From 0ecde8a38ea836601ea27c9e762286868beee171 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 16 Mar 2023 20:22:00 +0600 Subject: [PATCH 001/583] An empty DAC Validator pallet crate --- Cargo.toml | 19 +++++++++++++++++++ README.md | 1 + src/lib.rs | 26 ++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 src/lib.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000..d9525b4df --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "pallet-ddc-validator" +version = "0.1.0" +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } +scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-support/std", + "frame-system/std", + "scale-info/std", +] diff --git a/README.md b/README.md new file mode 100644 index 000000000..3a21d9d6c --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# DDC Validator diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 000000000..0cecc036b --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,26 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +pub use frame_support::pallet_prelude::*; +pub use frame_system::pallet_prelude::*; +pub use pallet::*; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + type Event: From> + IsType<::Event>; + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event {} + + #[pallet::error] + pub enum Error {} +} From 922560e422e3247e8564307119bcee1e2c172c94 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 17 Mar 2023 16:38:15 +0600 Subject: [PATCH 002/583] Era counter with privileged inc for DAC Validator --- src/lib.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 0cecc036b..a9b774968 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,10 +17,29 @@ pub mod pallet { type Event: From> + IsType<::Event>; } + #[pallet::storage] + #[pallet::getter(fn global_era_counter)] + pub type GlobalEraCounter = StorageValue<_, u32>; + #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event {} #[pallet::error] pub enum Error {} + + #[pallet::call] + impl Pallet { + #[pallet::weight(100_000)] + pub fn inc_era(origin: OriginFor) -> DispatchResult { + ensure_root(origin)?; + if let Some(era) = >::get() { + let new_era = era.checked_add(1).unwrap_or_default(); + >::put(new_era); + } else { + >::put(1); + } + Ok(()) + } + } } From 1a67ed7b3e62638bd4669ce2bcc86f902563ea91 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 17 Mar 2023 17:15:04 +0600 Subject: [PATCH 003/583] Hooks and storage items for DAC Validator --- Cargo.toml | 13 +++++++++++++ src/lib.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d9525b4df..057a274a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,14 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } +log = { version = "0.4.17", default-features = false } +pallet-ddc-staking = { version = "0.1.0", default-features = false, path = "../ddc-staking" } +pallet-staking = { version = "4.0.0-dev", default-features = false, path = "../staking" } scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } +sp-io = { version = "6.0.0", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "6.0.0", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "4.0.0-dev", default-features = false, path = "../../primitives/staking" } +sp-std = { version = "4.0.0-dev", default-features = false, path = "../../primitives/std" } [features] default = ["std"] @@ -15,5 +22,11 @@ std = [ "codec/std", "frame-support/std", "frame-system/std", + "pallet-ddc-staking/std", + "pallet-staking/std", "scale-info/std", + "sp-io/std", + "sp-runtime/std", + "sp-staking/std", + "sp-std/std", ] diff --git a/src/lib.rs b/src/lib.rs index a9b774968..df766e369 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,8 +1,27 @@ #![cfg_attr(not(feature = "std"), no_std)] -pub use frame_support::pallet_prelude::*; +pub use frame_support::{pallet_prelude::*, parameter_types, weights::Weight, BoundedVec}; pub use frame_system::pallet_prelude::*; +pub use pallet_ddc_staking::{self as ddc_staking}; +pub use pallet_staking::{self as staking}; pub use pallet::*; +pub use sp_std::prelude::*; + +parameter_types! { + pub DdcValidatorsQuorumSize: u32 = 3; +} + +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] +pub enum ValidationMethodKind { + ProofOfDelivery, +} + +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] +pub struct Decision { + pub decision: Option, + pub method: ValidationMethodKind, + pub validator: AccountId, +} #[frame_support::pallet] pub mod pallet { @@ -13,14 +32,27 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config { + pub trait Config: frame_system::Config + pallet_staking::Config + ddc_staking::Config { type Event: From> + IsType<::Event>; } + #[pallet::storage] + #[pallet::getter(fn tasks)] + pub type Tasks = StorageMap< + _, + Twox64Concat, + T::AccountId, + BoundedVec, DdcValidatorsQuorumSize>, + >; + #[pallet::storage] #[pallet::getter(fn global_era_counter)] pub type GlobalEraCounter = StorageValue<_, u32>; + #[pallet::storage] + #[pallet::getter(fn last_managed_era)] + pub type LastManagedEra = StorageValue<_, u32>; + #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event {} @@ -42,4 +74,24 @@ pub mod pallet { Ok(()) } } + + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_initialize(block_number: T::BlockNumber) -> Weight { + let validators: Vec = >::iter_keys().collect(); + let edges: Vec = >::iter_keys().collect(); + log::info!( + "Block number: {:?}, global era: {:?}, last era: {:?}, validators: {:?}, edges: {:?}", + block_number, + >::get(), + >::get(), + validators, + edges, + ); + 0 + } + fn offchain_worker(block_number: T::BlockNumber) { + log::info!("Off-chain worker at block {:?}", block_number); + } + } } From f87d650f72ba721d39ed122a0ddee53ac77e0cd0 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 17 Mar 2023 14:25:39 +0100 Subject: [PATCH 004/583] add function fetch_tasks --- src/lib.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index df766e369..77d1d894b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -94,4 +94,20 @@ pub mod pallet { log::info!("Off-chain worker at block {:?}", block_number); } } + + impl Pallet { + /// Fetch the tasks related to current validator + fn fetch_tasks(validator: T::AccountId) -> Vec { + let mut cdn_nodes: Vec = vec![]; + for (cdn_id, cdn_tasks) in >::iter() { + for decision in cdn_tasks.iter() { + if decision.validator == validator { + cdn_nodes.push(cdn_id); + break; + } + } + } + cdn_nodes + } + } } From ec1d3a87d94080956e5e7365db919ecad60af31d Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 20 Mar 2023 11:54:31 +0600 Subject: [PATCH 005/583] Assign a random DAC validator for each edge --- src/lib.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 77d1d894b..bb2dd7641 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,8 @@ #![cfg_attr(not(feature = "std"), no_std)] -pub use frame_support::{pallet_prelude::*, parameter_types, weights::Weight, BoundedVec}; +pub use frame_support::{ + pallet_prelude::*, parameter_types, traits::Randomness, weights::Weight, BoundedVec, +}; pub use frame_system::pallet_prelude::*; pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_staking::{self as staking}; @@ -34,6 +36,7 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config + pallet_staking::Config + ddc_staking::Config { type Event: From> + IsType<::Event>; + type Randomness: Randomness; } #[pallet::storage] @@ -79,15 +82,34 @@ pub mod pallet { impl Hooks> for Pallet { fn on_initialize(block_number: T::BlockNumber) -> Weight { let validators: Vec = >::iter_keys().collect(); + let validators_count = validators.len() as u32; let edges: Vec = >::iter_keys().collect(); log::info!( - "Block number: {:?}, global era: {:?}, last era: {:?}, validators: {:?}, edges: {:?}", + "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", block_number, >::get(), >::get(), + validators_count, validators, edges, ); + + // A naive approach assigns random validators for each edge. + for edge in edges { + let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = + Default::default(); + while !decisions.is_full() { + let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; + let validator: T::AccountId = validators[validator_idx].clone(); + let assignment = Decision { + validator, + method: ValidationMethodKind::ProofOfDelivery, + decision: None, + }; + decisions.try_push(assignment).unwrap(); + } + Tasks::::insert(edge, decisions); + } 0 } fn offchain_worker(block_number: T::BlockNumber) { @@ -109,5 +131,31 @@ pub mod pallet { } cdn_nodes } + + fn choose(total: u32) -> Option { + if total == 0 { + return None + } + let mut random_number = Self::generate_random_number(0); + + // Best effort attempt to remove bias from modulus operator. + for i in 1..128 { + if random_number < u32::MAX - u32::MAX % total { + break + } + + random_number = Self::generate_random_number(i); + } + + Some(random_number % total) + } + + fn generate_random_number(seed: u32) -> u32 { + let (random_seed, _) = T::Randomness::random(&(b"ddc-validator", seed).encode()); + let random_number = ::decode(&mut random_seed.as_ref()) + .expect("secure hashes should always be bigger than u32; qed"); + + random_number + } } } From 82b8b88a82ae70804eff4dcaf81bd9941e3d29f2 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 20 Mar 2023 14:27:15 +0600 Subject: [PATCH 006/583] Assign DAC validation tasks on era increment --- src/lib.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index bb2dd7641..a88d229d4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -81,6 +81,19 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(block_number: T::BlockNumber) -> Weight { + match (>::get(), >::get()) { + (Some(global_era_counter), Some(last_managed_era)) => { + if last_managed_era >= global_era_counter { + return 0 + } + >::put(global_era_counter); + }, + (Some(global_era_counter), None) => { + >::put(global_era_counter); + }, + _ => { return 0 }, + }; + let validators: Vec = >::iter_keys().collect(); let validators_count = validators.len() as u32; let edges: Vec = >::iter_keys().collect(); From 0a53fb45bb2e9b12f4969c7fe27e669ff612f32c Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 20 Mar 2023 14:54:08 +0600 Subject: [PATCH 007/583] Format DAC Validator files --- src/lib.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a88d229d4..344048de9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,9 +4,9 @@ pub use frame_support::{ pallet_prelude::*, parameter_types, traits::Randomness, weights::Weight, BoundedVec, }; pub use frame_system::pallet_prelude::*; +pub use pallet::*; pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_staking::{self as staking}; -pub use pallet::*; pub use sp_std::prelude::*; parameter_types! { @@ -91,7 +91,7 @@ pub mod pallet { (Some(global_era_counter), None) => { >::put(global_era_counter); }, - _ => { return 0 }, + _ => return 0, }; let validators: Vec = >::iter_keys().collect(); @@ -125,6 +125,7 @@ pub mod pallet { } 0 } + fn offchain_worker(block_number: T::BlockNumber) { log::info!("Off-chain worker at block {:?}", block_number); } @@ -138,7 +139,7 @@ pub mod pallet { for decision in cdn_tasks.iter() { if decision.validator == validator { cdn_nodes.push(cdn_id); - break; + break } } } From 134c2f43c1fc9ef70a1a8e1cc0367ad0b0936448 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 21 Mar 2023 15:15:39 +0100 Subject: [PATCH 008/583] adjust era --- src/lib.rs | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 344048de9..10f72a1ac 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,11 +8,16 @@ pub use pallet::*; pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_staking::{self as staking}; pub use sp_std::prelude::*; +pub use sp_io::offchain::timestamp; parameter_types! { pub DdcValidatorsQuorumSize: u32 = 3; } +const TIME_START_MS: u64 = 1_672_531_200_000; +const ERA_DURATION_MS: u64 = 120_000; +const ERA_IN_BLOCKS: u8 = 20; + #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] pub enum ValidationMethodKind { ProofOfDelivery, @@ -48,10 +53,6 @@ pub mod pallet { BoundedVec, DdcValidatorsQuorumSize>, >; - #[pallet::storage] - #[pallet::getter(fn global_era_counter)] - pub type GlobalEraCounter = StorageValue<_, u32>; - #[pallet::storage] #[pallet::getter(fn last_managed_era)] pub type LastManagedEra = StorageValue<_, u32>; @@ -63,21 +64,6 @@ pub mod pallet { #[pallet::error] pub enum Error {} - #[pallet::call] - impl Pallet { - #[pallet::weight(100_000)] - pub fn inc_era(origin: OriginFor) -> DispatchResult { - ensure_root(origin)?; - if let Some(era) = >::get() { - let new_era = era.checked_add(1).unwrap_or_default(); - >::put(new_era); - } else { - >::put(1); - } - Ok(()) - } - } - #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(block_number: T::BlockNumber) -> Weight { @@ -100,7 +86,7 @@ pub mod pallet { log::info!( "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", block_number, - >::get(), + Self::get_current_era(), >::get(), validators_count, validators, @@ -170,6 +156,9 @@ pub mod pallet { .expect("secure hashes should always be bigger than u32; qed"); random_number + // Get the current era; Shall we start era count from 0 or from 1? + fn get_current_era() -> u64 { + (timestamp().unix_millis() - TIME_START_MS) / ERA_DURATION_MS } } } From 2861d4441d39b7fdba33f93150cd40174a3fd030 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 21 Mar 2023 15:40:37 +0100 Subject: [PATCH 009/583] fix era --- src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 10f72a1ac..3d708a0a1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -156,6 +156,8 @@ pub mod pallet { .expect("secure hashes should always be bigger than u32; qed"); random_number + } + // Get the current era; Shall we start era count from 0 or from 1? fn get_current_era() -> u64 { (timestamp().unix_millis() - TIME_START_MS) / ERA_DURATION_MS From 9ebe1a973a685a930ea340443bd817001db057e5 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 22 Mar 2023 11:32:21 +0100 Subject: [PATCH 010/583] merge offchain worker with ddc validator --- Cargo.toml | 12 ++ src/lib.rs | 322 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 317 insertions(+), 17 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 057a274a2..55172f684 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,13 +4,20 @@ version = "0.1.0" edition = "2021" [dependencies] +alt_serde = { version = "1", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } log = { version = "0.4.17", default-features = false } +pallet-contracts = { version = '4.0.0-dev', default-features = false, path = "../contracts" } pallet-ddc-staking = { version = "0.1.0", default-features = false, path = "../ddc-staking" } pallet-staking = { version = "4.0.0-dev", default-features = false, path = "../staking" } +pallet-session = { version = "4.0.0-dev", path = "../session", default-features = false } scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } +serde = { version = "1.0.101", optional = true } +serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } +sp-keystore = { version = "0.12.0", default-features = false, path = "../../primitives/keystore", optional = true } +sp-core = { version = "6.0.0", default-features = false, path = "../../primitives/core" } sp-io = { version = "6.0.0", default-features = false, path = "../../primitives/io" } sp-runtime = { version = "6.0.0", default-features = false, path = "../../primitives/runtime" } sp-staking = { version = "4.0.0-dev", default-features = false, path = "../../primitives/staking" } @@ -22,9 +29,14 @@ std = [ "codec/std", "frame-support/std", "frame-system/std", + "pallet-contracts/std", "pallet-ddc-staking/std", "pallet-staking/std", + "pallet-session/std", "scale-info/std", + "serde", + "sp-keystore", + "sp-core/std", "sp-io/std", "sp-runtime/std", "sp-staking/std", diff --git a/src/lib.rs b/src/lib.rs index 3d708a0a1..9cab6656c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,23 +1,53 @@ #![cfg_attr(not(feature = "std"), no_std)] +pub use alloc::{format, string::String}; +pub use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; +pub use codec::{Encode, Decode, MaxEncodedLen, HasCompact}; +pub use core::fmt::Debug; pub use frame_support::{ - pallet_prelude::*, parameter_types, traits::Randomness, weights::Weight, BoundedVec, + decl_event, decl_module, decl_storage, + log::{error, info, warn}, + pallet_prelude::*, + traits::{Randomness, Currency}, + weights::Weight, + dispatch::DispatchResult, + RuntimeDebug, + BoundedVec, + parameter_types, }; -pub use frame_system::pallet_prelude::*; +pub use frame_system::{ensure_signed, pallet_prelude::*, offchain::{CreateSignedTransaction, Signer, SigningTypes, AppCrypto, SendSignedTransaction}}; pub use pallet::*; pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_staking::{self as staking}; +pub use pallet_session as session; +pub use scale_info::TypeInfo; +pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; +pub use sp_runtime::offchain::{http, Duration}; pub use sp_std::prelude::*; pub use sp_io::offchain::timestamp; +extern crate alloc; parameter_types! { pub DdcValidatorsQuorumSize: u32 = 3; } +type BalanceOf = <::Currency as Currency< + ::AccountId, +>>::Balance; + +type ResultStr = Result; + + +pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); + +pub const HTTP_TIMEOUT_MS: u64 = 30_000; + const TIME_START_MS: u64 = 1_672_531_200_000; const ERA_DURATION_MS: u64 = 120_000; const ERA_IN_BLOCKS: u8 = 20; +const DATA_PROVIDER_URL: &str = "http://localhost:7379/"; + #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] pub enum ValidationMethodKind { ProofOfDelivery, @@ -30,18 +60,112 @@ pub struct Decision { pub validator: AccountId, } +#[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo, Default)] +pub struct ValidationResult { + era: String, + signer: AccountId, + val_res: bool, + cdn_node_pub_key: String, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct RedisFtAggregate { + #[serde(rename = "FT.AGGREGATE")] + pub ft_aggregate: (u32, Vec, Vec), +} + +#[derive(Clone)] +struct BytesSent { + node_public_key: String, + era: String, + sum: u32, +} + +impl BytesSent { + pub fn new(aggregate: RedisFtAggregate) -> BytesSent { + let (_, values, values2) = aggregate.ft_aggregate; + + BytesSent { + node_public_key: values[1].clone(), + era: values[3].clone(), + sum: values[5].parse::().expect("bytesSentSum must be convertable to u32"), + } + } +} + +#[derive(Clone)] +struct BytesReceived { + node_public_key: String, + era: String, + sum: u32, +} + +impl BytesReceived { + pub fn new(aggregate: RedisFtAggregate) -> BytesReceived { + let (_, values, values2) = aggregate.ft_aggregate; + + BytesReceived { + node_public_key: values[1].clone(), + era: values[3].clone(), + sum: values[5].parse::().expect("bytesReceivedSum must be convertable to u32"), + } + } +} + +pub mod crypto { + use super::KEY_TYPE; + use frame_system::offchain::AppCrypto; + use sp_core::sr25519::Signature as Sr25519Signature; + use sp_runtime::{ + app_crypto::{app_crypto, sr25519}, + traits::Verify, + }; + app_crypto!(sr25519, KEY_TYPE); + + use sp_runtime::{MultiSignature, MultiSigner}; + + pub struct TestAuthId; + + impl AppCrypto<::Signer, Sr25519Signature> for TestAuthId { + type RuntimeAppPublic = Public; + type GenericSignature = sp_core::sr25519::Signature; + type GenericPublic = sp_core::sr25519::Public; + } + + impl AppCrypto for TestAuthId { + type RuntimeAppPublic = Public; + type GenericSignature = sp_core::sr25519::Signature; + type GenericPublic = sp_core::sr25519::Public; + } +} + #[frame_support::pallet] pub mod pallet { use super::*; #[pallet::pallet] + #[pallet::without_storage_info] #[pallet::generate_store(pub(super) trait Store)] pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config + pallet_staking::Config + ddc_staking::Config { + pub trait Config: + frame_system::Config + + pallet_contracts::Config + + pallet_session::Config::AccountId> + + pallet_staking::Config + + ddc_staking::Config + + CreateSignedTransaction> + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + { type Event: From> + IsType<::Event>; type Randomness: Randomness; + type Call: From>; + type AuthorityId: AppCrypto; } #[pallet::storage] @@ -55,26 +179,34 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn last_managed_era)] - pub type LastManagedEra = StorageValue<_, u32>; + pub type LastManagedEra = StorageValue<_, u64>; #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event {} + pub enum Event + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + {} #[pallet::error] pub enum Error {} #[pallet::hooks] - impl Hooks> for Pallet { + impl Hooks> for Pallet + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + { fn on_initialize(block_number: T::BlockNumber) -> Weight { - match (>::get(), >::get()) { - (Some(global_era_counter), Some(last_managed_era)) => { + match (Self::get_current_era(), >::get()) { + (global_era_counter, Some(last_managed_era)) => { if last_managed_era >= global_era_counter { return 0 } >::put(global_era_counter); }, - (Some(global_era_counter), None) => { + (global_era_counter, None) => { >::put(global_era_counter); }, _ => return 0, @@ -113,11 +245,172 @@ pub mod pallet { } fn offchain_worker(block_number: T::BlockNumber) { - log::info!("Off-chain worker at block {:?}", block_number); + let res = Self::offchain_worker_main(block_number); + + match res { + Ok(()) => info!("[DAC Validator] DAC Validator is suspended."), + Err(err) => error!("[DAC Validator] Error in Offchain Worker: {}", err), + }; } } - impl Pallet { + #[pallet::call] + impl Pallet + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + { + #[pallet::weight(10000)] + pub fn save_validated_data(origin: OriginFor, val_res: bool, cdn_node_pub_key: String, era: String) -> DispatchResult { + let signer: T::AccountId = ensure_signed(origin)?; + + info!("[DAC Validator] author: {:?}", signer); + let mut v_results = ValidationResults::::get(); + + let cur_validation = ValidationResult:: { + era, + val_res, + cdn_node_pub_key, + signer, + }; + + v_results.push(cur_validation); + + ValidationResults::::set(v_results); + + Ok(()) + } + } + + impl Pallet + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + { + fn offchain_worker_main(block_number: T::BlockNumber) -> ResultStr<()> { + info!("[DAC Validator] Validation data stored onchain: {:?}", ValidationResults::::get()); + + if block_number % ERA_IN_BLOCKS.into() != 0u32.into() { + return Ok(()) + } + + let signer = match Self::get_signer() { + Err(e) => { + warn!("{:?}", e); + return Ok(()); + } + Ok(signer) => signer, + }; + + info!("[DAC Validator] ValidationResults: {:?}", ValidationResults::::get()); + + // Read data from DataModel and do dumb validation + let current_era = Self::get_current_era() - 1u64; + let (bytes_sent, bytes_received) = Self::fetch_data(current_era); + let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); + + let cdn_node_pub_key = bytes_sent.node_public_key.clone(); + let tx_res = signer.send_signed_transaction(|_acct| { + info!("[DAC Validator] Sending save_validated_data tx"); + + // This is the on-chain function + Call::save_validated_data { val_res, cdn_node_pub_key: cdn_node_pub_key.clone(), era: bytes_sent.era.clone() } + }); + + match &tx_res { + None | Some((_, Err(()))) => { + return Err("Error while submitting save_validated_data TX") + } + Some((_, Ok(()))) => {} + } + + Ok(()) + } + + fn get_signer() -> ResultStr> { + let signer = Signer::<_, _>::any_account(); + if !signer.can_sign() { + return Err("[DAC Validator] No local accounts available. Consider adding one via `author_insertKey` RPC."); + } + + Ok(signer) + } + + // Get the current era; Shall we start era count from 0 or from 1? + fn get_current_era() -> u64 { + (timestamp().unix_millis() - TIME_START_MS) / ERA_DURATION_MS + } + + fn fetch_data(era: u64 ) -> (BytesSent, BytesReceived){ + info!("[DAC Validator] DAC Validator is running. Current era is {}", era); + // Todo: handle the error + let bytes_sent_query = Self::get_bytes_sent_query_url(era); + let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); + info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); + let bytes_sent = BytesSent::new(bytes_sent_res); + + // Todo: handle the error + let bytes_received_query = Self::get_bytes_received_query_url(era); + let bytes_received_res: RedisFtAggregate = + Self::http_get_json(&bytes_received_query).unwrap(); + info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); + let bytes_received = BytesReceived::new(bytes_received_res); + + (bytes_sent, bytes_received) + } + + fn get_bytes_sent_query_url(era: u64) -> String { + format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era) + } + + fn get_bytes_received_query_url(era: u64) -> String { + format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era) + } + + fn http_get_json(url: &str) -> ResultStr { + let body = Self::http_get_request(url).map_err(|err| { + error!("[DAC Validator] Error while getting {}: {:?}", url, err); + "HTTP GET error" + })?; + + let parsed = serde_json::from_slice(&body).map_err(|err| { + warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); + "HTTP JSON parse error" + }); + + parsed + } + + fn http_get_request(http_url: &str) -> Result, http::Error> { + info!("[DAC Validator] Sending request to: {:?}", http_url); + + // Initiate an external HTTP GET request. This is using high-level wrappers from + // `sp_runtime`. + let request = http::Request::get(http_url); + + let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); + + let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; + + let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; + + if response.code != 200 { + warn!("[DAC Validator] http_get_request unexpected status code: {}", response.code); + return Err(http::Error::Unknown) + } + + // Next we fully read the response body and collect it to a vector of bytes. + Ok(response.body().collect::>()) + } + + fn validate(bytes_sent: BytesSent, bytes_received: BytesReceived) -> bool { + return if bytes_sent.sum == bytes_received.sum { + true + } else { + false + } + } + /// Fetch the tasks related to current validator fn fetch_tasks(validator: T::AccountId) -> Vec { let mut cdn_nodes: Vec = vec![]; @@ -151,16 +444,11 @@ pub mod pallet { } fn generate_random_number(seed: u32) -> u32 { - let (random_seed, _) = T::Randomness::random(&(b"ddc-validator", seed).encode()); + let (random_seed, _) = ::Randomness::random(&(b"ddc-validator", seed).encode()); let random_number = ::decode(&mut random_seed.as_ref()) .expect("secure hashes should always be bigger than u32; qed"); random_number } - - // Get the current era; Shall we start era count from 0 or from 1? - fn get_current_era() -> u64 { - (timestamp().unix_millis() - TIME_START_MS) / ERA_DURATION_MS - } } } From a4ee180c54a4961397482dd557c5261b2ed3d6db Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 22 Mar 2023 14:43:26 +0100 Subject: [PATCH 011/583] add proof of delivery --- src/lib.rs | 75 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 9cab6656c..52219d6dc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -181,6 +181,10 @@ pub mod pallet { #[pallet::getter(fn last_managed_era)] pub type LastManagedEra = StorageValue<_, u64>; + #[pallet::storage] + #[pallet::getter(fn validation_results)] + pub(super) type ValidationResults = StorageValue<_, Vec>, ValueQuery>; + #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event @@ -209,7 +213,6 @@ pub mod pallet { (global_era_counter, None) => { >::put(global_era_counter); }, - _ => return 0, }; let validators: Vec = >::iter_keys().collect(); @@ -280,6 +283,27 @@ pub mod pallet { Ok(()) } + + #[pallet::weight(10000)] + pub fn proof_of_delivery(origin: OriginFor, era: u64) -> DispatchResult { + let signer: T::AccountId = ensure_signed(origin)?; + + let cdn_nodes_to_validate = Self::fetch_tasks(&signer); + for cdn_node_id in cdn_nodes_to_validate { + let (bytes_sent, bytes_received) = Self::fetch_data(era, &cdn_node_id); + let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); + + let decisions_for_cdn = >::get(cdn_node_id); + for decision in decisions_for_cdn.unwrap().iter_mut() { + if decision.validator == signer { + decision.decision = Some(val_res); + decision.method = ValidationMethodKind::ProofOfDelivery; + } + } + } + + Ok(()) + } } impl Pallet @@ -306,23 +330,26 @@ pub mod pallet { // Read data from DataModel and do dumb validation let current_era = Self::get_current_era() - 1u64; - let (bytes_sent, bytes_received) = Self::fetch_data(current_era); - let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); - let cdn_node_pub_key = bytes_sent.node_public_key.clone(); - let tx_res = signer.send_signed_transaction(|_acct| { - info!("[DAC Validator] Sending save_validated_data tx"); + // for decision in &mut cdn_nodes_to_validate { - // This is the on-chain function - Call::save_validated_data { val_res, cdn_node_pub_key: cdn_node_pub_key.clone(), era: bytes_sent.era.clone() } - }); + // } + // let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); + // let cdn_node_pub_key = bytes_sent.node_public_key.clone(); - match &tx_res { - None | Some((_, Err(()))) => { - return Err("Error while submitting save_validated_data TX") - } - Some((_, Ok(()))) => {} - } + // let tx_res = signer.send_signed_transaction(|_acct| { + // info!("[DAC Validator] Sending save_validated_data tx"); + + // // This is the on-chain function + // Call::save_validated_data { val_res, cdn_node_pub_key: cdn_node_pub_key.clone(), era: bytes_sent.era.clone() } + // }); + + // match &tx_res { + // None | Some((_, Err(()))) => { + // return Err("Error while submitting save_validated_data TX") + // } + // Some((_, Ok(()))) => {} + // } Ok(()) } @@ -341,16 +368,16 @@ pub mod pallet { (timestamp().unix_millis() - TIME_START_MS) / ERA_DURATION_MS } - fn fetch_data(era: u64 ) -> (BytesSent, BytesReceived){ + fn fetch_data(era: u64, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error - let bytes_sent_query = Self::get_bytes_sent_query_url(era); + let bytes_sent_query = Self::get_bytes_sent_query_url(era, cdn_node); let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); let bytes_sent = BytesSent::new(bytes_sent_res); // Todo: handle the error - let bytes_received_query = Self::get_bytes_received_query_url(era); + let bytes_received_query = Self::get_bytes_received_query_url(era, cdn_node); let bytes_received_res: RedisFtAggregate = Self::http_get_json(&bytes_received_query).unwrap(); info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); @@ -359,12 +386,12 @@ pub mod pallet { (bytes_sent, bytes_received) } - fn get_bytes_sent_query_url(era: u64) -> String { - format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era) + fn get_bytes_sent_query_url(era: u64, cdn_node: &T::AccountId) -> String { + format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/{:?}/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era, *cdn_node) } - fn get_bytes_received_query_url(era: u64) -> String { - format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era) + fn get_bytes_received_query_url(era: u64, cdn_node: &T::AccountId) -> String { + format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/{:?}/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era, *cdn_node) } fn http_get_json(url: &str) -> ResultStr { @@ -412,11 +439,11 @@ pub mod pallet { } /// Fetch the tasks related to current validator - fn fetch_tasks(validator: T::AccountId) -> Vec { + fn fetch_tasks(validator: &T::AccountId) -> Vec { let mut cdn_nodes: Vec = vec![]; for (cdn_id, cdn_tasks) in >::iter() { for decision in cdn_tasks.iter() { - if decision.validator == validator { + if decision.validator == *validator { cdn_nodes.push(cdn_id); break } From 54783d40f432cb831d28a48c0111a55e0aa0ce18 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 22 Mar 2023 14:45:48 +0100 Subject: [PATCH 012/583] add PoD trigger in offchain worker --- src/lib.rs | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 52219d6dc..d599567be 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -331,25 +331,20 @@ pub mod pallet { // Read data from DataModel and do dumb validation let current_era = Self::get_current_era() - 1u64; - // for decision in &mut cdn_nodes_to_validate { + + let tx_res = signer.send_signed_transaction(|_acct| { + info!("[DAC Validator] Trigger proof of delivery"); - // } - // let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); - // let cdn_node_pub_key = bytes_sent.node_public_key.clone(); - - // let tx_res = signer.send_signed_transaction(|_acct| { - // info!("[DAC Validator] Sending save_validated_data tx"); - - // // This is the on-chain function - // Call::save_validated_data { val_res, cdn_node_pub_key: cdn_node_pub_key.clone(), era: bytes_sent.era.clone() } - // }); + // This is the on-chain function + Call::proof_of_delivery { era: current_era } + }); - // match &tx_res { - // None | Some((_, Err(()))) => { - // return Err("Error while submitting save_validated_data TX") - // } - // Some((_, Ok(()))) => {} - // } + match &tx_res { + None | Some((_, Err(()))) => { + return Err("Error while submitting proof of delivery TX") + } + Some((_, Ok(()))) => {} + } Ok(()) } From 379c39dc7f2c1d8fde150a2fb4d496305115ea99 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Thu, 23 Mar 2023 11:47:35 +0100 Subject: [PATCH 013/583] Move JSON parsing fix to ddc-validator --- src/lib.rs | 58 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index d599567be..2b1d5245e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -72,8 +72,16 @@ pub struct ValidationResult { #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct RedisFtAggregate { - #[serde(rename = "FT.AGGREGATE")] - pub ft_aggregate: (u32, Vec, Vec), + #[serde(rename = "FT.AGGREGATE")] + pub ft_aggregate: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(crate = "alt_serde")] +#[serde(untagged)] +pub enum FtAggregate { + Length(u32), + Node(Vec), } #[derive(Clone)] @@ -84,15 +92,20 @@ struct BytesSent { } impl BytesSent { - pub fn new(aggregate: RedisFtAggregate) -> BytesSent { - let (_, values, values2) = aggregate.ft_aggregate; - - BytesSent { - node_public_key: values[1].clone(), - era: values[3].clone(), - sum: values[5].parse::().expect("bytesSentSum must be convertable to u32"), - } - } + pub fn new(aggregate: RedisFtAggregate) -> BytesSent { + let data = aggregate.ft_aggregate[1].clone(); + + match data { + FtAggregate::Node(node) => { + return BytesSent { + node_public_key: node[1].clone(), + era: node[3].clone(), + sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), + } + } + FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), + } + } } #[derive(Clone)] @@ -103,15 +116,20 @@ struct BytesReceived { } impl BytesReceived { - pub fn new(aggregate: RedisFtAggregate) -> BytesReceived { - let (_, values, values2) = aggregate.ft_aggregate; - - BytesReceived { - node_public_key: values[1].clone(), - era: values[3].clone(), - sum: values[5].parse::().expect("bytesReceivedSum must be convertable to u32"), - } - } + pub fn new(aggregate: RedisFtAggregate) -> BytesReceived { + let data = aggregate.ft_aggregate[1].clone(); + + match data { + FtAggregate::Node(node) => { + return BytesReceived { + node_public_key: node[1].clone(), + era: node[3].clone(), + sum: node[5].parse::().expect("bytesReceivedSum must be convertable to u32"), + } + } + FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), + } + } } pub mod crypto { From e1e9d3e9196e89ba549cf9567070470dce5a1aca Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 23 Mar 2023 15:23:09 +0100 Subject: [PATCH 014/583] fix timestamp bug --- src/lib.rs | 96 +++++++++++++++++++++++++++++------------------------- 1 file changed, 51 insertions(+), 45 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 2b1d5245e..e7481fe6e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,7 +8,7 @@ pub use frame_support::{ decl_event, decl_module, decl_storage, log::{error, info, warn}, pallet_prelude::*, - traits::{Randomness, Currency}, + traits::{Randomness, Currency, UnixTime}, weights::Weight, dispatch::DispatchResult, RuntimeDebug, @@ -22,9 +22,9 @@ pub use pallet_staking::{self as staking}; pub use pallet_session as session; pub use scale_info::TypeInfo; pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; -pub use sp_runtime::offchain::{http, Duration}; +pub use sp_runtime::offchain::{http, Duration, Timestamp}; pub use sp_std::prelude::*; -pub use sp_io::offchain::timestamp; + extern crate alloc; parameter_types! { @@ -42,8 +42,8 @@ pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); pub const HTTP_TIMEOUT_MS: u64 = 30_000; -const TIME_START_MS: u64 = 1_672_531_200_000; -const ERA_DURATION_MS: u64 = 120_000; +const TIME_START_MS: u128 = 1_672_531_200_000; +const ERA_DURATION_MS: u128 = 120_000; const ERA_IN_BLOCKS: u8 = 20; const DATA_PROVIDER_URL: &str = "http://localhost:7379/"; @@ -184,6 +184,7 @@ pub mod pallet { type Randomness: Randomness; type Call: From>; type AuthorityId: AppCrypto; + type TimeProvider: UnixTime; } #[pallet::storage] @@ -221,48 +222,53 @@ pub mod pallet { as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn on_initialize(block_number: T::BlockNumber) -> Weight { - match (Self::get_current_era(), >::get()) { - (global_era_counter, Some(last_managed_era)) => { - if last_managed_era >= global_era_counter { - return 0 + if block_number != 0u32.into() && block_number != 1u32.into() { + let era = Self::get_current_era(); + match (era, >::get()) { + (global_era_counter, Some(last_managed_era)) => { + if last_managed_era >= global_era_counter { + return 0 + } + >::put(global_era_counter); + }, + (global_era_counter, None) => { + >::put(global_era_counter); + }, + }; + + let validators: Vec = >::iter_keys().collect(); + let validators_count = validators.len() as u32; + let edges: Vec = >::iter_keys().collect(); + log::info!( + "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", + block_number, + era, + >::get(), + validators_count, + validators, + edges, + ); + + // A naive approach assigns random validators for each edge. + for edge in edges { + let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = + Default::default(); + while !decisions.is_full() { + let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; + let validator: T::AccountId = validators[validator_idx].clone(); + let assignment = Decision { + validator, + method: ValidationMethodKind::ProofOfDelivery, + decision: None, + }; + decisions.try_push(assignment).unwrap(); } - >::put(global_era_counter); - }, - (global_era_counter, None) => { - >::put(global_era_counter); - }, - }; - - let validators: Vec = >::iter_keys().collect(); - let validators_count = validators.len() as u32; - let edges: Vec = >::iter_keys().collect(); - log::info!( - "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", - block_number, - Self::get_current_era(), - >::get(), - validators_count, - validators, - edges, - ); - - // A naive approach assigns random validators for each edge. - for edge in edges { - let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = - Default::default(); - while !decisions.is_full() { - let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; - let validator: T::AccountId = validators[validator_idx].clone(); - let assignment = Decision { - validator, - method: ValidationMethodKind::ProofOfDelivery, - decision: None, - }; - decisions.try_push(assignment).unwrap(); + Tasks::::insert(edge, decisions); } - Tasks::::insert(edge, decisions); + 0 + } else { + 0 } - 0 } fn offchain_worker(block_number: T::BlockNumber) { @@ -378,7 +384,7 @@ pub mod pallet { // Get the current era; Shall we start era count from 0 or from 1? fn get_current_era() -> u64 { - (timestamp().unix_millis() - TIME_START_MS) / ERA_DURATION_MS + ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS).try_into().unwrap() } fn fetch_data(era: u64, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { From 4c001abcddd82dfde67b2b965444549544bc0383 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 24 Mar 2023 11:17:31 +0600 Subject: [PATCH 015/583] Autoformat DAC Validator files --- Cargo.toml | 8 +-- src/lib.rs | 205 +++++++++++++++++++++++++++-------------------------- 2 files changed, 109 insertions(+), 104 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 55172f684..af7a0108e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,14 +11,14 @@ frame-system = { version = "4.0.0-dev", default-features = false, path = "../sys log = { version = "0.4.17", default-features = false } pallet-contracts = { version = '4.0.0-dev', default-features = false, path = "../contracts" } pallet-ddc-staking = { version = "0.1.0", default-features = false, path = "../ddc-staking" } -pallet-staking = { version = "4.0.0-dev", default-features = false, path = "../staking" } pallet-session = { version = "4.0.0-dev", path = "../session", default-features = false } +pallet-staking = { version = "4.0.0-dev", default-features = false, path = "../staking" } scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } -sp-keystore = { version = "0.12.0", default-features = false, path = "../../primitives/keystore", optional = true } sp-core = { version = "6.0.0", default-features = false, path = "../../primitives/core" } sp-io = { version = "6.0.0", default-features = false, path = "../../primitives/io" } +sp-keystore = { version = "0.12.0", default-features = false, path = "../../primitives/keystore", optional = true } sp-runtime = { version = "6.0.0", default-features = false, path = "../../primitives/runtime" } sp-staking = { version = "4.0.0-dev", default-features = false, path = "../../primitives/staking" } sp-std = { version = "4.0.0-dev", default-features = false, path = "../../primitives/std" } @@ -31,13 +31,13 @@ std = [ "frame-system/std", "pallet-contracts/std", "pallet-ddc-staking/std", - "pallet-staking/std", "pallet-session/std", + "pallet-staking/std", "scale-info/std", "serde", - "sp-keystore", "sp-core/std", "sp-io/std", + "sp-keystore", "sp-runtime/std", "sp-staking/std", "sp-std/std", diff --git a/src/lib.rs b/src/lib.rs index e7481fe6e..a2e6586a8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,24 +2,27 @@ pub use alloc::{format, string::String}; pub use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; -pub use codec::{Encode, Decode, MaxEncodedLen, HasCompact}; +pub use codec::{Decode, Encode, HasCompact, MaxEncodedLen}; pub use core::fmt::Debug; pub use frame_support::{ decl_event, decl_module, decl_storage, - log::{error, info, warn}, - pallet_prelude::*, - traits::{Randomness, Currency, UnixTime}, - weights::Weight, dispatch::DispatchResult, - RuntimeDebug, - BoundedVec, + log::{error, info, warn}, + pallet_prelude::*, parameter_types, + traits::{Currency, Randomness, UnixTime}, + weights::Weight, + BoundedVec, RuntimeDebug, +}; +pub use frame_system::{ + ensure_signed, + offchain::{AppCrypto, CreateSignedTransaction, SendSignedTransaction, Signer, SigningTypes}, + pallet_prelude::*, }; -pub use frame_system::{ensure_signed, pallet_prelude::*, offchain::{CreateSignedTransaction, Signer, SigningTypes, AppCrypto, SendSignedTransaction}}; pub use pallet::*; pub use pallet_ddc_staking::{self as ddc_staking}; -pub use pallet_staking::{self as staking}; pub use pallet_session as session; +pub use pallet_staking::{self as staking}; pub use scale_info::TypeInfo; pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; pub use sp_runtime::offchain::{http, Duration, Timestamp}; @@ -32,12 +35,11 @@ parameter_types! { } type BalanceOf = <::Currency as Currency< - ::AccountId, + ::AccountId, >>::Balance; type ResultStr = Result; - pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); pub const HTTP_TIMEOUT_MS: u64 = 30_000; @@ -62,10 +64,10 @@ pub struct Decision { #[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo, Default)] pub struct ValidationResult { - era: String, - signer: AccountId, - val_res: bool, - cdn_node_pub_key: String, + era: String, + signer: AccountId, + val_res: bool, + cdn_node_pub_key: String, } #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] @@ -86,9 +88,9 @@ pub enum FtAggregate { #[derive(Clone)] struct BytesSent { - node_public_key: String, - era: String, - sum: u32, + node_public_key: String, + era: String, + sum: u32, } impl BytesSent { @@ -96,13 +98,12 @@ impl BytesSent { let data = aggregate.ft_aggregate[1].clone(); match data { - FtAggregate::Node(node) => { + FtAggregate::Node(node) => return BytesSent { node_public_key: node[1].clone(), era: node[3].clone(), sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), - } - } + }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } } @@ -110,9 +111,9 @@ impl BytesSent { #[derive(Clone)] struct BytesReceived { - node_public_key: String, - era: String, - sum: u32, + node_public_key: String, + era: String, + sum: u32, } impl BytesReceived { @@ -120,13 +121,14 @@ impl BytesReceived { let data = aggregate.ft_aggregate[1].clone(); match data { - FtAggregate::Node(node) => { + FtAggregate::Node(node) => return BytesReceived { node_public_key: node[1].clone(), era: node[3].clone(), - sum: node[5].parse::().expect("bytesReceivedSum must be convertable to u32"), - } - } + sum: node[5] + .parse::() + .expect("bytesReceivedSum must be convertable to u32"), + }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } } @@ -137,8 +139,8 @@ pub mod crypto { use frame_system::offchain::AppCrypto; use sp_core::sr25519::Signature as Sr25519Signature; use sp_runtime::{ - app_crypto::{app_crypto, sr25519}, - traits::Verify, + app_crypto::{app_crypto, sr25519}, + traits::Verify, }; app_crypto!(sr25519, KEY_TYPE); @@ -147,15 +149,15 @@ pub mod crypto { pub struct TestAuthId; impl AppCrypto<::Signer, Sr25519Signature> for TestAuthId { - type RuntimeAppPublic = Public; - type GenericSignature = sp_core::sr25519::Signature; - type GenericPublic = sp_core::sr25519::Public; + type RuntimeAppPublic = Public; + type GenericSignature = sp_core::sr25519::Signature; + type GenericPublic = sp_core::sr25519::Public; } impl AppCrypto for TestAuthId { - type RuntimeAppPublic = Public; - type GenericSignature = sp_core::sr25519::Signature; - type GenericPublic = sp_core::sr25519::Public; + type RuntimeAppPublic = Public; + type GenericSignature = sp_core::sr25519::Signature; + type GenericPublic = sp_core::sr25519::Public; } } @@ -169,21 +171,21 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: + pub trait Config: frame_system::Config + pallet_contracts::Config - + pallet_session::Config::AccountId> + + pallet_session::Config::AccountId> + pallet_staking::Config + ddc_staking::Config + CreateSignedTransaction> - where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { type Event: From> + IsType<::Event>; type Randomness: Randomness; type Call: From>; - type AuthorityId: AppCrypto; + type AuthorityId: AppCrypto; type TimeProvider: UnixTime; } @@ -202,28 +204,28 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn validation_results)] - pub(super) type ValidationResults = StorageValue<_, Vec>, ValueQuery>; + pub(super) type ValidationResults = + StorageValue<_, Vec>, ValueQuery>; #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event + pub enum Event where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, - {} + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, {} #[pallet::error] pub enum Error {} #[pallet::hooks] - impl Hooks> for Pallet + impl Hooks> for Pallet where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn on_initialize(block_number: T::BlockNumber) -> Weight { if block_number != 0u32.into() && block_number != 1u32.into() { - let era = Self::get_current_era(); + let era = Self::get_current_era(); match (era, >::get()) { (global_era_counter, Some(last_managed_era)) => { if last_managed_era >= global_era_counter { @@ -235,10 +237,11 @@ pub mod pallet { >::put(global_era_counter); }, }; - + let validators: Vec = >::iter_keys().collect(); let validators_count = validators.len() as u32; - let edges: Vec = >::iter_keys().collect(); + let edges: Vec = + >::iter_keys().collect(); log::info!( "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", block_number, @@ -248,7 +251,7 @@ pub mod pallet { validators, edges, ); - + // A naive approach assigns random validators for each edge. for edge in edges { let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = @@ -282,24 +285,25 @@ pub mod pallet { } #[pallet::call] - impl Pallet - where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + impl Pallet + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { #[pallet::weight(10000)] - pub fn save_validated_data(origin: OriginFor, val_res: bool, cdn_node_pub_key: String, era: String) -> DispatchResult { + pub fn save_validated_data( + origin: OriginFor, + val_res: bool, + cdn_node_pub_key: String, + era: String, + ) -> DispatchResult { let signer: T::AccountId = ensure_signed(origin)?; info!("[DAC Validator] author: {:?}", signer); let mut v_results = ValidationResults::::get(); - let cur_validation = ValidationResult:: { - era, - val_res, - cdn_node_pub_key, - signer, - }; + let cur_validation = + ValidationResult:: { era, val_res, cdn_node_pub_key, signer }; v_results.push(cur_validation); @@ -330,24 +334,27 @@ pub mod pallet { } } - impl Pallet + impl Pallet where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn offchain_worker_main(block_number: T::BlockNumber) -> ResultStr<()> { - info!("[DAC Validator] Validation data stored onchain: {:?}", ValidationResults::::get()); + info!( + "[DAC Validator] Validation data stored onchain: {:?}", + ValidationResults::::get() + ); if block_number % ERA_IN_BLOCKS.into() != 0u32.into() { - return Ok(()) + return Ok(()) } let signer = match Self::get_signer() { - Err(e) => { - warn!("{:?}", e); - return Ok(()); - } - Ok(signer) => signer, + Err(e) => { + warn!("{:?}", e); + return Ok(()) + }, + Ok(signer) => signer, }; info!("[DAC Validator] ValidationResults: {:?}", ValidationResults::::get()); @@ -355,19 +362,17 @@ pub mod pallet { // Read data from DataModel and do dumb validation let current_era = Self::get_current_era() - 1u64; - let tx_res = signer.send_signed_transaction(|_acct| { - info!("[DAC Validator] Trigger proof of delivery"); + info!("[DAC Validator] Trigger proof of delivery"); - // This is the on-chain function - Call::proof_of_delivery { era: current_era } + // This is the on-chain function + Call::proof_of_delivery { era: current_era } }); match &tx_res { - None | Some((_, Err(()))) => { - return Err("Error while submitting proof of delivery TX") - } - Some((_, Ok(()))) => {} + None | Some((_, Err(()))) => + return Err("Error while submitting proof of delivery TX"), + Some((_, Ok(()))) => {}, } Ok(()) @@ -376,7 +381,7 @@ pub mod pallet { fn get_signer() -> ResultStr> { let signer = Signer::<_, _>::any_account(); if !signer.can_sign() { - return Err("[DAC Validator] No local accounts available. Consider adding one via `author_insertKey` RPC."); + return Err("[DAC Validator] No local accounts available. Consider adding one via `author_insertKey` RPC."); } Ok(signer) @@ -384,7 +389,9 @@ pub mod pallet { // Get the current era; Shall we start era count from 0 or from 1? fn get_current_era() -> u64 { - ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS).try_into().unwrap() + ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS) + .try_into() + .unwrap() } fn fetch_data(era: u64, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { @@ -398,7 +405,7 @@ pub mod pallet { // Todo: handle the error let bytes_received_query = Self::get_bytes_received_query_url(era, cdn_node); let bytes_received_res: RedisFtAggregate = - Self::http_get_json(&bytes_received_query).unwrap(); + Self::http_get_json(&bytes_received_query).unwrap(); info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); let bytes_received = BytesReceived::new(bytes_received_res); @@ -415,13 +422,13 @@ pub mod pallet { fn http_get_json(url: &str) -> ResultStr { let body = Self::http_get_request(url).map_err(|err| { - error!("[DAC Validator] Error while getting {}: {:?}", url, err); - "HTTP GET error" + error!("[DAC Validator] Error while getting {}: {:?}", url, err); + "HTTP GET error" })?; let parsed = serde_json::from_slice(&body).map_err(|err| { - warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); - "HTTP JSON parse error" + warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); + "HTTP JSON parse error" }); parsed @@ -438,23 +445,20 @@ pub mod pallet { let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; - let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; + let response = + pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; if response.code != 200 { - warn!("[DAC Validator] http_get_request unexpected status code: {}", response.code); - return Err(http::Error::Unknown) + warn!("[DAC Validator] http_get_request unexpected status code: {}", response.code); + return Err(http::Error::Unknown) } // Next we fully read the response body and collect it to a vector of bytes. Ok(response.body().collect::>()) - } + } fn validate(bytes_sent: BytesSent, bytes_received: BytesReceived) -> bool { - return if bytes_sent.sum == bytes_received.sum { - true - } else { - false - } + return if bytes_sent.sum == bytes_received.sum { true } else { false } } /// Fetch the tasks related to current validator @@ -490,7 +494,8 @@ pub mod pallet { } fn generate_random_number(seed: u32) -> u32 { - let (random_seed, _) = ::Randomness::random(&(b"ddc-validator", seed).encode()); + let (random_seed, _) = + ::Randomness::random(&(b"ddc-validator", seed).encode()); let random_number = ::decode(&mut random_seed.as_ref()) .expect("secure hashes should always be bigger than u32; qed"); From c37437e4f5ffbced9566a746b4e0708506f41252 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 24 Mar 2023 12:02:07 +0100 Subject: [PATCH 016/583] add filtering of requests --- Cargo.toml | 1 + src/lib.rs | 91 +++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 85 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index af7a0108e..0e0fe0ea9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] +array-bytes = "6.0.0" alt_serde = { version = "1", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } diff --git a/src/lib.rs b/src/lib.rs index a2e6586a8..5a553ca1d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -107,6 +107,27 @@ impl BytesSent { FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } } + + pub fn get_all(aggregation: RedisFtAggregate) -> Vec { + let mut res: Vec = vec!(); + for i in 1..aggregation.ft_aggregate.len() { + let data = aggregation.ft_aggregate[i].clone(); + match data { + FtAggregate::Node(node) => { + let node = BytesSent { + node_public_key: node[1].clone(), + era: node[3].clone(), + sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), + }; + + res.push(node); + } + FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), + } + } + + return res; + } } #[derive(Clone)] @@ -132,6 +153,27 @@ impl BytesReceived { FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } } + + pub fn get_all(aggregation: RedisFtAggregate) -> Vec { + let mut res: Vec = vec!(); + for i in 1..aggregation.ft_aggregate.len() { + let data = aggregation.ft_aggregate[i].clone(); + match data { + FtAggregate::Node(node) => { + let node = BytesReceived { + node_public_key: node[1].clone(), + era: node[3].clone(), + sum: node[5].parse::().expect("bytesReceivedSum must be convertable to u32"), + }; + + res.push(node); + } + FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), + } + } + + return res; + } } pub mod crypto { @@ -317,8 +359,9 @@ pub mod pallet { let signer: T::AccountId = ensure_signed(origin)?; let cdn_nodes_to_validate = Self::fetch_tasks(&signer); + let (s, r) = Self::fetch_data1(era); for cdn_node_id in cdn_nodes_to_validate { - let (bytes_sent, bytes_received) = Self::fetch_data(era, &cdn_node_id); + let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); let decisions_for_cdn = >::get(cdn_node_id); @@ -397,13 +440,13 @@ pub mod pallet { fn fetch_data(era: u64, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error - let bytes_sent_query = Self::get_bytes_sent_query_url(era, cdn_node); + let bytes_sent_query = Self::get_bytes_sent_query_url(era); let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); let bytes_sent = BytesSent::new(bytes_sent_res); // Todo: handle the error - let bytes_received_query = Self::get_bytes_received_query_url(era, cdn_node); + let bytes_received_query = Self::get_bytes_received_query_url(era); let bytes_received_res: RedisFtAggregate = Self::http_get_json(&bytes_received_query).unwrap(); info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); @@ -412,12 +455,46 @@ pub mod pallet { (bytes_sent, bytes_received) } - fn get_bytes_sent_query_url(era: u64, cdn_node: &T::AccountId) -> String { - format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/{:?}/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era, *cdn_node) + fn account_to_string(account: T::AccountId) -> String { + let to32 = T::AccountId::encode(&account); + let pub_key_str = array_bytes::bytes2hex("", to32); + + pub_key_str + } + + fn filter_data(s: &Vec, r: &Vec, a: &T::AccountId) -> (BytesSent, BytesReceived){ + let ac = Self::account_to_string(a.clone()); + + let filtered_s = &*s.into_iter().find(|bs| bs.node_public_key == ac).unwrap(); + let filtered_r = &*r.into_iter().find(|br| br.node_public_key == ac).unwrap(); + + (filtered_s.clone(), filtered_r.clone()) + } + + fn fetch_data1(era: u64 ) -> (Vec, Vec){ + info!("[DAC Validator] DAC Validator is running. Current era is {}", era); + // Todo: handle the error + let bytes_sent_query = Self::get_bytes_sent_query_url(era); + let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); + info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); + let bytes_sent = BytesSent::get_all(bytes_sent_res); + + // Todo: handle the error + let bytes_received_query = Self::get_bytes_received_query_url(era); + let bytes_received_res: RedisFtAggregate = + Self::http_get_json(&bytes_received_query).unwrap(); + info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); + let bytes_received = BytesReceived::get_all(bytes_received_res); + + (bytes_sent, bytes_received) + } + + fn get_bytes_sent_query_url(era: u64) -> String { + format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era) } - fn get_bytes_received_query_url(era: u64, cdn_node: &T::AccountId) -> String { - format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/{:?}/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era, *cdn_node) + fn get_bytes_received_query_url(era: u64) -> String { + format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era) } fn http_get_json(url: &str) -> ResultStr { From 8de7826077b472f9378369829930e26a9cebd8a3 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 27 Mar 2023 14:38:27 +0600 Subject: [PATCH 017/583] Refactor guard condition --- src/lib.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 5a553ca1d..dc5b4688c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -268,18 +268,12 @@ pub mod pallet { fn on_initialize(block_number: T::BlockNumber) -> Weight { if block_number != 0u32.into() && block_number != 1u32.into() { let era = Self::get_current_era(); - match (era, >::get()) { - (global_era_counter, Some(last_managed_era)) => { - if last_managed_era >= global_era_counter { - return 0 - } - >::put(global_era_counter); - }, - (global_era_counter, None) => { - >::put(global_era_counter); - }, - }; - + if let Some(last_managed_era) = >::get() { + if last_managed_era >= era { + return 0 + } + } + >::put(era); let validators: Vec = >::iter_keys().collect(); let validators_count = validators.len() as u32; let edges: Vec = From 5e8b0b01ebee7e2263b72311cb0a3e539f351b97 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 27 Mar 2023 15:30:57 +0600 Subject: [PATCH 018/583] Refactor a guard condition to decrease indentation --- src/lib.rs | 79 +++++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index dc5b4688c..cf4423173 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -266,48 +266,49 @@ pub mod pallet { as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn on_initialize(block_number: T::BlockNumber) -> Weight { - if block_number != 0u32.into() && block_number != 1u32.into() { - let era = Self::get_current_era(); - if let Some(last_managed_era) = >::get() { - if last_managed_era >= era { - return 0 - } + if block_number < 1u32.into() { + return 0 + } + + let era = Self::get_current_era(); + if let Some(last_managed_era) = >::get() { + if last_managed_era >= era { + return 0 } - >::put(era); - let validators: Vec = >::iter_keys().collect(); - let validators_count = validators.len() as u32; - let edges: Vec = - >::iter_keys().collect(); - log::info!( - "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", - block_number, - era, - >::get(), - validators_count, - validators, - edges, - ); - - // A naive approach assigns random validators for each edge. - for edge in edges { - let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = - Default::default(); - while !decisions.is_full() { - let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; - let validator: T::AccountId = validators[validator_idx].clone(); - let assignment = Decision { - validator, - method: ValidationMethodKind::ProofOfDelivery, - decision: None, - }; - decisions.try_push(assignment).unwrap(); - } - Tasks::::insert(edge, decisions); + } + >::put(era); + + let validators: Vec = >::iter_keys().collect(); + let validators_count = validators.len() as u32; + let edges: Vec = >::iter_keys().collect(); + log::info!( + "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", + block_number, + era, + >::get(), + validators_count, + validators, + edges, + ); + + // A naive approach assigns random validators for each edge. + for edge in edges { + let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = + Default::default(); + while !decisions.is_full() { + let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; + let validator: T::AccountId = validators[validator_idx].clone(); + let assignment = Decision { + validator, + method: ValidationMethodKind::ProofOfDelivery, + decision: None, + }; + decisions.try_push(assignment).unwrap(); } - 0 - } else { - 0 + Tasks::::insert(edge, decisions); } + + 0 } fn offchain_worker(block_number: T::BlockNumber) { From 25b9c673b50953a89a5780ce8dbc4ba46c60bb8d Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 27 Mar 2023 20:04:43 +0600 Subject: [PATCH 019/583] Use era type from staking primitives --- src/lib.rs | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index cf4423173..1de5200c6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -26,6 +26,7 @@ pub use pallet_staking::{self as staking}; pub use scale_info::TypeInfo; pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; pub use sp_runtime::offchain::{http, Duration, Timestamp}; +pub use sp_staking::EraIndex; pub use sp_std::prelude::*; extern crate alloc; @@ -64,7 +65,7 @@ pub struct Decision { #[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo, Default)] pub struct ValidationResult { - era: String, + era: EraIndex, signer: AccountId, val_res: bool, cdn_node_pub_key: String, @@ -89,7 +90,7 @@ pub enum FtAggregate { #[derive(Clone)] struct BytesSent { node_public_key: String, - era: String, + era: EraIndex, sum: u32, } @@ -101,7 +102,8 @@ impl BytesSent { FtAggregate::Node(node) => return BytesSent { node_public_key: node[1].clone(), - era: node[3].clone(), + era: node[3].clone().parse::().expect("era must be convertible u32") + as EraIndex, sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), @@ -116,7 +118,8 @@ impl BytesSent { FtAggregate::Node(node) => { let node = BytesSent { node_public_key: node[1].clone(), - era: node[3].clone(), + era: node[3].clone().parse::().expect("era must be convertible u32") + as EraIndex, sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), }; @@ -133,7 +136,7 @@ impl BytesSent { #[derive(Clone)] struct BytesReceived { node_public_key: String, - era: String, + era: EraIndex, sum: u32, } @@ -145,7 +148,8 @@ impl BytesReceived { FtAggregate::Node(node) => return BytesReceived { node_public_key: node[1].clone(), - era: node[3].clone(), + era: node[3].clone().parse::().expect("era must be convertible u32") + as EraIndex, sum: node[5] .parse::() .expect("bytesReceivedSum must be convertable to u32"), @@ -162,7 +166,8 @@ impl BytesReceived { FtAggregate::Node(node) => { let node = BytesReceived { node_public_key: node[1].clone(), - era: node[3].clone(), + era: node[3].clone().parse::().expect("era must be convertible u32") + as EraIndex, sum: node[5].parse::().expect("bytesReceivedSum must be convertable to u32"), }; @@ -242,7 +247,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn last_managed_era)] - pub type LastManagedEra = StorageValue<_, u64>; + pub type LastManagedEra = StorageValue<_, EraIndex>; #[pallet::storage] #[pallet::getter(fn validation_results)] @@ -332,7 +337,7 @@ pub mod pallet { origin: OriginFor, val_res: bool, cdn_node_pub_key: String, - era: String, + era: EraIndex, ) -> DispatchResult { let signer: T::AccountId = ensure_signed(origin)?; @@ -350,7 +355,7 @@ pub mod pallet { } #[pallet::weight(10000)] - pub fn proof_of_delivery(origin: OriginFor, era: u64) -> DispatchResult { + pub fn proof_of_delivery(origin: OriginFor, era: EraIndex) -> DispatchResult { let signer: T::AccountId = ensure_signed(origin)?; let cdn_nodes_to_validate = Self::fetch_tasks(&signer); @@ -398,7 +403,7 @@ pub mod pallet { info!("[DAC Validator] ValidationResults: {:?}", ValidationResults::::get()); // Read data from DataModel and do dumb validation - let current_era = Self::get_current_era() - 1u64; + let current_era = Self::get_current_era() - 1; let tx_res = signer.send_signed_transaction(|_acct| { info!("[DAC Validator] Trigger proof of delivery"); @@ -426,13 +431,13 @@ pub mod pallet { } // Get the current era; Shall we start era count from 0 or from 1? - fn get_current_era() -> u64 { + fn get_current_era() -> EraIndex { ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS) .try_into() .unwrap() } - fn fetch_data(era: u64, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { + fn fetch_data(era: EraIndex, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error let bytes_sent_query = Self::get_bytes_sent_query_url(era); @@ -466,7 +471,7 @@ pub mod pallet { (filtered_s.clone(), filtered_r.clone()) } - fn fetch_data1(era: u64 ) -> (Vec, Vec){ + fn fetch_data1(era: EraIndex) -> (Vec, Vec){ info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error let bytes_sent_query = Self::get_bytes_sent_query_url(era); @@ -484,11 +489,11 @@ pub mod pallet { (bytes_sent, bytes_received) } - fn get_bytes_sent_query_url(era: u64) -> String { + fn get_bytes_sent_query_url(era: EraIndex) -> String { format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era) } - fn get_bytes_received_query_url(era: u64) -> String { + fn get_bytes_received_query_url(era: EraIndex) -> String { format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era) } From cf1383999d599f27de5d545901fc00f401af371e Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 28 Mar 2023 12:46:36 +0600 Subject: [PATCH 020/583] Fix faulty hook on block initialization --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 1de5200c6..edbaba17d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -271,7 +271,7 @@ pub mod pallet { as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn on_initialize(block_number: T::BlockNumber) -> Weight { - if block_number < 1u32.into() { + if block_number <= 1u32.into() { return 0 } From ff9b3a50e4c88183537ce0a007d38326a34fce61 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 28 Mar 2023 12:52:12 +0600 Subject: [PATCH 021/583] Autoformat DAC Validator files --- src/lib.rs | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index edbaba17d..c0fe9def0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -111,7 +111,7 @@ impl BytesSent { } pub fn get_all(aggregation: RedisFtAggregate) -> Vec { - let mut res: Vec = vec!(); + let mut res: Vec = vec![]; for i in 1..aggregation.ft_aggregate.len() { let data = aggregation.ft_aggregate[i].clone(); match data { @@ -120,16 +120,18 @@ impl BytesSent { node_public_key: node[1].clone(), era: node[3].clone().parse::().expect("era must be convertible u32") as EraIndex, - sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), + sum: node[5] + .parse::() + .expect("bytesSentSum must be convertable to u32"), }; res.push(node); - } + }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } } - return res; + return res } } @@ -159,7 +161,7 @@ impl BytesReceived { } pub fn get_all(aggregation: RedisFtAggregate) -> Vec { - let mut res: Vec = vec!(); + let mut res: Vec = vec![]; for i in 1..aggregation.ft_aggregate.len() { let data = aggregation.ft_aggregate[i].clone(); match data { @@ -168,16 +170,18 @@ impl BytesReceived { node_public_key: node[1].clone(), era: node[3].clone().parse::().expect("era must be convertible u32") as EraIndex, - sum: node[5].parse::().expect("bytesReceivedSum must be convertable to u32"), + sum: node[5] + .parse::() + .expect("bytesReceivedSum must be convertable to u32"), }; res.push(node); - } + }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } } - return res; + return res } } @@ -462,7 +466,11 @@ pub mod pallet { pub_key_str } - fn filter_data(s: &Vec, r: &Vec, a: &T::AccountId) -> (BytesSent, BytesReceived){ + fn filter_data( + s: &Vec, + r: &Vec, + a: &T::AccountId, + ) -> (BytesSent, BytesReceived) { let ac = Self::account_to_string(a.clone()); let filtered_s = &*s.into_iter().find(|bs| bs.node_public_key == ac).unwrap(); @@ -471,7 +479,7 @@ pub mod pallet { (filtered_s.clone(), filtered_r.clone()) } - fn fetch_data1(era: EraIndex) -> (Vec, Vec){ + fn fetch_data1(era: EraIndex) -> (Vec, Vec) { info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error let bytes_sent_query = Self::get_bytes_sent_query_url(era); From ccd5f7d10e94a4123d22938b2374ca440f44ba92 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 28 Mar 2023 12:53:59 +0600 Subject: [PATCH 022/583] Typo fix --- src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c0fe9def0..a30027c7d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -104,7 +104,7 @@ impl BytesSent { node_public_key: node[1].clone(), era: node[3].clone().parse::().expect("era must be convertible u32") as EraIndex, - sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), + sum: node[5].parse::().expect("bytesSentSum must be convertible to u32"), }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } @@ -122,7 +122,7 @@ impl BytesSent { as EraIndex, sum: node[5] .parse::() - .expect("bytesSentSum must be convertable to u32"), + .expect("bytesSentSum must be convertible to u32"), }; res.push(node); @@ -154,7 +154,7 @@ impl BytesReceived { as EraIndex, sum: node[5] .parse::() - .expect("bytesReceivedSum must be convertable to u32"), + .expect("bytesReceivedSum must be convertible to u32"), }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } @@ -172,7 +172,7 @@ impl BytesReceived { as EraIndex, sum: node[5] .parse::() - .expect("bytesReceivedSum must be convertable to u32"), + .expect("bytesReceivedSum must be convertible to u32"), }; res.push(node); From 043f42c2edb6f3202da5dfe9f937b83523c3d142 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 28 Mar 2023 13:45:04 +0600 Subject: [PATCH 023/583] Introduce era key for DAC validator tasks --- src/lib.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a30027c7d..32354fa19 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -242,9 +242,11 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn tasks)] - pub type Tasks = StorageMap< + pub type Tasks = StorageDoubleMap< _, Twox64Concat, + EraIndex, + Twox64Concat, T::AccountId, BoundedVec, DdcValidatorsQuorumSize>, >; @@ -314,7 +316,7 @@ pub mod pallet { }; decisions.try_push(assignment).unwrap(); } - Tasks::::insert(edge, decisions); + Tasks::::insert(era, edge, decisions); } 0 @@ -361,14 +363,14 @@ pub mod pallet { #[pallet::weight(10000)] pub fn proof_of_delivery(origin: OriginFor, era: EraIndex) -> DispatchResult { let signer: T::AccountId = ensure_signed(origin)?; - - let cdn_nodes_to_validate = Self::fetch_tasks(&signer); + let era = Self::get_current_era(); + let cdn_nodes_to_validate = Self::fetch_tasks(era, &signer); let (s, r) = Self::fetch_data1(era); for cdn_node_id in cdn_nodes_to_validate { let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); - let decisions_for_cdn = >::get(cdn_node_id); + let decisions_for_cdn = >::get(era, cdn_node_id); for decision in decisions_for_cdn.unwrap().iter_mut() { if decision.validator == signer { decision.decision = Some(val_res); @@ -547,9 +549,9 @@ pub mod pallet { } /// Fetch the tasks related to current validator - fn fetch_tasks(validator: &T::AccountId) -> Vec { + fn fetch_tasks(era: EraIndex, validator: &T::AccountId) -> Vec { let mut cdn_nodes: Vec = vec![]; - for (cdn_id, cdn_tasks) in >::iter() { + for (cdn_id, cdn_tasks) in >::iter_prefix(era) { for decision in cdn_tasks.iter() { if decision.validator == *validator { cdn_nodes.push(cdn_id); From 6213789372ed31ad7ec747ab8e9f95a766f0f4ca Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 29 Mar 2023 13:02:18 +0600 Subject: [PATCH 024/583] Set DAC Validators quorum size in runtime crate --- src/lib.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 32354fa19..eb284d97a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,10 +31,6 @@ pub use sp_std::prelude::*; extern crate alloc; -parameter_types! { - pub DdcValidatorsQuorumSize: u32 = 3; -} - type BalanceOf = <::Currency as Currency< ::AccountId, >>::Balance; @@ -238,6 +234,9 @@ pub mod pallet { type Call: From>; type AuthorityId: AppCrypto; type TimeProvider: UnixTime; + + #[pallet::constant] + type DdcValidatorsQuorumSize: Get; } #[pallet::storage] @@ -248,7 +247,7 @@ pub mod pallet { EraIndex, Twox64Concat, T::AccountId, - BoundedVec, DdcValidatorsQuorumSize>, + BoundedVec, T::DdcValidatorsQuorumSize>, >; #[pallet::storage] @@ -304,7 +303,7 @@ pub mod pallet { // A naive approach assigns random validators for each edge. for edge in edges { - let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = + let mut decisions: BoundedVec, T::DdcValidatorsQuorumSize> = Default::default(); while !decisions.is_full() { let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; From d49120c295dd3cf2f288d6ca52fc6431742d129f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 29 Mar 2023 15:26:38 +0600 Subject: [PATCH 025/583] Print pubkeys available to offchain worker --- src/lib.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index eb284d97a..6c06457a1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,6 +25,7 @@ pub use pallet_session as session; pub use pallet_staking::{self as staking}; pub use scale_info::TypeInfo; pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; +pub use sp_io::crypto::sr25519_public_keys; pub use sp_runtime::offchain::{http, Duration, Timestamp}; pub use sp_staking::EraIndex; pub use sp_std::prelude::*; @@ -322,6 +323,16 @@ pub mod pallet { } fn offchain_worker(block_number: T::BlockNumber) { + let pubkeys = sr25519_public_keys(KEY_TYPE); + if pubkeys.is_empty() { + log::info!("No local sr25519 accounts available to offchain worker."); + return + } + log::info!( + "Local sr25519 accounts available to offchain worker: {:?}, first pubilc key: {:?}", + pubkeys, pubkeys.first().unwrap() + ); + let res = Self::offchain_worker_main(block_number); match res { From c208087ebde61a0066a7f79c1c210866cda8ee70 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 29 Mar 2023 12:46:42 +0200 Subject: [PATCH 026/583] merge with latest commit --- src/lib.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 6c06457a1..229e01f05 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,6 +32,10 @@ pub use sp_std::prelude::*; extern crate alloc; +parameter_types! { + pub const ValidationThreshold: f32 = 5.0; +} + type BalanceOf = <::Currency as Currency< ::AccountId, >>::Balance; @@ -555,7 +559,9 @@ pub mod pallet { } fn validate(bytes_sent: BytesSent, bytes_received: BytesReceived) -> bool { - return if bytes_sent.sum == bytes_received.sum { true } else { false } + let percentage_difference = 1f32 - (bytes_received.sum as f32 / bytes_sent.sum as f32); + + return if percentage_difference > 0.0 && (ValidationThreshold::get() - percentage_difference) > 0.0 { true } else { false } } /// Fetch the tasks related to current validator From 50b237a620e0a7dbe09149088d6ac54fe1ee2c94 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 29 Mar 2023 12:49:55 +0200 Subject: [PATCH 027/583] fix merge --- src/lib.rs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 229e01f05..b39e00548 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -88,8 +88,8 @@ pub enum FtAggregate { Node(Vec), } -#[derive(Clone)] -struct BytesSent { +#[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] +pub struct BytesSent { node_public_key: String, era: EraIndex, sum: u32, @@ -136,8 +136,8 @@ impl BytesSent { } } -#[derive(Clone)] -struct BytesReceived { +#[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] +pub struct BytesReceived { node_public_key: String, era: EraIndex, sum: u32, @@ -375,8 +375,9 @@ pub mod pallet { } #[pallet::weight(10000)] - pub fn proof_of_delivery(origin: OriginFor, era: EraIndex) -> DispatchResult { + pub fn proof_of_delivery(origin: OriginFor, s: Vec, r: Vec) -> DispatchResult { let signer: T::AccountId = ensure_signed(origin)?; + let era = Self::get_current_era(); let cdn_nodes_to_validate = Self::fetch_tasks(era, &signer); let (s, r) = Self::fetch_data1(era); @@ -423,15 +424,12 @@ pub mod pallet { info!("[DAC Validator] ValidationResults: {:?}", ValidationResults::::get()); // Read data from DataModel and do dumb validation - let current_era = Self::get_current_era() - 1; + let current_era = Self::get_current_era() - 1u64; + let (s, r) = Self::fetch_data1(current_era); let tx_res = signer.send_signed_transaction(|_acct| { - info!("[DAC Validator] Trigger proof of delivery"); - - // This is the on-chain function - Call::proof_of_delivery { era: current_era } + Call::proof_of_delivery { s: s.clone(), r: r.clone() } }); - match &tx_res { None | Some((_, Err(()))) => return Err("Error while submitting proof of delivery TX"), From 589da9a9cbe410d6c3f3589c757a4ba714567145 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 29 Mar 2023 12:52:33 +0200 Subject: [PATCH 028/583] fix typo --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index b39e00548..af78c5be6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -424,7 +424,7 @@ pub mod pallet { info!("[DAC Validator] ValidationResults: {:?}", ValidationResults::::get()); // Read data from DataModel and do dumb validation - let current_era = Self::get_current_era() - 1u64; + let current_era = Self::get_current_era() - 1; let (s, r) = Self::fetch_data1(current_era); let tx_res = signer.send_signed_transaction(|_acct| { From c7a15da9ef84d39fd54780fb6189489860c0ff96 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 29 Mar 2023 16:35:22 +0600 Subject: [PATCH 029/583] Add doc comments --- src/lib.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index af78c5be6..eb28a1d59 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,6 +36,7 @@ parameter_types! { pub const ValidationThreshold: f32 = 5.0; } +/// The balance type of this pallet. type BalanceOf = <::Currency as Currency< ::AccountId, >>::Balance; @@ -52,15 +53,22 @@ const ERA_IN_BLOCKS: u8 = 20; const DATA_PROVIDER_URL: &str = "http://localhost:7379/"; +/// DAC Validation methods. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] pub enum ValidationMethodKind { + /// Compare amount of served content with amount of content consumed. ProofOfDelivery, } +/// Associates validation decision with the validator and the method used to produce it. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] pub struct Decision { + /// Individual validator's decision. Can be `None` if the validator did not produce a decision + /// (yet). pub decision: Option, + /// The method used to produce the decision. pub method: ValidationMethodKind, + /// The validator who produced the decision. pub validator: AccountId, } @@ -234,16 +242,27 @@ pub mod pallet { ::AccountId: AsRef<[u8]> + UncheckedFrom, as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { + /// The overarching event type. type Event: From> + IsType<::Event>; + + /// Something that provides randomness in the runtime. Required by the tasks assignment + /// procedure. type Randomness: Randomness; + + /// A dispatchable call. type Call: From>; + type AuthorityId: AppCrypto; type TimeProvider: UnixTime; + /// Number of validators expected to produce an individual validation decision to form a + /// consensus. Tasks assignment procedure use this value to determine the number of + /// validators are getting the same task. Must be an odd number. #[pallet::constant] type DdcValidatorsQuorumSize: Get; } + /// The map from the era and CDN participant stash key to the validation decisions related. #[pallet::storage] #[pallet::getter(fn tasks)] pub type Tasks = StorageDoubleMap< @@ -255,6 +274,7 @@ pub mod pallet { BoundedVec, T::DdcValidatorsQuorumSize>, >; + /// The last era for which the tasks assignment produced. #[pallet::storage] #[pallet::getter(fn last_managed_era)] pub type LastManagedEra = StorageValue<_, EraIndex>; @@ -576,6 +596,9 @@ pub mod pallet { cdn_nodes } + /// Randomly choose a number in range `[0, total)`. + /// Returns `None` for zero input. + /// Modification of `choose_ticket` from `pallet-lottery` version `4.0.0-dev`. fn choose(total: u32) -> Option { if total == 0 { return None @@ -594,6 +617,11 @@ pub mod pallet { Some(random_number % total) } + /// Generate a random number from a given seed. + /// Note that there is potential bias introduced by using modulus operator. + /// You should call this function with different seed values until the random + /// number lies within `u32::MAX - u32::MAX % n`. + /// Modification of `generate_random_number` from `pallet-lottery` version `4.0.0-dev`. fn generate_random_number(seed: u32) -> u32 { let (random_seed, _) = ::Randomness::random(&(b"ddc-validator", seed).encode()); From 051e95632afdb6c35100ed53b99a1ead583689b7 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 29 Mar 2023 18:00:40 +0600 Subject: [PATCH 030/583] Module level docs --- src/lib.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index eb28a1d59..6402d9f24 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,37 @@ +//! # DDC Validator pallet +//! +//! The DDC Validator pallet is responsible for producing validation decisions based on activity +//! data from DAC DataModel. It is expected to work on validators nodes only. +//! +//! - [`Config`] +//! - [`Call`] +//! - [`Pallet`] +//! - [`Hooks`] +//! +//! ## Responsibility +//! +//! 1. Assign validation tasks on DAC Validators in the beginning of each era, +//! 2. Spin the offchain worker which tries to execute the validation tasks each era, +//! 3. Fetch the data required for validation from DAC DataModel, +//! 4. Execute validation method on this data, +//! 5. Produce validation decision and submit it to the chain. +//! +//! ## Usage +//! +//! 1. Run the node with `--validator` flag, +//! 2. Setup validator key with `author_insertKey` RPC call. Use `dacv` validator key type and the +//! same private key as the one used to generate the validator's session keys, +//! 3. Proceed a regular validator setup, +//! 4. Tasks assignment will assign you a task in the beginning of the era which has your account in +//! validators set. +//! +//! ## Notes +//! +//! - Era definition in this pallet is different than in the `pallet-staking`. In this pallet era is +//! a period of time during which the validator is expected to produce a validation decision. +//! Means staking era and DAC era are different and are not related to each other, +//! - You can set DAC Validators quorum size by specifying `DdcValidatorsQuorumSize` parameter, + #![cfg_attr(not(feature = "std"), no_std)] pub use alloc::{format, string::String}; From 11747c29b7d6caa3547a1591106ba63c8b6389a0 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Wed, 29 Mar 2023 22:51:19 +0200 Subject: [PATCH 031/583] Remove http request from tx --- src/lib.rs | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 6402d9f24..0be9e9454 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -430,22 +430,32 @@ pub mod pallet { #[pallet::weight(10000)] pub fn proof_of_delivery(origin: OriginFor, s: Vec, r: Vec) -> DispatchResult { + info!("[DAC Validator] processing proof_of_delivery"); let signer: T::AccountId = ensure_signed(origin)?; + info!("signer: {:?}", Self::account_to_string(signer.clone())); + let era = Self::get_current_era(); let cdn_nodes_to_validate = Self::fetch_tasks(era, &signer); - let (s, r) = Self::fetch_data1(era); + + info!("[DAC Validator] cdn_nodes_to_validate: {:?}", cdn_nodes_to_validate); + for cdn_node_id in cdn_nodes_to_validate { let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); let decisions_for_cdn = >::get(era, cdn_node_id); - for decision in decisions_for_cdn.unwrap().iter_mut() { + for decision in decisions_for_cdn.clone().unwrap().iter_mut() { if decision.validator == signer { decision.decision = Some(val_res); decision.method = ValidationMethodKind::ProofOfDelivery; } } + + info!( + "[DAC Validator] decisions_for_cdn: {:?}", + decisions_for_cdn + ); } Ok(()) @@ -458,11 +468,6 @@ pub mod pallet { as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn offchain_worker_main(block_number: T::BlockNumber) -> ResultStr<()> { - info!( - "[DAC Validator] Validation data stored onchain: {:?}", - ValidationResults::::get() - ); - if block_number % ERA_IN_BLOCKS.into() != 0u32.into() { return Ok(()) } @@ -475,8 +480,6 @@ pub mod pallet { Ok(signer) => signer, }; - info!("[DAC Validator] ValidationResults: {:?}", ValidationResults::::get()); - // Read data from DataModel and do dumb validation let current_era = Self::get_current_era() - 1; let (s, r) = Self::fetch_data1(current_era); @@ -484,9 +487,13 @@ pub mod pallet { let tx_res = signer.send_signed_transaction(|_acct| { Call::proof_of_delivery { s: s.clone(), r: r.clone() } }); + match &tx_res { - None | Some((_, Err(()))) => - return Err("Error while submitting proof of delivery TX"), + None => return Err("Error while submitting proof of delivery TX"), + Some((_, Err(e))) => { + info!("Error while submitting proof of delivery TX: {:?}", e); + return Err("Error while submitting proof of delivery TX"); + }, Some((_, Ok(()))) => {}, } @@ -620,6 +627,8 @@ pub mod pallet { fn fetch_tasks(era: EraIndex, validator: &T::AccountId) -> Vec { let mut cdn_nodes: Vec = vec![]; for (cdn_id, cdn_tasks) in >::iter_prefix(era) { + info!("[DAC Validator] tasks assigned to {:?}: {:?}", cdn_id, cdn_tasks); + for decision in cdn_tasks.iter() { if decision.validator == *validator { cdn_nodes.push(cdn_id); From c0f2a7a67f4e88e6e32890c2526676ea4500d3e4 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 30 Mar 2023 14:51:59 +0600 Subject: [PATCH 032/583] Submit DAC Validation decision call --- src/lib.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0be9e9454..b456baf62 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -323,10 +323,22 @@ pub mod pallet { pub enum Event where ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, {} + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + { + /// DAC Validator successfully published the validation decision. + ValidationDecisionSubmitted, + } #[pallet::error] - pub enum Error {} + pub enum Error { + /// Validation decision attempts to submit the result for the wrong era (not the current + /// one). + BadEra, + /// Can't submit the validation decision twice. + DecisionAlreadySubmitted, + /// Task does not exist for a given era, CDN participant, and DAC validator. + TaskNotFound, + } #[pallet::hooks] impl Hooks> for Pallet @@ -428,6 +440,40 @@ pub mod pallet { Ok(()) } + /// Set validation decision in tasks assignment. + /// + /// `origin` must be a DAC Validator assigned to the task. + /// `era` must be a current era, otherwise the decision will be rejected. + /// `subject` is a CDN participant stash. + /// + /// Emits `ValidationDecisionSubmitted` event. + #[pallet::weight(100_000)] + pub fn submit_validation_decision( + origin: OriginFor, + era: EraIndex, + subject: T::AccountId, + method: ValidationMethodKind, + decision: bool, + ) -> DispatchResult { + let account = ensure_signed(origin)?; + + ensure!(Self::get_current_era() == era, Error::::BadEra); + + Tasks::::try_mutate_exists(era, &subject, |maybe_tasks| { + let mut tasks = maybe_tasks.take().ok_or(Error::::TaskNotFound)?; + let mut task = tasks + .iter_mut() + .find(|task| task.validator == account && task.method == method) + .ok_or(Error::::TaskNotFound)?; + ensure!(task.decision.is_none(), Error::::DecisionAlreadySubmitted); + task.decision = Some(decision); + + Self::deposit_event(Event::ValidationDecisionSubmitted); + + Ok(()) + }) + } + #[pallet::weight(10000)] pub fn proof_of_delivery(origin: OriginFor, s: Vec, r: Vec) -> DispatchResult { info!("[DAC Validator] processing proof_of_delivery"); From 3828bdc8b4f98f9a26e50e3cbabe08b7f6938fdb Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 31 Mar 2023 17:16:21 +0600 Subject: [PATCH 033/583] Fix validation decision update --- src/lib.rs | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b456baf62..1f10608c9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -490,18 +490,17 @@ pub mod pallet { let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); - let decisions_for_cdn = >::get(era, cdn_node_id); - for decision in decisions_for_cdn.clone().unwrap().iter_mut() { - if decision.validator == signer { - decision.decision = Some(val_res); - decision.method = ValidationMethodKind::ProofOfDelivery; - } - } - - info!( - "[DAC Validator] decisions_for_cdn: {:?}", - decisions_for_cdn - ); + >::mutate(era, cdn_node_id, |decisions_for_cdn| { + let decisions = + decisions_for_cdn.as_mut().expect("unexpected empty tasks assignment"); + let mut decision = decisions + .iter_mut() + .find(|decision| decision.validator == signer) + .expect("unexpected validators set in tasks assignment"); + decision.decision = Some(val_res); + }); + + info!("[DAC Validator] decisions_for_cdn: {:?}", >::get(era, cdn_node_id)); } Ok(()) From c5cfe53f045ad3e22879bd8d7d1037644c50a6ef Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 31 Mar 2023 17:33:09 +0600 Subject: [PATCH 034/583] Typo fix --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 1f10608c9..71c81b97f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -490,7 +490,7 @@ pub mod pallet { let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); - >::mutate(era, cdn_node_id, |decisions_for_cdn| { + >::mutate(era, &cdn_node_id, |decisions_for_cdn| { let decisions = decisions_for_cdn.as_mut().expect("unexpected empty tasks assignment"); let mut decision = decisions From a52cdbb26d8cb5c8467fedd24c5c1c1b102dca4e Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 11 Apr 2023 17:09:53 +0200 Subject: [PATCH 035/583] Try integrate unit tests --- Cargo.toml | 6 ++ src/lib.rs | 6 ++ src/mock.rs | 276 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/tests.rs | 0 4 files changed, 288 insertions(+) create mode 100644 src/mock.rs create mode 100644 src/tests.rs diff --git a/Cargo.toml b/Cargo.toml index 0e0fe0ea9..203e032e1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,3 +43,9 @@ std = [ "sp-staking/std", "sp-std/std", ] + +[dev-dependencies] +pallet-balances = { version = "4.0.0-dev", path = "../balances" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", path = "../randomness-collective-flip" } +pallet-timestamp = { version = "4.0.0-dev", path = "../timestamp" } +pallet-staking-reward-curve = { version = "4.0.0-dev", path = "../staking/reward-curve" } \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 71c81b97f..f1f64ad5e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -34,6 +34,12 @@ #![cfg_attr(not(feature = "std"), no_std)] +#[cfg(test)] +mod mock; + +#[cfg(test)] +mod tests; + pub use alloc::{format, string::String}; pub use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; pub use codec::{Decode, Encode, HasCompact, MaxEncodedLen}; diff --git a/src/mock.rs b/src/mock.rs new file mode 100644 index 000000000..b40c3a1c0 --- /dev/null +++ b/src/mock.rs @@ -0,0 +1,276 @@ +use crate::{*, self as pallet_ddc_validator}; +use frame_support::{ + parameter_types, + weights::Weight, + traits::{ConstU16, ConstU64, Currency, Everything, Nothing} +}; +use frame_system::EnsureRoot; +use frame_system::offchain::SendTransactionTypes; +use sp_core::H256; +use sp_runtime::{ curve::PiecewiseLinear, generic, testing::{Header, TestXt}, traits::{BlakeTwo256, IdentityLookup, Verify, Extrinsic as ExtrinsicT, IdentifyAccount}, Perbill, MultiSignature, curve}; +use pallet_contracts as contracts; + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; +type Balance = u128; +// type AccountId = u64; + +pub type Signature = MultiSignature; +pub type AccountId = <::Signer as IdentifyAccount>::AccountId; +// pub type Balance = u128; +pub type BlockNumber = u32; +pub type Moment = u64; + +// Configure a mock runtime to test the pallet. +frame_support::construct_runtime!( + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system, + Balances: pallet_balances, + Contracts: contracts, + Session: pallet_session, + Timestamp: pallet_timestamp, + RandomnessCollectiveFlip: pallet_randomness_collective_flip, + DdcStaking: pallet_ddc_staking, + DdcValidator: pallet_ddc_validator, + } +); + +parameter_types! { + pub const BlockHashCount: BlockNumber = 250; + pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); +} + +impl frame_system::Config for Test { + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type Origin = Origin; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type Call = Call; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + // u64; // sp_core::sr25519::Public; + type Lookup = IdentityLookup; + type Header = generic::Header; + type Event = Event; + type BlockHashCount = BlockHashCount; + type DbWeight = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +parameter_types! { + pub const SignedClaimHandicap: BlockNumber = 2; + pub const TombstoneDeposit: Balance = 16; + pub const StorageSizeOffset: u32 = 8; + pub const RentByteFee: Balance = 4; + pub const RentDepositOffset: Balance = 10_000; + pub const SurchargeReward: Balance = 150; + pub const MaxDepth: u32 = 100; + pub const MaxValueSize: u32 = 16_384; + pub Schedule: pallet_contracts::Schedule = Default::default(); +} + +use contracts::{Config as contractsConfig}; + +type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; + +impl contracts::Config for Test { + type Time = Timestamp; + type Randomness = RandomnessCollectiveFlip; + type Currency = Balances; + type Event = Event; + type CallStack = [pallet_contracts::Frame; 31]; + type WeightPrice = Self; //pallet_transaction_payment::Module; + type WeightInfo = (); + type ChainExtension = (); + type DeletionQueueDepth = (); + type DeletionWeightLimit = (); + type Schedule = Schedule; + type Call = Call; + type CallFilter = Nothing; + type DepositPerByte = DepositPerByte; + type DepositPerItem = DepositPerItem; + type AddressGenerator = pallet_contracts::DefaultAddressGenerator; +} + +parameter_types! { + pub const TransactionByteFee: u64 = 0; + pub const DepositPerItem: Balance = 0; + pub const DepositPerByte: Balance = 0; +} + +parameter_types! { + pub const MinimumPeriod: u64 = 1; +} + +impl pallet_timestamp::Config for Test { + type Moment = Moment; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); +} + +impl pallet_randomness_collective_flip::Config for Test {} + +parameter_types! { + pub const DdcValidatorsQuorumSize: u32 = 3; +} + +impl pallet_session::Config for Test { + type Event = (); + type ValidatorId = AccountId; + type ValidatorIdOf = (); + type ShouldEndSession = (); + type NextSessionRotation = (); + type SessionManager = (); + type SessionHandler = (); + type Keys = (); + type WeightInfo = (); +} + +pallet_staking_reward_curve::build! { + const REWARD_CURVE: PiecewiseLinear<'static> = curve!( + min_inflation: 0_000_100, + max_inflation: 0_050_000, + ideal_stake: 0_200_000, + falloff: 0_050_000, + max_piece_count: 100, + test_precision: 0_050_000, + ); +} + +parameter_types! { + pub const SessionsPerEra: sp_staking::SessionIndex = 6; + pub const BondingDuration: sp_staking::EraIndex = 3; + pub const SlashDeferDuration: sp_staking::EraIndex = 2; + pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; + pub const MaxNominatorRewardedPerValidator: u32 = 256; + pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); + pub OffchainRepeat: BlockNumber = 5; +} + +impl pallet_staking::Config for Test { + type MaxNominations = (); + type Currency = Balances; + type UnixTime = Timestamp; + type CurrencyToVote = (); + type RewardRemainder = (); + type Event = Event; + type Slash = (); // send the slashed funds to the treasury. + type Reward = (); // rewards are minted from the void + type SessionsPerEra = SessionsPerEra; + type BondingDuration = BondingDuration; + type SlashDeferDuration = SlashDeferDuration; + /// A super-majority of the council can cancel the slash. + type SlashCancelOrigin = (); + type SessionInterface = Self; + type EraPayout = pallet_staking::ConvertCurve; + type NextNewSession = Session; + type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; + type OffendingValidatorsThreshold = OffendingValidatorsThreshold; + type ElectionProvider = (); + type GenesisElectionProvider = (); + type VoterList = (); + type MaxUnlockingChunks = ConstU32<32>; + type WeightInfo = pallet_staking::weights::SubstrateWeight; + type BenchmarkingConfig = (); +} + +impl pallet_ddc_staking::Config for Test { + type BondingDuration = BondingDuration; + type Currency = Balances; + type Event = Event; + type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; +} + +impl pallet_ddc_validator::Config for Test { + type DdcValidatorsQuorumSize = DdcValidatorsQuorumSize; + type Event = Event; + type Randomness = RandomnessCollectiveFlip; + type Call = Call; + type AuthorityId = pallet_ddc_validator::crypto::TestAuthId; + type TimeProvider = pallet_timestamp::Pallet; +} + +impl SendTransactionTypes for Test + where + Call: From, +{ + type OverarchingCall = Call; + type Extrinsic = Extrinsic; +} + +parameter_types! { + pub const ExistentialDeposit: u64 = 1; + pub const MaxLocks: u32 = 10; +} + +impl pallet_balances::Config for Test { + type Balance = Balance; + type DustRemoval = (); + type Event = Event; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxLocks = (); + type MaxReserves = (); + type ReserveIdentifier = (); +} + +// Build genesis storage according to the mock runtime. +pub fn new_test_ext() -> sp_io::TestExternalities { + frame_system::GenesisConfig::default().build_storage::().unwrap().into() +} + +pub type Extrinsic = TestXt; + +impl SigningTypes for Test { + type Public = ::Signer; + type Signature = Signature; +} + +// impl frame_system::offchain::SendTransactionTypes for Test +// where +// Call: From, +// { +// type OverarchingCall = Call; +// type Extrinsic = TestXt; +// } + +// impl SendTransactionTypes for Test +// where +// Call: From, +// { +// type OverarchingCall = Call; +// type Extrinsic = Extrinsic; +// } + +impl CreateSignedTransaction for Test + where + Call: From, +{ + fn create_transaction>( + call: Call, + _public: ::Signer, + _account: AccountId, + nonce: u64, + ) -> Option<(Call, ::SignaturePayload)> { + Some((call, (nonce, ()))) + } +} \ No newline at end of file diff --git a/src/tests.rs b/src/tests.rs new file mode 100644 index 000000000..e69de29bb From 8b6ac905cc5d16bcf9c0eb590d0855c1ad6fe8d3 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 16 Mar 2023 20:22:00 +0600 Subject: [PATCH 036/583] An empty DAC Validator pallet crate --- Cargo.toml | 19 +++++++++++++++++++ README.md | 1 + src/lib.rs | 26 ++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 src/lib.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000..d9525b4df --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "pallet-ddc-validator" +version = "0.1.0" +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } +scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-support/std", + "frame-system/std", + "scale-info/std", +] diff --git a/README.md b/README.md new file mode 100644 index 000000000..3a21d9d6c --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# DDC Validator diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 000000000..0cecc036b --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,26 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +pub use frame_support::pallet_prelude::*; +pub use frame_system::pallet_prelude::*; +pub use pallet::*; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + type Event: From> + IsType<::Event>; + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event {} + + #[pallet::error] + pub enum Error {} +} From ff1928da8eccfe61d48465a2beb5c29be8030805 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 17 Mar 2023 16:38:15 +0600 Subject: [PATCH 037/583] Era counter with privileged inc for DAC Validator --- src/lib.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 0cecc036b..a9b774968 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,10 +17,29 @@ pub mod pallet { type Event: From> + IsType<::Event>; } + #[pallet::storage] + #[pallet::getter(fn global_era_counter)] + pub type GlobalEraCounter = StorageValue<_, u32>; + #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event {} #[pallet::error] pub enum Error {} + + #[pallet::call] + impl Pallet { + #[pallet::weight(100_000)] + pub fn inc_era(origin: OriginFor) -> DispatchResult { + ensure_root(origin)?; + if let Some(era) = >::get() { + let new_era = era.checked_add(1).unwrap_or_default(); + >::put(new_era); + } else { + >::put(1); + } + Ok(()) + } + } } From de4be86d9bbbdeccdedfb26f8c6440cf0264261f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 17 Mar 2023 17:15:04 +0600 Subject: [PATCH 038/583] Hooks and storage items for DAC Validator --- Cargo.toml | 13 +++++++++++++ src/lib.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d9525b4df..057a274a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,14 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } +log = { version = "0.4.17", default-features = false } +pallet-ddc-staking = { version = "0.1.0", default-features = false, path = "../ddc-staking" } +pallet-staking = { version = "4.0.0-dev", default-features = false, path = "../staking" } scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } +sp-io = { version = "6.0.0", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "6.0.0", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "4.0.0-dev", default-features = false, path = "../../primitives/staking" } +sp-std = { version = "4.0.0-dev", default-features = false, path = "../../primitives/std" } [features] default = ["std"] @@ -15,5 +22,11 @@ std = [ "codec/std", "frame-support/std", "frame-system/std", + "pallet-ddc-staking/std", + "pallet-staking/std", "scale-info/std", + "sp-io/std", + "sp-runtime/std", + "sp-staking/std", + "sp-std/std", ] diff --git a/src/lib.rs b/src/lib.rs index a9b774968..df766e369 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,8 +1,27 @@ #![cfg_attr(not(feature = "std"), no_std)] -pub use frame_support::pallet_prelude::*; +pub use frame_support::{pallet_prelude::*, parameter_types, weights::Weight, BoundedVec}; pub use frame_system::pallet_prelude::*; +pub use pallet_ddc_staking::{self as ddc_staking}; +pub use pallet_staking::{self as staking}; pub use pallet::*; +pub use sp_std::prelude::*; + +parameter_types! { + pub DdcValidatorsQuorumSize: u32 = 3; +} + +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] +pub enum ValidationMethodKind { + ProofOfDelivery, +} + +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] +pub struct Decision { + pub decision: Option, + pub method: ValidationMethodKind, + pub validator: AccountId, +} #[frame_support::pallet] pub mod pallet { @@ -13,14 +32,27 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config { + pub trait Config: frame_system::Config + pallet_staking::Config + ddc_staking::Config { type Event: From> + IsType<::Event>; } + #[pallet::storage] + #[pallet::getter(fn tasks)] + pub type Tasks = StorageMap< + _, + Twox64Concat, + T::AccountId, + BoundedVec, DdcValidatorsQuorumSize>, + >; + #[pallet::storage] #[pallet::getter(fn global_era_counter)] pub type GlobalEraCounter = StorageValue<_, u32>; + #[pallet::storage] + #[pallet::getter(fn last_managed_era)] + pub type LastManagedEra = StorageValue<_, u32>; + #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event {} @@ -42,4 +74,24 @@ pub mod pallet { Ok(()) } } + + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_initialize(block_number: T::BlockNumber) -> Weight { + let validators: Vec = >::iter_keys().collect(); + let edges: Vec = >::iter_keys().collect(); + log::info!( + "Block number: {:?}, global era: {:?}, last era: {:?}, validators: {:?}, edges: {:?}", + block_number, + >::get(), + >::get(), + validators, + edges, + ); + 0 + } + fn offchain_worker(block_number: T::BlockNumber) { + log::info!("Off-chain worker at block {:?}", block_number); + } + } } From c551411ed758ef06c70e59ea79125b3074012613 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 17 Mar 2023 14:25:39 +0100 Subject: [PATCH 039/583] add function fetch_tasks --- src/lib.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index df766e369..77d1d894b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -94,4 +94,20 @@ pub mod pallet { log::info!("Off-chain worker at block {:?}", block_number); } } + + impl Pallet { + /// Fetch the tasks related to current validator + fn fetch_tasks(validator: T::AccountId) -> Vec { + let mut cdn_nodes: Vec = vec![]; + for (cdn_id, cdn_tasks) in >::iter() { + for decision in cdn_tasks.iter() { + if decision.validator == validator { + cdn_nodes.push(cdn_id); + break; + } + } + } + cdn_nodes + } + } } From cb3c966d695da2ca9f9525d518b571adb402ab6b Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 20 Mar 2023 11:54:31 +0600 Subject: [PATCH 040/583] Assign a random DAC validator for each edge --- src/lib.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 77d1d894b..bb2dd7641 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,8 @@ #![cfg_attr(not(feature = "std"), no_std)] -pub use frame_support::{pallet_prelude::*, parameter_types, weights::Weight, BoundedVec}; +pub use frame_support::{ + pallet_prelude::*, parameter_types, traits::Randomness, weights::Weight, BoundedVec, +}; pub use frame_system::pallet_prelude::*; pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_staking::{self as staking}; @@ -34,6 +36,7 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config + pallet_staking::Config + ddc_staking::Config { type Event: From> + IsType<::Event>; + type Randomness: Randomness; } #[pallet::storage] @@ -79,15 +82,34 @@ pub mod pallet { impl Hooks> for Pallet { fn on_initialize(block_number: T::BlockNumber) -> Weight { let validators: Vec = >::iter_keys().collect(); + let validators_count = validators.len() as u32; let edges: Vec = >::iter_keys().collect(); log::info!( - "Block number: {:?}, global era: {:?}, last era: {:?}, validators: {:?}, edges: {:?}", + "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", block_number, >::get(), >::get(), + validators_count, validators, edges, ); + + // A naive approach assigns random validators for each edge. + for edge in edges { + let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = + Default::default(); + while !decisions.is_full() { + let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; + let validator: T::AccountId = validators[validator_idx].clone(); + let assignment = Decision { + validator, + method: ValidationMethodKind::ProofOfDelivery, + decision: None, + }; + decisions.try_push(assignment).unwrap(); + } + Tasks::::insert(edge, decisions); + } 0 } fn offchain_worker(block_number: T::BlockNumber) { @@ -109,5 +131,31 @@ pub mod pallet { } cdn_nodes } + + fn choose(total: u32) -> Option { + if total == 0 { + return None + } + let mut random_number = Self::generate_random_number(0); + + // Best effort attempt to remove bias from modulus operator. + for i in 1..128 { + if random_number < u32::MAX - u32::MAX % total { + break + } + + random_number = Self::generate_random_number(i); + } + + Some(random_number % total) + } + + fn generate_random_number(seed: u32) -> u32 { + let (random_seed, _) = T::Randomness::random(&(b"ddc-validator", seed).encode()); + let random_number = ::decode(&mut random_seed.as_ref()) + .expect("secure hashes should always be bigger than u32; qed"); + + random_number + } } } From eb02ac07ab2262ffd6f451371cdb06196e78c7b8 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 20 Mar 2023 14:27:15 +0600 Subject: [PATCH 041/583] Assign DAC validation tasks on era increment --- src/lib.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index bb2dd7641..a88d229d4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -81,6 +81,19 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(block_number: T::BlockNumber) -> Weight { + match (>::get(), >::get()) { + (Some(global_era_counter), Some(last_managed_era)) => { + if last_managed_era >= global_era_counter { + return 0 + } + >::put(global_era_counter); + }, + (Some(global_era_counter), None) => { + >::put(global_era_counter); + }, + _ => { return 0 }, + }; + let validators: Vec = >::iter_keys().collect(); let validators_count = validators.len() as u32; let edges: Vec = >::iter_keys().collect(); From 86d2174f8e08892cbb7a46b38880b1ba441b4627 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 20 Mar 2023 14:54:08 +0600 Subject: [PATCH 042/583] Format DAC Validator files --- src/lib.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a88d229d4..344048de9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,9 +4,9 @@ pub use frame_support::{ pallet_prelude::*, parameter_types, traits::Randomness, weights::Weight, BoundedVec, }; pub use frame_system::pallet_prelude::*; +pub use pallet::*; pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_staking::{self as staking}; -pub use pallet::*; pub use sp_std::prelude::*; parameter_types! { @@ -91,7 +91,7 @@ pub mod pallet { (Some(global_era_counter), None) => { >::put(global_era_counter); }, - _ => { return 0 }, + _ => return 0, }; let validators: Vec = >::iter_keys().collect(); @@ -125,6 +125,7 @@ pub mod pallet { } 0 } + fn offchain_worker(block_number: T::BlockNumber) { log::info!("Off-chain worker at block {:?}", block_number); } @@ -138,7 +139,7 @@ pub mod pallet { for decision in cdn_tasks.iter() { if decision.validator == validator { cdn_nodes.push(cdn_id); - break; + break } } } From 6a330d76946cfc6c3f79e517d0d24b3621845ae4 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 21 Mar 2023 15:15:39 +0100 Subject: [PATCH 043/583] adjust era --- src/lib.rs | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 344048de9..10f72a1ac 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,11 +8,16 @@ pub use pallet::*; pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_staking::{self as staking}; pub use sp_std::prelude::*; +pub use sp_io::offchain::timestamp; parameter_types! { pub DdcValidatorsQuorumSize: u32 = 3; } +const TIME_START_MS: u64 = 1_672_531_200_000; +const ERA_DURATION_MS: u64 = 120_000; +const ERA_IN_BLOCKS: u8 = 20; + #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] pub enum ValidationMethodKind { ProofOfDelivery, @@ -48,10 +53,6 @@ pub mod pallet { BoundedVec, DdcValidatorsQuorumSize>, >; - #[pallet::storage] - #[pallet::getter(fn global_era_counter)] - pub type GlobalEraCounter = StorageValue<_, u32>; - #[pallet::storage] #[pallet::getter(fn last_managed_era)] pub type LastManagedEra = StorageValue<_, u32>; @@ -63,21 +64,6 @@ pub mod pallet { #[pallet::error] pub enum Error {} - #[pallet::call] - impl Pallet { - #[pallet::weight(100_000)] - pub fn inc_era(origin: OriginFor) -> DispatchResult { - ensure_root(origin)?; - if let Some(era) = >::get() { - let new_era = era.checked_add(1).unwrap_or_default(); - >::put(new_era); - } else { - >::put(1); - } - Ok(()) - } - } - #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(block_number: T::BlockNumber) -> Weight { @@ -100,7 +86,7 @@ pub mod pallet { log::info!( "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", block_number, - >::get(), + Self::get_current_era(), >::get(), validators_count, validators, @@ -170,6 +156,9 @@ pub mod pallet { .expect("secure hashes should always be bigger than u32; qed"); random_number + // Get the current era; Shall we start era count from 0 or from 1? + fn get_current_era() -> u64 { + (timestamp().unix_millis() - TIME_START_MS) / ERA_DURATION_MS } } } From a9ed277ab846645e7293750bd820175dff17ca18 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 21 Mar 2023 15:40:37 +0100 Subject: [PATCH 044/583] fix era --- src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 10f72a1ac..3d708a0a1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -156,6 +156,8 @@ pub mod pallet { .expect("secure hashes should always be bigger than u32; qed"); random_number + } + // Get the current era; Shall we start era count from 0 or from 1? fn get_current_era() -> u64 { (timestamp().unix_millis() - TIME_START_MS) / ERA_DURATION_MS From 3b6a21bf91bd7b0be09ffc0c60615d36426878cd Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 22 Mar 2023 11:32:21 +0100 Subject: [PATCH 045/583] merge offchain worker with ddc validator --- Cargo.toml | 12 ++ src/lib.rs | 322 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 317 insertions(+), 17 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 057a274a2..55172f684 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,13 +4,20 @@ version = "0.1.0" edition = "2021" [dependencies] +alt_serde = { version = "1", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } log = { version = "0.4.17", default-features = false } +pallet-contracts = { version = '4.0.0-dev', default-features = false, path = "../contracts" } pallet-ddc-staking = { version = "0.1.0", default-features = false, path = "../ddc-staking" } pallet-staking = { version = "4.0.0-dev", default-features = false, path = "../staking" } +pallet-session = { version = "4.0.0-dev", path = "../session", default-features = false } scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } +serde = { version = "1.0.101", optional = true } +serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } +sp-keystore = { version = "0.12.0", default-features = false, path = "../../primitives/keystore", optional = true } +sp-core = { version = "6.0.0", default-features = false, path = "../../primitives/core" } sp-io = { version = "6.0.0", default-features = false, path = "../../primitives/io" } sp-runtime = { version = "6.0.0", default-features = false, path = "../../primitives/runtime" } sp-staking = { version = "4.0.0-dev", default-features = false, path = "../../primitives/staking" } @@ -22,9 +29,14 @@ std = [ "codec/std", "frame-support/std", "frame-system/std", + "pallet-contracts/std", "pallet-ddc-staking/std", "pallet-staking/std", + "pallet-session/std", "scale-info/std", + "serde", + "sp-keystore", + "sp-core/std", "sp-io/std", "sp-runtime/std", "sp-staking/std", diff --git a/src/lib.rs b/src/lib.rs index 3d708a0a1..9cab6656c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,23 +1,53 @@ #![cfg_attr(not(feature = "std"), no_std)] +pub use alloc::{format, string::String}; +pub use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; +pub use codec::{Encode, Decode, MaxEncodedLen, HasCompact}; +pub use core::fmt::Debug; pub use frame_support::{ - pallet_prelude::*, parameter_types, traits::Randomness, weights::Weight, BoundedVec, + decl_event, decl_module, decl_storage, + log::{error, info, warn}, + pallet_prelude::*, + traits::{Randomness, Currency}, + weights::Weight, + dispatch::DispatchResult, + RuntimeDebug, + BoundedVec, + parameter_types, }; -pub use frame_system::pallet_prelude::*; +pub use frame_system::{ensure_signed, pallet_prelude::*, offchain::{CreateSignedTransaction, Signer, SigningTypes, AppCrypto, SendSignedTransaction}}; pub use pallet::*; pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_staking::{self as staking}; +pub use pallet_session as session; +pub use scale_info::TypeInfo; +pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; +pub use sp_runtime::offchain::{http, Duration}; pub use sp_std::prelude::*; pub use sp_io::offchain::timestamp; +extern crate alloc; parameter_types! { pub DdcValidatorsQuorumSize: u32 = 3; } +type BalanceOf = <::Currency as Currency< + ::AccountId, +>>::Balance; + +type ResultStr = Result; + + +pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); + +pub const HTTP_TIMEOUT_MS: u64 = 30_000; + const TIME_START_MS: u64 = 1_672_531_200_000; const ERA_DURATION_MS: u64 = 120_000; const ERA_IN_BLOCKS: u8 = 20; +const DATA_PROVIDER_URL: &str = "http://localhost:7379/"; + #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] pub enum ValidationMethodKind { ProofOfDelivery, @@ -30,18 +60,112 @@ pub struct Decision { pub validator: AccountId, } +#[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo, Default)] +pub struct ValidationResult { + era: String, + signer: AccountId, + val_res: bool, + cdn_node_pub_key: String, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct RedisFtAggregate { + #[serde(rename = "FT.AGGREGATE")] + pub ft_aggregate: (u32, Vec, Vec), +} + +#[derive(Clone)] +struct BytesSent { + node_public_key: String, + era: String, + sum: u32, +} + +impl BytesSent { + pub fn new(aggregate: RedisFtAggregate) -> BytesSent { + let (_, values, values2) = aggregate.ft_aggregate; + + BytesSent { + node_public_key: values[1].clone(), + era: values[3].clone(), + sum: values[5].parse::().expect("bytesSentSum must be convertable to u32"), + } + } +} + +#[derive(Clone)] +struct BytesReceived { + node_public_key: String, + era: String, + sum: u32, +} + +impl BytesReceived { + pub fn new(aggregate: RedisFtAggregate) -> BytesReceived { + let (_, values, values2) = aggregate.ft_aggregate; + + BytesReceived { + node_public_key: values[1].clone(), + era: values[3].clone(), + sum: values[5].parse::().expect("bytesReceivedSum must be convertable to u32"), + } + } +} + +pub mod crypto { + use super::KEY_TYPE; + use frame_system::offchain::AppCrypto; + use sp_core::sr25519::Signature as Sr25519Signature; + use sp_runtime::{ + app_crypto::{app_crypto, sr25519}, + traits::Verify, + }; + app_crypto!(sr25519, KEY_TYPE); + + use sp_runtime::{MultiSignature, MultiSigner}; + + pub struct TestAuthId; + + impl AppCrypto<::Signer, Sr25519Signature> for TestAuthId { + type RuntimeAppPublic = Public; + type GenericSignature = sp_core::sr25519::Signature; + type GenericPublic = sp_core::sr25519::Public; + } + + impl AppCrypto for TestAuthId { + type RuntimeAppPublic = Public; + type GenericSignature = sp_core::sr25519::Signature; + type GenericPublic = sp_core::sr25519::Public; + } +} + #[frame_support::pallet] pub mod pallet { use super::*; #[pallet::pallet] + #[pallet::without_storage_info] #[pallet::generate_store(pub(super) trait Store)] pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config + pallet_staking::Config + ddc_staking::Config { + pub trait Config: + frame_system::Config + + pallet_contracts::Config + + pallet_session::Config::AccountId> + + pallet_staking::Config + + ddc_staking::Config + + CreateSignedTransaction> + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + { type Event: From> + IsType<::Event>; type Randomness: Randomness; + type Call: From>; + type AuthorityId: AppCrypto; } #[pallet::storage] @@ -55,26 +179,34 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn last_managed_era)] - pub type LastManagedEra = StorageValue<_, u32>; + pub type LastManagedEra = StorageValue<_, u64>; #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event {} + pub enum Event + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + {} #[pallet::error] pub enum Error {} #[pallet::hooks] - impl Hooks> for Pallet { + impl Hooks> for Pallet + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + { fn on_initialize(block_number: T::BlockNumber) -> Weight { - match (>::get(), >::get()) { - (Some(global_era_counter), Some(last_managed_era)) => { + match (Self::get_current_era(), >::get()) { + (global_era_counter, Some(last_managed_era)) => { if last_managed_era >= global_era_counter { return 0 } >::put(global_era_counter); }, - (Some(global_era_counter), None) => { + (global_era_counter, None) => { >::put(global_era_counter); }, _ => return 0, @@ -113,11 +245,172 @@ pub mod pallet { } fn offchain_worker(block_number: T::BlockNumber) { - log::info!("Off-chain worker at block {:?}", block_number); + let res = Self::offchain_worker_main(block_number); + + match res { + Ok(()) => info!("[DAC Validator] DAC Validator is suspended."), + Err(err) => error!("[DAC Validator] Error in Offchain Worker: {}", err), + }; } } - impl Pallet { + #[pallet::call] + impl Pallet + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + { + #[pallet::weight(10000)] + pub fn save_validated_data(origin: OriginFor, val_res: bool, cdn_node_pub_key: String, era: String) -> DispatchResult { + let signer: T::AccountId = ensure_signed(origin)?; + + info!("[DAC Validator] author: {:?}", signer); + let mut v_results = ValidationResults::::get(); + + let cur_validation = ValidationResult:: { + era, + val_res, + cdn_node_pub_key, + signer, + }; + + v_results.push(cur_validation); + + ValidationResults::::set(v_results); + + Ok(()) + } + } + + impl Pallet + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + { + fn offchain_worker_main(block_number: T::BlockNumber) -> ResultStr<()> { + info!("[DAC Validator] Validation data stored onchain: {:?}", ValidationResults::::get()); + + if block_number % ERA_IN_BLOCKS.into() != 0u32.into() { + return Ok(()) + } + + let signer = match Self::get_signer() { + Err(e) => { + warn!("{:?}", e); + return Ok(()); + } + Ok(signer) => signer, + }; + + info!("[DAC Validator] ValidationResults: {:?}", ValidationResults::::get()); + + // Read data from DataModel and do dumb validation + let current_era = Self::get_current_era() - 1u64; + let (bytes_sent, bytes_received) = Self::fetch_data(current_era); + let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); + + let cdn_node_pub_key = bytes_sent.node_public_key.clone(); + let tx_res = signer.send_signed_transaction(|_acct| { + info!("[DAC Validator] Sending save_validated_data tx"); + + // This is the on-chain function + Call::save_validated_data { val_res, cdn_node_pub_key: cdn_node_pub_key.clone(), era: bytes_sent.era.clone() } + }); + + match &tx_res { + None | Some((_, Err(()))) => { + return Err("Error while submitting save_validated_data TX") + } + Some((_, Ok(()))) => {} + } + + Ok(()) + } + + fn get_signer() -> ResultStr> { + let signer = Signer::<_, _>::any_account(); + if !signer.can_sign() { + return Err("[DAC Validator] No local accounts available. Consider adding one via `author_insertKey` RPC."); + } + + Ok(signer) + } + + // Get the current era; Shall we start era count from 0 or from 1? + fn get_current_era() -> u64 { + (timestamp().unix_millis() - TIME_START_MS) / ERA_DURATION_MS + } + + fn fetch_data(era: u64 ) -> (BytesSent, BytesReceived){ + info!("[DAC Validator] DAC Validator is running. Current era is {}", era); + // Todo: handle the error + let bytes_sent_query = Self::get_bytes_sent_query_url(era); + let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); + info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); + let bytes_sent = BytesSent::new(bytes_sent_res); + + // Todo: handle the error + let bytes_received_query = Self::get_bytes_received_query_url(era); + let bytes_received_res: RedisFtAggregate = + Self::http_get_json(&bytes_received_query).unwrap(); + info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); + let bytes_received = BytesReceived::new(bytes_received_res); + + (bytes_sent, bytes_received) + } + + fn get_bytes_sent_query_url(era: u64) -> String { + format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era) + } + + fn get_bytes_received_query_url(era: u64) -> String { + format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era) + } + + fn http_get_json(url: &str) -> ResultStr { + let body = Self::http_get_request(url).map_err(|err| { + error!("[DAC Validator] Error while getting {}: {:?}", url, err); + "HTTP GET error" + })?; + + let parsed = serde_json::from_slice(&body).map_err(|err| { + warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); + "HTTP JSON parse error" + }); + + parsed + } + + fn http_get_request(http_url: &str) -> Result, http::Error> { + info!("[DAC Validator] Sending request to: {:?}", http_url); + + // Initiate an external HTTP GET request. This is using high-level wrappers from + // `sp_runtime`. + let request = http::Request::get(http_url); + + let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); + + let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; + + let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; + + if response.code != 200 { + warn!("[DAC Validator] http_get_request unexpected status code: {}", response.code); + return Err(http::Error::Unknown) + } + + // Next we fully read the response body and collect it to a vector of bytes. + Ok(response.body().collect::>()) + } + + fn validate(bytes_sent: BytesSent, bytes_received: BytesReceived) -> bool { + return if bytes_sent.sum == bytes_received.sum { + true + } else { + false + } + } + /// Fetch the tasks related to current validator fn fetch_tasks(validator: T::AccountId) -> Vec { let mut cdn_nodes: Vec = vec![]; @@ -151,16 +444,11 @@ pub mod pallet { } fn generate_random_number(seed: u32) -> u32 { - let (random_seed, _) = T::Randomness::random(&(b"ddc-validator", seed).encode()); + let (random_seed, _) = ::Randomness::random(&(b"ddc-validator", seed).encode()); let random_number = ::decode(&mut random_seed.as_ref()) .expect("secure hashes should always be bigger than u32; qed"); random_number } - - // Get the current era; Shall we start era count from 0 or from 1? - fn get_current_era() -> u64 { - (timestamp().unix_millis() - TIME_START_MS) / ERA_DURATION_MS - } } } From f50b16da0e394c5ceecca6ad1e243245b4201491 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 22 Mar 2023 14:43:26 +0100 Subject: [PATCH 046/583] add proof of delivery --- src/lib.rs | 75 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 9cab6656c..52219d6dc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -181,6 +181,10 @@ pub mod pallet { #[pallet::getter(fn last_managed_era)] pub type LastManagedEra = StorageValue<_, u64>; + #[pallet::storage] + #[pallet::getter(fn validation_results)] + pub(super) type ValidationResults = StorageValue<_, Vec>, ValueQuery>; + #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event @@ -209,7 +213,6 @@ pub mod pallet { (global_era_counter, None) => { >::put(global_era_counter); }, - _ => return 0, }; let validators: Vec = >::iter_keys().collect(); @@ -280,6 +283,27 @@ pub mod pallet { Ok(()) } + + #[pallet::weight(10000)] + pub fn proof_of_delivery(origin: OriginFor, era: u64) -> DispatchResult { + let signer: T::AccountId = ensure_signed(origin)?; + + let cdn_nodes_to_validate = Self::fetch_tasks(&signer); + for cdn_node_id in cdn_nodes_to_validate { + let (bytes_sent, bytes_received) = Self::fetch_data(era, &cdn_node_id); + let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); + + let decisions_for_cdn = >::get(cdn_node_id); + for decision in decisions_for_cdn.unwrap().iter_mut() { + if decision.validator == signer { + decision.decision = Some(val_res); + decision.method = ValidationMethodKind::ProofOfDelivery; + } + } + } + + Ok(()) + } } impl Pallet @@ -306,23 +330,26 @@ pub mod pallet { // Read data from DataModel and do dumb validation let current_era = Self::get_current_era() - 1u64; - let (bytes_sent, bytes_received) = Self::fetch_data(current_era); - let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); - let cdn_node_pub_key = bytes_sent.node_public_key.clone(); - let tx_res = signer.send_signed_transaction(|_acct| { - info!("[DAC Validator] Sending save_validated_data tx"); + // for decision in &mut cdn_nodes_to_validate { - // This is the on-chain function - Call::save_validated_data { val_res, cdn_node_pub_key: cdn_node_pub_key.clone(), era: bytes_sent.era.clone() } - }); + // } + // let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); + // let cdn_node_pub_key = bytes_sent.node_public_key.clone(); - match &tx_res { - None | Some((_, Err(()))) => { - return Err("Error while submitting save_validated_data TX") - } - Some((_, Ok(()))) => {} - } + // let tx_res = signer.send_signed_transaction(|_acct| { + // info!("[DAC Validator] Sending save_validated_data tx"); + + // // This is the on-chain function + // Call::save_validated_data { val_res, cdn_node_pub_key: cdn_node_pub_key.clone(), era: bytes_sent.era.clone() } + // }); + + // match &tx_res { + // None | Some((_, Err(()))) => { + // return Err("Error while submitting save_validated_data TX") + // } + // Some((_, Ok(()))) => {} + // } Ok(()) } @@ -341,16 +368,16 @@ pub mod pallet { (timestamp().unix_millis() - TIME_START_MS) / ERA_DURATION_MS } - fn fetch_data(era: u64 ) -> (BytesSent, BytesReceived){ + fn fetch_data(era: u64, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error - let bytes_sent_query = Self::get_bytes_sent_query_url(era); + let bytes_sent_query = Self::get_bytes_sent_query_url(era, cdn_node); let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); let bytes_sent = BytesSent::new(bytes_sent_res); // Todo: handle the error - let bytes_received_query = Self::get_bytes_received_query_url(era); + let bytes_received_query = Self::get_bytes_received_query_url(era, cdn_node); let bytes_received_res: RedisFtAggregate = Self::http_get_json(&bytes_received_query).unwrap(); info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); @@ -359,12 +386,12 @@ pub mod pallet { (bytes_sent, bytes_received) } - fn get_bytes_sent_query_url(era: u64) -> String { - format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era) + fn get_bytes_sent_query_url(era: u64, cdn_node: &T::AccountId) -> String { + format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/{:?}/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era, *cdn_node) } - fn get_bytes_received_query_url(era: u64) -> String { - format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era) + fn get_bytes_received_query_url(era: u64, cdn_node: &T::AccountId) -> String { + format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/{:?}/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era, *cdn_node) } fn http_get_json(url: &str) -> ResultStr { @@ -412,11 +439,11 @@ pub mod pallet { } /// Fetch the tasks related to current validator - fn fetch_tasks(validator: T::AccountId) -> Vec { + fn fetch_tasks(validator: &T::AccountId) -> Vec { let mut cdn_nodes: Vec = vec![]; for (cdn_id, cdn_tasks) in >::iter() { for decision in cdn_tasks.iter() { - if decision.validator == validator { + if decision.validator == *validator { cdn_nodes.push(cdn_id); break } From b906084a0eb6f18dae06bb2d6ef5752a5ff90fbc Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 22 Mar 2023 14:45:48 +0100 Subject: [PATCH 047/583] add PoD trigger in offchain worker --- src/lib.rs | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 52219d6dc..d599567be 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -331,25 +331,20 @@ pub mod pallet { // Read data from DataModel and do dumb validation let current_era = Self::get_current_era() - 1u64; - // for decision in &mut cdn_nodes_to_validate { + + let tx_res = signer.send_signed_transaction(|_acct| { + info!("[DAC Validator] Trigger proof of delivery"); - // } - // let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); - // let cdn_node_pub_key = bytes_sent.node_public_key.clone(); - - // let tx_res = signer.send_signed_transaction(|_acct| { - // info!("[DAC Validator] Sending save_validated_data tx"); - - // // This is the on-chain function - // Call::save_validated_data { val_res, cdn_node_pub_key: cdn_node_pub_key.clone(), era: bytes_sent.era.clone() } - // }); + // This is the on-chain function + Call::proof_of_delivery { era: current_era } + }); - // match &tx_res { - // None | Some((_, Err(()))) => { - // return Err("Error while submitting save_validated_data TX") - // } - // Some((_, Ok(()))) => {} - // } + match &tx_res { + None | Some((_, Err(()))) => { + return Err("Error while submitting proof of delivery TX") + } + Some((_, Ok(()))) => {} + } Ok(()) } From f9dd9a0de6264af4ccb522163500de6b83552d72 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Thu, 23 Mar 2023 11:47:35 +0100 Subject: [PATCH 048/583] Move JSON parsing fix to ddc-validator --- src/lib.rs | 58 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index d599567be..2b1d5245e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -72,8 +72,16 @@ pub struct ValidationResult { #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct RedisFtAggregate { - #[serde(rename = "FT.AGGREGATE")] - pub ft_aggregate: (u32, Vec, Vec), + #[serde(rename = "FT.AGGREGATE")] + pub ft_aggregate: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(crate = "alt_serde")] +#[serde(untagged)] +pub enum FtAggregate { + Length(u32), + Node(Vec), } #[derive(Clone)] @@ -84,15 +92,20 @@ struct BytesSent { } impl BytesSent { - pub fn new(aggregate: RedisFtAggregate) -> BytesSent { - let (_, values, values2) = aggregate.ft_aggregate; - - BytesSent { - node_public_key: values[1].clone(), - era: values[3].clone(), - sum: values[5].parse::().expect("bytesSentSum must be convertable to u32"), - } - } + pub fn new(aggregate: RedisFtAggregate) -> BytesSent { + let data = aggregate.ft_aggregate[1].clone(); + + match data { + FtAggregate::Node(node) => { + return BytesSent { + node_public_key: node[1].clone(), + era: node[3].clone(), + sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), + } + } + FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), + } + } } #[derive(Clone)] @@ -103,15 +116,20 @@ struct BytesReceived { } impl BytesReceived { - pub fn new(aggregate: RedisFtAggregate) -> BytesReceived { - let (_, values, values2) = aggregate.ft_aggregate; - - BytesReceived { - node_public_key: values[1].clone(), - era: values[3].clone(), - sum: values[5].parse::().expect("bytesReceivedSum must be convertable to u32"), - } - } + pub fn new(aggregate: RedisFtAggregate) -> BytesReceived { + let data = aggregate.ft_aggregate[1].clone(); + + match data { + FtAggregate::Node(node) => { + return BytesReceived { + node_public_key: node[1].clone(), + era: node[3].clone(), + sum: node[5].parse::().expect("bytesReceivedSum must be convertable to u32"), + } + } + FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), + } + } } pub mod crypto { From 0cbef5016c24e9161e47f040a0af40a26d974a4a Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 23 Mar 2023 15:23:09 +0100 Subject: [PATCH 049/583] fix timestamp bug --- src/lib.rs | 96 +++++++++++++++++++++++++++++------------------------- 1 file changed, 51 insertions(+), 45 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 2b1d5245e..e7481fe6e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,7 +8,7 @@ pub use frame_support::{ decl_event, decl_module, decl_storage, log::{error, info, warn}, pallet_prelude::*, - traits::{Randomness, Currency}, + traits::{Randomness, Currency, UnixTime}, weights::Weight, dispatch::DispatchResult, RuntimeDebug, @@ -22,9 +22,9 @@ pub use pallet_staking::{self as staking}; pub use pallet_session as session; pub use scale_info::TypeInfo; pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; -pub use sp_runtime::offchain::{http, Duration}; +pub use sp_runtime::offchain::{http, Duration, Timestamp}; pub use sp_std::prelude::*; -pub use sp_io::offchain::timestamp; + extern crate alloc; parameter_types! { @@ -42,8 +42,8 @@ pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); pub const HTTP_TIMEOUT_MS: u64 = 30_000; -const TIME_START_MS: u64 = 1_672_531_200_000; -const ERA_DURATION_MS: u64 = 120_000; +const TIME_START_MS: u128 = 1_672_531_200_000; +const ERA_DURATION_MS: u128 = 120_000; const ERA_IN_BLOCKS: u8 = 20; const DATA_PROVIDER_URL: &str = "http://localhost:7379/"; @@ -184,6 +184,7 @@ pub mod pallet { type Randomness: Randomness; type Call: From>; type AuthorityId: AppCrypto; + type TimeProvider: UnixTime; } #[pallet::storage] @@ -221,48 +222,53 @@ pub mod pallet { as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn on_initialize(block_number: T::BlockNumber) -> Weight { - match (Self::get_current_era(), >::get()) { - (global_era_counter, Some(last_managed_era)) => { - if last_managed_era >= global_era_counter { - return 0 + if block_number != 0u32.into() && block_number != 1u32.into() { + let era = Self::get_current_era(); + match (era, >::get()) { + (global_era_counter, Some(last_managed_era)) => { + if last_managed_era >= global_era_counter { + return 0 + } + >::put(global_era_counter); + }, + (global_era_counter, None) => { + >::put(global_era_counter); + }, + }; + + let validators: Vec = >::iter_keys().collect(); + let validators_count = validators.len() as u32; + let edges: Vec = >::iter_keys().collect(); + log::info!( + "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", + block_number, + era, + >::get(), + validators_count, + validators, + edges, + ); + + // A naive approach assigns random validators for each edge. + for edge in edges { + let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = + Default::default(); + while !decisions.is_full() { + let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; + let validator: T::AccountId = validators[validator_idx].clone(); + let assignment = Decision { + validator, + method: ValidationMethodKind::ProofOfDelivery, + decision: None, + }; + decisions.try_push(assignment).unwrap(); } - >::put(global_era_counter); - }, - (global_era_counter, None) => { - >::put(global_era_counter); - }, - }; - - let validators: Vec = >::iter_keys().collect(); - let validators_count = validators.len() as u32; - let edges: Vec = >::iter_keys().collect(); - log::info!( - "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", - block_number, - Self::get_current_era(), - >::get(), - validators_count, - validators, - edges, - ); - - // A naive approach assigns random validators for each edge. - for edge in edges { - let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = - Default::default(); - while !decisions.is_full() { - let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; - let validator: T::AccountId = validators[validator_idx].clone(); - let assignment = Decision { - validator, - method: ValidationMethodKind::ProofOfDelivery, - decision: None, - }; - decisions.try_push(assignment).unwrap(); + Tasks::::insert(edge, decisions); } - Tasks::::insert(edge, decisions); + 0 + } else { + 0 } - 0 } fn offchain_worker(block_number: T::BlockNumber) { @@ -378,7 +384,7 @@ pub mod pallet { // Get the current era; Shall we start era count from 0 or from 1? fn get_current_era() -> u64 { - (timestamp().unix_millis() - TIME_START_MS) / ERA_DURATION_MS + ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS).try_into().unwrap() } fn fetch_data(era: u64, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { From 427f79ec813e9a7a3bfd9ab84de1b3a60ce766fd Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 24 Mar 2023 11:17:31 +0600 Subject: [PATCH 050/583] Autoformat DAC Validator files --- Cargo.toml | 8 +-- src/lib.rs | 205 +++++++++++++++++++++++++++-------------------------- 2 files changed, 109 insertions(+), 104 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 55172f684..af7a0108e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,14 +11,14 @@ frame-system = { version = "4.0.0-dev", default-features = false, path = "../sys log = { version = "0.4.17", default-features = false } pallet-contracts = { version = '4.0.0-dev', default-features = false, path = "../contracts" } pallet-ddc-staking = { version = "0.1.0", default-features = false, path = "../ddc-staking" } -pallet-staking = { version = "4.0.0-dev", default-features = false, path = "../staking" } pallet-session = { version = "4.0.0-dev", path = "../session", default-features = false } +pallet-staking = { version = "4.0.0-dev", default-features = false, path = "../staking" } scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } -sp-keystore = { version = "0.12.0", default-features = false, path = "../../primitives/keystore", optional = true } sp-core = { version = "6.0.0", default-features = false, path = "../../primitives/core" } sp-io = { version = "6.0.0", default-features = false, path = "../../primitives/io" } +sp-keystore = { version = "0.12.0", default-features = false, path = "../../primitives/keystore", optional = true } sp-runtime = { version = "6.0.0", default-features = false, path = "../../primitives/runtime" } sp-staking = { version = "4.0.0-dev", default-features = false, path = "../../primitives/staking" } sp-std = { version = "4.0.0-dev", default-features = false, path = "../../primitives/std" } @@ -31,13 +31,13 @@ std = [ "frame-system/std", "pallet-contracts/std", "pallet-ddc-staking/std", - "pallet-staking/std", "pallet-session/std", + "pallet-staking/std", "scale-info/std", "serde", - "sp-keystore", "sp-core/std", "sp-io/std", + "sp-keystore", "sp-runtime/std", "sp-staking/std", "sp-std/std", diff --git a/src/lib.rs b/src/lib.rs index e7481fe6e..a2e6586a8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,24 +2,27 @@ pub use alloc::{format, string::String}; pub use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; -pub use codec::{Encode, Decode, MaxEncodedLen, HasCompact}; +pub use codec::{Decode, Encode, HasCompact, MaxEncodedLen}; pub use core::fmt::Debug; pub use frame_support::{ decl_event, decl_module, decl_storage, - log::{error, info, warn}, - pallet_prelude::*, - traits::{Randomness, Currency, UnixTime}, - weights::Weight, dispatch::DispatchResult, - RuntimeDebug, - BoundedVec, + log::{error, info, warn}, + pallet_prelude::*, parameter_types, + traits::{Currency, Randomness, UnixTime}, + weights::Weight, + BoundedVec, RuntimeDebug, +}; +pub use frame_system::{ + ensure_signed, + offchain::{AppCrypto, CreateSignedTransaction, SendSignedTransaction, Signer, SigningTypes}, + pallet_prelude::*, }; -pub use frame_system::{ensure_signed, pallet_prelude::*, offchain::{CreateSignedTransaction, Signer, SigningTypes, AppCrypto, SendSignedTransaction}}; pub use pallet::*; pub use pallet_ddc_staking::{self as ddc_staking}; -pub use pallet_staking::{self as staking}; pub use pallet_session as session; +pub use pallet_staking::{self as staking}; pub use scale_info::TypeInfo; pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; pub use sp_runtime::offchain::{http, Duration, Timestamp}; @@ -32,12 +35,11 @@ parameter_types! { } type BalanceOf = <::Currency as Currency< - ::AccountId, + ::AccountId, >>::Balance; type ResultStr = Result; - pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); pub const HTTP_TIMEOUT_MS: u64 = 30_000; @@ -62,10 +64,10 @@ pub struct Decision { #[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo, Default)] pub struct ValidationResult { - era: String, - signer: AccountId, - val_res: bool, - cdn_node_pub_key: String, + era: String, + signer: AccountId, + val_res: bool, + cdn_node_pub_key: String, } #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] @@ -86,9 +88,9 @@ pub enum FtAggregate { #[derive(Clone)] struct BytesSent { - node_public_key: String, - era: String, - sum: u32, + node_public_key: String, + era: String, + sum: u32, } impl BytesSent { @@ -96,13 +98,12 @@ impl BytesSent { let data = aggregate.ft_aggregate[1].clone(); match data { - FtAggregate::Node(node) => { + FtAggregate::Node(node) => return BytesSent { node_public_key: node[1].clone(), era: node[3].clone(), sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), - } - } + }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } } @@ -110,9 +111,9 @@ impl BytesSent { #[derive(Clone)] struct BytesReceived { - node_public_key: String, - era: String, - sum: u32, + node_public_key: String, + era: String, + sum: u32, } impl BytesReceived { @@ -120,13 +121,14 @@ impl BytesReceived { let data = aggregate.ft_aggregate[1].clone(); match data { - FtAggregate::Node(node) => { + FtAggregate::Node(node) => return BytesReceived { node_public_key: node[1].clone(), era: node[3].clone(), - sum: node[5].parse::().expect("bytesReceivedSum must be convertable to u32"), - } - } + sum: node[5] + .parse::() + .expect("bytesReceivedSum must be convertable to u32"), + }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } } @@ -137,8 +139,8 @@ pub mod crypto { use frame_system::offchain::AppCrypto; use sp_core::sr25519::Signature as Sr25519Signature; use sp_runtime::{ - app_crypto::{app_crypto, sr25519}, - traits::Verify, + app_crypto::{app_crypto, sr25519}, + traits::Verify, }; app_crypto!(sr25519, KEY_TYPE); @@ -147,15 +149,15 @@ pub mod crypto { pub struct TestAuthId; impl AppCrypto<::Signer, Sr25519Signature> for TestAuthId { - type RuntimeAppPublic = Public; - type GenericSignature = sp_core::sr25519::Signature; - type GenericPublic = sp_core::sr25519::Public; + type RuntimeAppPublic = Public; + type GenericSignature = sp_core::sr25519::Signature; + type GenericPublic = sp_core::sr25519::Public; } impl AppCrypto for TestAuthId { - type RuntimeAppPublic = Public; - type GenericSignature = sp_core::sr25519::Signature; - type GenericPublic = sp_core::sr25519::Public; + type RuntimeAppPublic = Public; + type GenericSignature = sp_core::sr25519::Signature; + type GenericPublic = sp_core::sr25519::Public; } } @@ -169,21 +171,21 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: + pub trait Config: frame_system::Config + pallet_contracts::Config - + pallet_session::Config::AccountId> + + pallet_session::Config::AccountId> + pallet_staking::Config + ddc_staking::Config + CreateSignedTransaction> - where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { type Event: From> + IsType<::Event>; type Randomness: Randomness; type Call: From>; - type AuthorityId: AppCrypto; + type AuthorityId: AppCrypto; type TimeProvider: UnixTime; } @@ -202,28 +204,28 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn validation_results)] - pub(super) type ValidationResults = StorageValue<_, Vec>, ValueQuery>; + pub(super) type ValidationResults = + StorageValue<_, Vec>, ValueQuery>; #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event + pub enum Event where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, - {} + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, {} #[pallet::error] pub enum Error {} #[pallet::hooks] - impl Hooks> for Pallet + impl Hooks> for Pallet where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn on_initialize(block_number: T::BlockNumber) -> Weight { if block_number != 0u32.into() && block_number != 1u32.into() { - let era = Self::get_current_era(); + let era = Self::get_current_era(); match (era, >::get()) { (global_era_counter, Some(last_managed_era)) => { if last_managed_era >= global_era_counter { @@ -235,10 +237,11 @@ pub mod pallet { >::put(global_era_counter); }, }; - + let validators: Vec = >::iter_keys().collect(); let validators_count = validators.len() as u32; - let edges: Vec = >::iter_keys().collect(); + let edges: Vec = + >::iter_keys().collect(); log::info!( "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", block_number, @@ -248,7 +251,7 @@ pub mod pallet { validators, edges, ); - + // A naive approach assigns random validators for each edge. for edge in edges { let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = @@ -282,24 +285,25 @@ pub mod pallet { } #[pallet::call] - impl Pallet - where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + impl Pallet + where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { #[pallet::weight(10000)] - pub fn save_validated_data(origin: OriginFor, val_res: bool, cdn_node_pub_key: String, era: String) -> DispatchResult { + pub fn save_validated_data( + origin: OriginFor, + val_res: bool, + cdn_node_pub_key: String, + era: String, + ) -> DispatchResult { let signer: T::AccountId = ensure_signed(origin)?; info!("[DAC Validator] author: {:?}", signer); let mut v_results = ValidationResults::::get(); - let cur_validation = ValidationResult:: { - era, - val_res, - cdn_node_pub_key, - signer, - }; + let cur_validation = + ValidationResult:: { era, val_res, cdn_node_pub_key, signer }; v_results.push(cur_validation); @@ -330,24 +334,27 @@ pub mod pallet { } } - impl Pallet + impl Pallet where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn offchain_worker_main(block_number: T::BlockNumber) -> ResultStr<()> { - info!("[DAC Validator] Validation data stored onchain: {:?}", ValidationResults::::get()); + info!( + "[DAC Validator] Validation data stored onchain: {:?}", + ValidationResults::::get() + ); if block_number % ERA_IN_BLOCKS.into() != 0u32.into() { - return Ok(()) + return Ok(()) } let signer = match Self::get_signer() { - Err(e) => { - warn!("{:?}", e); - return Ok(()); - } - Ok(signer) => signer, + Err(e) => { + warn!("{:?}", e); + return Ok(()) + }, + Ok(signer) => signer, }; info!("[DAC Validator] ValidationResults: {:?}", ValidationResults::::get()); @@ -355,19 +362,17 @@ pub mod pallet { // Read data from DataModel and do dumb validation let current_era = Self::get_current_era() - 1u64; - let tx_res = signer.send_signed_transaction(|_acct| { - info!("[DAC Validator] Trigger proof of delivery"); + info!("[DAC Validator] Trigger proof of delivery"); - // This is the on-chain function - Call::proof_of_delivery { era: current_era } + // This is the on-chain function + Call::proof_of_delivery { era: current_era } }); match &tx_res { - None | Some((_, Err(()))) => { - return Err("Error while submitting proof of delivery TX") - } - Some((_, Ok(()))) => {} + None | Some((_, Err(()))) => + return Err("Error while submitting proof of delivery TX"), + Some((_, Ok(()))) => {}, } Ok(()) @@ -376,7 +381,7 @@ pub mod pallet { fn get_signer() -> ResultStr> { let signer = Signer::<_, _>::any_account(); if !signer.can_sign() { - return Err("[DAC Validator] No local accounts available. Consider adding one via `author_insertKey` RPC."); + return Err("[DAC Validator] No local accounts available. Consider adding one via `author_insertKey` RPC."); } Ok(signer) @@ -384,7 +389,9 @@ pub mod pallet { // Get the current era; Shall we start era count from 0 or from 1? fn get_current_era() -> u64 { - ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS).try_into().unwrap() + ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS) + .try_into() + .unwrap() } fn fetch_data(era: u64, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { @@ -398,7 +405,7 @@ pub mod pallet { // Todo: handle the error let bytes_received_query = Self::get_bytes_received_query_url(era, cdn_node); let bytes_received_res: RedisFtAggregate = - Self::http_get_json(&bytes_received_query).unwrap(); + Self::http_get_json(&bytes_received_query).unwrap(); info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); let bytes_received = BytesReceived::new(bytes_received_res); @@ -415,13 +422,13 @@ pub mod pallet { fn http_get_json(url: &str) -> ResultStr { let body = Self::http_get_request(url).map_err(|err| { - error!("[DAC Validator] Error while getting {}: {:?}", url, err); - "HTTP GET error" + error!("[DAC Validator] Error while getting {}: {:?}", url, err); + "HTTP GET error" })?; let parsed = serde_json::from_slice(&body).map_err(|err| { - warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); - "HTTP JSON parse error" + warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); + "HTTP JSON parse error" }); parsed @@ -438,23 +445,20 @@ pub mod pallet { let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; - let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; + let response = + pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; if response.code != 200 { - warn!("[DAC Validator] http_get_request unexpected status code: {}", response.code); - return Err(http::Error::Unknown) + warn!("[DAC Validator] http_get_request unexpected status code: {}", response.code); + return Err(http::Error::Unknown) } // Next we fully read the response body and collect it to a vector of bytes. Ok(response.body().collect::>()) - } + } fn validate(bytes_sent: BytesSent, bytes_received: BytesReceived) -> bool { - return if bytes_sent.sum == bytes_received.sum { - true - } else { - false - } + return if bytes_sent.sum == bytes_received.sum { true } else { false } } /// Fetch the tasks related to current validator @@ -490,7 +494,8 @@ pub mod pallet { } fn generate_random_number(seed: u32) -> u32 { - let (random_seed, _) = ::Randomness::random(&(b"ddc-validator", seed).encode()); + let (random_seed, _) = + ::Randomness::random(&(b"ddc-validator", seed).encode()); let random_number = ::decode(&mut random_seed.as_ref()) .expect("secure hashes should always be bigger than u32; qed"); From 673cd9312048da38a2aaaf8636688581e0ffc5d8 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 24 Mar 2023 12:02:07 +0100 Subject: [PATCH 051/583] add filtering of requests --- Cargo.toml | 1 + src/lib.rs | 91 +++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 85 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index af7a0108e..0e0fe0ea9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] +array-bytes = "6.0.0" alt_serde = { version = "1", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } diff --git a/src/lib.rs b/src/lib.rs index a2e6586a8..5a553ca1d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -107,6 +107,27 @@ impl BytesSent { FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } } + + pub fn get_all(aggregation: RedisFtAggregate) -> Vec { + let mut res: Vec = vec!(); + for i in 1..aggregation.ft_aggregate.len() { + let data = aggregation.ft_aggregate[i].clone(); + match data { + FtAggregate::Node(node) => { + let node = BytesSent { + node_public_key: node[1].clone(), + era: node[3].clone(), + sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), + }; + + res.push(node); + } + FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), + } + } + + return res; + } } #[derive(Clone)] @@ -132,6 +153,27 @@ impl BytesReceived { FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } } + + pub fn get_all(aggregation: RedisFtAggregate) -> Vec { + let mut res: Vec = vec!(); + for i in 1..aggregation.ft_aggregate.len() { + let data = aggregation.ft_aggregate[i].clone(); + match data { + FtAggregate::Node(node) => { + let node = BytesReceived { + node_public_key: node[1].clone(), + era: node[3].clone(), + sum: node[5].parse::().expect("bytesReceivedSum must be convertable to u32"), + }; + + res.push(node); + } + FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), + } + } + + return res; + } } pub mod crypto { @@ -317,8 +359,9 @@ pub mod pallet { let signer: T::AccountId = ensure_signed(origin)?; let cdn_nodes_to_validate = Self::fetch_tasks(&signer); + let (s, r) = Self::fetch_data1(era); for cdn_node_id in cdn_nodes_to_validate { - let (bytes_sent, bytes_received) = Self::fetch_data(era, &cdn_node_id); + let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); let decisions_for_cdn = >::get(cdn_node_id); @@ -397,13 +440,13 @@ pub mod pallet { fn fetch_data(era: u64, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error - let bytes_sent_query = Self::get_bytes_sent_query_url(era, cdn_node); + let bytes_sent_query = Self::get_bytes_sent_query_url(era); let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); let bytes_sent = BytesSent::new(bytes_sent_res); // Todo: handle the error - let bytes_received_query = Self::get_bytes_received_query_url(era, cdn_node); + let bytes_received_query = Self::get_bytes_received_query_url(era); let bytes_received_res: RedisFtAggregate = Self::http_get_json(&bytes_received_query).unwrap(); info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); @@ -412,12 +455,46 @@ pub mod pallet { (bytes_sent, bytes_received) } - fn get_bytes_sent_query_url(era: u64, cdn_node: &T::AccountId) -> String { - format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/{:?}/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era, *cdn_node) + fn account_to_string(account: T::AccountId) -> String { + let to32 = T::AccountId::encode(&account); + let pub_key_str = array_bytes::bytes2hex("", to32); + + pub_key_str + } + + fn filter_data(s: &Vec, r: &Vec, a: &T::AccountId) -> (BytesSent, BytesReceived){ + let ac = Self::account_to_string(a.clone()); + + let filtered_s = &*s.into_iter().find(|bs| bs.node_public_key == ac).unwrap(); + let filtered_r = &*r.into_iter().find(|br| br.node_public_key == ac).unwrap(); + + (filtered_s.clone(), filtered_r.clone()) + } + + fn fetch_data1(era: u64 ) -> (Vec, Vec){ + info!("[DAC Validator] DAC Validator is running. Current era is {}", era); + // Todo: handle the error + let bytes_sent_query = Self::get_bytes_sent_query_url(era); + let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); + info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); + let bytes_sent = BytesSent::get_all(bytes_sent_res); + + // Todo: handle the error + let bytes_received_query = Self::get_bytes_received_query_url(era); + let bytes_received_res: RedisFtAggregate = + Self::http_get_json(&bytes_received_query).unwrap(); + info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); + let bytes_received = BytesReceived::get_all(bytes_received_res); + + (bytes_sent, bytes_received) + } + + fn get_bytes_sent_query_url(era: u64) -> String { + format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era) } - fn get_bytes_received_query_url(era: u64, cdn_node: &T::AccountId) -> String { - format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/{:?}/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era, *cdn_node) + fn get_bytes_received_query_url(era: u64) -> String { + format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era) } fn http_get_json(url: &str) -> ResultStr { From b12511fdb4d6237c1f99414a783c86b7ac8bc789 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 27 Mar 2023 14:38:27 +0600 Subject: [PATCH 052/583] Refactor guard condition --- src/lib.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 5a553ca1d..dc5b4688c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -268,18 +268,12 @@ pub mod pallet { fn on_initialize(block_number: T::BlockNumber) -> Weight { if block_number != 0u32.into() && block_number != 1u32.into() { let era = Self::get_current_era(); - match (era, >::get()) { - (global_era_counter, Some(last_managed_era)) => { - if last_managed_era >= global_era_counter { - return 0 - } - >::put(global_era_counter); - }, - (global_era_counter, None) => { - >::put(global_era_counter); - }, - }; - + if let Some(last_managed_era) = >::get() { + if last_managed_era >= era { + return 0 + } + } + >::put(era); let validators: Vec = >::iter_keys().collect(); let validators_count = validators.len() as u32; let edges: Vec = From 3853a50bd35dae6405587f7bc010b1131b1eb1da Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 27 Mar 2023 15:30:57 +0600 Subject: [PATCH 053/583] Refactor a guard condition to decrease indentation --- src/lib.rs | 79 +++++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index dc5b4688c..cf4423173 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -266,48 +266,49 @@ pub mod pallet { as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn on_initialize(block_number: T::BlockNumber) -> Weight { - if block_number != 0u32.into() && block_number != 1u32.into() { - let era = Self::get_current_era(); - if let Some(last_managed_era) = >::get() { - if last_managed_era >= era { - return 0 - } + if block_number < 1u32.into() { + return 0 + } + + let era = Self::get_current_era(); + if let Some(last_managed_era) = >::get() { + if last_managed_era >= era { + return 0 } - >::put(era); - let validators: Vec = >::iter_keys().collect(); - let validators_count = validators.len() as u32; - let edges: Vec = - >::iter_keys().collect(); - log::info!( - "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", - block_number, - era, - >::get(), - validators_count, - validators, - edges, - ); - - // A naive approach assigns random validators for each edge. - for edge in edges { - let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = - Default::default(); - while !decisions.is_full() { - let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; - let validator: T::AccountId = validators[validator_idx].clone(); - let assignment = Decision { - validator, - method: ValidationMethodKind::ProofOfDelivery, - decision: None, - }; - decisions.try_push(assignment).unwrap(); - } - Tasks::::insert(edge, decisions); + } + >::put(era); + + let validators: Vec = >::iter_keys().collect(); + let validators_count = validators.len() as u32; + let edges: Vec = >::iter_keys().collect(); + log::info!( + "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", + block_number, + era, + >::get(), + validators_count, + validators, + edges, + ); + + // A naive approach assigns random validators for each edge. + for edge in edges { + let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = + Default::default(); + while !decisions.is_full() { + let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; + let validator: T::AccountId = validators[validator_idx].clone(); + let assignment = Decision { + validator, + method: ValidationMethodKind::ProofOfDelivery, + decision: None, + }; + decisions.try_push(assignment).unwrap(); } - 0 - } else { - 0 + Tasks::::insert(edge, decisions); } + + 0 } fn offchain_worker(block_number: T::BlockNumber) { From fb88c8a7b01ed65a36cd95f6cdef6a4d964db646 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 27 Mar 2023 20:04:43 +0600 Subject: [PATCH 054/583] Use era type from staking primitives --- src/lib.rs | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index cf4423173..1de5200c6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -26,6 +26,7 @@ pub use pallet_staking::{self as staking}; pub use scale_info::TypeInfo; pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; pub use sp_runtime::offchain::{http, Duration, Timestamp}; +pub use sp_staking::EraIndex; pub use sp_std::prelude::*; extern crate alloc; @@ -64,7 +65,7 @@ pub struct Decision { #[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo, Default)] pub struct ValidationResult { - era: String, + era: EraIndex, signer: AccountId, val_res: bool, cdn_node_pub_key: String, @@ -89,7 +90,7 @@ pub enum FtAggregate { #[derive(Clone)] struct BytesSent { node_public_key: String, - era: String, + era: EraIndex, sum: u32, } @@ -101,7 +102,8 @@ impl BytesSent { FtAggregate::Node(node) => return BytesSent { node_public_key: node[1].clone(), - era: node[3].clone(), + era: node[3].clone().parse::().expect("era must be convertible u32") + as EraIndex, sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), @@ -116,7 +118,8 @@ impl BytesSent { FtAggregate::Node(node) => { let node = BytesSent { node_public_key: node[1].clone(), - era: node[3].clone(), + era: node[3].clone().parse::().expect("era must be convertible u32") + as EraIndex, sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), }; @@ -133,7 +136,7 @@ impl BytesSent { #[derive(Clone)] struct BytesReceived { node_public_key: String, - era: String, + era: EraIndex, sum: u32, } @@ -145,7 +148,8 @@ impl BytesReceived { FtAggregate::Node(node) => return BytesReceived { node_public_key: node[1].clone(), - era: node[3].clone(), + era: node[3].clone().parse::().expect("era must be convertible u32") + as EraIndex, sum: node[5] .parse::() .expect("bytesReceivedSum must be convertable to u32"), @@ -162,7 +166,8 @@ impl BytesReceived { FtAggregate::Node(node) => { let node = BytesReceived { node_public_key: node[1].clone(), - era: node[3].clone(), + era: node[3].clone().parse::().expect("era must be convertible u32") + as EraIndex, sum: node[5].parse::().expect("bytesReceivedSum must be convertable to u32"), }; @@ -242,7 +247,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn last_managed_era)] - pub type LastManagedEra = StorageValue<_, u64>; + pub type LastManagedEra = StorageValue<_, EraIndex>; #[pallet::storage] #[pallet::getter(fn validation_results)] @@ -332,7 +337,7 @@ pub mod pallet { origin: OriginFor, val_res: bool, cdn_node_pub_key: String, - era: String, + era: EraIndex, ) -> DispatchResult { let signer: T::AccountId = ensure_signed(origin)?; @@ -350,7 +355,7 @@ pub mod pallet { } #[pallet::weight(10000)] - pub fn proof_of_delivery(origin: OriginFor, era: u64) -> DispatchResult { + pub fn proof_of_delivery(origin: OriginFor, era: EraIndex) -> DispatchResult { let signer: T::AccountId = ensure_signed(origin)?; let cdn_nodes_to_validate = Self::fetch_tasks(&signer); @@ -398,7 +403,7 @@ pub mod pallet { info!("[DAC Validator] ValidationResults: {:?}", ValidationResults::::get()); // Read data from DataModel and do dumb validation - let current_era = Self::get_current_era() - 1u64; + let current_era = Self::get_current_era() - 1; let tx_res = signer.send_signed_transaction(|_acct| { info!("[DAC Validator] Trigger proof of delivery"); @@ -426,13 +431,13 @@ pub mod pallet { } // Get the current era; Shall we start era count from 0 or from 1? - fn get_current_era() -> u64 { + fn get_current_era() -> EraIndex { ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS) .try_into() .unwrap() } - fn fetch_data(era: u64, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { + fn fetch_data(era: EraIndex, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error let bytes_sent_query = Self::get_bytes_sent_query_url(era); @@ -466,7 +471,7 @@ pub mod pallet { (filtered_s.clone(), filtered_r.clone()) } - fn fetch_data1(era: u64 ) -> (Vec, Vec){ + fn fetch_data1(era: EraIndex) -> (Vec, Vec){ info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error let bytes_sent_query = Self::get_bytes_sent_query_url(era); @@ -484,11 +489,11 @@ pub mod pallet { (bytes_sent, bytes_received) } - fn get_bytes_sent_query_url(era: u64) -> String { + fn get_bytes_sent_query_url(era: EraIndex) -> String { format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era) } - fn get_bytes_received_query_url(era: u64) -> String { + fn get_bytes_received_query_url(era: EraIndex) -> String { format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era) } From 8e47f4a1750e297202216c75f97b09ca32f8c80f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 28 Mar 2023 12:46:36 +0600 Subject: [PATCH 055/583] Fix faulty hook on block initialization --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 1de5200c6..edbaba17d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -271,7 +271,7 @@ pub mod pallet { as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn on_initialize(block_number: T::BlockNumber) -> Weight { - if block_number < 1u32.into() { + if block_number <= 1u32.into() { return 0 } From 2f290ae466ceb38b545f6292e17ec8c496838f90 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 28 Mar 2023 12:52:12 +0600 Subject: [PATCH 056/583] Autoformat DAC Validator files --- src/lib.rs | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index edbaba17d..c0fe9def0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -111,7 +111,7 @@ impl BytesSent { } pub fn get_all(aggregation: RedisFtAggregate) -> Vec { - let mut res: Vec = vec!(); + let mut res: Vec = vec![]; for i in 1..aggregation.ft_aggregate.len() { let data = aggregation.ft_aggregate[i].clone(); match data { @@ -120,16 +120,18 @@ impl BytesSent { node_public_key: node[1].clone(), era: node[3].clone().parse::().expect("era must be convertible u32") as EraIndex, - sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), + sum: node[5] + .parse::() + .expect("bytesSentSum must be convertable to u32"), }; res.push(node); - } + }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } } - return res; + return res } } @@ -159,7 +161,7 @@ impl BytesReceived { } pub fn get_all(aggregation: RedisFtAggregate) -> Vec { - let mut res: Vec = vec!(); + let mut res: Vec = vec![]; for i in 1..aggregation.ft_aggregate.len() { let data = aggregation.ft_aggregate[i].clone(); match data { @@ -168,16 +170,18 @@ impl BytesReceived { node_public_key: node[1].clone(), era: node[3].clone().parse::().expect("era must be convertible u32") as EraIndex, - sum: node[5].parse::().expect("bytesReceivedSum must be convertable to u32"), + sum: node[5] + .parse::() + .expect("bytesReceivedSum must be convertable to u32"), }; res.push(node); - } + }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } } - return res; + return res } } @@ -462,7 +466,11 @@ pub mod pallet { pub_key_str } - fn filter_data(s: &Vec, r: &Vec, a: &T::AccountId) -> (BytesSent, BytesReceived){ + fn filter_data( + s: &Vec, + r: &Vec, + a: &T::AccountId, + ) -> (BytesSent, BytesReceived) { let ac = Self::account_to_string(a.clone()); let filtered_s = &*s.into_iter().find(|bs| bs.node_public_key == ac).unwrap(); @@ -471,7 +479,7 @@ pub mod pallet { (filtered_s.clone(), filtered_r.clone()) } - fn fetch_data1(era: EraIndex) -> (Vec, Vec){ + fn fetch_data1(era: EraIndex) -> (Vec, Vec) { info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error let bytes_sent_query = Self::get_bytes_sent_query_url(era); From 416c2c6d52fb59d2a3a1a93de0bffedd9638a685 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 28 Mar 2023 12:53:59 +0600 Subject: [PATCH 057/583] Typo fix --- src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c0fe9def0..a30027c7d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -104,7 +104,7 @@ impl BytesSent { node_public_key: node[1].clone(), era: node[3].clone().parse::().expect("era must be convertible u32") as EraIndex, - sum: node[5].parse::().expect("bytesSentSum must be convertable to u32"), + sum: node[5].parse::().expect("bytesSentSum must be convertible to u32"), }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } @@ -122,7 +122,7 @@ impl BytesSent { as EraIndex, sum: node[5] .parse::() - .expect("bytesSentSum must be convertable to u32"), + .expect("bytesSentSum must be convertible to u32"), }; res.push(node); @@ -154,7 +154,7 @@ impl BytesReceived { as EraIndex, sum: node[5] .parse::() - .expect("bytesReceivedSum must be convertable to u32"), + .expect("bytesReceivedSum must be convertible to u32"), }, FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), } @@ -172,7 +172,7 @@ impl BytesReceived { as EraIndex, sum: node[5] .parse::() - .expect("bytesReceivedSum must be convertable to u32"), + .expect("bytesReceivedSum must be convertible to u32"), }; res.push(node); From 1b75a63d0d4b5b63b2892b0d2cebf7f7d9e4f3bc Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 28 Mar 2023 13:45:04 +0600 Subject: [PATCH 058/583] Introduce era key for DAC validator tasks --- src/lib.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a30027c7d..32354fa19 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -242,9 +242,11 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn tasks)] - pub type Tasks = StorageMap< + pub type Tasks = StorageDoubleMap< _, Twox64Concat, + EraIndex, + Twox64Concat, T::AccountId, BoundedVec, DdcValidatorsQuorumSize>, >; @@ -314,7 +316,7 @@ pub mod pallet { }; decisions.try_push(assignment).unwrap(); } - Tasks::::insert(edge, decisions); + Tasks::::insert(era, edge, decisions); } 0 @@ -361,14 +363,14 @@ pub mod pallet { #[pallet::weight(10000)] pub fn proof_of_delivery(origin: OriginFor, era: EraIndex) -> DispatchResult { let signer: T::AccountId = ensure_signed(origin)?; - - let cdn_nodes_to_validate = Self::fetch_tasks(&signer); + let era = Self::get_current_era(); + let cdn_nodes_to_validate = Self::fetch_tasks(era, &signer); let (s, r) = Self::fetch_data1(era); for cdn_node_id in cdn_nodes_to_validate { let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); - let decisions_for_cdn = >::get(cdn_node_id); + let decisions_for_cdn = >::get(era, cdn_node_id); for decision in decisions_for_cdn.unwrap().iter_mut() { if decision.validator == signer { decision.decision = Some(val_res); @@ -547,9 +549,9 @@ pub mod pallet { } /// Fetch the tasks related to current validator - fn fetch_tasks(validator: &T::AccountId) -> Vec { + fn fetch_tasks(era: EraIndex, validator: &T::AccountId) -> Vec { let mut cdn_nodes: Vec = vec![]; - for (cdn_id, cdn_tasks) in >::iter() { + for (cdn_id, cdn_tasks) in >::iter_prefix(era) { for decision in cdn_tasks.iter() { if decision.validator == *validator { cdn_nodes.push(cdn_id); From 1b9ec07f6e4ad8eae3b2182e9584e04aeea562f3 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 29 Mar 2023 13:02:18 +0600 Subject: [PATCH 059/583] Set DAC Validators quorum size in runtime crate --- src/lib.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 32354fa19..eb284d97a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,10 +31,6 @@ pub use sp_std::prelude::*; extern crate alloc; -parameter_types! { - pub DdcValidatorsQuorumSize: u32 = 3; -} - type BalanceOf = <::Currency as Currency< ::AccountId, >>::Balance; @@ -238,6 +234,9 @@ pub mod pallet { type Call: From>; type AuthorityId: AppCrypto; type TimeProvider: UnixTime; + + #[pallet::constant] + type DdcValidatorsQuorumSize: Get; } #[pallet::storage] @@ -248,7 +247,7 @@ pub mod pallet { EraIndex, Twox64Concat, T::AccountId, - BoundedVec, DdcValidatorsQuorumSize>, + BoundedVec, T::DdcValidatorsQuorumSize>, >; #[pallet::storage] @@ -304,7 +303,7 @@ pub mod pallet { // A naive approach assigns random validators for each edge. for edge in edges { - let mut decisions: BoundedVec, DdcValidatorsQuorumSize> = + let mut decisions: BoundedVec, T::DdcValidatorsQuorumSize> = Default::default(); while !decisions.is_full() { let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; From 3dac8e82845c89e992d26d97c198cc678739f071 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 29 Mar 2023 15:26:38 +0600 Subject: [PATCH 060/583] Print pubkeys available to offchain worker --- src/lib.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index eb284d97a..6c06457a1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,6 +25,7 @@ pub use pallet_session as session; pub use pallet_staking::{self as staking}; pub use scale_info::TypeInfo; pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; +pub use sp_io::crypto::sr25519_public_keys; pub use sp_runtime::offchain::{http, Duration, Timestamp}; pub use sp_staking::EraIndex; pub use sp_std::prelude::*; @@ -322,6 +323,16 @@ pub mod pallet { } fn offchain_worker(block_number: T::BlockNumber) { + let pubkeys = sr25519_public_keys(KEY_TYPE); + if pubkeys.is_empty() { + log::info!("No local sr25519 accounts available to offchain worker."); + return + } + log::info!( + "Local sr25519 accounts available to offchain worker: {:?}, first pubilc key: {:?}", + pubkeys, pubkeys.first().unwrap() + ); + let res = Self::offchain_worker_main(block_number); match res { From 9a473c4f6e999bc390faabf1c755f77d9bd8b5c1 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 29 Mar 2023 12:46:42 +0200 Subject: [PATCH 061/583] merge with latest commit --- src/lib.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 6c06457a1..229e01f05 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,6 +32,10 @@ pub use sp_std::prelude::*; extern crate alloc; +parameter_types! { + pub const ValidationThreshold: f32 = 5.0; +} + type BalanceOf = <::Currency as Currency< ::AccountId, >>::Balance; @@ -555,7 +559,9 @@ pub mod pallet { } fn validate(bytes_sent: BytesSent, bytes_received: BytesReceived) -> bool { - return if bytes_sent.sum == bytes_received.sum { true } else { false } + let percentage_difference = 1f32 - (bytes_received.sum as f32 / bytes_sent.sum as f32); + + return if percentage_difference > 0.0 && (ValidationThreshold::get() - percentage_difference) > 0.0 { true } else { false } } /// Fetch the tasks related to current validator From 669dded6f19b8fe6b1dde9cf9b258ff3f54608a4 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 29 Mar 2023 12:49:55 +0200 Subject: [PATCH 062/583] fix merge --- src/lib.rs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 229e01f05..b39e00548 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -88,8 +88,8 @@ pub enum FtAggregate { Node(Vec), } -#[derive(Clone)] -struct BytesSent { +#[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] +pub struct BytesSent { node_public_key: String, era: EraIndex, sum: u32, @@ -136,8 +136,8 @@ impl BytesSent { } } -#[derive(Clone)] -struct BytesReceived { +#[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] +pub struct BytesReceived { node_public_key: String, era: EraIndex, sum: u32, @@ -375,8 +375,9 @@ pub mod pallet { } #[pallet::weight(10000)] - pub fn proof_of_delivery(origin: OriginFor, era: EraIndex) -> DispatchResult { + pub fn proof_of_delivery(origin: OriginFor, s: Vec, r: Vec) -> DispatchResult { let signer: T::AccountId = ensure_signed(origin)?; + let era = Self::get_current_era(); let cdn_nodes_to_validate = Self::fetch_tasks(era, &signer); let (s, r) = Self::fetch_data1(era); @@ -423,15 +424,12 @@ pub mod pallet { info!("[DAC Validator] ValidationResults: {:?}", ValidationResults::::get()); // Read data from DataModel and do dumb validation - let current_era = Self::get_current_era() - 1; + let current_era = Self::get_current_era() - 1u64; + let (s, r) = Self::fetch_data1(current_era); let tx_res = signer.send_signed_transaction(|_acct| { - info!("[DAC Validator] Trigger proof of delivery"); - - // This is the on-chain function - Call::proof_of_delivery { era: current_era } + Call::proof_of_delivery { s: s.clone(), r: r.clone() } }); - match &tx_res { None | Some((_, Err(()))) => return Err("Error while submitting proof of delivery TX"), From 48a130d22dc1963be5527bc1ae5ac41ccc73ce91 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 29 Mar 2023 12:52:33 +0200 Subject: [PATCH 063/583] fix typo --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index b39e00548..af78c5be6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -424,7 +424,7 @@ pub mod pallet { info!("[DAC Validator] ValidationResults: {:?}", ValidationResults::::get()); // Read data from DataModel and do dumb validation - let current_era = Self::get_current_era() - 1u64; + let current_era = Self::get_current_era() - 1; let (s, r) = Self::fetch_data1(current_era); let tx_res = signer.send_signed_transaction(|_acct| { From c9986fab435cbd0824cced892c296114e7595ecb Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 29 Mar 2023 16:35:22 +0600 Subject: [PATCH 064/583] Add doc comments --- src/lib.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index af78c5be6..eb28a1d59 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,6 +36,7 @@ parameter_types! { pub const ValidationThreshold: f32 = 5.0; } +/// The balance type of this pallet. type BalanceOf = <::Currency as Currency< ::AccountId, >>::Balance; @@ -52,15 +53,22 @@ const ERA_IN_BLOCKS: u8 = 20; const DATA_PROVIDER_URL: &str = "http://localhost:7379/"; +/// DAC Validation methods. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] pub enum ValidationMethodKind { + /// Compare amount of served content with amount of content consumed. ProofOfDelivery, } +/// Associates validation decision with the validator and the method used to produce it. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] pub struct Decision { + /// Individual validator's decision. Can be `None` if the validator did not produce a decision + /// (yet). pub decision: Option, + /// The method used to produce the decision. pub method: ValidationMethodKind, + /// The validator who produced the decision. pub validator: AccountId, } @@ -234,16 +242,27 @@ pub mod pallet { ::AccountId: AsRef<[u8]> + UncheckedFrom, as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { + /// The overarching event type. type Event: From> + IsType<::Event>; + + /// Something that provides randomness in the runtime. Required by the tasks assignment + /// procedure. type Randomness: Randomness; + + /// A dispatchable call. type Call: From>; + type AuthorityId: AppCrypto; type TimeProvider: UnixTime; + /// Number of validators expected to produce an individual validation decision to form a + /// consensus. Tasks assignment procedure use this value to determine the number of + /// validators are getting the same task. Must be an odd number. #[pallet::constant] type DdcValidatorsQuorumSize: Get; } + /// The map from the era and CDN participant stash key to the validation decisions related. #[pallet::storage] #[pallet::getter(fn tasks)] pub type Tasks = StorageDoubleMap< @@ -255,6 +274,7 @@ pub mod pallet { BoundedVec, T::DdcValidatorsQuorumSize>, >; + /// The last era for which the tasks assignment produced. #[pallet::storage] #[pallet::getter(fn last_managed_era)] pub type LastManagedEra = StorageValue<_, EraIndex>; @@ -576,6 +596,9 @@ pub mod pallet { cdn_nodes } + /// Randomly choose a number in range `[0, total)`. + /// Returns `None` for zero input. + /// Modification of `choose_ticket` from `pallet-lottery` version `4.0.0-dev`. fn choose(total: u32) -> Option { if total == 0 { return None @@ -594,6 +617,11 @@ pub mod pallet { Some(random_number % total) } + /// Generate a random number from a given seed. + /// Note that there is potential bias introduced by using modulus operator. + /// You should call this function with different seed values until the random + /// number lies within `u32::MAX - u32::MAX % n`. + /// Modification of `generate_random_number` from `pallet-lottery` version `4.0.0-dev`. fn generate_random_number(seed: u32) -> u32 { let (random_seed, _) = ::Randomness::random(&(b"ddc-validator", seed).encode()); From 9c77216cac535380f01cbb44e97d056e2169d5d7 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 29 Mar 2023 18:00:40 +0600 Subject: [PATCH 065/583] Module level docs --- src/lib.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index eb28a1d59..6402d9f24 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,37 @@ +//! # DDC Validator pallet +//! +//! The DDC Validator pallet is responsible for producing validation decisions based on activity +//! data from DAC DataModel. It is expected to work on validators nodes only. +//! +//! - [`Config`] +//! - [`Call`] +//! - [`Pallet`] +//! - [`Hooks`] +//! +//! ## Responsibility +//! +//! 1. Assign validation tasks on DAC Validators in the beginning of each era, +//! 2. Spin the offchain worker which tries to execute the validation tasks each era, +//! 3. Fetch the data required for validation from DAC DataModel, +//! 4. Execute validation method on this data, +//! 5. Produce validation decision and submit it to the chain. +//! +//! ## Usage +//! +//! 1. Run the node with `--validator` flag, +//! 2. Setup validator key with `author_insertKey` RPC call. Use `dacv` validator key type and the +//! same private key as the one used to generate the validator's session keys, +//! 3. Proceed a regular validator setup, +//! 4. Tasks assignment will assign you a task in the beginning of the era which has your account in +//! validators set. +//! +//! ## Notes +//! +//! - Era definition in this pallet is different than in the `pallet-staking`. In this pallet era is +//! a period of time during which the validator is expected to produce a validation decision. +//! Means staking era and DAC era are different and are not related to each other, +//! - You can set DAC Validators quorum size by specifying `DdcValidatorsQuorumSize` parameter, + #![cfg_attr(not(feature = "std"), no_std)] pub use alloc::{format, string::String}; From 65ff73d2e90909f730d0f97da2dc0ab1828816e9 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Wed, 29 Mar 2023 22:51:19 +0200 Subject: [PATCH 066/583] Remove http request from tx --- src/lib.rs | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 6402d9f24..0be9e9454 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -430,22 +430,32 @@ pub mod pallet { #[pallet::weight(10000)] pub fn proof_of_delivery(origin: OriginFor, s: Vec, r: Vec) -> DispatchResult { + info!("[DAC Validator] processing proof_of_delivery"); let signer: T::AccountId = ensure_signed(origin)?; + info!("signer: {:?}", Self::account_to_string(signer.clone())); + let era = Self::get_current_era(); let cdn_nodes_to_validate = Self::fetch_tasks(era, &signer); - let (s, r) = Self::fetch_data1(era); + + info!("[DAC Validator] cdn_nodes_to_validate: {:?}", cdn_nodes_to_validate); + for cdn_node_id in cdn_nodes_to_validate { let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); let decisions_for_cdn = >::get(era, cdn_node_id); - for decision in decisions_for_cdn.unwrap().iter_mut() { + for decision in decisions_for_cdn.clone().unwrap().iter_mut() { if decision.validator == signer { decision.decision = Some(val_res); decision.method = ValidationMethodKind::ProofOfDelivery; } } + + info!( + "[DAC Validator] decisions_for_cdn: {:?}", + decisions_for_cdn + ); } Ok(()) @@ -458,11 +468,6 @@ pub mod pallet { as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn offchain_worker_main(block_number: T::BlockNumber) -> ResultStr<()> { - info!( - "[DAC Validator] Validation data stored onchain: {:?}", - ValidationResults::::get() - ); - if block_number % ERA_IN_BLOCKS.into() != 0u32.into() { return Ok(()) } @@ -475,8 +480,6 @@ pub mod pallet { Ok(signer) => signer, }; - info!("[DAC Validator] ValidationResults: {:?}", ValidationResults::::get()); - // Read data from DataModel and do dumb validation let current_era = Self::get_current_era() - 1; let (s, r) = Self::fetch_data1(current_era); @@ -484,9 +487,13 @@ pub mod pallet { let tx_res = signer.send_signed_transaction(|_acct| { Call::proof_of_delivery { s: s.clone(), r: r.clone() } }); + match &tx_res { - None | Some((_, Err(()))) => - return Err("Error while submitting proof of delivery TX"), + None => return Err("Error while submitting proof of delivery TX"), + Some((_, Err(e))) => { + info!("Error while submitting proof of delivery TX: {:?}", e); + return Err("Error while submitting proof of delivery TX"); + }, Some((_, Ok(()))) => {}, } @@ -620,6 +627,8 @@ pub mod pallet { fn fetch_tasks(era: EraIndex, validator: &T::AccountId) -> Vec { let mut cdn_nodes: Vec = vec![]; for (cdn_id, cdn_tasks) in >::iter_prefix(era) { + info!("[DAC Validator] tasks assigned to {:?}: {:?}", cdn_id, cdn_tasks); + for decision in cdn_tasks.iter() { if decision.validator == *validator { cdn_nodes.push(cdn_id); From 4f0495d0e3a9a6dc579f03d078ca8f6d6c1220ea Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 30 Mar 2023 14:51:59 +0600 Subject: [PATCH 067/583] Submit DAC Validation decision call --- src/lib.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0be9e9454..b456baf62 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -323,10 +323,22 @@ pub mod pallet { pub enum Event where ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, {} + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + { + /// DAC Validator successfully published the validation decision. + ValidationDecisionSubmitted, + } #[pallet::error] - pub enum Error {} + pub enum Error { + /// Validation decision attempts to submit the result for the wrong era (not the current + /// one). + BadEra, + /// Can't submit the validation decision twice. + DecisionAlreadySubmitted, + /// Task does not exist for a given era, CDN participant, and DAC validator. + TaskNotFound, + } #[pallet::hooks] impl Hooks> for Pallet @@ -428,6 +440,40 @@ pub mod pallet { Ok(()) } + /// Set validation decision in tasks assignment. + /// + /// `origin` must be a DAC Validator assigned to the task. + /// `era` must be a current era, otherwise the decision will be rejected. + /// `subject` is a CDN participant stash. + /// + /// Emits `ValidationDecisionSubmitted` event. + #[pallet::weight(100_000)] + pub fn submit_validation_decision( + origin: OriginFor, + era: EraIndex, + subject: T::AccountId, + method: ValidationMethodKind, + decision: bool, + ) -> DispatchResult { + let account = ensure_signed(origin)?; + + ensure!(Self::get_current_era() == era, Error::::BadEra); + + Tasks::::try_mutate_exists(era, &subject, |maybe_tasks| { + let mut tasks = maybe_tasks.take().ok_or(Error::::TaskNotFound)?; + let mut task = tasks + .iter_mut() + .find(|task| task.validator == account && task.method == method) + .ok_or(Error::::TaskNotFound)?; + ensure!(task.decision.is_none(), Error::::DecisionAlreadySubmitted); + task.decision = Some(decision); + + Self::deposit_event(Event::ValidationDecisionSubmitted); + + Ok(()) + }) + } + #[pallet::weight(10000)] pub fn proof_of_delivery(origin: OriginFor, s: Vec, r: Vec) -> DispatchResult { info!("[DAC Validator] processing proof_of_delivery"); From 419abd0be976a4c8ecf6925d28afc69cadcd1b69 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 31 Mar 2023 17:16:21 +0600 Subject: [PATCH 068/583] Fix validation decision update --- src/lib.rs | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b456baf62..1f10608c9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -490,18 +490,17 @@ pub mod pallet { let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); - let decisions_for_cdn = >::get(era, cdn_node_id); - for decision in decisions_for_cdn.clone().unwrap().iter_mut() { - if decision.validator == signer { - decision.decision = Some(val_res); - decision.method = ValidationMethodKind::ProofOfDelivery; - } - } - - info!( - "[DAC Validator] decisions_for_cdn: {:?}", - decisions_for_cdn - ); + >::mutate(era, cdn_node_id, |decisions_for_cdn| { + let decisions = + decisions_for_cdn.as_mut().expect("unexpected empty tasks assignment"); + let mut decision = decisions + .iter_mut() + .find(|decision| decision.validator == signer) + .expect("unexpected validators set in tasks assignment"); + decision.decision = Some(val_res); + }); + + info!("[DAC Validator] decisions_for_cdn: {:?}", >::get(era, cdn_node_id)); } Ok(()) From 1977ef70bbba64cff75b92fc806dc911f0c48e38 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 31 Mar 2023 17:33:09 +0600 Subject: [PATCH 069/583] Typo fix --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 1f10608c9..71c81b97f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -490,7 +490,7 @@ pub mod pallet { let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); - >::mutate(era, cdn_node_id, |decisions_for_cdn| { + >::mutate(era, &cdn_node_id, |decisions_for_cdn| { let decisions = decisions_for_cdn.as_mut().expect("unexpected empty tasks assignment"); let mut decision = decisions From f4c46ea4b0237b0baf3a8c5f18b707a1464f0a44 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 10 Apr 2023 12:24:52 +0600 Subject: [PATCH 070/583] Integer type ValidationThreshold --- src/lib.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 71c81b97f..b1c65fe41 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -67,7 +67,7 @@ pub use sp_std::prelude::*; extern crate alloc; parameter_types! { - pub const ValidationThreshold: f32 = 5.0; + pub const ValidationThreshold: u32 = 5; } /// The balance type of this pallet. @@ -665,7 +665,13 @@ pub mod pallet { fn validate(bytes_sent: BytesSent, bytes_received: BytesReceived) -> bool { let percentage_difference = 1f32 - (bytes_received.sum as f32 / bytes_sent.sum as f32); - return if percentage_difference > 0.0 && (ValidationThreshold::get() - percentage_difference) > 0.0 { true } else { false } + return if percentage_difference > 0.0 && + (ValidationThreshold::get() as f32 - percentage_difference) > 0.0 + { + true + } else { + false + } } /// Fetch the tasks related to current validator From 095718f199bb0f3004f8e17bccee1b959813bc66 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 10 Apr 2023 12:27:05 +0600 Subject: [PATCH 071/583] Autoformat DAC Validator files --- src/lib.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b1c65fe41..976a5131f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -400,7 +400,8 @@ pub mod pallet { } log::info!( "Local sr25519 accounts available to offchain worker: {:?}, first pubilc key: {:?}", - pubkeys, pubkeys.first().unwrap() + pubkeys, + pubkeys.first().unwrap() ); let res = Self::offchain_worker_main(block_number); @@ -475,7 +476,11 @@ pub mod pallet { } #[pallet::weight(10000)] - pub fn proof_of_delivery(origin: OriginFor, s: Vec, r: Vec) -> DispatchResult { + pub fn proof_of_delivery( + origin: OriginFor, + s: Vec, + r: Vec, + ) -> DispatchResult { info!("[DAC Validator] processing proof_of_delivery"); let signer: T::AccountId = ensure_signed(origin)?; @@ -529,15 +534,16 @@ pub mod pallet { let current_era = Self::get_current_era() - 1; let (s, r) = Self::fetch_data1(current_era); - let tx_res = signer.send_signed_transaction(|_acct| { - Call::proof_of_delivery { s: s.clone(), r: r.clone() } + let tx_res = signer.send_signed_transaction(|_acct| Call::proof_of_delivery { + s: s.clone(), + r: r.clone(), }); match &tx_res { None => return Err("Error while submitting proof of delivery TX"), Some((_, Err(e))) => { info!("Error while submitting proof of delivery TX: {:?}", e); - return Err("Error while submitting proof of delivery TX"); + return Err("Error while submitting proof of delivery TX") }, Some((_, Ok(()))) => {}, } From 7244a13bf3a6764cd5cedd1f9296f920e0908571 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 10 Apr 2023 13:20:16 +0600 Subject: [PATCH 072/583] Set PoD allowed deviation in runtime crate --- src/lib.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 976a5131f..157d6fa0b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -66,10 +66,6 @@ pub use sp_std::prelude::*; extern crate alloc; -parameter_types! { - pub const ValidationThreshold: u32 = 5; -} - /// The balance type of this pallet. type BalanceOf = <::Currency as Currency< ::AccountId, @@ -294,6 +290,13 @@ pub mod pallet { /// validators are getting the same task. Must be an odd number. #[pallet::constant] type DdcValidatorsQuorumSize: Get; + + /// Proof-of-Delivery parameter specifies an allowed deviation between bytes sent and bytes + /// received. The deviation is expressed as a percentage. For example, if the value is 10, + /// then the difference between bytes sent and bytes received is allowed to be up to 10%. + /// The value must be in range [0, 100]. + #[pallet::constant] + type ValidationThreshold: Get; } /// The map from the era and CDN participant stash key to the validation decisions related. @@ -672,7 +675,7 @@ pub mod pallet { let percentage_difference = 1f32 - (bytes_received.sum as f32 / bytes_sent.sum as f32); return if percentage_difference > 0.0 && - (ValidationThreshold::get() as f32 - percentage_difference) > 0.0 + (T::ValidationThreshold::get() as f32 - percentage_difference) > 0.0 { true } else { From fa83b3c275d3f7d0e20ec9697a209aebcd8ec06a Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 14 Apr 2023 18:35:48 +0600 Subject: [PATCH 073/583] DAC Validators run a process by signal --- src/lib.rs | 183 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 130 insertions(+), 53 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 157d6fa0b..0ebd3f3f0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -81,7 +81,8 @@ const TIME_START_MS: u128 = 1_672_531_200_000; const ERA_DURATION_MS: u128 = 120_000; const ERA_IN_BLOCKS: u8 = 20; -const DATA_PROVIDER_URL: &str = "http://localhost:7379/"; +/// Webdis in experimental cluster connected to Redis in dev. +const DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379/"; /// DAC Validation methods. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] @@ -299,6 +300,11 @@ pub mod pallet { type ValidationThreshold: Get; } + /// A signal to start a process on all the validators. + #[pallet::storage] + #[pallet::getter(fn signal)] + pub(super) type Signal = StorageValue<_, bool>; + /// The map from the era and CDN participant stash key to the validation decisions related. #[pallet::storage] #[pallet::getter(fn tasks)] @@ -350,69 +356,108 @@ pub mod pallet { as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn on_initialize(block_number: T::BlockNumber) -> Weight { - if block_number <= 1u32.into() { - return 0 - } - - let era = Self::get_current_era(); - if let Some(last_managed_era) = >::get() { - if last_managed_era >= era { - return 0 - } + // Reset the signal in the beginning of the block to keep it reset until an incoming + // transaction sets it to true. + if Signal::::get().unwrap_or(false) { + Signal::::set(Some(false)); } - >::put(era); - let validators: Vec = >::iter_keys().collect(); - let validators_count = validators.len() as u32; - let edges: Vec = >::iter_keys().collect(); - log::info!( - "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, validators: {:?}, edges: {:?}", - block_number, - era, - >::get(), - validators_count, - validators, - edges, - ); - - // A naive approach assigns random validators for each edge. - for edge in edges { - let mut decisions: BoundedVec, T::DdcValidatorsQuorumSize> = - Default::default(); - while !decisions.is_full() { - let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; - let validator: T::AccountId = validators[validator_idx].clone(); - let assignment = Decision { - validator, - method: ValidationMethodKind::ProofOfDelivery, - decision: None, - }; - decisions.try_push(assignment).unwrap(); - } - Tasks::::insert(era, edge, decisions); - } + // Old task manager. + // + // if block_number <= 1u32.into() { + // return 0 + // } + + // let era = Self::get_current_era(); + // if let Some(last_managed_era) = >::get() { + // if last_managed_era >= era { + // return 0 + // } + // } + // >::put(era); + + // let validators: Vec = >::iter_keys().collect(); + // let validators_count = validators.len() as u32; + // let edges: Vec = + // >::iter_keys().collect(); log::info!( + // "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, + // validators: {:?}, edges: {:?}", block_number, + // era, + // >::get(), + // validators_count, + // validators, + // edges, + // ); + + // // A naive approach assigns random validators for each edge. + // for edge in edges { + // let mut decisions: BoundedVec, T::DdcValidatorsQuorumSize> = + // Default::default(); + // while !decisions.is_full() { + // let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; + // let validator: T::AccountId = validators[validator_idx].clone(); + // let assignment = Decision { + // validator, + // method: ValidationMethodKind::ProofOfDelivery, + // decision: None, + // }; + // decisions.try_push(assignment).unwrap(); + // } + // Tasks::::insert(era, edge, decisions); + // } 0 } + /// Offchain worker entry point. + /// + /// 1. Listen to a signal, + /// 2. Run a process at the same time, + /// 3. Read data from DAC. fn offchain_worker(block_number: T::BlockNumber) { - let pubkeys = sr25519_public_keys(KEY_TYPE); - if pubkeys.is_empty() { - log::info!("No local sr25519 accounts available to offchain worker."); + // Skip if not a validator. + if !sp_io::offchain::is_validator() { + return + } + + // Wait for signal. + let signal = Signal::::get().unwrap_or(false); + if !signal { + log::info!("🔎 DAC Validator is idle at block {:?}, waiting for a signal, signal state is {:?}", block_number, signal); return } + + // Read from DAC. + let current_era = Self::get_current_era(); + let (sent_query, sent, received_query, received) = Self::fetch_data2(current_era - 1); log::info!( - "Local sr25519 accounts available to offchain worker: {:?}, first pubilc key: {:?}", - pubkeys, - pubkeys.first().unwrap() + "🔎 DAC Validator is fetching data from DAC, current era: {:?}, bytes sent query: {:?}, bytes sent response: {:?}, bytes received query: {:?}, bytes received response: {:?}", + current_era, + sent_query, + sent, + received_query, + received, ); - let res = Self::offchain_worker_main(block_number); - - match res { - Ok(()) => info!("[DAC Validator] DAC Validator is suspended."), - Err(err) => error!("[DAC Validator] Error in Offchain Worker: {}", err), - }; + // Old off-chain worker. + // + // let pubkeys = sr25519_public_keys(KEY_TYPE); + // if pubkeys.is_empty() { + // log::info!("No local sr25519 accounts available to offchain worker."); + // return + // } + // log::info!( + // "Local sr25519 accounts available to offchain worker: {:?}, first pubilc key: {:?}", + // pubkeys, + // pubkeys.first().unwrap() + // ); + + // let res = Self::offchain_worker_main(block_number); + + // match res { + // Ok(()) => info!("[DAC Validator] DAC Validator is suspended."), + // Err(err) => error!("[DAC Validator] Error in Offchain Worker: {}", err), + // }; } } @@ -422,6 +467,25 @@ pub mod pallet { ::AccountId: AsRef<[u8]> + UncheckedFrom, as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { + /// Run a process at the same time on all the validators. + #[pallet::weight(10_000)] + pub fn send_signal(origin: OriginFor) -> DispatchResult { + ensure_signed(origin)?; + + Signal::::set(Some(true)); + + Ok(()) + } + + #[pallet::weight(10_000)] + pub fn reset_signal(origin: OriginFor) -> DispatchResult { + ensure_signed(origin)?; + + Signal::::set(Some(false)); + + Ok(()) + } + #[pallet::weight(10000)] pub fn save_validated_data( origin: OriginFor, @@ -626,6 +690,19 @@ pub mod pallet { (bytes_sent, bytes_received) } + fn fetch_data2(era: EraIndex) -> (String, Vec, String, Vec) { + let bytes_sent_query = Self::get_bytes_sent_query_url(era); + let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); + let bytes_sent = BytesSent::get_all(bytes_sent_res); + + let bytes_received_query = Self::get_bytes_received_query_url(era); + let bytes_received_res: RedisFtAggregate = + Self::http_get_json(&bytes_received_query).unwrap(); + let bytes_received = BytesReceived::get_all(bytes_received_res); + + (bytes_sent_query, bytes_sent, bytes_received_query, bytes_received) + } + fn get_bytes_sent_query_url(era: EraIndex) -> String { format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era) } @@ -649,7 +726,7 @@ pub mod pallet { } fn http_get_request(http_url: &str) -> Result, http::Error> { - info!("[DAC Validator] Sending request to: {:?}", http_url); + // info!("[DAC Validator] Sending request to: {:?}", http_url); // Initiate an external HTTP GET request. This is using high-level wrappers from // `sp_runtime`. From de1c21b36243fa39baa7d2b0c2b821a68304c682 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Sat, 15 Apr 2023 02:34:51 +0200 Subject: [PATCH 074/583] fix(ddc-validator): compilation error is fixed --- Cargo.toml | 3 ++ src/mock.rs | 79 +++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 203e032e1..eeaa05436 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,8 @@ alt_serde = { version = "1", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } +frame-election-provider-support = { version = "4.0.0-dev", path = "../election-provider-support" } + log = { version = "0.4.17", default-features = false } pallet-contracts = { version = '4.0.0-dev', default-features = false, path = "../contracts" } pallet-ddc-staking = { version = "0.1.0", default-features = false, path = "../ddc-staking" } @@ -30,6 +32,7 @@ std = [ "codec/std", "frame-support/std", "frame-system/std", + "frame-election-provider-support/std", "pallet-contracts/std", "pallet-ddc-staking/std", "pallet-session/std", diff --git a/src/mock.rs b/src/mock.rs index b40c3a1c0..76cde6fff 100644 --- a/src/mock.rs +++ b/src/mock.rs @@ -10,6 +10,22 @@ use sp_core::H256; use sp_runtime::{ curve::PiecewiseLinear, generic, testing::{Header, TestXt}, traits::{BlakeTwo256, IdentityLookup, Verify, Extrinsic as ExtrinsicT, IdentifyAccount}, Perbill, MultiSignature, curve}; use pallet_contracts as contracts; +use sp_runtime::traits::Convert; +use pallet_session::ShouldEndSession; +use sp_runtime::{ + impl_opaque_keys, + testing::{UintAuthorityId}, +}; +use sp_staking::SessionIndex; +use frame_support::{ + traits::{U128CurrencyToVote} +}; + +use frame_election_provider_support::{ + onchain, SequentialPhragmen +}; + + type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; type Balance = u128; @@ -32,6 +48,7 @@ frame_support::construct_runtime!( Balances: pallet_balances, Contracts: contracts, Session: pallet_session, + Staking: pallet_staking, Timestamp: pallet_timestamp, RandomnessCollectiveFlip: pallet_randomness_collective_flip, DdcStaking: pallet_ddc_staking, @@ -90,13 +107,20 @@ use contracts::{Config as contractsConfig}; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +pub struct TestWeightToFee; +impl Convert for TestWeightToFee { + fn convert(weight: u64) -> u128 { + weight as u128 + } +} + impl contracts::Config for Test { type Time = Timestamp; type Randomness = RandomnessCollectiveFlip; type Currency = Balances; type Event = Event; type CallStack = [pallet_contracts::Frame; 31]; - type WeightPrice = Self; //pallet_transaction_payment::Module; + type WeightPrice = TestWeightToFee; //pallet_transaction_payment::Module; type WeightInfo = (); type ChainExtension = (); type DeletionQueueDepth = (); @@ -132,15 +156,34 @@ parameter_types! { pub const DdcValidatorsQuorumSize: u32 = 3; } +pub struct TestShouldEndSession; +impl ShouldEndSession for TestShouldEndSession { + fn should_end_session(now: u32) -> bool { + now % 10 == 0 // every 10 blocks + } +} + +impl_opaque_keys! { + pub struct MockSessionKeys { + pub dummy: UintAuthorityId, + } +} + +impl From for MockSessionKeys { + fn from(dummy: UintAuthorityId) -> Self { + Self { dummy } + } +} + impl pallet_session::Config for Test { - type Event = (); + type Event = Event; type ValidatorId = AccountId; type ValidatorIdOf = (); - type ShouldEndSession = (); + type ShouldEndSession = TestShouldEndSession; type NextSessionRotation = (); type SessionManager = (); - type SessionHandler = (); - type Keys = (); + type SessionHandler = pallet_session::TestSessionHandler; + type Keys = MockSessionKeys; type WeightInfo = (); } @@ -165,11 +208,24 @@ parameter_types! { pub OffchainRepeat: BlockNumber = 5; } + +pub struct OnChainSeqPhragmen; +impl onchain::ExecutionConfig for OnChainSeqPhragmen { + type System = Test; + type Solver = SequentialPhragmen; + type DataProvider = Staking; +} + +impl pallet_session::historical::Config for Test { + type FullIdentification = pallet_staking::Exposure; + type FullIdentificationOf = pallet_staking::ExposureOf; +} + impl pallet_staking::Config for Test { type MaxNominations = (); type Currency = Balances; type UnixTime = Timestamp; - type CurrencyToVote = (); + type CurrencyToVote = U128CurrencyToVote; type RewardRemainder = (); type Event = Event; type Slash = (); // send the slashed funds to the treasury. @@ -177,19 +233,18 @@ impl pallet_staking::Config for Test { type SessionsPerEra = SessionsPerEra; type BondingDuration = BondingDuration; type SlashDeferDuration = SlashDeferDuration; - /// A super-majority of the council can cancel the slash. - type SlashCancelOrigin = (); + type SlashCancelOrigin = frame_system::EnsureRoot; type SessionInterface = Self; type EraPayout = pallet_staking::ConvertCurve; type NextNewSession = Session; type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; type OffendingValidatorsThreshold = OffendingValidatorsThreshold; - type ElectionProvider = (); - type GenesisElectionProvider = (); - type VoterList = (); + type ElectionProvider = onchain::UnboundedExecution; + type GenesisElectionProvider = Self::ElectionProvider; + type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; type MaxUnlockingChunks = ConstU32<32>; type WeightInfo = pallet_staking::weights::SubstrateWeight; - type BenchmarkingConfig = (); + type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; } impl pallet_ddc_staking::Config for Test { From eb7da5928789a63813768ecd0098908185c46f97 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Mon, 17 Apr 2023 11:50:38 +0200 Subject: [PATCH 075/583] Fix MaxNominations config --- src/mock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mock.rs b/src/mock.rs index 76cde6fff..d897eca04 100644 --- a/src/mock.rs +++ b/src/mock.rs @@ -222,7 +222,7 @@ impl pallet_session::historical::Config for Test { } impl pallet_staking::Config for Test { - type MaxNominations = (); + type MaxNominations = ConstU32<16>; type Currency = Balances; type UnixTime = Timestamp; type CurrencyToVote = U128CurrencyToVote; From dce39730b9df1c261f7bcfeb709bf07c3721c5eb Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Mon, 17 Apr 2023 11:55:47 +0200 Subject: [PATCH 076/583] Reorder imps block according to construct_runtime! --- src/mock.rs | 53 ++++++++++++++--------------------------------------- 1 file changed, 14 insertions(+), 39 deletions(-) diff --git a/src/mock.rs b/src/mock.rs index d897eca04..2180867f8 100644 --- a/src/mock.rs +++ b/src/mock.rs @@ -9,7 +9,6 @@ use frame_system::offchain::SendTransactionTypes; use sp_core::H256; use sp_runtime::{ curve::PiecewiseLinear, generic, testing::{Header, TestXt}, traits::{BlakeTwo256, IdentityLookup, Verify, Extrinsic as ExtrinsicT, IdentifyAccount}, Perbill, MultiSignature, curve}; use pallet_contracts as contracts; - use sp_runtime::traits::Convert; use pallet_session::ShouldEndSession; use sp_runtime::{ @@ -20,24 +19,17 @@ use sp_staking::SessionIndex; use frame_support::{ traits::{U128CurrencyToVote} }; - use frame_election_provider_support::{ onchain, SequentialPhragmen }; - - type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; type Balance = u128; -// type AccountId = u64; - pub type Signature = MultiSignature; pub type AccountId = <::Signer as IdentifyAccount>::AccountId; -// pub type Balance = u128; pub type BlockNumber = u32; pub type Moment = u64; -// Configure a mock runtime to test the pallet. frame_support::construct_runtime!( pub enum Test where Block = Block, @@ -47,11 +39,11 @@ frame_support::construct_runtime!( System: frame_system, Balances: pallet_balances, Contracts: contracts, + Timestamp: pallet_timestamp, Session: pallet_session, Staking: pallet_staking, - Timestamp: pallet_timestamp, - RandomnessCollectiveFlip: pallet_randomness_collective_flip, DdcStaking: pallet_ddc_staking, + RandomnessCollectiveFlip: pallet_randomness_collective_flip, DdcValidator: pallet_ddc_validator, } ); @@ -187,6 +179,11 @@ impl pallet_session::Config for Test { type WeightInfo = (); } +impl pallet_session::historical::Config for Test { + type FullIdentification = pallet_staking::Exposure; + type FullIdentificationOf = pallet_staking::ExposureOf; +} + pallet_staking_reward_curve::build! { const REWARD_CURVE: PiecewiseLinear<'static> = curve!( min_inflation: 0_000_100, @@ -198,6 +195,13 @@ pallet_staking_reward_curve::build! { ); } +pub struct OnChainSeqPhragmen; +impl onchain::ExecutionConfig for OnChainSeqPhragmen { + type System = Test; + type Solver = SequentialPhragmen; + type DataProvider = Staking; +} + parameter_types! { pub const SessionsPerEra: sp_staking::SessionIndex = 6; pub const BondingDuration: sp_staking::EraIndex = 3; @@ -208,19 +212,6 @@ parameter_types! { pub OffchainRepeat: BlockNumber = 5; } - -pub struct OnChainSeqPhragmen; -impl onchain::ExecutionConfig for OnChainSeqPhragmen { - type System = Test; - type Solver = SequentialPhragmen; - type DataProvider = Staking; -} - -impl pallet_session::historical::Config for Test { - type FullIdentification = pallet_staking::Exposure; - type FullIdentificationOf = pallet_staking::ExposureOf; -} - impl pallet_staking::Config for Test { type MaxNominations = ConstU32<16>; type Currency = Balances; @@ -300,22 +291,6 @@ impl SigningTypes for Test { type Signature = Signature; } -// impl frame_system::offchain::SendTransactionTypes for Test -// where -// Call: From, -// { -// type OverarchingCall = Call; -// type Extrinsic = TestXt; -// } - -// impl SendTransactionTypes for Test -// where -// Call: From, -// { -// type OverarchingCall = Call; -// type Extrinsic = Extrinsic; -// } - impl CreateSignedTransaction for Test where Call: From, From 2835f5695e26edf4672ab83f2b9b70f10e8669ff Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Mon, 17 Apr 2023 12:41:49 +0200 Subject: [PATCH 077/583] Fix compilation errors after merge --- src/mock.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/mock.rs b/src/mock.rs index 2180867f8..5e4ada7f3 100644 --- a/src/mock.rs +++ b/src/mock.rs @@ -144,10 +144,6 @@ impl pallet_timestamp::Config for Test { impl pallet_randomness_collective_flip::Config for Test {} -parameter_types! { - pub const DdcValidatorsQuorumSize: u32 = 3; -} - pub struct TestShouldEndSession; impl ShouldEndSession for TestShouldEndSession { fn should_end_session(now: u32) -> bool { @@ -196,10 +192,12 @@ pallet_staking_reward_curve::build! { } pub struct OnChainSeqPhragmen; -impl onchain::ExecutionConfig for OnChainSeqPhragmen { +impl onchain::Config for OnChainSeqPhragmen { type System = Test; type Solver = SequentialPhragmen; type DataProvider = Staking; + type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; + } parameter_types! { @@ -236,6 +234,8 @@ impl pallet_staking::Config for Test { type MaxUnlockingChunks = ConstU32<32>; type WeightInfo = pallet_staking::weights::SubstrateWeight; type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; + type CurrencyBalance = Balance; + type OnStakerSlash = (); } impl pallet_ddc_staking::Config for Test { @@ -245,6 +245,11 @@ impl pallet_ddc_staking::Config for Test { type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; } +parameter_types! { + pub const DdcValidatorsQuorumSize: u32 = 3; + pub const ValidationThreshold: u32 = 5; +} + impl pallet_ddc_validator::Config for Test { type DdcValidatorsQuorumSize = DdcValidatorsQuorumSize; type Event = Event; @@ -252,6 +257,7 @@ impl pallet_ddc_validator::Config for Test { type Call = Call; type AuthorityId = pallet_ddc_validator::crypto::TestAuthId; type TimeProvider = pallet_timestamp::Pallet; + type ValidationThreshold = ValidationThreshold; } impl SendTransactionTypes for Test From 4c0817a3e79f4faa22af9de235a06e6b8d93fd0a Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Mon, 17 Apr 2023 14:58:29 +0200 Subject: [PATCH 078/583] Add unit test example --- src/tests.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/tests.rs b/src/tests.rs index e69de29bb..cc0df5512 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -0,0 +1,15 @@ +use crate::{mock::*}; +use frame_support::{assert_ok}; +use sp_core::crypto::AccountId32; + +#[test] +fn save_validated_data_works() { + new_test_ext().execute_with(|| { + assert_ok!(DdcValidator::save_validated_data( + Origin::signed(AccountId32::from([1; 32])), + true, + String::from("0xab1"), + 1, + )); + }); +} \ No newline at end of file From b4c5a68748aea5acba87b31eef1740bc7c1e7852 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 18 Apr 2023 10:30:22 +0200 Subject: [PATCH 079/583] Fix build --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index eeaa05436..2c9fe6bc2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ alt_serde = { version = "1", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } -frame-election-provider-support = { version = "4.0.0-dev", path = "../election-provider-support" } +frame-election-provider-support = { version = "4.0.0-dev", default-features = false, path = "../election-provider-support" } log = { version = "0.4.17", default-features = false } pallet-contracts = { version = '4.0.0-dev', default-features = false, path = "../contracts" } From d7da3133b3b08270c60fdc7a95b662c1b35edb1b Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Wed, 19 Apr 2023 11:46:03 +0200 Subject: [PATCH 080/583] Make data provider url configurable via rpc --- src/lib.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fef99bd08..2d565566c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -53,6 +53,7 @@ pub use frame_support::{ traits::{Currency, Randomness, UnixTime}, weights::Weight, BoundedVec, RuntimeDebug, + storage, }; pub use frame_system::{ ensure_signed, @@ -66,7 +67,7 @@ pub use pallet_staking::{self as staking}; pub use scale_info::TypeInfo; pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; pub use sp_io::crypto::sr25519_public_keys; -pub use sp_runtime::offchain::{http, Duration, Timestamp}; +pub use sp_runtime::offchain::{http, Duration, Timestamp, storage::StorageValueRef}; pub use sp_staking::EraIndex; pub use sp_std::prelude::*; @@ -92,7 +93,9 @@ const ERA_DURATION_MS: u128 = 120_000; const ERA_IN_BLOCKS: u8 = 20; /// Webdis in experimental cluster connected to Redis in dev. -const DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379/"; +// const DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379/"; +const DEFAULT_DATA_PROVIDER_URL: &str = "localhost:7379/"; +const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; /// DAC Validation methods. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] @@ -425,6 +428,10 @@ pub mod pallet { /// 2. Run a process at the same time, /// 3. Read data from DAC. fn offchain_worker(block_number: T::BlockNumber) { + let data_provider_url = Self::get_data_provider_url(); + + info!("data_provider_url: {:?}", data_provider_url.unwrap_or(String::from("no url"))); + // Skip if not a validator. if !sp_io::offchain::is_validator() { return @@ -628,6 +635,26 @@ pub mod pallet { Ok(()) } + fn get_data_provider_url() -> Option { + let url_ref = StorageValueRef::persistent(DATA_PROVIDER_URL_KEY).get::>(); + info!("url_ref: {:?}", url_ref); + match url_ref { + Ok(None) => { + let url_key = String::from_utf8(DATA_PROVIDER_URL_KEY.to_vec()).unwrap(); + let msg = format!("[DAC Validator] Data provider URL is not configured. Please configure it using offchain_localStorageSet with key {:?}", url_key); + warn!("{}", msg); + None + } + Ok(Some(url)) => { + Some(String::from_utf8(url).unwrap()) + }, + Err(_) => { + error!("[OCW] Data provider URL is configured but the value could not be decoded"); + None + } + } + } + fn get_signer() -> ResultStr> { let signer = Signer::<_, _>::any_account(); if !signer.can_sign() { @@ -714,11 +741,29 @@ pub mod pallet { } fn get_bytes_sent_query_url(era: EraIndex) -> String { - format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DATA_PROVIDER_URL, era, era) + let data_provider_url = Self::get_data_provider_url(); + + match data_provider_url { + Some(url) => { + return format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", url, era, era); + } + None => { + return format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DEFAULT_DATA_PROVIDER_URL, era, era); + } + } } fn get_bytes_received_query_url(era: EraIndex) -> String { - format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DATA_PROVIDER_URL, era, era) + let data_provider_url = Self::get_data_provider_url(); + + match data_provider_url { + Some(url) => { + return format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", url, era, era); + } + None => { + return format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DEFAULT_DATA_PROVIDER_URL, era, era); + } + } } fn http_get_json(url: &str) -> ResultStr { From c7f928b3cae46087ee4c589ac987d6ef7f3ea71e Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 19 Apr 2023 20:24:41 +0600 Subject: [PATCH 081/583] Fix local storage reading --- src/lib.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 2d565566c..4d4d88f32 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -636,22 +636,19 @@ pub mod pallet { } fn get_data_provider_url() -> Option { - let url_ref = StorageValueRef::persistent(DATA_PROVIDER_URL_KEY).get::>(); + let url_ref = sp_io::offchain::local_storage_get( + sp_core::offchain::StorageKind::PERSISTENT, + DATA_PROVIDER_URL_KEY, + ); info!("url_ref: {:?}", url_ref); match url_ref { - Ok(None) => { + None => { let url_key = String::from_utf8(DATA_PROVIDER_URL_KEY.to_vec()).unwrap(); let msg = format!("[DAC Validator] Data provider URL is not configured. Please configure it using offchain_localStorageSet with key {:?}", url_key); warn!("{}", msg); None - } - Ok(Some(url)) => { - Some(String::from_utf8(url).unwrap()) }, - Err(_) => { - error!("[OCW] Data provider URL is configured but the value could not be decoded"); - None - } + Some(url) => Some(String::from_utf8(url).unwrap()), } } From a4a9f8cb88673a4373dbf12fa876ab06293b050b Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Wed, 19 Apr 2023 16:53:00 +0200 Subject: [PATCH 082/583] Clean up --- src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 4d4d88f32..ec2769b01 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -93,7 +93,6 @@ const ERA_DURATION_MS: u128 = 120_000; const ERA_IN_BLOCKS: u8 = 20; /// Webdis in experimental cluster connected to Redis in dev. -// const DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379/"; const DEFAULT_DATA_PROVIDER_URL: &str = "localhost:7379/"; const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; @@ -640,7 +639,7 @@ pub mod pallet { sp_core::offchain::StorageKind::PERSISTENT, DATA_PROVIDER_URL_KEY, ); - info!("url_ref: {:?}", url_ref); + match url_ref { None => { let url_key = String::from_utf8(DATA_PROVIDER_URL_KEY.to_vec()).unwrap(); From a9f264aee0596a011b1a647bf8eff48d5318fe69 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 20 Apr 2023 13:00:01 +0600 Subject: [PATCH 083/583] Remove duplicate parameter --- src/lib.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ec2769b01..f1c58a4ba 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -73,10 +73,6 @@ pub use sp_std::prelude::*; extern crate alloc; -parameter_types! { - pub const ValidationThreshold: f32 = 5.0; -} - /// The balance type of this pallet. type BalanceOf = <::Currency as Currency< ::AccountId, From bae3c9e706aba2ccc8648287e122a03aa9b56b05 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 20 Apr 2023 13:10:24 +0600 Subject: [PATCH 084/583] Autoformat DAC Validator files --- src/lib.rs | 13 +- src/mock.rs | 340 +++++++++++++++++++++++++-------------------------- src/tests.rs | 22 ++-- 3 files changed, 186 insertions(+), 189 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index f1c58a4ba..f64bc4ae0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -49,11 +49,10 @@ pub use frame_support::{ dispatch::DispatchResult, log::{error, info, warn}, pallet_prelude::*, - parameter_types, + parameter_types, storage, traits::{Currency, Randomness, UnixTime}, weights::Weight, BoundedVec, RuntimeDebug, - storage, }; pub use frame_system::{ ensure_signed, @@ -67,7 +66,7 @@ pub use pallet_staking::{self as staking}; pub use scale_info::TypeInfo; pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; pub use sp_io::crypto::sr25519_public_keys; -pub use sp_runtime::offchain::{http, Duration, Timestamp, storage::StorageValueRef}; +pub use sp_runtime::offchain::{http, storage::StorageValueRef, Duration, Timestamp}; pub use sp_staking::EraIndex; pub use sp_std::prelude::*; @@ -738,10 +737,10 @@ pub mod pallet { match data_provider_url { Some(url) => { return format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", url, era, era); - } + }, None => { return format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DEFAULT_DATA_PROVIDER_URL, era, era); - } + }, } } @@ -751,10 +750,10 @@ pub mod pallet { match data_provider_url { Some(url) => { return format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", url, era, era); - } + }, None => { return format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DEFAULT_DATA_PROVIDER_URL, era, era); - } + }, } } diff --git a/src/mock.rs b/src/mock.rs index 5e4ada7f3..bc057705c 100644 --- a/src/mock.rs +++ b/src/mock.rs @@ -1,27 +1,25 @@ -use crate::{*, self as pallet_ddc_validator}; +use crate::{self as pallet_ddc_validator, *}; +use frame_election_provider_support::{onchain, SequentialPhragmen}; use frame_support::{ - parameter_types, - weights::Weight, - traits::{ConstU16, ConstU64, Currency, Everything, Nothing} + parameter_types, + traits::{ConstU16, ConstU64, Currency, Everything, Nothing, U128CurrencyToVote}, + weights::Weight, }; -use frame_system::EnsureRoot; -use frame_system::offchain::SendTransactionTypes; -use sp_core::H256; -use sp_runtime::{ curve::PiecewiseLinear, generic, testing::{Header, TestXt}, traits::{BlakeTwo256, IdentityLookup, Verify, Extrinsic as ExtrinsicT, IdentifyAccount}, Perbill, MultiSignature, curve}; +use frame_system::{offchain::SendTransactionTypes, EnsureRoot}; use pallet_contracts as contracts; -use sp_runtime::traits::Convert; use pallet_session::ShouldEndSession; +use sp_core::H256; use sp_runtime::{ - impl_opaque_keys, - testing::{UintAuthorityId}, + curve, + curve::PiecewiseLinear, + generic, impl_opaque_keys, + testing::{Header, TestXt, UintAuthorityId}, + traits::{ + BlakeTwo256, Convert, Extrinsic as ExtrinsicT, IdentifyAccount, IdentityLookup, Verify, + }, + MultiSignature, Perbill, }; use sp_staking::SessionIndex; -use frame_support::{ - traits::{U128CurrencyToVote} -}; -use frame_election_provider_support::{ - onchain, SequentialPhragmen -}; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; type Balance = u128; @@ -38,117 +36,118 @@ frame_support::construct_runtime!( { System: frame_system, Balances: pallet_balances, - Contracts: contracts, - Timestamp: pallet_timestamp, - Session: pallet_session, - Staking: pallet_staking, - DdcStaking: pallet_ddc_staking, - RandomnessCollectiveFlip: pallet_randomness_collective_flip, - DdcValidator: pallet_ddc_validator, + Contracts: contracts, + Timestamp: pallet_timestamp, + Session: pallet_session, + Staking: pallet_staking, + DdcStaking: pallet_ddc_staking, + RandomnessCollectiveFlip: pallet_randomness_collective_flip, + DdcValidator: pallet_ddc_validator, } ); parameter_types! { - pub const BlockHashCount: BlockNumber = 250; - pub const MaximumBlockWeight: Weight = 1024; - pub const MaximumBlockLength: u32 = 2 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::one(); + pub const BlockHashCount: BlockNumber = 250; + pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl frame_system::Config for Test { - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - type Origin = Origin; - type Index = u64; - type BlockNumber = BlockNumber; - type Hash = H256; - type Call = Call; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - // u64; // sp_core::sr25519::Public; - type Lookup = IdentityLookup; - type Header = generic::Header; - type Event = Event; - type BlockHashCount = BlockHashCount; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type Origin = Origin; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type Call = Call; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + // u64; // sp_core::sr25519::Public; + type Lookup = IdentityLookup; + type Header = generic::Header; + type Event = Event; + type BlockHashCount = BlockHashCount; + type DbWeight = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; } parameter_types! { - pub const SignedClaimHandicap: BlockNumber = 2; - pub const TombstoneDeposit: Balance = 16; - pub const StorageSizeOffset: u32 = 8; - pub const RentByteFee: Balance = 4; - pub const RentDepositOffset: Balance = 10_000; - pub const SurchargeReward: Balance = 150; - pub const MaxDepth: u32 = 100; - pub const MaxValueSize: u32 = 16_384; - pub Schedule: pallet_contracts::Schedule = Default::default(); + pub const SignedClaimHandicap: BlockNumber = 2; + pub const TombstoneDeposit: Balance = 16; + pub const StorageSizeOffset: u32 = 8; + pub const RentByteFee: Balance = 4; + pub const RentDepositOffset: Balance = 10_000; + pub const SurchargeReward: Balance = 150; + pub const MaxDepth: u32 = 100; + pub const MaxValueSize: u32 = 16_384; + pub Schedule: pallet_contracts::Schedule = Default::default(); } -use contracts::{Config as contractsConfig}; +use contracts::Config as contractsConfig; -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; pub struct TestWeightToFee; impl Convert for TestWeightToFee { - fn convert(weight: u64) -> u128 { - weight as u128 - } + fn convert(weight: u64) -> u128 { + weight as u128 + } } impl contracts::Config for Test { - type Time = Timestamp; - type Randomness = RandomnessCollectiveFlip; - type Currency = Balances; - type Event = Event; - type CallStack = [pallet_contracts::Frame; 31]; - type WeightPrice = TestWeightToFee; //pallet_transaction_payment::Module; - type WeightInfo = (); - type ChainExtension = (); - type DeletionQueueDepth = (); - type DeletionWeightLimit = (); - type Schedule = Schedule; - type Call = Call; - type CallFilter = Nothing; - type DepositPerByte = DepositPerByte; - type DepositPerItem = DepositPerItem; - type AddressGenerator = pallet_contracts::DefaultAddressGenerator; + type Time = Timestamp; + type Randomness = RandomnessCollectiveFlip; + type Currency = Balances; + type Event = Event; + type CallStack = [pallet_contracts::Frame; 31]; + type WeightPrice = TestWeightToFee; //pallet_transaction_payment::Module; + type WeightInfo = (); + type ChainExtension = (); + type DeletionQueueDepth = (); + type DeletionWeightLimit = (); + type Schedule = Schedule; + type Call = Call; + type CallFilter = Nothing; + type DepositPerByte = DepositPerByte; + type DepositPerItem = DepositPerItem; + type AddressGenerator = pallet_contracts::DefaultAddressGenerator; } parameter_types! { - pub const TransactionByteFee: u64 = 0; - pub const DepositPerItem: Balance = 0; + pub const TransactionByteFee: u64 = 0; + pub const DepositPerItem: Balance = 0; pub const DepositPerByte: Balance = 0; } parameter_types! { - pub const MinimumPeriod: u64 = 1; + pub const MinimumPeriod: u64 = 1; } impl pallet_timestamp::Config for Test { - type Moment = Moment; - type OnTimestampSet = (); - type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); + type Moment = Moment; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); } impl pallet_randomness_collective_flip::Config for Test {} pub struct TestShouldEndSession; impl ShouldEndSession for TestShouldEndSession { - fn should_end_session(now: u32) -> bool { - now % 10 == 0 // every 10 blocks - } + fn should_end_session(now: u32) -> bool { + now % 10 == 0 // every 10 blocks + } } impl_opaque_keys! { @@ -164,15 +163,15 @@ impl From for MockSessionKeys { } impl pallet_session::Config for Test { - type Event = Event; - type ValidatorId = AccountId; - type ValidatorIdOf = (); - type ShouldEndSession = TestShouldEndSession; - type NextSessionRotation = (); - type SessionManager = (); - type SessionHandler = pallet_session::TestSessionHandler; - type Keys = MockSessionKeys; - type WeightInfo = (); + type Event = Event; + type ValidatorId = AccountId; + type ValidatorIdOf = (); + type ShouldEndSession = TestShouldEndSession; + type NextSessionRotation = (); + type SessionManager = (); + type SessionHandler = pallet_session::TestSessionHandler; + type Keys = MockSessionKeys; + type WeightInfo = (); } impl pallet_session::historical::Config for Test { @@ -193,11 +192,10 @@ pallet_staking_reward_curve::build! { pub struct OnChainSeqPhragmen; impl onchain::Config for OnChainSeqPhragmen { - type System = Test; - type Solver = SequentialPhragmen; - type DataProvider = Staking; - type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; - + type System = Test; + type Solver = SequentialPhragmen; + type DataProvider = Staking; + type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; } parameter_types! { @@ -211,61 +209,61 @@ parameter_types! { } impl pallet_staking::Config for Test { - type MaxNominations = ConstU32<16>; - type Currency = Balances; - type UnixTime = Timestamp; - type CurrencyToVote = U128CurrencyToVote; - type RewardRemainder = (); - type Event = Event; - type Slash = (); // send the slashed funds to the treasury. - type Reward = (); // rewards are minted from the void - type SessionsPerEra = SessionsPerEra; - type BondingDuration = BondingDuration; - type SlashDeferDuration = SlashDeferDuration; - type SlashCancelOrigin = frame_system::EnsureRoot; - type SessionInterface = Self; - type EraPayout = pallet_staking::ConvertCurve; - type NextNewSession = Session; - type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; - type ElectionProvider = onchain::UnboundedExecution; - type GenesisElectionProvider = Self::ElectionProvider; - type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; - type MaxUnlockingChunks = ConstU32<32>; - type WeightInfo = pallet_staking::weights::SubstrateWeight; - type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type CurrencyBalance = Balance; - type OnStakerSlash = (); + type MaxNominations = ConstU32<16>; + type Currency = Balances; + type UnixTime = Timestamp; + type CurrencyToVote = U128CurrencyToVote; + type RewardRemainder = (); + type Event = Event; + type Slash = (); // send the slashed funds to the treasury. + type Reward = (); // rewards are minted from the void + type SessionsPerEra = SessionsPerEra; + type BondingDuration = BondingDuration; + type SlashDeferDuration = SlashDeferDuration; + type SlashCancelOrigin = frame_system::EnsureRoot; + type SessionInterface = Self; + type EraPayout = pallet_staking::ConvertCurve; + type NextNewSession = Session; + type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; + type OffendingValidatorsThreshold = OffendingValidatorsThreshold; + type ElectionProvider = onchain::UnboundedExecution; + type GenesisElectionProvider = Self::ElectionProvider; + type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; + type MaxUnlockingChunks = ConstU32<32>; + type WeightInfo = pallet_staking::weights::SubstrateWeight; + type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; + type CurrencyBalance = Balance; + type OnStakerSlash = (); } impl pallet_ddc_staking::Config for Test { - type BondingDuration = BondingDuration; - type Currency = Balances; - type Event = Event; - type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; + type BondingDuration = BondingDuration; + type Currency = Balances; + type Event = Event; + type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; } parameter_types! { pub const DdcValidatorsQuorumSize: u32 = 3; - pub const ValidationThreshold: u32 = 5; + pub const ValidationThreshold: u32 = 5; } impl pallet_ddc_validator::Config for Test { - type DdcValidatorsQuorumSize = DdcValidatorsQuorumSize; - type Event = Event; - type Randomness = RandomnessCollectiveFlip; - type Call = Call; - type AuthorityId = pallet_ddc_validator::crypto::TestAuthId; - type TimeProvider = pallet_timestamp::Pallet; - type ValidationThreshold = ValidationThreshold; + type DdcValidatorsQuorumSize = DdcValidatorsQuorumSize; + type Event = Event; + type Randomness = RandomnessCollectiveFlip; + type Call = Call; + type AuthorityId = pallet_ddc_validator::crypto::TestAuthId; + type TimeProvider = pallet_timestamp::Pallet; + type ValidationThreshold = ValidationThreshold; } impl SendTransactionTypes for Test - where - Call: From, +where + Call: From, { - type OverarchingCall = Call; - type Extrinsic = Extrinsic; + type OverarchingCall = Call; + type Extrinsic = Extrinsic; } parameter_types! { @@ -274,39 +272,39 @@ parameter_types! { } impl pallet_balances::Config for Test { - type Balance = Balance; - type DustRemoval = (); - type Event = Event; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = (); + type Balance = Balance; + type DustRemoval = (); + type Event = Event; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxLocks = (); + type MaxReserves = (); + type ReserveIdentifier = (); } // Build genesis storage according to the mock runtime. pub fn new_test_ext() -> sp_io::TestExternalities { - frame_system::GenesisConfig::default().build_storage::().unwrap().into() + frame_system::GenesisConfig::default().build_storage::().unwrap().into() } pub type Extrinsic = TestXt; impl SigningTypes for Test { - type Public = ::Signer; - type Signature = Signature; + type Public = ::Signer; + type Signature = Signature; } impl CreateSignedTransaction for Test - where - Call: From, +where + Call: From, { - fn create_transaction>( - call: Call, - _public: ::Signer, - _account: AccountId, - nonce: u64, - ) -> Option<(Call, ::SignaturePayload)> { - Some((call, (nonce, ()))) - } -} \ No newline at end of file + fn create_transaction>( + call: Call, + _public: ::Signer, + _account: AccountId, + nonce: u64, + ) -> Option<(Call, ::SignaturePayload)> { + Some((call, (nonce, ()))) + } +} diff --git a/src/tests.rs b/src/tests.rs index cc0df5512..2baeb76c0 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1,15 +1,15 @@ -use crate::{mock::*}; -use frame_support::{assert_ok}; +use crate::mock::*; +use frame_support::assert_ok; use sp_core::crypto::AccountId32; #[test] fn save_validated_data_works() { - new_test_ext().execute_with(|| { - assert_ok!(DdcValidator::save_validated_data( - Origin::signed(AccountId32::from([1; 32])), - true, - String::from("0xab1"), - 1, - )); - }); -} \ No newline at end of file + new_test_ext().execute_with(|| { + assert_ok!(DdcValidator::save_validated_data( + Origin::signed(AccountId32::from([1; 32])), + true, + String::from("0xab1"), + 1, + )); + }); +} From 201db368de4ab02388f6ed62b9f042abff471390 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 20 Apr 2023 14:13:45 +0600 Subject: [PATCH 085/583] Separate modules for validation and DAC client --- src/dac.rs | 1 + src/lib.rs | 3 +++ src/validation.rs | 1 + 3 files changed, 5 insertions(+) create mode 100644 src/dac.rs create mode 100644 src/validation.rs diff --git a/src/dac.rs b/src/dac.rs new file mode 100644 index 000000000..b24eb0cc5 --- /dev/null +++ b/src/dac.rs @@ -0,0 +1 @@ +//! A module with Data Activity Capture (DAC) interaction. diff --git a/src/lib.rs b/src/lib.rs index f64bc4ae0..fec14bdb0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -34,6 +34,9 @@ #![cfg_attr(not(feature = "std"), no_std)] +mod dac; +mod validation; + #[cfg(test)] mod mock; diff --git a/src/validation.rs b/src/validation.rs new file mode 100644 index 000000000..017d90782 --- /dev/null +++ b/src/validation.rs @@ -0,0 +1 @@ +//! DAC Validation implementation. From 553f375e59eee95d34dbda6d2801c3ac49fe8e2d Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Thu, 20 Apr 2023 16:04:01 +0200 Subject: [PATCH 086/583] Implement job assignment --- Cargo.toml | 2 +- src/lib.rs | 110 ++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 84 insertions(+), 28 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2c9fe6bc2..26477e7c6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,6 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } frame-election-provider-support = { version = "4.0.0-dev", default-features = false, path = "../election-provider-support" } - log = { version = "0.4.17", default-features = false } pallet-contracts = { version = '4.0.0-dev', default-features = false, path = "../contracts" } pallet-ddc-staking = { version = "0.1.0", default-features = false, path = "../ddc-staking" } @@ -25,6 +24,7 @@ sp-keystore = { version = "0.12.0", default-features = false, path = "../../prim sp-runtime = { version = "6.0.0", default-features = false, path = "../../primitives/runtime" } sp-staking = { version = "4.0.0-dev", default-features = false, path = "../../primitives/staking" } sp-std = { version = "4.0.0-dev", default-features = false, path = "../../primitives/std" } +rand = { version = "0.8", default-features = false } [features] default = ["std"] diff --git a/src/lib.rs b/src/lib.rs index ec2769b01..3d58f37d1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -40,6 +40,7 @@ mod mock; #[cfg(test)] mod tests; +use std::collections::{HashMap}; pub use alloc::{format, string::String}; pub use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; pub use codec::{Decode, Encode, HasCompact, MaxEncodedLen}; @@ -70,6 +71,7 @@ pub use sp_io::crypto::sr25519_public_keys; pub use sp_runtime::offchain::{http, Duration, Timestamp, storage::StorageValueRef}; pub use sp_staking::EraIndex; pub use sp_std::prelude::*; +use rand::seq::SliceRandom; extern crate alloc; @@ -304,6 +306,8 @@ pub mod pallet { #[pallet::constant] type DdcValidatorsQuorumSize: Get; + type ValidatorsMax: Get; + /// Proof-of-Delivery parameter specifies an allowed deviation between bytes sent and bytes /// received. The deviation is expressed as a percentage. For example, if the value is 10, /// then the difference between bytes sent and bytes received is allowed to be up to 10%. @@ -312,6 +316,17 @@ pub mod pallet { type ValidationThreshold: Get; } + #[pallet::storage] + #[pallet::getter(fn assignments)] + pub(super) type Assignments = StorageDoubleMap< + _, + Twox64Concat, + EraIndex, + Twox64Concat, + String, + Vec, + >; + /// A signal to start a process on all the validators. #[pallet::storage] #[pallet::getter(fn signal)] @@ -370,36 +385,23 @@ pub mod pallet { fn on_initialize(block_number: T::BlockNumber) -> Weight { // Reset the signal in the beginning of the block to keep it reset until an incoming // transaction sets it to true. - if Signal::::get().unwrap_or(false) { - Signal::::set(Some(false)); - } + // if Signal::::get().unwrap_or(false) { + // Signal::::set(Some(false)); + // } // Old task manager. - // - // if block_number <= 1u32.into() { - // return 0 - // } - // let era = Self::get_current_era(); - // if let Some(last_managed_era) = >::get() { - // if last_managed_era >= era { - // return 0 - // } - // } - // >::put(era); - - // let validators: Vec = >::iter_keys().collect(); - // let validators_count = validators.len() as u32; - // let edges: Vec = - // >::iter_keys().collect(); log::info!( - // "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, - // validators: {:?}, edges: {:?}", block_number, - // era, - // >::get(), - // validators_count, - // validators, - // edges, - // ); + if block_number <= 1u32.into() { + return 0 + } + + let era = Self::get_current_era(); + if let Some(last_managed_era) = >::get() { + if last_managed_era >= era { + return 0 + } + } + >::put(era); // // A naive approach assigns random validators for each edge. // for edge in edges { @@ -811,6 +813,60 @@ pub mod pallet { } } + fn shuffle(mut list: Vec) -> Vec { + list.shuffle(&mut rand::thread_rng()); + + list + } + + fn split(list: Vec, segment_len: usize) -> Vec> { + list.chunks(segment_len).map(|chunk| chunk.to_vec()).collect() + } + + fn assign(quorum_size: usize) -> HashMap> { + let validators: Vec = >::iter_keys().collect(); + let edges: Vec = >::iter_keys().collect(); + + let shuffled_validators = Self::shuffle(validators); + let shuffled_edges = Self::shuffle(edges); + + let validators_keys: Vec = shuffled_validators.iter().map( |v| { + Self::account_to_string(v.clone()) + }).collect(); + + let edges_keys: Vec = shuffled_edges.iter().map( |e| { + Self::account_to_string(e.clone()) + }).collect(); + + let quorums = Self::split(validators_keys, quorum_size); + let edges_groups = Self::split(edges_keys, quorums.len()); + + Self::map_validators_to_edges(quorums, edges_groups) + } + + fn map_validators_to_edges(quorums: Vec>, edges_groups: Vec>) -> HashMap> { + let mut validators_to_edges: HashMap> = HashMap::new(); + + for (i, quorum) in quorums.iter().enumerate() { + let edges_group = &edges_groups[i]; + for validator in quorum { + validators_to_edges.insert(validator.clone(), edges_group.clone()); + } + } + + validators_to_edges + } + + fn save_assignments(era: EraIndex, assignments: HashMap>) -> DispatchResult { + let era = Self::get_current_era(); + + for (validator, edges) in assignments { + Assignments::::insert(era, validator, edges); + } + + Ok(()) + } + /// Fetch the tasks related to current validator fn fetch_tasks(era: EraIndex, validator: &T::AccountId) -> Vec { let mut cdn_nodes: Vec = vec![]; From 72c0c283be7523421b36b55a2b7aae1ba68d7a71 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Thu, 20 Apr 2023 18:57:39 +0200 Subject: [PATCH 087/583] Compilation fixes --- Cargo.toml | 1 - src/lib.rs | 39 +++++++++++++++++---------------------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 26477e7c6..ff6dbd53b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,6 @@ sp-keystore = { version = "0.12.0", default-features = false, path = "../../prim sp-runtime = { version = "6.0.0", default-features = false, path = "../../primitives/runtime" } sp-staking = { version = "4.0.0-dev", default-features = false, path = "../../primitives/staking" } sp-std = { version = "4.0.0-dev", default-features = false, path = "../../primitives/std" } -rand = { version = "0.8", default-features = false } [features] default = ["std"] diff --git a/src/lib.rs b/src/lib.rs index 3d58f37d1..050aa7267 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -40,7 +40,6 @@ mod mock; #[cfg(test)] mod tests; -use std::collections::{HashMap}; pub use alloc::{format, string::String}; pub use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; pub use codec::{Decode, Encode, HasCompact, MaxEncodedLen}; @@ -71,7 +70,6 @@ pub use sp_io::crypto::sr25519_public_keys; pub use sp_runtime::offchain::{http, Duration, Timestamp, storage::StorageValueRef}; pub use sp_staking::EraIndex; pub use sp_std::prelude::*; -use rand::seq::SliceRandom; extern crate alloc; @@ -396,13 +394,18 @@ pub mod pallet { } let era = Self::get_current_era(); + info!("current era: {:?}", era); + if let Some(last_managed_era) = >::get() { + info!("last_managed_era: {:?}", last_managed_era); if last_managed_era >= era { return 0 } } >::put(era); + Self::assign(3usize); + // // A naive approach assigns random validators for each edge. // for edge in edges { // let mut decisions: BoundedVec, T::DdcValidatorsQuorumSize> = @@ -814,7 +817,11 @@ pub mod pallet { } fn shuffle(mut list: Vec) -> Vec { - list.shuffle(&mut rand::thread_rng()); + let len = list.len(); + for i in 1..len { + let random_index = Self::choose(len as u32).unwrap() as usize; + list.swap(i, random_index) + } list } @@ -823,10 +830,14 @@ pub mod pallet { list.chunks(segment_len).map(|chunk| chunk.to_vec()).collect() } - fn assign(quorum_size: usize) -> HashMap> { + fn assign(quorum_size: usize) { let validators: Vec = >::iter_keys().collect(); let edges: Vec = >::iter_keys().collect(); + if edges.len() == 0 { + return; + } + let shuffled_validators = Self::shuffle(validators); let shuffled_edges = Self::shuffle(edges); @@ -841,30 +852,14 @@ pub mod pallet { let quorums = Self::split(validators_keys, quorum_size); let edges_groups = Self::split(edges_keys, quorums.len()); - Self::map_validators_to_edges(quorums, edges_groups) - } - - fn map_validators_to_edges(quorums: Vec>, edges_groups: Vec>) -> HashMap> { - let mut validators_to_edges: HashMap> = HashMap::new(); + let era = Self::get_current_era(); for (i, quorum) in quorums.iter().enumerate() { let edges_group = &edges_groups[i]; for validator in quorum { - validators_to_edges.insert(validator.clone(), edges_group.clone()); + Assignments::::insert(era, validator, edges_group); } } - - validators_to_edges - } - - fn save_assignments(era: EraIndex, assignments: HashMap>) -> DispatchResult { - let era = Self::get_current_era(); - - for (validator, edges) in assignments { - Assignments::::insert(era, validator, edges); - } - - Ok(()) } /// Fetch the tasks related to current validator From 8eca54ec7711b2e7861f6715a70bba6f91cf5d6f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 21 Apr 2023 13:30:15 +0600 Subject: [PATCH 088/583] Validation results with aggregates from DAC --- src/lib.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index fec14bdb0..b8b296e7e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -94,6 +94,30 @@ const ERA_IN_BLOCKS: u8 = 20; const DEFAULT_DATA_PROVIDER_URL: &str = "localhost:7379/"; const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; +/// Aggregated values from DAC that describe CDN node's activity during a certain era. +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] +pub struct DacTotalAggregates { + /// Total bytes received by the client. + pub received: u64, + /// Total bytes sent by the CDN node. + pub sent: u64, + /// Total bytes sent by the CDN node to the client which interrupts the connection. + pub failed_by_client: u64, + /// ToDo: explain. + pub failure_rate: u64, +} + +/// Final DAC Validation decision. +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] +pub struct ValidationDecision { + /// Validation result. + pub result: bool, + /// A hash of the data used to produce validation result. + pub payload: [u8; 256], + /// Values aggregated from the payload. + pub totals: DacTotalAggregates, +} + /// DAC Validation methods. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] pub enum ValidationMethodKind { @@ -315,6 +339,12 @@ pub mod pallet { #[pallet::getter(fn signal)] pub(super) type Signal = StorageValue<_, bool>; + /// The map from the era and CDN participant stash key to the validation decision related. + #[pallet::storage] + #[pallet::getter(fn validation_decisions)] + pub type ValidationDecisions = + StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, ValidationDecision>; + /// The map from the era and CDN participant stash key to the validation decisions related. #[pallet::storage] #[pallet::getter(fn tasks)] @@ -591,6 +621,28 @@ pub mod pallet { Ok(()) } + + /// Set validation decision for a given CDN node in an era. + #[pallet::weight(10_000)] + pub fn set_validation_decision( + origin: OriginFor, + era: EraIndex, + cdn_node: T::AccountId, + validation_decision: ValidationDecision, + ) -> DispatchResult { + ensure_signed(origin)?; + + // ToDo: check if origin is a validator. + // ToDo: check if the era is current - 1. + // ToDo: check if the validation decision is not set yet. + // ToDo: check cdn_node is known to ddc-staking. + + ValidationDecisions::::insert(era, cdn_node, validation_decision); + + // ToDo: emit event. + + Ok(()) + } } impl Pallet From 8434e99ee1372e7bf3b3f00fe7a80c3097fc1152 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 21 Apr 2023 14:04:57 +0600 Subject: [PATCH 089/583] Remove unnecessary validators signal reset call --- src/lib.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b8b296e7e..3d7f4d229 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -521,15 +521,6 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] - pub fn reset_signal(origin: OriginFor) -> DispatchResult { - ensure_signed(origin)?; - - Signal::::set(Some(false)); - - Ok(()) - } - #[pallet::weight(10000)] pub fn save_validated_data( origin: OriginFor, From 3079bacac7960be49328f704f84a81dec7f9decb Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 21 Apr 2023 15:34:16 +0600 Subject: [PATCH 090/583] Remove an obsolete task manager related code --- src/lib.rs | 317 +---------------------------------------------------- 1 file changed, 6 insertions(+), 311 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3d7f4d229..350fd204b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,36 +1,17 @@ //! # DDC Validator pallet //! -//! The DDC Validator pallet is responsible for producing validation decisions based on activity -//! data from DAC DataModel. It is expected to work on validators nodes only. +//! The DDC Validator pallet defines storage item to store validation results and implements OCW +//! (off-chain worker) to produce these results using the data from Data Activity Capture (DAC). //! //! - [`Config`] //! - [`Call`] //! - [`Pallet`] //! - [`Hooks`] //! -//! ## Responsibility -//! -//! 1. Assign validation tasks on DAC Validators in the beginning of each era, -//! 2. Spin the offchain worker which tries to execute the validation tasks each era, -//! 3. Fetch the data required for validation from DAC DataModel, -//! 4. Execute validation method on this data, -//! 5. Produce validation decision and submit it to the chain. -//! -//! ## Usage -//! -//! 1. Run the node with `--validator` flag, -//! 2. Setup validator key with `author_insertKey` RPC call. Use `dacv` validator key type and the -//! same private key as the one used to generate the validator's session keys, -//! 3. Proceed a regular validator setup, -//! 4. Tasks assignment will assign you a task in the beginning of the era which has your account in -//! validators set. -//! //! ## Notes //! -//! - Era definition in this pallet is different than in the `pallet-staking`. In this pallet era is -//! a period of time during which the validator is expected to produce a validation decision. -//! Means staking era and DAC era are different and are not related to each other, -//! - You can set DAC Validators quorum size by specifying `DdcValidatorsQuorumSize` parameter, +//! - Era definition in this pallet is different than in the `pallet-staking`. Check DAC +//! documentation for `era` definition used in this pallet. #![cfg_attr(not(feature = "std"), no_std)] @@ -118,25 +99,6 @@ pub struct ValidationDecision { pub totals: DacTotalAggregates, } -/// DAC Validation methods. -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] -pub enum ValidationMethodKind { - /// Compare amount of served content with amount of content consumed. - ProofOfDelivery, -} - -/// Associates validation decision with the validator and the method used to produce it. -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] -pub struct Decision { - /// Individual validator's decision. Can be `None` if the validator did not produce a decision - /// (yet). - pub decision: Option, - /// The method used to produce the decision. - pub method: ValidationMethodKind, - /// The validator who produced the decision. - pub validator: AccountId, -} - #[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo, Default)] pub struct ValidationResult { era: EraIndex, @@ -310,22 +272,12 @@ pub mod pallet { /// The overarching event type. type Event: From> + IsType<::Event>; - /// Something that provides randomness in the runtime. Required by the tasks assignment - /// procedure. - type Randomness: Randomness; - /// A dispatchable call. type Call: From>; type AuthorityId: AppCrypto; type TimeProvider: UnixTime; - /// Number of validators expected to produce an individual validation decision to form a - /// consensus. Tasks assignment procedure use this value to determine the number of - /// validators are getting the same task. Must be an odd number. - #[pallet::constant] - type DdcValidatorsQuorumSize: Get; - /// Proof-of-Delivery parameter specifies an allowed deviation between bytes sent and bytes /// received. The deviation is expressed as a percentage. For example, if the value is 10, /// then the difference between bytes sent and bytes received is allowed to be up to 10%. @@ -345,23 +297,6 @@ pub mod pallet { pub type ValidationDecisions = StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, ValidationDecision>; - /// The map from the era and CDN participant stash key to the validation decisions related. - #[pallet::storage] - #[pallet::getter(fn tasks)] - pub type Tasks = StorageDoubleMap< - _, - Twox64Concat, - EraIndex, - Twox64Concat, - T::AccountId, - BoundedVec, T::DdcValidatorsQuorumSize>, - >; - - /// The last era for which the tasks assignment produced. - #[pallet::storage] - #[pallet::getter(fn last_managed_era)] - pub type LastManagedEra = StorageValue<_, EraIndex>; - #[pallet::storage] #[pallet::getter(fn validation_results)] pub(super) type ValidationResults = @@ -372,22 +307,10 @@ pub mod pallet { pub enum Event where ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, - { - /// DAC Validator successfully published the validation decision. - ValidationDecisionSubmitted, - } + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, {} #[pallet::error] - pub enum Error { - /// Validation decision attempts to submit the result for the wrong era (not the current - /// one). - BadEra, - /// Can't submit the validation decision twice. - DecisionAlreadySubmitted, - /// Task does not exist for a given era, CDN participant, and DAC validator. - TaskNotFound, - } + pub enum Error {} #[pallet::hooks] impl Hooks> for Pallet @@ -402,50 +325,6 @@ pub mod pallet { Signal::::set(Some(false)); } - // Old task manager. - // - // if block_number <= 1u32.into() { - // return 0 - // } - - // let era = Self::get_current_era(); - // if let Some(last_managed_era) = >::get() { - // if last_managed_era >= era { - // return 0 - // } - // } - // >::put(era); - - // let validators: Vec = >::iter_keys().collect(); - // let validators_count = validators.len() as u32; - // let edges: Vec = - // >::iter_keys().collect(); log::info!( - // "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, - // validators: {:?}, edges: {:?}", block_number, - // era, - // >::get(), - // validators_count, - // validators, - // edges, - // ); - - // // A naive approach assigns random validators for each edge. - // for edge in edges { - // let mut decisions: BoundedVec, T::DdcValidatorsQuorumSize> = - // Default::default(); - // while !decisions.is_full() { - // let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; - // let validator: T::AccountId = validators[validator_idx].clone(); - // let assignment = Decision { - // validator, - // method: ValidationMethodKind::ProofOfDelivery, - // decision: None, - // }; - // decisions.try_push(assignment).unwrap(); - // } - // Tasks::::insert(era, edge, decisions); - // } - 0 } @@ -482,26 +361,6 @@ pub mod pallet { received_query, received, ); - - // Old off-chain worker. - // - // let pubkeys = sr25519_public_keys(KEY_TYPE); - // if pubkeys.is_empty() { - // log::info!("No local sr25519 accounts available to offchain worker."); - // return - // } - // log::info!( - // "Local sr25519 accounts available to offchain worker: {:?}, first pubilc key: {:?}", - // pubkeys, - // pubkeys.first().unwrap() - // ); - - // let res = Self::offchain_worker_main(block_number); - - // match res { - // Ok(()) => info!("[DAC Validator] DAC Validator is suspended."), - // Err(err) => error!("[DAC Validator] Error in Offchain Worker: {}", err), - // }; } } @@ -543,76 +402,6 @@ pub mod pallet { Ok(()) } - /// Set validation decision in tasks assignment. - /// - /// `origin` must be a DAC Validator assigned to the task. - /// `era` must be a current era, otherwise the decision will be rejected. - /// `subject` is a CDN participant stash. - /// - /// Emits `ValidationDecisionSubmitted` event. - #[pallet::weight(100_000)] - pub fn submit_validation_decision( - origin: OriginFor, - era: EraIndex, - subject: T::AccountId, - method: ValidationMethodKind, - decision: bool, - ) -> DispatchResult { - let account = ensure_signed(origin)?; - - ensure!(Self::get_current_era() == era, Error::::BadEra); - - Tasks::::try_mutate_exists(era, &subject, |maybe_tasks| { - let mut tasks = maybe_tasks.take().ok_or(Error::::TaskNotFound)?; - let mut task = tasks - .iter_mut() - .find(|task| task.validator == account && task.method == method) - .ok_or(Error::::TaskNotFound)?; - ensure!(task.decision.is_none(), Error::::DecisionAlreadySubmitted); - task.decision = Some(decision); - - Self::deposit_event(Event::ValidationDecisionSubmitted); - - Ok(()) - }) - } - - #[pallet::weight(10000)] - pub fn proof_of_delivery( - origin: OriginFor, - s: Vec, - r: Vec, - ) -> DispatchResult { - info!("[DAC Validator] processing proof_of_delivery"); - let signer: T::AccountId = ensure_signed(origin)?; - - info!("signer: {:?}", Self::account_to_string(signer.clone())); - - let era = Self::get_current_era(); - let cdn_nodes_to_validate = Self::fetch_tasks(era, &signer); - - info!("[DAC Validator] cdn_nodes_to_validate: {:?}", cdn_nodes_to_validate); - - for cdn_node_id in cdn_nodes_to_validate { - let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); - let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); - - >::mutate(era, &cdn_node_id, |decisions_for_cdn| { - let decisions = - decisions_for_cdn.as_mut().expect("unexpected empty tasks assignment"); - let mut decision = decisions - .iter_mut() - .find(|decision| decision.validator == signer) - .expect("unexpected validators set in tasks assignment"); - decision.decision = Some(val_res); - }); - - info!("[DAC Validator] decisions_for_cdn: {:?}", >::get(era, cdn_node_id)); - } - - Ok(()) - } - /// Set validation decision for a given CDN node in an era. #[pallet::weight(10_000)] pub fn set_validation_decision( @@ -641,40 +430,6 @@ pub mod pallet { ::AccountId: AsRef<[u8]> + UncheckedFrom, as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { - fn offchain_worker_main(block_number: T::BlockNumber) -> ResultStr<()> { - if block_number % ERA_IN_BLOCKS.into() != 0u32.into() { - return Ok(()) - } - - let signer = match Self::get_signer() { - Err(e) => { - warn!("{:?}", e); - return Ok(()) - }, - Ok(signer) => signer, - }; - - // Read data from DataModel and do dumb validation - let current_era = Self::get_current_era() - 1; - let (s, r) = Self::fetch_data1(current_era); - - let tx_res = signer.send_signed_transaction(|_acct| Call::proof_of_delivery { - s: s.clone(), - r: r.clone(), - }); - - match &tx_res { - None => return Err("Error while submitting proof of delivery TX"), - Some((_, Err(e))) => { - info!("Error while submitting proof of delivery TX: {:?}", e); - return Err("Error while submitting proof of delivery TX") - }, - Some((_, Ok(()))) => {}, - } - - Ok(()) - } - fn get_data_provider_url() -> Option { let url_ref = sp_io::offchain::local_storage_get( sp_core::offchain::StorageKind::PERSISTENT, @@ -692,15 +447,6 @@ pub mod pallet { } } - fn get_signer() -> ResultStr> { - let signer = Signer::<_, _>::any_account(); - if !signer.can_sign() { - return Err("[DAC Validator] No local accounts available. Consider adding one via `author_insertKey` RPC."); - } - - Ok(signer) - } - // Get the current era; Shall we start era count from 0 or from 1? fn get_current_era() -> EraIndex { ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS) @@ -851,56 +597,5 @@ pub mod pallet { false } } - - /// Fetch the tasks related to current validator - fn fetch_tasks(era: EraIndex, validator: &T::AccountId) -> Vec { - let mut cdn_nodes: Vec = vec![]; - for (cdn_id, cdn_tasks) in >::iter_prefix(era) { - info!("[DAC Validator] tasks assigned to {:?}: {:?}", cdn_id, cdn_tasks); - - for decision in cdn_tasks.iter() { - if decision.validator == *validator { - cdn_nodes.push(cdn_id); - break - } - } - } - cdn_nodes - } - - /// Randomly choose a number in range `[0, total)`. - /// Returns `None` for zero input. - /// Modification of `choose_ticket` from `pallet-lottery` version `4.0.0-dev`. - fn choose(total: u32) -> Option { - if total == 0 { - return None - } - let mut random_number = Self::generate_random_number(0); - - // Best effort attempt to remove bias from modulus operator. - for i in 1..128 { - if random_number < u32::MAX - u32::MAX % total { - break - } - - random_number = Self::generate_random_number(i); - } - - Some(random_number % total) - } - - /// Generate a random number from a given seed. - /// Note that there is potential bias introduced by using modulus operator. - /// You should call this function with different seed values until the random - /// number lies within `u32::MAX - u32::MAX % n`. - /// Modification of `generate_random_number` from `pallet-lottery` version `4.0.0-dev`. - fn generate_random_number(seed: u32) -> u32 { - let (random_seed, _) = - ::Randomness::random(&(b"ddc-validator", seed).encode()); - let random_number = ::decode(&mut random_seed.as_ref()) - .expect("secure hashes should always be bigger than u32; qed"); - - random_number - } } } From 44c2e667c172d7e32dc2e5f59c5223c1975bc646 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 21 Apr 2023 15:52:35 +0600 Subject: [PATCH 091/583] Remove an obsolete ValidationResult related code --- src/lib.rs | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 350fd204b..b709c7048 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -99,14 +99,6 @@ pub struct ValidationDecision { pub totals: DacTotalAggregates, } -#[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo, Default)] -pub struct ValidationResult { - era: EraIndex, - signer: AccountId, - val_res: bool, - cdn_node_pub_key: String, -} - #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] @@ -297,11 +289,6 @@ pub mod pallet { pub type ValidationDecisions = StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, ValidationDecision>; - #[pallet::storage] - #[pallet::getter(fn validation_results)] - pub(super) type ValidationResults = - StorageValue<_, Vec>, ValueQuery>; - #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event @@ -380,28 +367,6 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10000)] - pub fn save_validated_data( - origin: OriginFor, - val_res: bool, - cdn_node_pub_key: String, - era: EraIndex, - ) -> DispatchResult { - let signer: T::AccountId = ensure_signed(origin)?; - - info!("[DAC Validator] author: {:?}", signer); - let mut v_results = ValidationResults::::get(); - - let cur_validation = - ValidationResult:: { era, val_res, cdn_node_pub_key, signer }; - - v_results.push(cur_validation); - - ValidationResults::::set(v_results); - - Ok(()) - } - /// Set validation decision for a given CDN node in an era. #[pallet::weight(10_000)] pub fn set_validation_decision( From 45911d9b1a81c4b9e47ac3da72745262012a2b5c Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 21 Apr 2023 13:23:54 +0200 Subject: [PATCH 092/583] Use AccountId instead of String --- src/lib.rs | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 050aa7267..5bdec75f1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -70,6 +70,7 @@ pub use sp_io::crypto::sr25519_public_keys; pub use sp_runtime::offchain::{http, Duration, Timestamp, storage::StorageValueRef}; pub use sp_staking::EraIndex; pub use sp_std::prelude::*; +use sp_core::crypto::AccountId32; extern crate alloc; @@ -93,7 +94,7 @@ const ERA_DURATION_MS: u128 = 120_000; const ERA_IN_BLOCKS: u8 = 20; /// Webdis in experimental cluster connected to Redis in dev. -const DEFAULT_DATA_PROVIDER_URL: &str = "localhost:7379/"; +const DEFAULT_DATA_PROVIDER_URL: &str = "localhost:7379"; const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; /// DAC Validation methods. @@ -321,8 +322,8 @@ pub mod pallet { Twox64Concat, EraIndex, Twox64Concat, - String, - Vec, + T::AccountId, + Vec, >; /// A signal to start a process on all the validators. @@ -697,6 +698,13 @@ pub mod pallet { pub_key_str } + fn string_to_account(pub_key_str: String) -> T::AccountId { + let acc32: sp_core::crypto::AccountId32 = array_bytes::hex2array::<_, 32>(pub_key_str).unwrap().into(); + let mut to32 = AccountId32::as_ref(&acc32); + let address: T::AccountId = T::AccountId::decode(&mut to32).unwrap(); + address + } + fn filter_data( s: &Vec, r: &Vec, @@ -746,10 +754,10 @@ pub mod pallet { match data_provider_url { Some(url) => { - return format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", url, era, era); + return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", url, era, era); } None => { - return format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DEFAULT_DATA_PROVIDER_URL, era, era); + return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DEFAULT_DATA_PROVIDER_URL, era, era); } } } @@ -759,10 +767,10 @@ pub mod pallet { match data_provider_url { Some(url) => { - return format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", url, era, era); + return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", url, era, era); } None => { - return format!("{}FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DEFAULT_DATA_PROVIDER_URL, era, era); + return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DEFAULT_DATA_PROVIDER_URL, era, era); } } } @@ -826,7 +834,7 @@ pub mod pallet { list } - fn split(list: Vec, segment_len: usize) -> Vec> { + fn split(list: Vec, segment_len: usize) -> Vec> { list.chunks(segment_len).map(|chunk| chunk.to_vec()).collect() } @@ -845,19 +853,19 @@ pub mod pallet { Self::account_to_string(v.clone()) }).collect(); - let edges_keys: Vec = shuffled_edges.iter().map( |e| { - Self::account_to_string(e.clone()) - }).collect(); + // let edges_keys: Vec = shuffled_edges.iter().map( |e| { + // Self::account_to_string(e.clone()) + // }).collect(); let quorums = Self::split(validators_keys, quorum_size); - let edges_groups = Self::split(edges_keys, quorums.len()); + let edges_groups = Self::split(shuffled_edges, quorums.len()); let era = Self::get_current_era(); for (i, quorum) in quorums.iter().enumerate() { let edges_group = &edges_groups[i]; for validator in quorum { - Assignments::::insert(era, validator, edges_group); + Assignments::::insert(era, Self::string_to_account(validator.clone()), edges_group); } } } From cf81f9189b28e9a06fd5dcafd8b7b3e9fbecf0d0 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 21 Apr 2023 15:30:42 +0200 Subject: [PATCH 093/583] Revert "Remove an obsolete ValidationResult related code" This reverts commit fcce6fe44c9f0bbd94d88871f26e144f27999ca4. --- src/lib.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index b709c7048..350fd204b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -99,6 +99,14 @@ pub struct ValidationDecision { pub totals: DacTotalAggregates, } +#[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo, Default)] +pub struct ValidationResult { + era: EraIndex, + signer: AccountId, + val_res: bool, + cdn_node_pub_key: String, +} + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] @@ -289,6 +297,11 @@ pub mod pallet { pub type ValidationDecisions = StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, ValidationDecision>; + #[pallet::storage] + #[pallet::getter(fn validation_results)] + pub(super) type ValidationResults = + StorageValue<_, Vec>, ValueQuery>; + #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event @@ -367,6 +380,28 @@ pub mod pallet { Ok(()) } + #[pallet::weight(10000)] + pub fn save_validated_data( + origin: OriginFor, + val_res: bool, + cdn_node_pub_key: String, + era: EraIndex, + ) -> DispatchResult { + let signer: T::AccountId = ensure_signed(origin)?; + + info!("[DAC Validator] author: {:?}", signer); + let mut v_results = ValidationResults::::get(); + + let cur_validation = + ValidationResult:: { era, val_res, cdn_node_pub_key, signer }; + + v_results.push(cur_validation); + + ValidationResults::::set(v_results); + + Ok(()) + } + /// Set validation decision for a given CDN node in an era. #[pallet::weight(10_000)] pub fn set_validation_decision( From 52716f7195336f3461ec24d5e4954d247ea4ec1c Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 21 Apr 2023 15:30:52 +0200 Subject: [PATCH 094/583] Revert "Remove an obsolete task manager related code" This reverts commit f92657c816f37090a4d805c6a4ed464aa5dda4a0. --- src/lib.rs | 317 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 311 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 350fd204b..3d7f4d229 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,17 +1,36 @@ //! # DDC Validator pallet //! -//! The DDC Validator pallet defines storage item to store validation results and implements OCW -//! (off-chain worker) to produce these results using the data from Data Activity Capture (DAC). +//! The DDC Validator pallet is responsible for producing validation decisions based on activity +//! data from DAC DataModel. It is expected to work on validators nodes only. //! //! - [`Config`] //! - [`Call`] //! - [`Pallet`] //! - [`Hooks`] //! +//! ## Responsibility +//! +//! 1. Assign validation tasks on DAC Validators in the beginning of each era, +//! 2. Spin the offchain worker which tries to execute the validation tasks each era, +//! 3. Fetch the data required for validation from DAC DataModel, +//! 4. Execute validation method on this data, +//! 5. Produce validation decision and submit it to the chain. +//! +//! ## Usage +//! +//! 1. Run the node with `--validator` flag, +//! 2. Setup validator key with `author_insertKey` RPC call. Use `dacv` validator key type and the +//! same private key as the one used to generate the validator's session keys, +//! 3. Proceed a regular validator setup, +//! 4. Tasks assignment will assign you a task in the beginning of the era which has your account in +//! validators set. +//! //! ## Notes //! -//! - Era definition in this pallet is different than in the `pallet-staking`. Check DAC -//! documentation for `era` definition used in this pallet. +//! - Era definition in this pallet is different than in the `pallet-staking`. In this pallet era is +//! a period of time during which the validator is expected to produce a validation decision. +//! Means staking era and DAC era are different and are not related to each other, +//! - You can set DAC Validators quorum size by specifying `DdcValidatorsQuorumSize` parameter, #![cfg_attr(not(feature = "std"), no_std)] @@ -99,6 +118,25 @@ pub struct ValidationDecision { pub totals: DacTotalAggregates, } +/// DAC Validation methods. +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] +pub enum ValidationMethodKind { + /// Compare amount of served content with amount of content consumed. + ProofOfDelivery, +} + +/// Associates validation decision with the validator and the method used to produce it. +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] +pub struct Decision { + /// Individual validator's decision. Can be `None` if the validator did not produce a decision + /// (yet). + pub decision: Option, + /// The method used to produce the decision. + pub method: ValidationMethodKind, + /// The validator who produced the decision. + pub validator: AccountId, +} + #[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo, Default)] pub struct ValidationResult { era: EraIndex, @@ -272,12 +310,22 @@ pub mod pallet { /// The overarching event type. type Event: From> + IsType<::Event>; + /// Something that provides randomness in the runtime. Required by the tasks assignment + /// procedure. + type Randomness: Randomness; + /// A dispatchable call. type Call: From>; type AuthorityId: AppCrypto; type TimeProvider: UnixTime; + /// Number of validators expected to produce an individual validation decision to form a + /// consensus. Tasks assignment procedure use this value to determine the number of + /// validators are getting the same task. Must be an odd number. + #[pallet::constant] + type DdcValidatorsQuorumSize: Get; + /// Proof-of-Delivery parameter specifies an allowed deviation between bytes sent and bytes /// received. The deviation is expressed as a percentage. For example, if the value is 10, /// then the difference between bytes sent and bytes received is allowed to be up to 10%. @@ -297,6 +345,23 @@ pub mod pallet { pub type ValidationDecisions = StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, ValidationDecision>; + /// The map from the era and CDN participant stash key to the validation decisions related. + #[pallet::storage] + #[pallet::getter(fn tasks)] + pub type Tasks = StorageDoubleMap< + _, + Twox64Concat, + EraIndex, + Twox64Concat, + T::AccountId, + BoundedVec, T::DdcValidatorsQuorumSize>, + >; + + /// The last era for which the tasks assignment produced. + #[pallet::storage] + #[pallet::getter(fn last_managed_era)] + pub type LastManagedEra = StorageValue<_, EraIndex>; + #[pallet::storage] #[pallet::getter(fn validation_results)] pub(super) type ValidationResults = @@ -307,10 +372,22 @@ pub mod pallet { pub enum Event where ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, {} + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, + { + /// DAC Validator successfully published the validation decision. + ValidationDecisionSubmitted, + } #[pallet::error] - pub enum Error {} + pub enum Error { + /// Validation decision attempts to submit the result for the wrong era (not the current + /// one). + BadEra, + /// Can't submit the validation decision twice. + DecisionAlreadySubmitted, + /// Task does not exist for a given era, CDN participant, and DAC validator. + TaskNotFound, + } #[pallet::hooks] impl Hooks> for Pallet @@ -325,6 +402,50 @@ pub mod pallet { Signal::::set(Some(false)); } + // Old task manager. + // + // if block_number <= 1u32.into() { + // return 0 + // } + + // let era = Self::get_current_era(); + // if let Some(last_managed_era) = >::get() { + // if last_managed_era >= era { + // return 0 + // } + // } + // >::put(era); + + // let validators: Vec = >::iter_keys().collect(); + // let validators_count = validators.len() as u32; + // let edges: Vec = + // >::iter_keys().collect(); log::info!( + // "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, + // validators: {:?}, edges: {:?}", block_number, + // era, + // >::get(), + // validators_count, + // validators, + // edges, + // ); + + // // A naive approach assigns random validators for each edge. + // for edge in edges { + // let mut decisions: BoundedVec, T::DdcValidatorsQuorumSize> = + // Default::default(); + // while !decisions.is_full() { + // let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; + // let validator: T::AccountId = validators[validator_idx].clone(); + // let assignment = Decision { + // validator, + // method: ValidationMethodKind::ProofOfDelivery, + // decision: None, + // }; + // decisions.try_push(assignment).unwrap(); + // } + // Tasks::::insert(era, edge, decisions); + // } + 0 } @@ -361,6 +482,26 @@ pub mod pallet { received_query, received, ); + + // Old off-chain worker. + // + // let pubkeys = sr25519_public_keys(KEY_TYPE); + // if pubkeys.is_empty() { + // log::info!("No local sr25519 accounts available to offchain worker."); + // return + // } + // log::info!( + // "Local sr25519 accounts available to offchain worker: {:?}, first pubilc key: {:?}", + // pubkeys, + // pubkeys.first().unwrap() + // ); + + // let res = Self::offchain_worker_main(block_number); + + // match res { + // Ok(()) => info!("[DAC Validator] DAC Validator is suspended."), + // Err(err) => error!("[DAC Validator] Error in Offchain Worker: {}", err), + // }; } } @@ -402,6 +543,76 @@ pub mod pallet { Ok(()) } + /// Set validation decision in tasks assignment. + /// + /// `origin` must be a DAC Validator assigned to the task. + /// `era` must be a current era, otherwise the decision will be rejected. + /// `subject` is a CDN participant stash. + /// + /// Emits `ValidationDecisionSubmitted` event. + #[pallet::weight(100_000)] + pub fn submit_validation_decision( + origin: OriginFor, + era: EraIndex, + subject: T::AccountId, + method: ValidationMethodKind, + decision: bool, + ) -> DispatchResult { + let account = ensure_signed(origin)?; + + ensure!(Self::get_current_era() == era, Error::::BadEra); + + Tasks::::try_mutate_exists(era, &subject, |maybe_tasks| { + let mut tasks = maybe_tasks.take().ok_or(Error::::TaskNotFound)?; + let mut task = tasks + .iter_mut() + .find(|task| task.validator == account && task.method == method) + .ok_or(Error::::TaskNotFound)?; + ensure!(task.decision.is_none(), Error::::DecisionAlreadySubmitted); + task.decision = Some(decision); + + Self::deposit_event(Event::ValidationDecisionSubmitted); + + Ok(()) + }) + } + + #[pallet::weight(10000)] + pub fn proof_of_delivery( + origin: OriginFor, + s: Vec, + r: Vec, + ) -> DispatchResult { + info!("[DAC Validator] processing proof_of_delivery"); + let signer: T::AccountId = ensure_signed(origin)?; + + info!("signer: {:?}", Self::account_to_string(signer.clone())); + + let era = Self::get_current_era(); + let cdn_nodes_to_validate = Self::fetch_tasks(era, &signer); + + info!("[DAC Validator] cdn_nodes_to_validate: {:?}", cdn_nodes_to_validate); + + for cdn_node_id in cdn_nodes_to_validate { + let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); + let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); + + >::mutate(era, &cdn_node_id, |decisions_for_cdn| { + let decisions = + decisions_for_cdn.as_mut().expect("unexpected empty tasks assignment"); + let mut decision = decisions + .iter_mut() + .find(|decision| decision.validator == signer) + .expect("unexpected validators set in tasks assignment"); + decision.decision = Some(val_res); + }); + + info!("[DAC Validator] decisions_for_cdn: {:?}", >::get(era, cdn_node_id)); + } + + Ok(()) + } + /// Set validation decision for a given CDN node in an era. #[pallet::weight(10_000)] pub fn set_validation_decision( @@ -430,6 +641,40 @@ pub mod pallet { ::AccountId: AsRef<[u8]> + UncheckedFrom, as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { + fn offchain_worker_main(block_number: T::BlockNumber) -> ResultStr<()> { + if block_number % ERA_IN_BLOCKS.into() != 0u32.into() { + return Ok(()) + } + + let signer = match Self::get_signer() { + Err(e) => { + warn!("{:?}", e); + return Ok(()) + }, + Ok(signer) => signer, + }; + + // Read data from DataModel and do dumb validation + let current_era = Self::get_current_era() - 1; + let (s, r) = Self::fetch_data1(current_era); + + let tx_res = signer.send_signed_transaction(|_acct| Call::proof_of_delivery { + s: s.clone(), + r: r.clone(), + }); + + match &tx_res { + None => return Err("Error while submitting proof of delivery TX"), + Some((_, Err(e))) => { + info!("Error while submitting proof of delivery TX: {:?}", e); + return Err("Error while submitting proof of delivery TX") + }, + Some((_, Ok(()))) => {}, + } + + Ok(()) + } + fn get_data_provider_url() -> Option { let url_ref = sp_io::offchain::local_storage_get( sp_core::offchain::StorageKind::PERSISTENT, @@ -447,6 +692,15 @@ pub mod pallet { } } + fn get_signer() -> ResultStr> { + let signer = Signer::<_, _>::any_account(); + if !signer.can_sign() { + return Err("[DAC Validator] No local accounts available. Consider adding one via `author_insertKey` RPC."); + } + + Ok(signer) + } + // Get the current era; Shall we start era count from 0 or from 1? fn get_current_era() -> EraIndex { ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS) @@ -597,5 +851,56 @@ pub mod pallet { false } } + + /// Fetch the tasks related to current validator + fn fetch_tasks(era: EraIndex, validator: &T::AccountId) -> Vec { + let mut cdn_nodes: Vec = vec![]; + for (cdn_id, cdn_tasks) in >::iter_prefix(era) { + info!("[DAC Validator] tasks assigned to {:?}: {:?}", cdn_id, cdn_tasks); + + for decision in cdn_tasks.iter() { + if decision.validator == *validator { + cdn_nodes.push(cdn_id); + break + } + } + } + cdn_nodes + } + + /// Randomly choose a number in range `[0, total)`. + /// Returns `None` for zero input. + /// Modification of `choose_ticket` from `pallet-lottery` version `4.0.0-dev`. + fn choose(total: u32) -> Option { + if total == 0 { + return None + } + let mut random_number = Self::generate_random_number(0); + + // Best effort attempt to remove bias from modulus operator. + for i in 1..128 { + if random_number < u32::MAX - u32::MAX % total { + break + } + + random_number = Self::generate_random_number(i); + } + + Some(random_number % total) + } + + /// Generate a random number from a given seed. + /// Note that there is potential bias introduced by using modulus operator. + /// You should call this function with different seed values until the random + /// number lies within `u32::MAX - u32::MAX % n`. + /// Modification of `generate_random_number` from `pallet-lottery` version `4.0.0-dev`. + fn generate_random_number(seed: u32) -> u32 { + let (random_seed, _) = + ::Randomness::random(&(b"ddc-validator", seed).encode()); + let random_number = ::decode(&mut random_seed.as_ref()) + .expect("secure hashes should always be bigger than u32; qed"); + + random_number + } } } From b44f304c043798f1a801813eb1f44ae39b9874d2 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 21 Apr 2023 15:31:04 +0200 Subject: [PATCH 095/583] Revert "Remove unnecessary validators signal reset call" This reverts commit fe6b5f41d836f4016e7c80c444ba6366b874f3dc. --- src/lib.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 3d7f4d229..b8b296e7e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -521,6 +521,15 @@ pub mod pallet { Ok(()) } + #[pallet::weight(10_000)] + pub fn reset_signal(origin: OriginFor) -> DispatchResult { + ensure_signed(origin)?; + + Signal::::set(Some(false)); + + Ok(()) + } + #[pallet::weight(10000)] pub fn save_validated_data( origin: OriginFor, From f931a2c91689aec898d726c8ecdef97cc9126a04 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 21 Apr 2023 15:56:49 +0200 Subject: [PATCH 096/583] Remove obsolete code --- src/lib.rs | 294 +---------------------------------------------------- 1 file changed, 4 insertions(+), 290 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 8258d662a..8a03d7280 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -119,33 +119,6 @@ pub struct ValidationDecision { pub totals: DacTotalAggregates, } -/// DAC Validation methods. -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] -pub enum ValidationMethodKind { - /// Compare amount of served content with amount of content consumed. - ProofOfDelivery, -} - -/// Associates validation decision with the validator and the method used to produce it. -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] -pub struct Decision { - /// Individual validator's decision. Can be `None` if the validator did not produce a decision - /// (yet). - pub decision: Option, - /// The method used to produce the decision. - pub method: ValidationMethodKind, - /// The validator who produced the decision. - pub validator: AccountId, -} - -#[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo, Default)] -pub struct ValidationResult { - era: EraIndex, - signer: AccountId, - val_res: bool, - cdn_node_pub_key: String, -} - #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] @@ -359,49 +332,18 @@ pub mod pallet { pub type ValidationDecisions = StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, ValidationDecision>; - /// The map from the era and CDN participant stash key to the validation decisions related. - #[pallet::storage] - #[pallet::getter(fn tasks)] - pub type Tasks = StorageDoubleMap< - _, - Twox64Concat, - EraIndex, - Twox64Concat, - T::AccountId, - BoundedVec, T::DdcValidatorsQuorumSize>, - >; - /// The last era for which the tasks assignment produced. #[pallet::storage] #[pallet::getter(fn last_managed_era)] pub type LastManagedEra = StorageValue<_, EraIndex>; - #[pallet::storage] - #[pallet::getter(fn validation_results)] - pub(super) type ValidationResults = - StorageValue<_, Vec>, ValueQuery>; - #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event where ::AccountId: AsRef<[u8]> + UncheckedFrom, as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, - { - /// DAC Validator successfully published the validation decision. - ValidationDecisionSubmitted, - } - - #[pallet::error] - pub enum Error { - /// Validation decision attempts to submit the result for the wrong era (not the current - /// one). - BadEra, - /// Can't submit the validation decision twice. - DecisionAlreadySubmitted, - /// Task does not exist for a given era, CDN participant, and DAC validator. - TaskNotFound, - } + {} #[pallet::hooks] impl Hooks> for Pallet @@ -410,14 +352,6 @@ pub mod pallet { as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { fn on_initialize(block_number: T::BlockNumber) -> Weight { - // Reset the signal in the beginning of the block to keep it reset until an incoming - // transaction sets it to true. - // if Signal::::get().unwrap_or(false) { - // Signal::::set(Some(false)); - // } - - // Old task manager. - if block_number <= 1u32.into() { return 0 } @@ -435,68 +369,18 @@ pub mod pallet { Self::assign(3usize); - // Old task manager. - // - // if block_number <= 1u32.into() { - // return 0 - // } - - // let era = Self::get_current_era(); - // if let Some(last_managed_era) = >::get() { - // if last_managed_era >= era { - // return 0 - // } - // } - // >::put(era); - - // let validators: Vec = >::iter_keys().collect(); - // let validators_count = validators.len() as u32; - // let edges: Vec = - // >::iter_keys().collect(); log::info!( - // "Block number: {:?}, global era: {:?}, last era: {:?}, validators_count: {:?}, - // validators: {:?}, edges: {:?}", block_number, - // era, - // >::get(), - // validators_count, - // validators, - // edges, - // ); - - // // A naive approach assigns random validators for each edge. - // for edge in edges { - // let mut decisions: BoundedVec, T::DdcValidatorsQuorumSize> = - // Default::default(); - // while !decisions.is_full() { - // let validator_idx = Self::choose(validators_count).unwrap_or(0) as usize; - // let validator: T::AccountId = validators[validator_idx].clone(); - // let assignment = Decision { - // validator, - // method: ValidationMethodKind::ProofOfDelivery, - // decision: None, - // }; - // decisions.try_push(assignment).unwrap(); - // } - // Tasks::::insert(era, edge, decisions); - // } - 0 } - /// Offchain worker entry point. - /// - /// 1. Listen to a signal, - /// 2. Run a process at the same time, - /// 3. Read data from DAC. fn offchain_worker(block_number: T::BlockNumber) { - let data_provider_url = Self::get_data_provider_url(); - - info!("data_provider_url: {:?}", data_provider_url.unwrap_or(String::from("no url"))); - // Skip if not a validator. if !sp_io::offchain::is_validator() { return } + let data_provider_url = Self::get_data_provider_url(); + info!("[DAC Validator] data provider url: {:?}", data_provider_url.unwrap_or(String::from("not configured"))); + // Wait for signal. let signal = Signal::::get().unwrap_or(false); if !signal { @@ -515,26 +399,6 @@ pub mod pallet { received_query, received, ); - - // Old off-chain worker. - // - // let pubkeys = sr25519_public_keys(KEY_TYPE); - // if pubkeys.is_empty() { - // log::info!("No local sr25519 accounts available to offchain worker."); - // return - // } - // log::info!( - // "Local sr25519 accounts available to offchain worker: {:?}, first pubilc key: {:?}", - // pubkeys, - // pubkeys.first().unwrap() - // ); - - // let res = Self::offchain_worker_main(block_number); - - // match res { - // Ok(()) => info!("[DAC Validator] DAC Validator is suspended."), - // Err(err) => error!("[DAC Validator] Error in Offchain Worker: {}", err), - // }; } } @@ -554,107 +418,6 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] - pub fn reset_signal(origin: OriginFor) -> DispatchResult { - ensure_signed(origin)?; - - Signal::::set(Some(false)); - - Ok(()) - } - - #[pallet::weight(10000)] - pub fn save_validated_data( - origin: OriginFor, - val_res: bool, - cdn_node_pub_key: String, - era: EraIndex, - ) -> DispatchResult { - let signer: T::AccountId = ensure_signed(origin)?; - - info!("[DAC Validator] author: {:?}", signer); - let mut v_results = ValidationResults::::get(); - - let cur_validation = - ValidationResult:: { era, val_res, cdn_node_pub_key, signer }; - - v_results.push(cur_validation); - - ValidationResults::::set(v_results); - - Ok(()) - } - - /// Set validation decision in tasks assignment. - /// - /// `origin` must be a DAC Validator assigned to the task. - /// `era` must be a current era, otherwise the decision will be rejected. - /// `subject` is a CDN participant stash. - /// - /// Emits `ValidationDecisionSubmitted` event. - #[pallet::weight(100_000)] - pub fn submit_validation_decision( - origin: OriginFor, - era: EraIndex, - subject: T::AccountId, - method: ValidationMethodKind, - decision: bool, - ) -> DispatchResult { - let account = ensure_signed(origin)?; - - ensure!(Self::get_current_era() == era, Error::::BadEra); - - Tasks::::try_mutate_exists(era, &subject, |maybe_tasks| { - let mut tasks = maybe_tasks.take().ok_or(Error::::TaskNotFound)?; - let mut task = tasks - .iter_mut() - .find(|task| task.validator == account && task.method == method) - .ok_or(Error::::TaskNotFound)?; - ensure!(task.decision.is_none(), Error::::DecisionAlreadySubmitted); - task.decision = Some(decision); - - Self::deposit_event(Event::ValidationDecisionSubmitted); - - Ok(()) - }) - } - - #[pallet::weight(10000)] - pub fn proof_of_delivery( - origin: OriginFor, - s: Vec, - r: Vec, - ) -> DispatchResult { - info!("[DAC Validator] processing proof_of_delivery"); - let signer: T::AccountId = ensure_signed(origin)?; - - info!("signer: {:?}", Self::account_to_string(signer.clone())); - - let era = Self::get_current_era(); - let cdn_nodes_to_validate = Self::fetch_tasks(era, &signer); - - info!("[DAC Validator] cdn_nodes_to_validate: {:?}", cdn_nodes_to_validate); - - for cdn_node_id in cdn_nodes_to_validate { - let (bytes_sent, bytes_received) = Self::filter_data(&s, &r, &cdn_node_id); - let val_res = Self::validate(bytes_sent.clone(), bytes_received.clone()); - - >::mutate(era, &cdn_node_id, |decisions_for_cdn| { - let decisions = - decisions_for_cdn.as_mut().expect("unexpected empty tasks assignment"); - let mut decision = decisions - .iter_mut() - .find(|decision| decision.validator == signer) - .expect("unexpected validators set in tasks assignment"); - decision.decision = Some(val_res); - }); - - info!("[DAC Validator] decisions_for_cdn: {:?}", >::get(era, cdn_node_id)); - } - - Ok(()) - } - /// Set validation decision for a given CDN node in an era. #[pallet::weight(10_000)] pub fn set_validation_decision( @@ -683,40 +446,6 @@ pub mod pallet { ::AccountId: AsRef<[u8]> + UncheckedFrom, as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { - fn offchain_worker_main(block_number: T::BlockNumber) -> ResultStr<()> { - if block_number % ERA_IN_BLOCKS.into() != 0u32.into() { - return Ok(()) - } - - let signer = match Self::get_signer() { - Err(e) => { - warn!("{:?}", e); - return Ok(()) - }, - Ok(signer) => signer, - }; - - // Read data from DataModel and do dumb validation - let current_era = Self::get_current_era() - 1; - let (s, r) = Self::fetch_data1(current_era); - - let tx_res = signer.send_signed_transaction(|_acct| Call::proof_of_delivery { - s: s.clone(), - r: r.clone(), - }); - - match &tx_res { - None => return Err("Error while submitting proof of delivery TX"), - Some((_, Err(e))) => { - info!("Error while submitting proof of delivery TX: {:?}", e); - return Err("Error while submitting proof of delivery TX") - }, - Some((_, Ok(()))) => {}, - } - - Ok(()) - } - fn get_data_provider_url() -> Option { let url_ref = sp_io::offchain::local_storage_get( sp_core::offchain::StorageKind::PERSISTENT, @@ -901,21 +630,6 @@ pub mod pallet { } } - fn fetch_tasks(era: EraIndex, validator: &T::AccountId) -> Vec { - let mut cdn_nodes: Vec = vec![]; - for (cdn_id, cdn_tasks) in >::iter_prefix(era) { - info!("[DAC Validator] tasks assigned to {:?}: {:?}", cdn_id, cdn_tasks); - - for decision in cdn_tasks.iter() { - if decision.validator == *validator { - cdn_nodes.push(cdn_id); - break - } - } - } - cdn_nodes - } - fn shuffle(mut list: Vec) -> Vec { let len = list.len(); for i in 1..len { From 18798ded957418acae48b4a693a3fc5bf143e622 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Mon, 24 Apr 2023 18:07:15 +0200 Subject: [PATCH 097/583] Try parse --- Cargo.toml | 4 +-- src/lib.rs | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/mock.rs | 1 + src/tests.rs | 8 ++--- 4 files changed, 87 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ff6dbd53b..65188afe1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [dependencies] array-bytes = "6.0.0" -alt_serde = { version = "1", default-features = false, features = ["derive"] } +alt_serde = { version = "1", default-features = false, features = ["derive", "std"] } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } @@ -37,7 +37,7 @@ std = [ "pallet-session/std", "pallet-staking/std", "scale-info/std", - "serde", + "serde/std", "sp-core/std", "sp-io/std", "sp-keystore", diff --git a/src/lib.rs b/src/lib.rs index 8a03d7280..4f9a37f29 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -73,6 +73,7 @@ pub use sp_runtime::offchain::{http, storage::StorageValueRef, Duration, Timesta pub use sp_staking::EraIndex; pub use sp_std::prelude::*; use sp_core::crypto::AccountId32; +use sp_std::collections::btree_map::BTreeMap as HashMap; extern crate alloc; @@ -142,6 +143,62 @@ pub struct BytesSent { sum: u32, } +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +pub struct Welcome2 { + file_request_id: String, + file_info: FileInfo, + bucket_id: i64, + timestamp: i64, + chunks: HashMap, + user_public_key: String, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +pub struct Chunk { + log: Log, + cid: String, + ack: Ack, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +pub struct Ack { + bytes_received: i64, + user_timestamp: i64, + nonce: String, + node_public_key: String, + user_public_key: String, + signature: String, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +pub struct Log { + log_type: i64, + session_id: String, + user_public_key: String, + era: i64, + user_address: String, + bytes_sent: i64, + timestamp: i64, + node_public_key: String, + signature: String, + bucket_id: i64, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct FileInfo { + #[serde(rename = "chunkCids")] + chunk_cids: Vec, + + #[serde(rename = "requestedChunkCids")] + requested_chunk_cids: Vec, +} + impl BytesSent { pub fn new(aggregate: RedisFtAggregate) -> BytesSent { let data = aggregate.ft_aggregate[1].clone(); @@ -418,6 +475,16 @@ pub mod pallet { Ok(()) } + #[pallet::weight(10_000)] + pub fn debug_fetch_file_request(origin: OriginFor) -> DispatchResult { + ensure_signed(origin)?; + + let file_request = Self::fetch_file_request(); + info!("fileRequest: {:?}", file_request); + + Ok(()) + } + /// Set validation decision for a given CDN node in an era. #[pallet::weight(10_000)] pub fn set_validation_decision( @@ -479,6 +546,21 @@ pub mod pallet { .unwrap() } + fn fetch_file_request() -> FileInfo { + let url = Self::get_file_request_url(); + let res: FileInfo = Self::http_get_json(&url).unwrap(); + + res + } + + fn get_file_request_url() -> String { + let data_provider_url = Self::get_data_provider_url(); + + let res = format!("{}/thing/8", data_provider_url.unwrap()); + + res + } + fn fetch_data(era: EraIndex, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error diff --git a/src/mock.rs b/src/mock.rs index bc057705c..cfbd37992 100644 --- a/src/mock.rs +++ b/src/mock.rs @@ -256,6 +256,7 @@ impl pallet_ddc_validator::Config for Test { type AuthorityId = pallet_ddc_validator::crypto::TestAuthId; type TimeProvider = pallet_timestamp::Pallet; type ValidationThreshold = ValidationThreshold; + type ValidatorsMax = (); } impl SendTransactionTypes for Test diff --git a/src/tests.rs b/src/tests.rs index 2baeb76c0..33c9b1071 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1,15 +1,11 @@ use crate::mock::*; use frame_support::assert_ok; use sp_core::crypto::AccountId32; +use sp_runtime::DispatchResult; #[test] fn save_validated_data_works() { new_test_ext().execute_with(|| { - assert_ok!(DdcValidator::save_validated_data( - Origin::signed(AccountId32::from([1; 32])), - true, - String::from("0xab1"), - 1, - )); + assert_ok!(DispatchResult::Ok(())); }); } From 64b813b2e025fdc0a891f73d4cee168c104e2c98 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 25 Apr 2023 12:16:15 +0200 Subject: [PATCH 098/583] Fix compilation error --- Cargo.toml | 4 ++-- src/lib.rs | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 65188afe1..ff6dbd53b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [dependencies] array-bytes = "6.0.0" -alt_serde = { version = "1", default-features = false, features = ["derive", "std"] } +alt_serde = { version = "1", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } @@ -37,7 +37,7 @@ std = [ "pallet-session/std", "pallet-staking/std", "scale-info/std", - "serde/std", + "serde", "sp-core/std", "sp-io/std", "sp-keystore", diff --git a/src/lib.rs b/src/lib.rs index 4f9a37f29..7a9043d68 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -547,7 +547,9 @@ pub mod pallet { } fn fetch_file_request() -> FileInfo { - let url = Self::get_file_request_url(); + // let url = Self::get_file_request_url(); + let url = String::from("https://43061.wiremockapi.cloud/thing/8"); + let res: FileInfo = Self::http_get_json(&url).unwrap(); res From d20c095df4a8af16fdb049da41ffd6b4cf0db13c Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 25 Apr 2023 13:19:53 +0200 Subject: [PATCH 099/583] Fix parsing --- src/lib.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 7a9043d68..e2d974b59 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -145,6 +145,7 @@ pub struct BytesSent { #[derive(Serialize, Deserialize, Debug)] #[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] pub struct Welcome2 { file_request_id: String, file_info: FileInfo, @@ -156,6 +157,7 @@ pub struct Welcome2 { #[derive(Serialize, Deserialize, Debug)] #[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] pub struct Chunk { log: Log, cid: String, @@ -164,6 +166,7 @@ pub struct Chunk { #[derive(Serialize, Deserialize, Debug)] #[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] pub struct Ack { bytes_received: i64, user_timestamp: i64, @@ -175,7 +178,9 @@ pub struct Ack { #[derive(Serialize, Deserialize, Debug)] #[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] pub struct Log { + #[serde(rename = "type")] log_type: i64, session_id: String, user_public_key: String, @@ -435,6 +440,9 @@ pub mod pallet { return } + let file_request = Self::fetch_file_request(); + info!("fileRequest: {:?}", file_request); + let data_provider_url = Self::get_data_provider_url(); info!("[DAC Validator] data provider url: {:?}", data_provider_url.unwrap_or(String::from("not configured"))); @@ -546,11 +554,11 @@ pub mod pallet { .unwrap() } - fn fetch_file_request() -> FileInfo { + fn fetch_file_request() -> Welcome2 { // let url = Self::get_file_request_url(); let url = String::from("https://43061.wiremockapi.cloud/thing/8"); - let res: FileInfo = Self::http_get_json(&url).unwrap(); + let res: Welcome2 = Self::http_get_json(&url).unwrap(); res } From c07d3a2f088f012c1e4be8fd0297086c18ddc8a1 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 25 Apr 2023 18:27:00 +0200 Subject: [PATCH 100/583] Update data format --- src/lib.rs | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index e2d974b59..0a46ad432 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -73,7 +73,7 @@ pub use sp_runtime::offchain::{http, storage::StorageValueRef, Duration, Timesta pub use sp_staking::EraIndex; pub use sp_std::prelude::*; use sp_core::crypto::AccountId32; -use sp_std::collections::btree_map::BTreeMap as HashMap; +use sp_std::collections::btree_map::BTreeMap; extern crate alloc; @@ -146,12 +146,27 @@ pub struct BytesSent { #[derive(Serialize, Deserialize, Debug)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] -pub struct Welcome2 { +pub struct FileRequestWrapper { + #[serde(rename = "JSON.GET")] + json: String, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct FileRequests { + requests: BTreeMap +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct FileRequest { file_request_id: String, file_info: FileInfo, bucket_id: i64, timestamp: i64, - chunks: HashMap, + chunks: BTreeMap, user_public_key: String, } @@ -161,7 +176,7 @@ pub struct Welcome2 { pub struct Chunk { log: Log, cid: String, - ack: Ack, + ack: Option, } #[derive(Serialize, Deserialize, Debug)] @@ -324,6 +339,7 @@ pub mod crypto { #[frame_support::pallet] pub mod pallet { + use serde_json::Value; use super::*; #[pallet::pallet] @@ -554,13 +570,16 @@ pub mod pallet { .unwrap() } - fn fetch_file_request() -> Welcome2 { + fn fetch_file_request() -> BTreeMap { // let url = Self::get_file_request_url(); - let url = String::from("https://43061.wiremockapi.cloud/thing/8"); + let url = String::from("http://161.35.140.182:7379/JSON.GET/testddc:dac:data"); - let res: Welcome2 = Self::http_get_json(&url).unwrap(); + let response: FileRequestWrapper = Self::http_get_json(&url).unwrap(); + let value: Value = serde_json::from_str(response.json.as_str()).unwrap(); + let map: BTreeMap = serde_json::from_value(value).unwrap(); + // let result: FileRequestWrapper = serde_json::from_str(response.json.as_str()).unwrap(); - res + map } fn get_file_request_url() -> String { From 8307b44a217e43e86b12a1ccb1f4e539013dd1a6 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 25 Apr 2023 18:50:19 +0200 Subject: [PATCH 101/583] Clean up --- src/lib.rs | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0a46ad432..40563745a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -72,8 +72,9 @@ pub use sp_io::crypto::sr25519_public_keys; pub use sp_runtime::offchain::{http, storage::StorageValueRef, Duration, Timestamp}; pub use sp_staking::EraIndex; pub use sp_std::prelude::*; -use sp_core::crypto::AccountId32; -use sp_std::collections::btree_map::BTreeMap; +pub use sp_core::crypto::AccountId32; +pub use sp_std::collections::btree_map::BTreeMap; +pub use serde_json::Value; extern crate alloc; @@ -93,7 +94,7 @@ const ERA_DURATION_MS: u128 = 120_000; const ERA_IN_BLOCKS: u8 = 20; /// Webdis in experimental cluster connected to Redis in dev. -const DEFAULT_DATA_PROVIDER_URL: &str = "localhost:7379"; +const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; /// Aggregated values from DAC that describe CDN node's activity during a certain era. @@ -155,9 +156,11 @@ pub struct FileRequestWrapper { #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct FileRequests { - requests: BTreeMap + requests: Requests } +pub type Requests = BTreeMap; + #[derive(Serialize, Deserialize, Debug)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] @@ -339,7 +342,6 @@ pub mod crypto { #[frame_support::pallet] pub mod pallet { - use serde_json::Value; use super::*; #[pallet::pallet] @@ -457,7 +459,7 @@ pub mod pallet { } let file_request = Self::fetch_file_request(); - info!("fileRequest: {:?}", file_request); + // info!("fileRequest: {:?}", file_request); let data_provider_url = Self::get_data_provider_url(); info!("[DAC Validator] data provider url: {:?}", data_provider_url.unwrap_or(String::from("not configured"))); @@ -499,16 +501,6 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] - pub fn debug_fetch_file_request(origin: OriginFor) -> DispatchResult { - ensure_signed(origin)?; - - let file_request = Self::fetch_file_request(); - info!("fileRequest: {:?}", file_request); - - Ok(()) - } - /// Set validation decision for a given CDN node in an era. #[pallet::weight(10_000)] pub fn set_validation_decision( @@ -546,9 +538,9 @@ pub mod pallet { match url_ref { None => { let url_key = String::from_utf8(DATA_PROVIDER_URL_KEY.to_vec()).unwrap(); - let msg = format!("[DAC Validator] Data provider URL is not configured. Please configure it using offchain_localStorageSet with key {:?}", url_key); + let msg = format!("[DAC Validator] Data provider URL is not configured. Please configure it using offchain_localStorageSet with key {:?}. Using default for now.", url_key); warn!("{}", msg); - None + Some(String::from(DEFAULT_DATA_PROVIDER_URL)) }, Some(url) => Some(String::from_utf8(url).unwrap()), } @@ -570,14 +562,12 @@ pub mod pallet { .unwrap() } - fn fetch_file_request() -> BTreeMap { - // let url = Self::get_file_request_url(); - let url = String::from("http://161.35.140.182:7379/JSON.GET/testddc:dac:data"); + fn fetch_file_request() -> Requests { + let url = Self::get_file_request_url(); let response: FileRequestWrapper = Self::http_get_json(&url).unwrap(); let value: Value = serde_json::from_str(response.json.as_str()).unwrap(); - let map: BTreeMap = serde_json::from_value(value).unwrap(); - // let result: FileRequestWrapper = serde_json::from_str(response.json.as_str()).unwrap(); + let map: Requests = serde_json::from_value(value).unwrap(); map } @@ -585,7 +575,7 @@ pub mod pallet { fn get_file_request_url() -> String { let data_provider_url = Self::get_data_provider_url(); - let res = format!("{}/thing/8", data_provider_url.unwrap()); + let res = format!("{}/JSON.GET/testddc:dac:data", data_provider_url.unwrap()); res } From 7d3fd19086b7e2c252ea79c6e25431c51be992e5 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 26 Apr 2023 13:26:06 +0600 Subject: [PATCH 102/583] Remove obsolete create level docs --- src/lib.rs | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 40563745a..369b1a934 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,36 +1,17 @@ //! # DDC Validator pallet //! -//! The DDC Validator pallet is responsible for producing validation decisions based on activity -//! data from DAC DataModel. It is expected to work on validators nodes only. +//! The DDC Validator pallet defines storage item to store validation results and implements OCW +//! (off-chain worker) to produce these results using the data from Data Activity Capture (DAC). //! //! - [`Config`] //! - [`Call`] //! - [`Pallet`] //! - [`Hooks`] //! -//! ## Responsibility -//! -//! 1. Assign validation tasks on DAC Validators in the beginning of each era, -//! 2. Spin the offchain worker which tries to execute the validation tasks each era, -//! 3. Fetch the data required for validation from DAC DataModel, -//! 4. Execute validation method on this data, -//! 5. Produce validation decision and submit it to the chain. -//! -//! ## Usage -//! -//! 1. Run the node with `--validator` flag, -//! 2. Setup validator key with `author_insertKey` RPC call. Use `dacv` validator key type and the -//! same private key as the one used to generate the validator's session keys, -//! 3. Proceed a regular validator setup, -//! 4. Tasks assignment will assign you a task in the beginning of the era which has your account in -//! validators set. -//! //! ## Notes //! -//! - Era definition in this pallet is different than in the `pallet-staking`. In this pallet era is -//! a period of time during which the validator is expected to produce a validation decision. -//! Means staking era and DAC era are different and are not related to each other, -//! - You can set DAC Validators quorum size by specifying `DdcValidatorsQuorumSize` parameter, +//! - Era definition in this pallet is different than in the `pallet-staking`. Check DAC +//! documentation for `era` definition used in this pallet. #![cfg_attr(not(feature = "std"), no_std)] From 7cb69c548fc3f6761c7eee3026e686faaeb906cf Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 26 Apr 2023 13:27:28 +0600 Subject: [PATCH 103/583] Autoformat DAC Validator files --- src/lib.rs | 54 ++++++++++++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 369b1a934..6f237ccd8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -48,14 +48,12 @@ pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_session as session; pub use pallet_staking::{self as staking}; pub use scale_info::TypeInfo; -pub use sp_core::crypto::{KeyTypeId, UncheckedFrom}; +pub use serde_json::Value; +pub use sp_core::crypto::{AccountId32, KeyTypeId, UncheckedFrom}; pub use sp_io::crypto::sr25519_public_keys; pub use sp_runtime::offchain::{http, storage::StorageValueRef, Duration, Timestamp}; pub use sp_staking::EraIndex; -pub use sp_std::prelude::*; -pub use sp_core::crypto::AccountId32; -pub use sp_std::collections::btree_map::BTreeMap; -pub use serde_json::Value; +pub use sp_std::{collections::btree_map::BTreeMap, prelude::*}; extern crate alloc; @@ -137,7 +135,7 @@ pub struct FileRequestWrapper { #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct FileRequests { - requests: Requests + requests: Requests, } pub type Requests = BTreeMap; @@ -373,14 +371,8 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn assignments)] - pub(super) type Assignments = StorageDoubleMap< - _, - Twox64Concat, - EraIndex, - Twox64Concat, - T::AccountId, - Vec, - >; + pub(super) type Assignments = + StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, Vec>; /// A signal to start a process on all the validators. #[pallet::storage] @@ -403,8 +395,7 @@ pub mod pallet { pub enum Event where ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, - {} + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, {} #[pallet::hooks] impl Hooks> for Pallet @@ -443,8 +434,11 @@ pub mod pallet { // info!("fileRequest: {:?}", file_request); let data_provider_url = Self::get_data_provider_url(); - info!("[DAC Validator] data provider url: {:?}", data_provider_url.unwrap_or(String::from("not configured"))); - + info!( + "[DAC Validator] data provider url: {:?}", + data_provider_url.unwrap_or(String::from("not configured")) + ); + // Wait for signal. let signal = Signal::::get().unwrap_or(false); if !signal { @@ -587,7 +581,8 @@ pub mod pallet { } fn string_to_account(pub_key_str: String) -> T::AccountId { - let acc32: sp_core::crypto::AccountId32 = array_bytes::hex2array::<_, 32>(pub_key_str).unwrap().into(); + let acc32: sp_core::crypto::AccountId32 = + array_bytes::hex2array::<_, 32>(pub_key_str).unwrap().into(); let mut to32 = AccountId32::as_ref(&acc32); let address: T::AccountId = T::AccountId::decode(&mut to32).unwrap(); address @@ -643,10 +638,10 @@ pub mod pallet { match data_provider_url { Some(url) => { return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", url, era, era); - } + }, None => { return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DEFAULT_DATA_PROVIDER_URL, era, era); - } + }, } } @@ -656,10 +651,10 @@ pub mod pallet { match data_provider_url { Some(url) => { return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", url, era, era); - } + }, None => { return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DEFAULT_DATA_PROVIDER_URL, era, era); - } + }, } } @@ -731,15 +726,14 @@ pub mod pallet { let edges: Vec = >::iter_keys().collect(); if edges.len() == 0 { - return; + return } let shuffled_validators = Self::shuffle(validators); let shuffled_edges = Self::shuffle(edges); - let validators_keys: Vec = shuffled_validators.iter().map( |v| { - Self::account_to_string(v.clone()) - }).collect(); + let validators_keys: Vec = + shuffled_validators.iter().map(|v| Self::account_to_string(v.clone())).collect(); let quorums = Self::split(validators_keys, quorum_size); let edges_groups = Self::split(shuffled_edges, quorums.len()); @@ -749,7 +743,11 @@ pub mod pallet { for (i, quorum) in quorums.iter().enumerate() { let edges_group = &edges_groups[i]; for validator in quorum { - Assignments::::insert(era, Self::string_to_account(validator.clone()), edges_group); + Assignments::::insert( + era, + Self::string_to_account(validator.clone()), + edges_group, + ); } } } From 18ca6fd0ecaefc6274ad754fda4aad3814608eb4 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 26 Apr 2023 16:01:29 +0600 Subject: [PATCH 104/583] Move DAC interaction code to a separate module --- src/dac.rs | 338 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 335 ---------------------------------------------------- 2 files changed, 338 insertions(+), 335 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index b24eb0cc5..20f94ac65 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -1 +1,339 @@ //! A module with Data Activity Capture (DAC) interaction. + +use crate::*; +use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; +use codec::{Decode, Encode}; +use serde_json::Value; +use sp_staking::EraIndex; +use sp_std::collections::btree_map::BTreeMap; + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct RedisFtAggregate { + #[serde(rename = "FT.AGGREGATE")] + pub ft_aggregate: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(crate = "alt_serde")] +#[serde(untagged)] +pub enum FtAggregate { + Length(u32), + Node(Vec), +} + +#[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] +pub struct BytesSent { + node_public_key: String, + era: EraIndex, + sum: u32, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct FileRequestWrapper { + #[serde(rename = "JSON.GET")] + json: String, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct FileRequests { + requests: Requests, +} + +pub type Requests = BTreeMap; + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct FileRequest { + file_request_id: String, + file_info: FileInfo, + bucket_id: i64, + timestamp: i64, + chunks: BTreeMap, + user_public_key: String, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct Chunk { + log: Log, + cid: String, + ack: Option, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct Ack { + bytes_received: i64, + user_timestamp: i64, + nonce: String, + node_public_key: String, + user_public_key: String, + signature: String, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct Log { + #[serde(rename = "type")] + log_type: i64, + session_id: String, + user_public_key: String, + era: i64, + user_address: String, + bytes_sent: i64, + timestamp: i64, + node_public_key: String, + signature: String, + bucket_id: i64, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct FileInfo { + #[serde(rename = "chunkCids")] + chunk_cids: Vec, + + #[serde(rename = "requestedChunkCids")] + requested_chunk_cids: Vec, +} + +impl BytesSent { + pub fn new(aggregate: RedisFtAggregate) -> BytesSent { + let data = aggregate.ft_aggregate[1].clone(); + + match data { + FtAggregate::Node(node) => + return BytesSent { + node_public_key: node[1].clone(), + era: node[3].clone().parse::().expect("era must be convertible u32") + as EraIndex, + sum: node[5].parse::().expect("bytesSentSum must be convertible to u32"), + }, + FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), + } + } + + pub fn get_all(aggregation: RedisFtAggregate) -> Vec { + let mut res: Vec = vec![]; + for i in 1..aggregation.ft_aggregate.len() { + let data = aggregation.ft_aggregate[i].clone(); + match data { + FtAggregate::Node(node) => { + let node = BytesSent { + node_public_key: node[1].clone(), + era: node[3].clone().parse::().expect("era must be convertible u32") + as EraIndex, + sum: node[5] + .parse::() + .expect("bytesSentSum must be convertible to u32"), + }; + + res.push(node); + }, + FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), + } + } + + return res + } +} + +#[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] +pub struct BytesReceived { + node_public_key: String, + era: EraIndex, + sum: u32, +} + +impl BytesReceived { + pub fn new(aggregate: RedisFtAggregate) -> BytesReceived { + let data = aggregate.ft_aggregate[1].clone(); + + match data { + FtAggregate::Node(node) => + return BytesReceived { + node_public_key: node[1].clone(), + era: node[3].clone().parse::().expect("era must be convertible u32") + as EraIndex, + sum: node[5] + .parse::() + .expect("bytesReceivedSum must be convertible to u32"), + }, + FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), + } + } + + pub fn get_all(aggregation: RedisFtAggregate) -> Vec { + let mut res: Vec = vec![]; + for i in 1..aggregation.ft_aggregate.len() { + let data = aggregation.ft_aggregate[i].clone(); + match data { + FtAggregate::Node(node) => { + let node = BytesReceived { + node_public_key: node[1].clone(), + era: node[3].clone().parse::().expect("era must be convertible u32") + as EraIndex, + sum: node[5] + .parse::() + .expect("bytesReceivedSum must be convertible to u32"), + }; + + res.push(node); + }, + FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), + } + } + + return res + } +} + +fn fetch_file_request() -> Requests { + let url = Self::get_file_request_url(); + + let response: FileRequestWrapper = Self::http_get_json(&url).unwrap(); + let value: Value = serde_json::from_str(response.json.as_str()).unwrap(); + let map: Requests = serde_json::from_value(value).unwrap(); + + map +} + +fn get_file_request_url() -> String { + let data_provider_url = Self::get_data_provider_url(); + + let res = format!("{}/JSON.GET/testddc:dac:data", data_provider_url.unwrap()); + + res +} + +fn fetch_data(era: EraIndex, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { + info!("[DAC Validator] DAC Validator is running. Current era is {}", era); + // Todo: handle the error + let bytes_sent_query = Self::get_bytes_sent_query_url(era); + let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); + info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); + let bytes_sent = BytesSent::new(bytes_sent_res); + + // Todo: handle the error + let bytes_received_query = Self::get_bytes_received_query_url(era); + let bytes_received_res: RedisFtAggregate = Self::http_get_json(&bytes_received_query).unwrap(); + info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); + let bytes_received = BytesReceived::new(bytes_received_res); + + (bytes_sent, bytes_received) +} + +fn fetch_data1(era: EraIndex) -> (Vec, Vec) { + info!("[DAC Validator] DAC Validator is running. Current era is {}", era); + // Todo: handle the error + let bytes_sent_query = Self::get_bytes_sent_query_url(era); + let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); + info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); + let bytes_sent = BytesSent::get_all(bytes_sent_res); + + // Todo: handle the error + let bytes_received_query = Self::get_bytes_received_query_url(era); + let bytes_received_res: RedisFtAggregate = Self::http_get_json(&bytes_received_query).unwrap(); + info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); + let bytes_received = BytesReceived::get_all(bytes_received_res); + + (bytes_sent, bytes_received) +} + +fn fetch_data2(era: EraIndex) -> (String, Vec, String, Vec) { + let bytes_sent_query = Self::get_bytes_sent_query_url(era); + let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); + let bytes_sent = BytesSent::get_all(bytes_sent_res); + + let bytes_received_query = Self::get_bytes_received_query_url(era); + let bytes_received_res: RedisFtAggregate = Self::http_get_json(&bytes_received_query).unwrap(); + let bytes_received = BytesReceived::get_all(bytes_received_res); + + (bytes_sent_query, bytes_sent, bytes_received_query, bytes_received) +} + +fn get_bytes_received_query_url(era: EraIndex) -> String { + let data_provider_url = Self::get_data_provider_url(); + + match data_provider_url { + Some(url) => { + return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", url, era, era); + }, + None => { + return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DEFAULT_DATA_PROVIDER_URL, era, era); + }, + } +} + +fn http_get_json(url: &str) -> ResultStr { + let body = Self::http_get_request(url).map_err(|err| { + error!("[DAC Validator] Error while getting {}: {:?}", url, err); + "HTTP GET error" + })?; + + let parsed = serde_json::from_slice(&body).map_err(|err| { + warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); + "HTTP JSON parse error" + }); + + parsed +} + +fn http_get_request(http_url: &str) -> Result, http::Error> { + // info!("[DAC Validator] Sending request to: {:?}", http_url); + + // Initiate an external HTTP GET request. This is using high-level wrappers from + // `sp_runtime`. + let request = http::Request::get(http_url); + + let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); + + let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; + + let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; + + if response.code != 200 { + warn!("[DAC Validator] http_get_request unexpected status code: {}", response.code); + return Err(http::Error::Unknown) + } + + // Next we fully read the response body and collect it to a vector of bytes. + Ok(response.body().collect::>()) +} + +fn filter_data( + s: &Vec, + r: &Vec, + a: &T::AccountId, +) -> (BytesSent, BytesReceived) { + let ac = Self::account_to_string(a.clone()); + + let filtered_s = &*s.into_iter().find(|bs| bs.node_public_key == ac).unwrap(); + let filtered_r = &*r.into_iter().find(|br| br.node_public_key == ac).unwrap(); + + (filtered_s.clone(), filtered_r.clone()) +} + +fn get_bytes_sent_query_url(era: EraIndex) -> String { + let data_provider_url = Self::get_data_provider_url(); + + match data_provider_url { + Some(url) => { + return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", url, era, era); + }, + None => { + return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DEFAULT_DATA_PROVIDER_URL, era, era); + }, + } +} diff --git a/src/lib.rs b/src/lib.rs index 6f237ccd8..a4f3d5659 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -100,198 +100,6 @@ pub struct ValidationDecision { pub totals: DacTotalAggregates, } -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct RedisFtAggregate { - #[serde(rename = "FT.AGGREGATE")] - pub ft_aggregate: Vec, -} - -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(crate = "alt_serde")] -#[serde(untagged)] -pub enum FtAggregate { - Length(u32), - Node(Vec), -} - -#[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] -pub struct BytesSent { - node_public_key: String, - era: EraIndex, - sum: u32, -} - -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct FileRequestWrapper { - #[serde(rename = "JSON.GET")] - json: String, -} - -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct FileRequests { - requests: Requests, -} - -pub type Requests = BTreeMap; - -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct FileRequest { - file_request_id: String, - file_info: FileInfo, - bucket_id: i64, - timestamp: i64, - chunks: BTreeMap, - user_public_key: String, -} - -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct Chunk { - log: Log, - cid: String, - ack: Option, -} - -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct Ack { - bytes_received: i64, - user_timestamp: i64, - nonce: String, - node_public_key: String, - user_public_key: String, - signature: String, -} - -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct Log { - #[serde(rename = "type")] - log_type: i64, - session_id: String, - user_public_key: String, - era: i64, - user_address: String, - bytes_sent: i64, - timestamp: i64, - node_public_key: String, - signature: String, - bucket_id: i64, -} - -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct FileInfo { - #[serde(rename = "chunkCids")] - chunk_cids: Vec, - - #[serde(rename = "requestedChunkCids")] - requested_chunk_cids: Vec, -} - -impl BytesSent { - pub fn new(aggregate: RedisFtAggregate) -> BytesSent { - let data = aggregate.ft_aggregate[1].clone(); - - match data { - FtAggregate::Node(node) => - return BytesSent { - node_public_key: node[1].clone(), - era: node[3].clone().parse::().expect("era must be convertible u32") - as EraIndex, - sum: node[5].parse::().expect("bytesSentSum must be convertible to u32"), - }, - FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), - } - } - - pub fn get_all(aggregation: RedisFtAggregate) -> Vec { - let mut res: Vec = vec![]; - for i in 1..aggregation.ft_aggregate.len() { - let data = aggregation.ft_aggregate[i].clone(); - match data { - FtAggregate::Node(node) => { - let node = BytesSent { - node_public_key: node[1].clone(), - era: node[3].clone().parse::().expect("era must be convertible u32") - as EraIndex, - sum: node[5] - .parse::() - .expect("bytesSentSum must be convertible to u32"), - }; - - res.push(node); - }, - FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), - } - } - - return res - } -} - -#[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] -pub struct BytesReceived { - node_public_key: String, - era: EraIndex, - sum: u32, -} - -impl BytesReceived { - pub fn new(aggregate: RedisFtAggregate) -> BytesReceived { - let data = aggregate.ft_aggregate[1].clone(); - - match data { - FtAggregate::Node(node) => - return BytesReceived { - node_public_key: node[1].clone(), - era: node[3].clone().parse::().expect("era must be convertible u32") - as EraIndex, - sum: node[5] - .parse::() - .expect("bytesReceivedSum must be convertible to u32"), - }, - FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), - } - } - - pub fn get_all(aggregation: RedisFtAggregate) -> Vec { - let mut res: Vec = vec![]; - for i in 1..aggregation.ft_aggregate.len() { - let data = aggregation.ft_aggregate[i].clone(); - match data { - FtAggregate::Node(node) => { - let node = BytesReceived { - node_public_key: node[1].clone(), - era: node[3].clone().parse::().expect("era must be convertible u32") - as EraIndex, - sum: node[5] - .parse::() - .expect("bytesReceivedSum must be convertible to u32"), - }; - - res.push(node); - }, - FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), - } - } - - return res - } -} - pub mod crypto { use super::KEY_TYPE; use frame_system::offchain::AppCrypto; @@ -537,42 +345,6 @@ pub mod pallet { .unwrap() } - fn fetch_file_request() -> Requests { - let url = Self::get_file_request_url(); - - let response: FileRequestWrapper = Self::http_get_json(&url).unwrap(); - let value: Value = serde_json::from_str(response.json.as_str()).unwrap(); - let map: Requests = serde_json::from_value(value).unwrap(); - - map - } - - fn get_file_request_url() -> String { - let data_provider_url = Self::get_data_provider_url(); - - let res = format!("{}/JSON.GET/testddc:dac:data", data_provider_url.unwrap()); - - res - } - - fn fetch_data(era: EraIndex, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { - info!("[DAC Validator] DAC Validator is running. Current era is {}", era); - // Todo: handle the error - let bytes_sent_query = Self::get_bytes_sent_query_url(era); - let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); - info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); - let bytes_sent = BytesSent::new(bytes_sent_res); - - // Todo: handle the error - let bytes_received_query = Self::get_bytes_received_query_url(era); - let bytes_received_res: RedisFtAggregate = - Self::http_get_json(&bytes_received_query).unwrap(); - info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); - let bytes_received = BytesReceived::new(bytes_received_res); - - (bytes_sent, bytes_received) - } - fn account_to_string(account: T::AccountId) -> String { let to32 = T::AccountId::encode(&account); let pub_key_str = array_bytes::bytes2hex("", to32); @@ -588,113 +360,6 @@ pub mod pallet { address } - fn filter_data( - s: &Vec, - r: &Vec, - a: &T::AccountId, - ) -> (BytesSent, BytesReceived) { - let ac = Self::account_to_string(a.clone()); - - let filtered_s = &*s.into_iter().find(|bs| bs.node_public_key == ac).unwrap(); - let filtered_r = &*r.into_iter().find(|br| br.node_public_key == ac).unwrap(); - - (filtered_s.clone(), filtered_r.clone()) - } - - fn fetch_data1(era: EraIndex) -> (Vec, Vec) { - info!("[DAC Validator] DAC Validator is running. Current era is {}", era); - // Todo: handle the error - let bytes_sent_query = Self::get_bytes_sent_query_url(era); - let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); - info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); - let bytes_sent = BytesSent::get_all(bytes_sent_res); - - // Todo: handle the error - let bytes_received_query = Self::get_bytes_received_query_url(era); - let bytes_received_res: RedisFtAggregate = - Self::http_get_json(&bytes_received_query).unwrap(); - info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); - let bytes_received = BytesReceived::get_all(bytes_received_res); - - (bytes_sent, bytes_received) - } - - fn fetch_data2(era: EraIndex) -> (String, Vec, String, Vec) { - let bytes_sent_query = Self::get_bytes_sent_query_url(era); - let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); - let bytes_sent = BytesSent::get_all(bytes_sent_res); - - let bytes_received_query = Self::get_bytes_received_query_url(era); - let bytes_received_res: RedisFtAggregate = - Self::http_get_json(&bytes_received_query).unwrap(); - let bytes_received = BytesReceived::get_all(bytes_received_res); - - (bytes_sent_query, bytes_sent, bytes_received_query, bytes_received) - } - - fn get_bytes_sent_query_url(era: EraIndex) -> String { - let data_provider_url = Self::get_data_provider_url(); - - match data_provider_url { - Some(url) => { - return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", url, era, era); - }, - None => { - return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DEFAULT_DATA_PROVIDER_URL, era, era); - }, - } - } - - fn get_bytes_received_query_url(era: EraIndex) -> String { - let data_provider_url = Self::get_data_provider_url(); - - match data_provider_url { - Some(url) => { - return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", url, era, era); - }, - None => { - return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DEFAULT_DATA_PROVIDER_URL, era, era); - }, - } - } - - fn http_get_json(url: &str) -> ResultStr { - let body = Self::http_get_request(url).map_err(|err| { - error!("[DAC Validator] Error while getting {}: {:?}", url, err); - "HTTP GET error" - })?; - - let parsed = serde_json::from_slice(&body).map_err(|err| { - warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); - "HTTP JSON parse error" - }); - - parsed - } - - fn http_get_request(http_url: &str) -> Result, http::Error> { - // info!("[DAC Validator] Sending request to: {:?}", http_url); - - // Initiate an external HTTP GET request. This is using high-level wrappers from - // `sp_runtime`. - let request = http::Request::get(http_url); - - let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); - - let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; - - let response = - pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; - - if response.code != 200 { - warn!("[DAC Validator] http_get_request unexpected status code: {}", response.code); - return Err(http::Error::Unknown) - } - - // Next we fully read the response body and collect it to a vector of bytes. - Ok(response.body().collect::>()) - } - fn validate(bytes_sent: BytesSent, bytes_received: BytesReceived) -> bool { let percentage_difference = 1f32 - (bytes_received.sum as f32 / bytes_sent.sum as f32); From 47587227c3213e3e50b2f2c6363335711225a620 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 26 Apr 2023 19:12:06 +0600 Subject: [PATCH 105/583] Add DAC Validator utils module --- src/utils.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/utils.rs diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 000000000..5c8c5cf4f --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,18 @@ +use alloc::string::String; +use codec::{Decode, Encode}; +use sp_core::crypto::AccountId32; + +pub fn account_to_string(account: T::AccountId) -> String { + let to32 = T::AccountId::encode(&account); + let pub_key_str = array_bytes::bytes2hex("", to32); + + pub_key_str +} + +pub fn string_to_account(pub_key_str: String) -> T::AccountId { + let acc32: sp_core::crypto::AccountId32 = + array_bytes::hex2array::<_, 32>(pub_key_str).unwrap().into(); + let mut to32 = AccountId32::as_ref(&acc32); + let address: T::AccountId = T::AccountId::decode(&mut to32).unwrap(); + address +} From a2e6b918f80d1430e72bc353ba12c7f258a57c99 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 26 Apr 2023 19:13:49 +0600 Subject: [PATCH 106/583] Fix dac module usage in ddc-validator crate --- src/dac.rs | 106 +++++++++++++++++++++++++---------------------------- src/lib.rs | 53 ++++++++++----------------- 2 files changed, 69 insertions(+), 90 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index 20f94ac65..32d1fd793 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -1,11 +1,17 @@ //! A module with Data Activity Capture (DAC) interaction. -use crate::*; +use alloc::{format, string::String}; // ToDo: remove String usage use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use codec::{Decode, Encode}; +use frame_support::log::{error, info, warn}; use serde_json::Value; +use sp_runtime::offchain::{http, Duration}; use sp_staking::EraIndex; -use sp_std::collections::btree_map::BTreeMap; +use sp_std::{collections::btree_map::BTreeMap, prelude::*}; + +use crate::utils; + +pub const HTTP_TIMEOUT_MS: u64 = 30_000; #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(crate = "alt_serde")] @@ -27,7 +33,7 @@ pub enum FtAggregate { pub struct BytesSent { node_public_key: String, era: EraIndex, - sum: u32, + pub sum: u32, } #[derive(Serialize, Deserialize, Debug)] @@ -153,7 +159,7 @@ impl BytesSent { pub struct BytesReceived { node_public_key: String, era: EraIndex, - sum: u32, + pub sum: u32, } impl BytesReceived { @@ -199,85 +205,82 @@ impl BytesReceived { } } -fn fetch_file_request() -> Requests { - let url = Self::get_file_request_url(); +fn get_file_request_url(data_provider_url: &String) -> String { + let res = format!("{}/JSON.GET/testddc:dac:data", data_provider_url); + + res +} - let response: FileRequestWrapper = Self::http_get_json(&url).unwrap(); +pub(crate) fn fetch_file_request(url: &String) -> Requests { + let response: FileRequestWrapper = http_get_json(&url).unwrap(); let value: Value = serde_json::from_str(response.json.as_str()).unwrap(); let map: Requests = serde_json::from_value(value).unwrap(); map } -fn get_file_request_url() -> String { - let data_provider_url = Self::get_data_provider_url(); - - let res = format!("{}/JSON.GET/testddc:dac:data", data_provider_url.unwrap()); - - res -} - -fn fetch_data(era: EraIndex, cdn_node: &T::AccountId) -> (BytesSent, BytesReceived) { +pub(crate) fn fetch_data( + data_provider_url: &String, + era: EraIndex, + cdn_node: &T::AccountId, +) -> (BytesSent, BytesReceived) { info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error - let bytes_sent_query = Self::get_bytes_sent_query_url(era); - let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); + let bytes_sent_query = get_bytes_sent_query_url(data_provider_url, era); + let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).unwrap(); info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); let bytes_sent = BytesSent::new(bytes_sent_res); // Todo: handle the error - let bytes_received_query = Self::get_bytes_received_query_url(era); - let bytes_received_res: RedisFtAggregate = Self::http_get_json(&bytes_received_query).unwrap(); + let bytes_received_query = get_bytes_received_query_url(data_provider_url, era); + let bytes_received_res: RedisFtAggregate = http_get_json(&bytes_received_query).unwrap(); info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); let bytes_received = BytesReceived::new(bytes_received_res); (bytes_sent, bytes_received) } -fn fetch_data1(era: EraIndex) -> (Vec, Vec) { +pub(crate) fn fetch_data1( + data_provider_url: &String, + era: EraIndex, +) -> (Vec, Vec) { info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error - let bytes_sent_query = Self::get_bytes_sent_query_url(era); - let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); + let bytes_sent_query = get_bytes_sent_query_url(data_provider_url, era); + let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).unwrap(); info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); let bytes_sent = BytesSent::get_all(bytes_sent_res); // Todo: handle the error - let bytes_received_query = Self::get_bytes_received_query_url(era); - let bytes_received_res: RedisFtAggregate = Self::http_get_json(&bytes_received_query).unwrap(); + let bytes_received_query = get_bytes_received_query_url(data_provider_url, era); + let bytes_received_res: RedisFtAggregate = http_get_json(&bytes_received_query).unwrap(); info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); let bytes_received = BytesReceived::get_all(bytes_received_res); (bytes_sent, bytes_received) } -fn fetch_data2(era: EraIndex) -> (String, Vec, String, Vec) { - let bytes_sent_query = Self::get_bytes_sent_query_url(era); - let bytes_sent_res: RedisFtAggregate = Self::http_get_json(&bytes_sent_query).unwrap(); +pub(crate) fn fetch_data2( + data_provider_url: &String, + era: EraIndex, +) -> (String, Vec, String, Vec) { + let bytes_sent_query = get_bytes_sent_query_url(data_provider_url, era); + let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).unwrap(); let bytes_sent = BytesSent::get_all(bytes_sent_res); - let bytes_received_query = Self::get_bytes_received_query_url(era); - let bytes_received_res: RedisFtAggregate = Self::http_get_json(&bytes_received_query).unwrap(); + let bytes_received_query = get_bytes_received_query_url(data_provider_url, era); + let bytes_received_res: RedisFtAggregate = http_get_json(&bytes_received_query).unwrap(); let bytes_received = BytesReceived::get_all(bytes_received_res); (bytes_sent_query, bytes_sent, bytes_received_query, bytes_received) } -fn get_bytes_received_query_url(era: EraIndex) -> String { - let data_provider_url = Self::get_data_provider_url(); - - match data_provider_url { - Some(url) => { - return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", url, era, era); - }, - None => { - return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", DEFAULT_DATA_PROVIDER_URL, era, era); - }, - } +fn get_bytes_received_query_url(data_provider_url: &String, era: EraIndex) -> String { + format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", data_provider_url, era, era) } -fn http_get_json(url: &str) -> ResultStr { - let body = Self::http_get_request(url).map_err(|err| { +fn http_get_json(url: &str) -> crate::ResultStr { + let body = http_get_request(url).map_err(|err| { error!("[DAC Validator] Error while getting {}: {:?}", url, err); "HTTP GET error" })?; @@ -312,12 +315,12 @@ fn http_get_request(http_url: &str) -> Result, http::Error> { Ok(response.body().collect::>()) } -fn filter_data( +fn filter_data( s: &Vec, r: &Vec, a: &T::AccountId, ) -> (BytesSent, BytesReceived) { - let ac = Self::account_to_string(a.clone()); + let ac = utils::account_to_string::(a.clone()); let filtered_s = &*s.into_iter().find(|bs| bs.node_public_key == ac).unwrap(); let filtered_r = &*r.into_iter().find(|br| br.node_public_key == ac).unwrap(); @@ -325,15 +328,6 @@ fn filter_data( (filtered_s.clone(), filtered_r.clone()) } -fn get_bytes_sent_query_url(era: EraIndex) -> String { - let data_provider_url = Self::get_data_provider_url(); - - match data_provider_url { - Some(url) => { - return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", url, era, era); - }, - None => { - return format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", DEFAULT_DATA_PROVIDER_URL, era, era); - }, - } +fn get_bytes_sent_query_url(data_provider_url: &String, era: EraIndex) -> String { + format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", data_provider_url, era, era) } diff --git a/src/lib.rs b/src/lib.rs index a4f3d5659..cefd0da33 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,6 +16,7 @@ #![cfg_attr(not(feature = "std"), no_std)] mod dac; +mod utils; mod validation; #[cfg(test)] @@ -66,15 +67,13 @@ type ResultStr = Result; pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); -pub const HTTP_TIMEOUT_MS: u64 = 30_000; - -const TIME_START_MS: u128 = 1_672_531_200_000; -const ERA_DURATION_MS: u128 = 120_000; -const ERA_IN_BLOCKS: u8 = 20; +pub const TIME_START_MS: u128 = 1_672_531_200_000; +pub const ERA_DURATION_MS: u128 = 120_000; +pub const ERA_IN_BLOCKS: u8 = 20; /// Webdis in experimental cluster connected to Redis in dev. -const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; -const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; +pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; +pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; /// Aggregated values from DAC that describe CDN node's activity during a certain era. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] @@ -238,14 +237,12 @@ pub mod pallet { return } - let file_request = Self::fetch_file_request(); - // info!("fileRequest: {:?}", file_request); + let data_provider_url = + Self::get_data_provider_url().unwrap_or(String::from(DEFAULT_DATA_PROVIDER_URL)); + info!("[DAC Validator] data provider url: {:?}", &data_provider_url,); - let data_provider_url = Self::get_data_provider_url(); - info!( - "[DAC Validator] data provider url: {:?}", - data_provider_url.unwrap_or(String::from("not configured")) - ); + let file_request = dac::fetch_file_request(&data_provider_url); + // info!("fileRequest: {:?}", file_request); // Wait for signal. let signal = Signal::::get().unwrap_or(false); @@ -256,7 +253,8 @@ pub mod pallet { // Read from DAC. let current_era = Self::get_current_era(); - let (sent_query, sent, received_query, received) = Self::fetch_data2(current_era - 1); + let (sent_query, sent, received_query, received) = + dac::fetch_data2(&data_provider_url, current_era - 1); log::info!( "🔎 DAC Validator is fetching data from DAC, current era: {:?}, bytes sent query: {:?}, bytes sent response: {:?}, bytes received query: {:?}, bytes received response: {:?}", current_era, @@ -345,22 +343,7 @@ pub mod pallet { .unwrap() } - fn account_to_string(account: T::AccountId) -> String { - let to32 = T::AccountId::encode(&account); - let pub_key_str = array_bytes::bytes2hex("", to32); - - pub_key_str - } - - fn string_to_account(pub_key_str: String) -> T::AccountId { - let acc32: sp_core::crypto::AccountId32 = - array_bytes::hex2array::<_, 32>(pub_key_str).unwrap().into(); - let mut to32 = AccountId32::as_ref(&acc32); - let address: T::AccountId = T::AccountId::decode(&mut to32).unwrap(); - address - } - - fn validate(bytes_sent: BytesSent, bytes_received: BytesReceived) -> bool { + fn validate(bytes_sent: dac::BytesSent, bytes_received: dac::BytesReceived) -> bool { let percentage_difference = 1f32 - (bytes_received.sum as f32 / bytes_sent.sum as f32); return if percentage_difference > 0.0 && @@ -397,8 +380,10 @@ pub mod pallet { let shuffled_validators = Self::shuffle(validators); let shuffled_edges = Self::shuffle(edges); - let validators_keys: Vec = - shuffled_validators.iter().map(|v| Self::account_to_string(v.clone())).collect(); + let validators_keys: Vec = shuffled_validators + .iter() + .map(|v| utils::account_to_string::(v.clone())) + .collect(); let quorums = Self::split(validators_keys, quorum_size); let edges_groups = Self::split(shuffled_edges, quorums.len()); @@ -410,7 +395,7 @@ pub mod pallet { for validator in quorum { Assignments::::insert( era, - Self::string_to_account(validator.clone()), + utils::string_to_account::(validator.clone()), edges_group, ); } From 1c0abec2491e00af8be00fa152edf5a8ca84ecb8 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 27 Apr 2023 19:09:16 +0600 Subject: [PATCH 107/583] Use log crate directly --- src/dac.rs | 21 ++++++++++----------- src/lib.rs | 11 +++++------ 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index 32d1fd793..a6e450219 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -3,7 +3,6 @@ use alloc::{format, string::String}; // ToDo: remove String usage use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use codec::{Decode, Encode}; -use frame_support::log::{error, info, warn}; use serde_json::Value; use sp_runtime::offchain::{http, Duration}; use sp_staking::EraIndex; @@ -224,17 +223,17 @@ pub(crate) fn fetch_data( era: EraIndex, cdn_node: &T::AccountId, ) -> (BytesSent, BytesReceived) { - info!("[DAC Validator] DAC Validator is running. Current era is {}", era); + log::info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error let bytes_sent_query = get_bytes_sent_query_url(data_provider_url, era); let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).unwrap(); - info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); + log::info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); let bytes_sent = BytesSent::new(bytes_sent_res); // Todo: handle the error let bytes_received_query = get_bytes_received_query_url(data_provider_url, era); let bytes_received_res: RedisFtAggregate = http_get_json(&bytes_received_query).unwrap(); - info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); + log::info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); let bytes_received = BytesReceived::new(bytes_received_res); (bytes_sent, bytes_received) @@ -244,17 +243,17 @@ pub(crate) fn fetch_data1( data_provider_url: &String, era: EraIndex, ) -> (Vec, Vec) { - info!("[DAC Validator] DAC Validator is running. Current era is {}", era); + log::info!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error let bytes_sent_query = get_bytes_sent_query_url(data_provider_url, era); let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).unwrap(); - info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); + log::info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); let bytes_sent = BytesSent::get_all(bytes_sent_res); // Todo: handle the error let bytes_received_query = get_bytes_received_query_url(data_provider_url, era); let bytes_received_res: RedisFtAggregate = http_get_json(&bytes_received_query).unwrap(); - info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); + log::info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); let bytes_received = BytesReceived::get_all(bytes_received_res); (bytes_sent, bytes_received) @@ -281,12 +280,12 @@ fn get_bytes_received_query_url(data_provider_url: &String, era: EraIndex) -> St fn http_get_json(url: &str) -> crate::ResultStr { let body = http_get_request(url).map_err(|err| { - error!("[DAC Validator] Error while getting {}: {:?}", url, err); + log::error!("[DAC Validator] Error while getting {}: {:?}", url, err); "HTTP GET error" })?; let parsed = serde_json::from_slice(&body).map_err(|err| { - warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); + log::warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); "HTTP JSON parse error" }); @@ -294,7 +293,7 @@ fn http_get_json(url: &str) -> crate::ResultStr { } fn http_get_request(http_url: &str) -> Result, http::Error> { - // info!("[DAC Validator] Sending request to: {:?}", http_url); + // log::info!("[DAC Validator] Sending request to: {:?}", http_url); // Initiate an external HTTP GET request. This is using high-level wrappers from // `sp_runtime`. @@ -307,7 +306,7 @@ fn http_get_request(http_url: &str) -> Result, http::Error> { let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; if response.code != 200 { - warn!("[DAC Validator] http_get_request unexpected status code: {}", response.code); + log::warn!("[DAC Validator] http_get_request unexpected status code: {}", response.code); return Err(http::Error::Unknown) } diff --git a/src/lib.rs b/src/lib.rs index cefd0da33..78fd8ffe9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,7 +32,6 @@ pub use core::fmt::Debug; pub use frame_support::{ decl_event, decl_module, decl_storage, dispatch::DispatchResult, - log::{error, info, warn}, pallet_prelude::*, parameter_types, storage, traits::{Currency, Randomness, UnixTime}, @@ -216,10 +215,10 @@ pub mod pallet { } let era = Self::get_current_era(); - info!("current era: {:?}", era); + log::info!("current era: {:?}", era); if let Some(last_managed_era) = >::get() { - info!("last_managed_era: {:?}", last_managed_era); + log::info!("last_managed_era: {:?}", last_managed_era); if last_managed_era >= era { return 0 } @@ -239,10 +238,10 @@ pub mod pallet { let data_provider_url = Self::get_data_provider_url().unwrap_or(String::from(DEFAULT_DATA_PROVIDER_URL)); - info!("[DAC Validator] data provider url: {:?}", &data_provider_url,); + log::info!("[DAC Validator] data provider url: {:?}", &data_provider_url); let file_request = dac::fetch_file_request(&data_provider_url); - // info!("fileRequest: {:?}", file_request); + // log::info!("fileRequest: {:?}", file_request); // Wait for signal. let signal = Signal::::get().unwrap_or(false); @@ -320,7 +319,7 @@ pub mod pallet { None => { let url_key = String::from_utf8(DATA_PROVIDER_URL_KEY.to_vec()).unwrap(); let msg = format!("[DAC Validator] Data provider URL is not configured. Please configure it using offchain_localStorageSet with key {:?}. Using default for now.", url_key); - warn!("{}", msg); + log::warn!("{}", msg); Some(String::from(DEFAULT_DATA_PROVIDER_URL)) }, Some(url) => Some(String::from_utf8(url).unwrap()), From 0f29c1cff27f87785e5ff2d71f8ee462cd6b2b92 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Thu, 27 Apr 2023 15:16:36 +0200 Subject: [PATCH 108/583] Implement bytes aggregation --- src/dac.rs | 98 ++++++++++++++++++++++++++++++++++++++++++++++++------ src/lib.rs | 8 +++-- 2 files changed, 94 insertions(+), 12 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index a6e450219..b3bfc8af2 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -6,10 +6,18 @@ use codec::{Decode, Encode}; use serde_json::Value; use sp_runtime::offchain::{http, Duration}; use sp_staking::EraIndex; -use sp_std::{collections::btree_map::BTreeMap, prelude::*}; +pub use sp_std::{ + collections::{ + btree_map::BTreeMap, + btree_set::BTreeSet, + }, + prelude::* +}; + use crate::utils; +pub type TimestampInSec = u64; pub const HTTP_TIMEOUT_MS: u64 = 30_000; #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] @@ -58,8 +66,8 @@ pub type Requests = BTreeMap; pub struct FileRequest { file_request_id: String, file_info: FileInfo, - bucket_id: i64, - timestamp: i64, + bucket_id: u64, + timestamp: u64, chunks: BTreeMap, user_public_key: String, } @@ -77,8 +85,8 @@ pub struct Chunk { #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct Ack { - bytes_received: i64, - user_timestamp: i64, + bytes_received: u64, + user_timestamp: u64, nonce: String, node_public_key: String, user_public_key: String, @@ -90,16 +98,16 @@ pub struct Ack { #[serde(rename_all = "camelCase")] pub struct Log { #[serde(rename = "type")] - log_type: i64, + log_type: u64, session_id: String, user_public_key: String, - era: i64, + era: u64, user_address: String, - bytes_sent: i64, - timestamp: i64, + bytes_sent: u64, + timestamp: u64, node_public_key: String, signature: String, - bucket_id: i64, + bucket_id: u64, } #[derive(Serialize, Deserialize, Debug)] @@ -204,6 +212,76 @@ impl BytesReceived { } } +fn get_timestamps_with_ack(file_requests: &FileRequests) -> Vec { + let mut timestamps:Vec = Vec::new(); + + for (_, file_request) in &file_requests.requests { + for (_, chunk) in &file_request.chunks { + if let Some(ack) = &chunk.ack { + timestamps.push(chunk.log.timestamp); + } + } + } + + timestamps.sort(); + + timestamps +} + +pub fn get_proved_deliveried_bytes_sum(file_requests: &FileRequests) -> u64 { + let ack_timestamps= get_timestamps_with_ack(file_requests); + let mut total_bytes_received = 0u64; + + for (_, file_request) in &file_requests.requests { + for (_, chunk) in &file_request.chunks { + if let Some(ack) = &chunk.ack { + total_bytes_received += ack.bytes_received; + } else { + total_bytes_received += get_proved_delivered_bytes(chunk, &ack_timestamps); + } + } + } + + total_bytes_received +} + +fn get_proved_delivered_bytes(chunk: &Chunk, ack_timestamps: &Vec) -> u64 { + let log_timestamp = chunk.log.timestamp; + let neighbors = get_closer_neighbors(log_timestamp, &ack_timestamps); + let is_proved = is_lies_within_threshold(log_timestamp, neighbors, 42); + + if is_proved { + return chunk.log.bytes_sent; + } else { + 0 + } +} + +fn get_closer_neighbors(timestamp: TimestampInSec, timestamps: &Vec) -> (TimestampInSec, TimestampInSec) { + let mut before = 0; + let mut after = TimestampInSec::MAX; + for ts in timestamps { + if ts < ×tamp { + before = before.max(*ts); + } else if ts > ×tamp { + after = after.min(*ts); + } + } + + (before, after) +} + +fn is_lies_within_threshold(timestamp: TimestampInSec, borders: (TimestampInSec, TimestampInSec), threshold: TimestampInSec) -> bool { + let left_distance = timestamp - borders.0; + let right_distance = borders.1 - timestamp; + + if left_distance < threshold || right_distance < threshold { + return true; + } + + false +} + fn get_file_request_url(data_provider_url: &String) -> String { let res = format!("{}/JSON.GET/testddc:dac:data", data_provider_url); diff --git a/src/lib.rs b/src/lib.rs index 78fd8ffe9..b075b5eca 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -53,7 +53,12 @@ pub use sp_core::crypto::{AccountId32, KeyTypeId, UncheckedFrom}; pub use sp_io::crypto::sr25519_public_keys; pub use sp_runtime::offchain::{http, storage::StorageValueRef, Duration, Timestamp}; pub use sp_staking::EraIndex; -pub use sp_std::{collections::btree_map::BTreeMap, prelude::*}; +pub use sp_std::{ + collections::{ + btree_map::BTreeMap, + }, + prelude::* +}; extern crate alloc; @@ -241,7 +246,6 @@ pub mod pallet { log::info!("[DAC Validator] data provider url: {:?}", &data_provider_url); let file_request = dac::fetch_file_request(&data_provider_url); - // log::info!("fileRequest: {:?}", file_request); // Wait for signal. let signal = Signal::::get().unwrap_or(false); From 11c219cc2577f3e9c4cba2b27206eca6254d946d Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Thu, 27 Apr 2023 20:02:17 +0200 Subject: [PATCH 109/583] Clean up code --- src/dac.rs | 8 ++++---- src/lib.rs | 34 ++++++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index b3bfc8af2..dc160db84 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -212,10 +212,10 @@ impl BytesReceived { } } -fn get_timestamps_with_ack(file_requests: &FileRequests) -> Vec { +fn get_timestamps_with_ack(file_requests: &Requests) -> Vec { let mut timestamps:Vec = Vec::new(); - for (_, file_request) in &file_requests.requests { + for (_, file_request) in file_requests { for (_, chunk) in &file_request.chunks { if let Some(ack) = &chunk.ack { timestamps.push(chunk.log.timestamp); @@ -228,11 +228,11 @@ fn get_timestamps_with_ack(file_requests: &FileRequests) -> Vec timestamps } -pub fn get_proved_deliveried_bytes_sum(file_requests: &FileRequests) -> u64 { +pub fn get_proved_deliveried_bytes_sum(file_requests: &Requests) -> u64 { let ack_timestamps= get_timestamps_with_ack(file_requests); let mut total_bytes_received = 0u64; - for (_, file_request) in &file_requests.requests { + for (_, file_request) in file_requests { for (_, chunk) in &file_request.chunks { if let Some(ack) = &chunk.ack { total_bytes_received += ack.bytes_received; diff --git a/src/lib.rs b/src/lib.rs index b075b5eca..6848ad3e1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -76,6 +76,7 @@ pub const ERA_DURATION_MS: u128 = 120_000; pub const ERA_IN_BLOCKS: u8 = 20; /// Webdis in experimental cluster connected to Redis in dev. +// pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; @@ -201,6 +202,11 @@ pub mod pallet { #[pallet::getter(fn last_managed_era)] pub type LastManagedEra = StorageValue<_, EraIndex>; + #[pallet::error] + pub enum Error { + // TBA + } + #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event @@ -241,11 +247,14 @@ pub mod pallet { return } - let data_provider_url = - Self::get_data_provider_url().unwrap_or(String::from(DEFAULT_DATA_PROVIDER_URL)); - log::info!("[DAC Validator] data provider url: {:?}", &data_provider_url); + let data_provider_url = Self::get_data_provider_url(); + info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); + + let mock_data_url = Self::get_mock_data_url(); - let file_request = dac::fetch_file_request(&data_provider_url); + let file_request = dac::fetch_file_request(&mock_data_url); + let bytes_sum = dac::get_proved_deliveried_bytes_sum(&file_request); + info!("Proved bytes sum: {:?}", bytes_sum); // Wait for signal. let signal = Signal::::get().unwrap_or(false); @@ -313,23 +322,28 @@ pub mod pallet { ::AccountId: AsRef<[u8]> + UncheckedFrom, as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { - fn get_data_provider_url() -> Option { + fn get_data_provider_url() -> String { let url_ref = sp_io::offchain::local_storage_get( sp_core::offchain::StorageKind::PERSISTENT, DATA_PROVIDER_URL_KEY, ); match url_ref { + Some(url) => String::from_utf8(url).expect("Data provider URL should be valid UTF-8 string"), None => { - let url_key = String::from_utf8(DATA_PROVIDER_URL_KEY.to_vec()).unwrap(); - let msg = format!("[DAC Validator] Data provider URL is not configured. Please configure it using offchain_localStorageSet with key {:?}. Using default for now.", url_key); - log::warn!("{}", msg); - Some(String::from(DEFAULT_DATA_PROVIDER_URL)) + String::from(DEFAULT_DATA_PROVIDER_URL) }, - Some(url) => Some(String::from_utf8(url).unwrap()), } } + fn get_mock_data_url() -> String { + let data_url = Self::get_data_provider_url(); + let mock_url = "/JSON.GET/testddc:dac:data/INDENT/0"; + let url = format!("{}{}", data_url, mock_url); + + url + } + fn get_signer() -> ResultStr> { let signer = Signer::<_, _>::any_account(); if !signer.can_sign() { From 1f458ae8a702e9cce9fd54b80dcddf07c78458cc Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 28 Apr 2023 13:18:40 +0200 Subject: [PATCH 110/583] Fix mock data url --- src/dac.rs | 4 ++-- src/lib.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index dc160db84..11c8c8802 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -228,14 +228,14 @@ fn get_timestamps_with_ack(file_requests: &Requests) -> Vec { timestamps } -pub fn get_proved_deliveried_bytes_sum(file_requests: &Requests) -> u64 { +pub fn get_proved_delivered_bytes_sum(file_requests: &Requests) -> u64 { let ack_timestamps= get_timestamps_with_ack(file_requests); let mut total_bytes_received = 0u64; for (_, file_request) in file_requests { for (_, chunk) in &file_request.chunks { if let Some(ack) = &chunk.ack { - total_bytes_received += ack.bytes_received; + total_bytes_received += &chunk.log.bytes_sent; } else { total_bytes_received += get_proved_delivered_bytes(chunk, &ack_timestamps); } diff --git a/src/lib.rs b/src/lib.rs index 6848ad3e1..51aa4ac88 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -253,7 +253,7 @@ pub mod pallet { let mock_data_url = Self::get_mock_data_url(); let file_request = dac::fetch_file_request(&mock_data_url); - let bytes_sum = dac::get_proved_deliveried_bytes_sum(&file_request); + let bytes_sum = dac::get_proved_delivered_bytes_sum(&file_request); info!("Proved bytes sum: {:?}", bytes_sum); // Wait for signal. @@ -338,7 +338,7 @@ pub mod pallet { fn get_mock_data_url() -> String { let data_url = Self::get_data_provider_url(); - let mock_url = "/JSON.GET/testddc:dac:data/INDENT/0"; + let mock_url = "/JSON.GET/testddc:dac:data"; let url = format!("{}{}", data_url, mock_url); url From 652fd81dd0f40a078120cc874fe62839f8f3a3fc Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 28 Apr 2023 13:29:03 +0200 Subject: [PATCH 111/583] Fix info macro --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 51aa4ac88..40d52dcd8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -248,13 +248,13 @@ pub mod pallet { } let data_provider_url = Self::get_data_provider_url(); - info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); + log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); let mock_data_url = Self::get_mock_data_url(); let file_request = dac::fetch_file_request(&mock_data_url); let bytes_sum = dac::get_proved_delivered_bytes_sum(&file_request); - info!("Proved bytes sum: {:?}", bytes_sum); + log::info!("Proved bytes sum: {:?}", bytes_sum); // Wait for signal. let signal = Signal::::get().unwrap_or(false); From f5bb023ef7594caa10315ab70c6536e9f173880b Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 28 Apr 2023 19:48:28 +0600 Subject: [PATCH 112/583] DAC aggregates reading function --- Cargo.toml | 2 ++ src/dac.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index ff6dbd53b..0657d768f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ frame-support = { version = "4.0.0-dev", default-features = false, path = "../su frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } frame-election-provider-support = { version = "4.0.0-dev", default-features = false, path = "../election-provider-support" } log = { version = "0.4.17", default-features = false } +lite-json = { version = "0.2.0", default-features = false } pallet-contracts = { version = '4.0.0-dev', default-features = false, path = "../contracts" } pallet-ddc-staking = { version = "0.1.0", default-features = false, path = "../ddc-staking" } pallet-session = { version = "4.0.0-dev", path = "../session", default-features = false } @@ -32,6 +33,7 @@ std = [ "frame-support/std", "frame-system/std", "frame-election-provider-support/std", + "lite-json/std", "pallet-contracts/std", "pallet-ddc-staking/std", "pallet-session/std", diff --git a/src/dac.rs b/src/dac.rs index 11c8c8802..2ab312b14 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -3,6 +3,7 @@ use alloc::{format, string::String}; // ToDo: remove String usage use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use codec::{Decode, Encode}; +use lite_json::json::JsonValue; use serde_json::Value; use sp_runtime::offchain::{http, Duration}; use sp_staking::EraIndex; @@ -408,3 +409,29 @@ fn filter_data( fn get_bytes_sent_query_url(data_provider_url: &String, era: EraIndex) -> String { format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", data_provider_url, era, era) } + +pub(crate) fn fetch_aggregates( + data_provider_url: &String, + era: EraIndex, +) -> Result { + let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); + let url = + format!("{}/JSON.GET/ddc:dac:aggregation:nodes:{}?type=query", data_provider_url, era); + let request = http::Request::get(url.as_str()); + let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; + let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; + if response.code != 200 { + log::warn!("Unexpected status code: {}", response.code); + return Err(http::Error::Unknown) + } + let body = response.body().collect::>(); + let body_str = sp_std::str::from_utf8(&body).map_err(|_| { + log::warn!("No UTF-8 body"); + http::Error::Unknown + })?; + let json = lite_json::parse_json(body_str).map_err(|_| { + log::warn!("No JSON body"); + http::Error::Unknown + })?; + Ok(json) +} From 4fa175b2e2f2973e47f489762b503b8377009114 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 28 Apr 2023 19:50:11 +0600 Subject: [PATCH 113/583] Print the number of broken sessions by CDN node --- src/lib.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 40d52dcd8..0661efb66 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -43,6 +43,7 @@ pub use frame_system::{ offchain::{AppCrypto, CreateSignedTransaction, SendSignedTransaction, Signer, SigningTypes}, pallet_prelude::*, }; +pub use lite_json::json::JsonValue; pub use pallet::*; pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_session as session; @@ -256,6 +257,34 @@ pub mod pallet { let bytes_sum = dac::get_proved_delivered_bytes_sum(&file_request); log::info!("Proved bytes sum: {:?}", bytes_sum); + // Print the number of broken sessions per CDN node. + let aggregates_value = dac::fetch_aggregates(&data_provider_url, 77436).unwrap(); // 77436 is for a mock data + let aggregates_obj = aggregates_value.as_object().unwrap(); + aggregates_obj + .into_iter() + .for_each(|(cdn_node_pubkey, cdn_node_aggregates_value)| { + // iterate over aggregates for each node + let cdn_node_aggregates_obj = cdn_node_aggregates_value.as_object().unwrap(); + // Extract `nodeInterruptedSessions` field + let (_, cdn_node_interrupted_sessions_value) = cdn_node_aggregates_obj + .into_iter() + .find(|(key, _)| key.iter().copied().eq("nodeInterruptedSessions".chars())) + .unwrap(); + let cdn_node_interrupted_sessions_obj = + cdn_node_interrupted_sessions_value.as_object().unwrap(); + // Prepare CDN pubkey without heap allocated string + let cdn_node_pubkey_vecu8: Vec = + cdn_node_pubkey.iter().map(|c| *c as u8).collect(); + let cdn_node_pubkey_str = + sp_std::str::from_utf8(&cdn_node_pubkey_vecu8).unwrap(); + log::info!( + "Broken sessions per CDN node | Node {}: {} sessions broken", + cdn_node_pubkey_str, + cdn_node_interrupted_sessions_obj.len(), /* count sessions broken by the + * node */ + ); + }); + // Wait for signal. let signal = Signal::::get().unwrap_or(false); if !signal { From c2e46564f50b50f3810cb86e366586e8c5d0182f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 28 Apr 2023 19:51:25 +0600 Subject: [PATCH 114/583] Autoformat DAC Validator files --- Cargo.toml | 2 +- src/dac.rs | 27 +++++++++++++++------------ src/lib.rs | 14 ++++---------- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0657d768f..66b8deec8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,4 +52,4 @@ std = [ pallet-balances = { version = "4.0.0-dev", path = "../balances" } pallet-randomness-collective-flip = { version = "4.0.0-dev", path = "../randomness-collective-flip" } pallet-timestamp = { version = "4.0.0-dev", path = "../timestamp" } -pallet-staking-reward-curve = { version = "4.0.0-dev", path = "../staking/reward-curve" } \ No newline at end of file +pallet-staking-reward-curve = { version = "4.0.0-dev", path = "../staking/reward-curve" } diff --git a/src/dac.rs b/src/dac.rs index 2ab312b14..9f0c0f5ac 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -8,14 +8,10 @@ use serde_json::Value; use sp_runtime::offchain::{http, Duration}; use sp_staking::EraIndex; pub use sp_std::{ - collections::{ - btree_map::BTreeMap, - btree_set::BTreeSet, - }, - prelude::* + collections::{btree_map::BTreeMap, btree_set::BTreeSet}, + prelude::*, }; - use crate::utils; pub type TimestampInSec = u64; @@ -214,7 +210,7 @@ impl BytesReceived { } fn get_timestamps_with_ack(file_requests: &Requests) -> Vec { - let mut timestamps:Vec = Vec::new(); + let mut timestamps: Vec = Vec::new(); for (_, file_request) in file_requests { for (_, chunk) in &file_request.chunks { @@ -230,7 +226,7 @@ fn get_timestamps_with_ack(file_requests: &Requests) -> Vec { } pub fn get_proved_delivered_bytes_sum(file_requests: &Requests) -> u64 { - let ack_timestamps= get_timestamps_with_ack(file_requests); + let ack_timestamps = get_timestamps_with_ack(file_requests); let mut total_bytes_received = 0u64; for (_, file_request) in file_requests { @@ -252,13 +248,16 @@ fn get_proved_delivered_bytes(chunk: &Chunk, ack_timestamps: &Vec) -> (TimestampInSec, TimestampInSec) { +fn get_closer_neighbors( + timestamp: TimestampInSec, + timestamps: &Vec, +) -> (TimestampInSec, TimestampInSec) { let mut before = 0; let mut after = TimestampInSec::MAX; for ts in timestamps { @@ -272,12 +271,16 @@ fn get_closer_neighbors(timestamp: TimestampInSec, timestamps: &Vec bool { +fn is_lies_within_threshold( + timestamp: TimestampInSec, + borders: (TimestampInSec, TimestampInSec), + threshold: TimestampInSec, +) -> bool { let left_distance = timestamp - borders.0; let right_distance = borders.1 - timestamp; if left_distance < threshold || right_distance < threshold { - return true; + return true } false diff --git a/src/lib.rs b/src/lib.rs index 0661efb66..0aeaf7778 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -54,12 +54,7 @@ pub use sp_core::crypto::{AccountId32, KeyTypeId, UncheckedFrom}; pub use sp_io::crypto::sr25519_public_keys; pub use sp_runtime::offchain::{http, storage::StorageValueRef, Duration, Timestamp}; pub use sp_staking::EraIndex; -pub use sp_std::{ - collections::{ - btree_map::BTreeMap, - }, - prelude::* -}; +pub use sp_std::{collections::btree_map::BTreeMap, prelude::*}; extern crate alloc; @@ -358,10 +353,9 @@ pub mod pallet { ); match url_ref { - Some(url) => String::from_utf8(url).expect("Data provider URL should be valid UTF-8 string"), - None => { - String::from(DEFAULT_DATA_PROVIDER_URL) - }, + Some(url) => + String::from_utf8(url).expect("Data provider URL should be valid UTF-8 string"), + None => String::from(DEFAULT_DATA_PROVIDER_URL), } } From 33651929b3dfd89e4aad3bebe2ff862b98b7652d Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 28 Apr 2023 16:45:59 +0200 Subject: [PATCH 115/583] Add const for threshold configuration --- src/dac.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dac.rs b/src/dac.rs index 9f0c0f5ac..52497eed5 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -16,6 +16,7 @@ use crate::utils; pub type TimestampInSec = u64; pub const HTTP_TIMEOUT_MS: u64 = 30_000; +pub const FAILED_CONTENT_CONSUMER_THRESHOLD: TimestampInSec = 100; #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(crate = "alt_serde")] @@ -245,7 +246,7 @@ pub fn get_proved_delivered_bytes_sum(file_requests: &Requests) -> u64 { fn get_proved_delivered_bytes(chunk: &Chunk, ack_timestamps: &Vec) -> u64 { let log_timestamp = chunk.log.timestamp; let neighbors = get_closer_neighbors(log_timestamp, &ack_timestamps); - let is_proved = is_lies_within_threshold(log_timestamp, neighbors, 42); + let is_proved = is_lies_within_threshold(log_timestamp, neighbors, FAILED_CONTENT_CONSUMER_THRESHOLD); if is_proved { return chunk.log.bytes_sent From 6298c5d091127f1e1a81ec1cd95b3d80b3d17363 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 3 May 2023 13:52:53 +0600 Subject: [PATCH 116/583] DAC Validators' "shared memory" module --- src/lib.rs | 1 + src/shm.rs | 1 + 2 files changed, 2 insertions(+) create mode 100644 src/shm.rs diff --git a/src/lib.rs b/src/lib.rs index 0aeaf7778..e0c481342 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,6 +16,7 @@ #![cfg_attr(not(feature = "std"), no_std)] mod dac; +mod shm; mod utils; mod validation; diff --git a/src/shm.rs b/src/shm.rs new file mode 100644 index 000000000..baad0fa83 --- /dev/null +++ b/src/shm.rs @@ -0,0 +1 @@ +//! Validators' "shared memory" module. From f18fe685685896d8421bfb6ef6aac61847057034 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 4 May 2023 15:27:37 +0600 Subject: [PATCH 117/583] Borrow DAC data for validation, remove ownership --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index e0c481342..11a082deb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -384,7 +384,7 @@ pub mod pallet { .unwrap() } - fn validate(bytes_sent: dac::BytesSent, bytes_received: dac::BytesReceived) -> bool { + fn validate(bytes_sent: &dac::BytesSent, bytes_received: &dac::BytesReceived) -> bool { let percentage_difference = 1f32 - (bytes_received.sum as f32 / bytes_sent.sum as f32); return if percentage_difference > 0.0 && From c6007274ea8c4278d7212b9161cd6273e9d7adb1 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 4 May 2023 17:53:48 +0600 Subject: [PATCH 118/583] Make all DAC data types fields public --- src/dac.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index 52497eed5..2bf6cde85 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -36,8 +36,8 @@ pub enum FtAggregate { #[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] pub struct BytesSent { - node_public_key: String, - era: EraIndex, + pub node_public_key: String, + pub era: EraIndex, pub sum: u32, } @@ -162,8 +162,8 @@ impl BytesSent { #[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] pub struct BytesReceived { - node_public_key: String, - era: EraIndex, + pub node_public_key: String, + pub era: EraIndex, pub sum: u32, } From 247995397be2d105e1a21a3ce24b9a2b2b18acf0 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 4 May 2023 17:56:38 +0600 Subject: [PATCH 119/583] Create intermediate validation decisions --- src/lib.rs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 11a082deb..a6381e401 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -300,6 +300,45 @@ pub mod pallet { received_query, received, ); + + // Create intermediate validation decisions + // ======================================== + + // All validators validate all CDN nodes. + let edges: Vec = >::iter_keys().collect(); + for edge in edges.iter() { + // Get string type CDN node pubkey + let edge_pubkey: String = utils::account_to_string::(edge.clone()); + + // Get bytes sent and received for the CDN node + let Some(node_sent) = sent + .iter() + .find(|bytes_sent| bytes_sent.node_public_key == edge_pubkey) else { + log::warn!("No logs to validate {:?}", edge); + continue + }; + let Some(client_received) = received + .iter() + .find(|bytes_received| bytes_received.node_public_key == edge_pubkey) else { + log::warn!("No acks to validate {:?}", edge); + continue + }; + + // Proof-of-delivery validation + let validation_result = Self::validate(node_sent, client_received); + + // Prepare an intermediate validation decision + let _validation_decision = ValidationDecision { + result: validation_result, + payload: [0u8; 256], // ToDo: put a hash of the validated data here + totals: DacTotalAggregates { + sent: node_sent.sum as u64, + received: client_received.sum as u64, + failed_by_client: 0, // ToDo + failure_rate: 0, // ToDo + }, + }; + } } } From 2689bff4cd668fe7bb2ef7de98fb20c04625ee6f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 4 May 2023 18:54:53 +0600 Subject: [PATCH 120/583] Remove let...else unstable feature usage --- src/lib.rs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a6381e401..391804e9e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -311,18 +311,26 @@ pub mod pallet { let edge_pubkey: String = utils::account_to_string::(edge.clone()); // Get bytes sent and received for the CDN node - let Some(node_sent) = sent + let node_sent: &dac::BytesSent = match sent .iter() - .find(|bytes_sent| bytes_sent.node_public_key == edge_pubkey) else { + .find(|bytes_sent| bytes_sent.node_public_key == edge_pubkey) + { + Some(node_sent) => node_sent, + None => { log::warn!("No logs to validate {:?}", edge); continue - }; - let Some(client_received) = received + }, + }; + let client_received: &dac::BytesReceived = match received .iter() - .find(|bytes_received| bytes_received.node_public_key == edge_pubkey) else { + .find(|bytes_received| bytes_received.node_public_key == edge_pubkey) + { + Some(client_received) => client_received, + None => { log::warn!("No acks to validate {:?}", edge); continue - }; + }, + }; // Proof-of-delivery validation let validation_result = Self::validate(node_sent, client_received); From bf748db920f2be6107a47aef16e26493891354a4 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 5 May 2023 18:34:18 +0600 Subject: [PATCH 121/583] Base64 encoding func for validators' shared memory --- Cargo.toml | 1 + src/shm.rs | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 66b8deec8..7e2d7f563 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] array-bytes = "6.0.0" alt_serde = { version = "1", default-features = false, features = ["derive"] } +base64 = { version = "0.21.0", default-features = false } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } diff --git a/src/shm.rs b/src/shm.rs index baad0fa83..ab8698d0d 100644 --- a/src/shm.rs +++ b/src/shm.rs @@ -1 +1,12 @@ //! Validators' "shared memory" module. + +use base64::prelude::*; +use sp_std::prelude::*; + +/// Encodes a vector of bytes into a vector of characters using base64 encoding. +pub fn base64_encode(input: &Vec) -> Vec { + let mut buf = Vec::with_capacity(1024); // ToDo: calculate capacity + buf.resize(1024, 0); + BASE64_STANDARD.encode_slice(input, &mut buf).unwrap(); // ToDo: handle error + buf.iter().map(|&byte| byte as char).collect() +} From e93cad5f2946ce0dfe4bc2837628897eed15ab48 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 5 May 2023 19:51:00 +0600 Subject: [PATCH 122/583] A func to publish intermediate validation result --- src/shm.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/shm.rs b/src/shm.rs index ab8698d0d..6ae033e77 100644 --- a/src/shm.rs +++ b/src/shm.rs @@ -1,8 +1,14 @@ //! Validators' "shared memory" module. +use alloc::{format, string::String}; // ToDo: remove String usage use base64::prelude::*; +use lite_json::json::JsonValue; +use sp_runtime::offchain::{http, Duration}; +use sp_staking::EraIndex; use sp_std::prelude::*; +const HTTP_TIMEOUT_MS: u64 = 30_000; + /// Encodes a vector of bytes into a vector of characters using base64 encoding. pub fn base64_encode(input: &Vec) -> Vec { let mut buf = Vec::with_capacity(1024); // ToDo: calculate capacity @@ -10,3 +16,43 @@ pub fn base64_encode(input: &Vec) -> Vec { BASE64_STANDARD.encode_slice(input, &mut buf).unwrap(); // ToDo: handle error buf.iter().map(|&byte| byte as char).collect() } + +/// Publish intermediate validation result to redis. +pub fn share_intermediate_validation_result( + shared_memory_webdis_url: &String, + era: EraIndex, + validator: &String, + cdn_node: &String, + validation_result: bool, + validation_decision_encoded: &String, +) -> Result { + let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); + let validation_result_string = String::from(if validation_result { "true" } else { "false" }); + let validation_decision_string = String::from(validation_decision_encoded); + let url = format!( + "{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{{\"result\":{},\"data\":{}}}", + shared_memory_webdis_url, + validator, + cdn_node, + era, + validation_result_string, + validation_decision_string, + ); + let request = http::Request::get(url.as_str()); + let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; + let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; + if response.code != 200 { + log::warn!("Unexpected status code: {}", response.code); + return Err(http::Error::Unknown) + } + let body = response.body().collect::>(); + let body_str = sp_std::str::from_utf8(&body).map_err(|_| { + log::warn!("No UTF-8 body"); + http::Error::Unknown + })?; + let json = lite_json::parse_json(body_str).map_err(|_| { + log::warn!("No JSON body"); + http::Error::Unknown + })?; + Ok(json) +} From a81248a0ccf0dac1444ec4d35086480505677c3e Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 5 May 2023 20:29:07 +0600 Subject: [PATCH 123/583] Reset validators launch signal each block --- src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 391804e9e..406250e97 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -222,6 +222,8 @@ pub mod pallet { return 0 } + Signal::::set(Some(false)); + let era = Self::get_current_era(); log::info!("current era: {:?}", era); From 9ef60d6768680da48728a80e60a180a2cef8b49e Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 5 May 2023 20:29:38 +0600 Subject: [PATCH 124/583] Publish intermediate validation results to shm --- src/lib.rs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 406250e97..4f4657115 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -338,7 +338,7 @@ pub mod pallet { let validation_result = Self::validate(node_sent, client_received); // Prepare an intermediate validation decision - let _validation_decision = ValidationDecision { + let validation_decision = ValidationDecision { result: validation_result, payload: [0u8; 256], // ToDo: put a hash of the validated data here totals: DacTotalAggregates { @@ -348,7 +348,38 @@ pub mod pallet { failure_rate: 0, // ToDo }, }; + + // Encode validation decision to base64 + let validation_decision_serialized: Vec = validation_decision.encode(); + let validation_decision_base64 = + shm::base64_encode(&validation_decision_serialized); + log::info!( + "Intermediate validation decision for CDN node {:?}: , base64 encoded: {:?}", + validation_decision, + validation_decision_base64, + ); + + // Prepare values to publish validation decision and publish it + let validator_id_string = String::from("validator1"); // ToDo: get validator ID + let edge_id_string = utils::account_to_string::(edge.clone()); + let validation_decision_base64_string = + validation_decision_base64.iter().cloned().collect::(); + let response = shm::share_intermediate_validation_result( + &data_provider_url, + current_era - 1, + &validator_id_string, + &edge_id_string, + validation_result, + &validation_decision_base64_string, + ); + let response_text = response.unwrap().to_string(); + log::info!("Redis response: {:?}", response_text) } + log::info!( + "Intermediate validation results published for {} CDN nodes in era {:?}", + edges.len(), + current_era - 1 + ); } } From 735668215f75f40855c2b7b503125a857d148e0a Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Thu, 4 May 2023 16:16:35 +0200 Subject: [PATCH 125/583] Implement validator decisions fetching Cargo fmt Post mocked final decision Parse intermediate decisions Adjust get_final_decisions according to new structs Fix input structures Remove unused code Replace Post with Put Run cargo fmt --- src/dac.rs | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++- src/lib.rs | 5 ++ 2 files changed, 168 insertions(+), 2 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index 2bf6cde85..36e5bd4ef 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -4,8 +4,13 @@ use alloc::{format, string::String}; // ToDo: remove String usage use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use codec::{Decode, Encode}; use lite_json::json::JsonValue; +use log::info; use serde_json::Value; -use sp_runtime::offchain::{http, Duration}; +use sp_runtime::offchain::{ + http, + http::{Method, Request}, + Duration, +}; use sp_staking::EraIndex; pub use sp_std::{ collections::{btree_map::BTreeMap, btree_set::BTreeSet}, @@ -119,6 +124,52 @@ pub struct FileInfo { requested_chunk_cids: Vec, } +#[derive(Debug, Deserialize, Serialize)] +#[serde(crate = "alt_serde")] +pub(crate) struct ValidationResult { + data: String, + result: bool, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(crate = "alt_serde")] +pub(crate) struct ValidationResults(BTreeMap); + +#[derive(Debug, Deserialize, Serialize)] +#[serde(crate = "alt_serde")] +pub(crate) struct Edges(BTreeMap); + +#[derive(Debug, Deserialize, Serialize)] +#[serde(crate = "alt_serde")] +pub(crate) struct Wrapper { + #[serde(rename = "HGET")] + decisions: String, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(crate = "alt_serde")] +pub(crate) struct ResultLog { + validator_id: String, + data: String, + result: bool, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(crate = "alt_serde")] +pub(crate) struct ResultsLog(Vec>); + +#[derive(Debug, Deserialize, Serialize)] +#[serde(crate = "alt_serde")] +pub(crate) struct FinalDecision { + data: String, + result: bool, + results_log: ResultsLog, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(crate = "alt_serde")] +pub(crate) struct FinalDecisions(BTreeMap); + impl BytesSent { pub fn new(aggregate: RedisFtAggregate) -> BytesSent { let data = aggregate.ft_aggregate[1].clone(); @@ -246,7 +297,8 @@ pub fn get_proved_delivered_bytes_sum(file_requests: &Requests) -> u64 { fn get_proved_delivered_bytes(chunk: &Chunk, ack_timestamps: &Vec) -> u64 { let log_timestamp = chunk.log.timestamp; let neighbors = get_closer_neighbors(log_timestamp, &ack_timestamps); - let is_proved = is_lies_within_threshold(log_timestamp, neighbors, FAILED_CONTENT_CONSUMER_THRESHOLD); + let is_proved = + is_lies_within_threshold(log_timestamp, neighbors, FAILED_CONTENT_CONSUMER_THRESHOLD); if is_proved { return chunk.log.bytes_sent @@ -439,3 +491,112 @@ pub(crate) fn fetch_aggregates( })?; Ok(json) } + +pub(crate) fn make_http_put(url: &String, payload: &String) -> Result<(), http::Error> { + let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); + + let request = http::Request::new(url.as_str()) + .method(Method::Put) + .body(vec![payload.as_bytes()]); + + let pending_req = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; + let response = pending_req.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; + + if response.code != 200 { + log::warn!("Unexpected status code: {}", response.code); + return Err(http::Error::Unknown) + } + + let body = response.body().collect::>(); + let body_str = sp_std::str::from_utf8(&body).map_err(|_| { + log::warn!("No UTF-8 body"); + http::Error::Unknown + })?; + + let json = lite_json::parse_json(body_str).map_err(|_| { + log::warn!("No JSON body"); + http::Error::Unknown + })?; + + Ok(()) +} + +pub(crate) fn fetch_validators_decisions( + data_provider_url: &String, + era: EraIndex, +) -> Result { + let url = format!("{}/HGET/mock:ddc:dac:decisions_to_eras/{}", data_provider_url, era); + let wrapper: Wrapper = http_get_json(&url).unwrap(); + + Ok(wrapper) +} + +pub(crate) fn post_final_decision( + data_provider_url: &String, + era: EraIndex, + decision: FinalDecision, +) -> Result<(), http::Error> { + let url = format!("{}/HSET/mock:ddc:dac:final_decision_to_era/{}", data_provider_url, era); + + let payload_str: String = serde_json::to_string(&decision).unwrap(); + let res = make_http_put(&url, &payload_str); + + res +} + +pub(crate) fn get_final_decision(decisions: &ValidationResults) -> FinalDecision { + let mut validators_on_edge = 0u32; + let mut positive_count = 0u32; + + let mut results_log: Vec> = Vec::new(); + for (validator_id, decision) in decisions.0.iter() { + let result = decision.result; + + if result == true { + positive_count += 1; + } + + let result_log_value = + ResultLog { validator_id: validator_id.clone(), data: String::from("Base64"), result }; + + let mut result_log: BTreeMap = BTreeMap::new(); + result_log.insert(validator_id.clone(), result_log_value); + results_log.push(result_log); + + validators_on_edge += 1; + } + + let threshold = validators_on_edge / 2; + + let mut validation_result = false; + if positive_count > threshold { + validation_result = true; + } + + let final_decision = FinalDecision { + data: String::from("Base64"), + result: validation_result, + results_log: ResultsLog(results_log), + }; + + final_decision +} + +pub(crate) fn finalize_decisions( + data_provider_url: &String, + era: EraIndex, + edge: &String, +) -> Result<(), http::Error> { + let wrapper = fetch_validators_decisions(data_provider_url, era).unwrap(); + let edges: Edges = serde_json::from_str(wrapper.decisions.as_str()).unwrap(); + let result = edges.0.get(edge).unwrap(); + info!("decisions: {:?}", result); + + let final_decision = get_final_decision(&result); + + info!("final_decision: {:?}", final_decision); + + let res = post_final_decision(data_provider_url, era, final_decision); + + res +} diff --git a/src/lib.rs b/src/lib.rs index 4f4657115..a9ea535e1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -255,6 +255,11 @@ pub mod pallet { let bytes_sum = dac::get_proved_delivered_bytes_sum(&file_request); log::info!("Proved bytes sum: {:?}", bytes_sum); + let assigned_edge = + String::from("0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1"); + dac::finalize_decisions(&data_provider_url, 123345 as EraIndex, &assigned_edge) + .unwrap(); + // Print the number of broken sessions per CDN node. let aggregates_value = dac::fetch_aggregates(&data_provider_url, 77436).unwrap(); // 77436 is for a mock data let aggregates_obj = aggregates_value.as_object().unwrap(); From 118ead186dc74ac2e8fbb26fe517effad3a38b27 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 10 May 2023 11:19:09 +0600 Subject: [PATCH 126/583] Fix shm save_validation_result_by_node request arg --- src/shm.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shm.rs b/src/shm.rs index 6ae033e77..d782f0c4b 100644 --- a/src/shm.rs +++ b/src/shm.rs @@ -30,7 +30,7 @@ pub fn share_intermediate_validation_result( let validation_result_string = String::from(if validation_result { "true" } else { "false" }); let validation_decision_string = String::from(validation_decision_encoded); let url = format!( - "{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{{\"result\":{},\"data\":{}}}", + "{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{{\"result\":{},\"data\":\"{}\"}}", shared_memory_webdis_url, validator, cdn_node, From 6a5e48f7dbe52a2f7182cb7230db0f4099cdf999 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 10 May 2023 11:43:56 +0600 Subject: [PATCH 127/583] Module docs for validators' shared memory mod --- src/shm.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/shm.rs b/src/shm.rs index d782f0c4b..777f31d11 100644 --- a/src/shm.rs +++ b/src/shm.rs @@ -1,4 +1,9 @@ //! Validators' "shared memory" module. +//! +//! It implements a step of the DAC and Validation sequence when validators share their intermediate +//! validation results with each other. The design of the "shared memory" is expected to become like +//! transactions pool or peers list in the future, but for now it works on the centralized Redis +//! server which we maintain for DAC DataModel. use alloc::{format, string::String}; // ToDo: remove String usage use base64::prelude::*; From 5d54ce57c46f42073f1d1e450e46af97d89f1a08 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 10 May 2023 11:53:49 +0600 Subject: [PATCH 128/583] Payments module for DDC Validator pallet --- src/lib.rs | 1 + src/payments.rs | 1 + 2 files changed, 2 insertions(+) create mode 100644 src/payments.rs diff --git a/src/lib.rs b/src/lib.rs index a9ea535e1..820aaf5dc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,6 +16,7 @@ #![cfg_attr(not(feature = "std"), no_std)] mod dac; +mod payments; mod shm; mod utils; mod validation; diff --git a/src/payments.rs b/src/payments.rs new file mode 100644 index 000000000..a1a26ade5 --- /dev/null +++ b/src/payments.rs @@ -0,0 +1 @@ +//! Payments module to calculate and store a withdrawal per content owner and a payout per CDN node. From 240f13f29e9cc3befd22d9cc72db6480ea45f1fa Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Thu, 11 May 2023 10:31:28 +0200 Subject: [PATCH 129/583] Get final decision --- src/dac.rs | 102 ++++++++++++++++++++++++++++++----------------------- src/lib.rs | 4 ++- 2 files changed, 61 insertions(+), 45 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index 36e5bd4ef..e9253f051 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -6,6 +6,7 @@ use codec::{Decode, Encode}; use lite_json::json::JsonValue; use log::info; use serde_json::Value; +use sp_runtime::generic::Era; use sp_runtime::offchain::{ http, http::{Method, Request}, @@ -124,20 +125,16 @@ pub struct FileInfo { requested_chunk_cids: Vec, } -#[derive(Debug, Deserialize, Serialize)] -#[serde(crate = "alt_serde")] -pub(crate) struct ValidationResult { - data: String, - result: bool, -} +type EdgeId = String; +type ValidatorId = String; -#[derive(Debug, Deserialize, Serialize)] -#[serde(crate = "alt_serde")] -pub(crate) struct ValidationResults(BTreeMap); +// #[derive(Debug, Deserialize, Serialize)] +// #[serde(crate = "alt_serde")] +// pub(crate) struct ValidationResults(BTreeMap); #[derive(Debug, Deserialize, Serialize)] #[serde(crate = "alt_serde")] -pub(crate) struct Edges(BTreeMap); +pub(crate) struct EdgesToResults(BTreeMap>); #[derive(Debug, Deserialize, Serialize)] #[serde(crate = "alt_serde")] @@ -148,22 +145,28 @@ pub(crate) struct Wrapper { #[derive(Debug, Deserialize, Serialize)] #[serde(crate = "alt_serde")] -pub(crate) struct ResultLog { - validator_id: String, - data: String, +pub(crate) struct ValidationResult { + validator_id: ValidatorId, + edge_id: EdgeId, result: bool, + received: u64, + sent: u64, + era: EraIndex, } -#[derive(Debug, Deserialize, Serialize)] -#[serde(crate = "alt_serde")] -pub(crate) struct ResultsLog(Vec>); +// #[derive(Debug, Deserialize, Serialize)] +// #[serde(crate = "alt_serde")] +// pub(crate) struct ResultsLogs(Vec); #[derive(Debug, Deserialize, Serialize)] #[serde(crate = "alt_serde")] pub(crate) struct FinalDecision { - data: String, result: bool, - results_log: ResultsLog, + edge_id: EdgeId, + era: EraIndex, + received: u64, + sent: u64, + results_logs: Vec, } #[derive(Debug, Deserialize, Serialize)] @@ -544,24 +547,17 @@ pub(crate) fn post_final_decision( res } -pub(crate) fn get_final_decision(decisions: &ValidationResults) -> FinalDecision { +pub(crate) fn get_final_decision(decisions: Vec) -> FinalDecision { let mut validators_on_edge = 0u32; let mut positive_count = 0u32; - let mut results_log: Vec> = Vec::new(); - for (validator_id, decision) in decisions.0.iter() { - let result = decision.result; - - if result == true { + let mut results_logs: Vec = Vec::new(); + for decision in decisions { + if decision.result == true { positive_count += 1; } - let result_log_value = - ResultLog { validator_id: validator_id.clone(), data: String::from("Base64"), result }; - - let mut result_log: BTreeMap = BTreeMap::new(); - result_log.insert(validator_id.clone(), result_log_value); - results_log.push(result_log); + results_logs.push(decision); validators_on_edge += 1; } @@ -574,29 +570,47 @@ pub(crate) fn get_final_decision(decisions: &ValidationResults) -> FinalDecision } let final_decision = FinalDecision { - data: String::from("Base64"), result: validation_result, - results_log: ResultsLog(results_log), + edge_id: results_logs[0].edge_id.clone(), + results_logs, + // Todo: Implement fn to get the values from intermediate decisions + received: 0, + sent: 0, + era: 0, }; final_decision } -pub(crate) fn finalize_decisions( +// pub(crate) fn finalize_decisions( +// data_provider_url: &String, +// era: EraIndex, +// edge: &String, +// ) -> Result<(), http::Error> { +// let wrapper = fetch_validators_decisions(data_provider_url, era).unwrap(); +// let edges: Edges = serde_json::from_str(wrapper.decisions.as_str()).unwrap(); +// let result = edges.0.get(edge).unwrap(); +// info!("decisions: {:?}", result); +// +// let final_decision = get_final_decision(&result); +// +// info!("final_decision: {:?}", final_decision); +// +// let res = post_final_decision(data_provider_url, era, final_decision); +// +// res +// } + +pub(crate) fn get_validation_results( data_provider_url: &String, era: EraIndex, edge: &String, -) -> Result<(), http::Error> { +) -> Result, http::Error> { let wrapper = fetch_validators_decisions(data_provider_url, era).unwrap(); - let edges: Edges = serde_json::from_str(wrapper.decisions.as_str()).unwrap(); - let result = edges.0.get(edge).unwrap(); - info!("decisions: {:?}", result); + let mut edges: EdgesToResults = serde_json::from_str(wrapper.decisions.as_str()).unwrap(); + let results = edges.0.remove(edge).unwrap(); - let final_decision = get_final_decision(&result); - - info!("final_decision: {:?}", final_decision); - - let res = post_final_decision(data_provider_url, era, final_decision); - - res + Ok(results) } + +// pub(crate) fn save_final_decision(); diff --git a/src/lib.rs b/src/lib.rs index a9ea535e1..386b18efc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -257,8 +257,10 @@ pub mod pallet { let assigned_edge = String::from("0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1"); - dac::finalize_decisions(&data_provider_url, 123345 as EraIndex, &assigned_edge) + let validations_res = dac::get_validation_results(&data_provider_url, 5 as EraIndex, &assigned_edge) .unwrap(); + let final_res = dac::get_final_decision(validations_res); + log::info!("final_res: {:?}", final_res); // Print the number of broken sessions per CDN node. let aggregates_value = dac::fetch_aggregates(&data_provider_url, 77436).unwrap(); // 77436 is for a mock data From eb86761a033766f6ff0b8eae35cae3988eb0f8b7 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Thu, 11 May 2023 10:32:33 +0200 Subject: [PATCH 130/583] Run cargo fmt --- src/dac.rs | 12 +++++++----- src/lib.rs | 5 +++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index e9253f051..da789361f 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -6,11 +6,13 @@ use codec::{Decode, Encode}; use lite_json::json::JsonValue; use log::info; use serde_json::Value; -use sp_runtime::generic::Era; -use sp_runtime::offchain::{ - http, - http::{Method, Request}, - Duration, +use sp_runtime::{ + generic::Era, + offchain::{ + http, + http::{Method, Request}, + Duration, + }, }; use sp_staking::EraIndex; pub use sp_std::{ diff --git a/src/lib.rs b/src/lib.rs index 386b18efc..10c359694 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -257,8 +257,9 @@ pub mod pallet { let assigned_edge = String::from("0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1"); - let validations_res = dac::get_validation_results(&data_provider_url, 5 as EraIndex, &assigned_edge) - .unwrap(); + let validations_res = + dac::get_validation_results(&data_provider_url, 5 as EraIndex, &assigned_edge) + .unwrap(); let final_res = dac::get_final_decision(validations_res); log::info!("final_res: {:?}", final_res); From 6f14608f7d348e816f05c5f94d12ebda65c18769 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Thu, 11 May 2023 12:48:34 +0200 Subject: [PATCH 131/583] Replace FinalDecision wiht ValidationDecision --- src/dac.rs | 41 ++++++++++------------------------------- src/utils.rs | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index da789361f..1ed5d217e 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -19,8 +19,7 @@ pub use sp_std::{ collections::{btree_map::BTreeMap, btree_set::BTreeSet}, prelude::*, }; - -use crate::utils; +use crate::{DacTotalAggregates, utils, ValidationDecision}; pub type TimestampInSec = u64; pub const HTTP_TIMEOUT_MS: u64 = 30_000; @@ -549,7 +548,7 @@ pub(crate) fn post_final_decision( res } -pub(crate) fn get_final_decision(decisions: Vec) -> FinalDecision { +pub(crate) fn get_final_decision(decisions: Vec) -> ValidationDecision { let mut validators_on_edge = 0u32; let mut positive_count = 0u32; @@ -571,38 +570,20 @@ pub(crate) fn get_final_decision(decisions: Vec) -> FinalDecis validation_result = true; } - let final_decision = FinalDecision { + let final_decision= ValidationDecision { result: validation_result, - edge_id: results_logs[0].edge_id.clone(), - results_logs, - // Todo: Implement fn to get the values from intermediate decisions - received: 0, - sent: 0, - era: 0, + payload: utils::get_hashed(&results_logs), + totals: DacTotalAggregates { + received: 0, + sent: 0, + failed_by_client: 0, + failure_rate: 0, + }, }; final_decision } -// pub(crate) fn finalize_decisions( -// data_provider_url: &String, -// era: EraIndex, -// edge: &String, -// ) -> Result<(), http::Error> { -// let wrapper = fetch_validators_decisions(data_provider_url, era).unwrap(); -// let edges: Edges = serde_json::from_str(wrapper.decisions.as_str()).unwrap(); -// let result = edges.0.get(edge).unwrap(); -// info!("decisions: {:?}", result); -// -// let final_decision = get_final_decision(&result); -// -// info!("final_decision: {:?}", final_decision); -// -// let res = post_final_decision(data_provider_url, era, final_decision); -// -// res -// } - pub(crate) fn get_validation_results( data_provider_url: &String, era: EraIndex, @@ -614,5 +595,3 @@ pub(crate) fn get_validation_results( Ok(results) } - -// pub(crate) fn save_final_decision(); diff --git a/src/utils.rs b/src/utils.rs index 5c8c5cf4f..bf3ed3cc4 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,6 +1,11 @@ use alloc::string::String; use codec::{Decode, Encode}; use sp_core::crypto::AccountId32; +use sp_io::hashing::blake2_256; +use crate::dac::ValidationResult; +pub use sp_std::{ + prelude::*, +}; pub fn account_to_string(account: T::AccountId) -> String { let to32 = T::AccountId::encode(&account); @@ -16,3 +21,20 @@ pub fn string_to_account(pub_key_str: String) -> T::Acc let address: T::AccountId = T::AccountId::decode(&mut to32).unwrap(); address } + +pub(crate) fn hash(data: &String) -> [u8; 32] { + let hash = blake2_256(data.as_bytes()); + let mut result = [0u8; 32]; + result.copy_from_slice(&hash); + + result +} + +pub(crate) fn get_hashed(data: &Vec) -> [u8; 256] { + let results_log = serde_json::to_string(data).unwrap(); + let mut payload:[u8; 256] = [0; 256]; + let hashed_results = hash(&results_log); + payload[..32].copy_from_slice(&hashed_results); + + payload +} From d983ac8089ea0324d3d924bcf4089088d88bcd9f Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Thu, 11 May 2023 17:09:39 +0200 Subject: [PATCH 132/583] Implement find_largest_group --- src/dac.rs | 61 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index 1ed5d217e..5bcb53ce8 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -144,7 +144,7 @@ pub(crate) struct Wrapper { decisions: String, } -#[derive(Debug, Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize, Clone)] #[serde(crate = "alt_serde")] pub(crate) struct ValidationResult { validator_id: ValidatorId, @@ -549,30 +549,12 @@ pub(crate) fn post_final_decision( } pub(crate) fn get_final_decision(decisions: Vec) -> ValidationDecision { - let mut validators_on_edge = 0u32; - let mut positive_count = 0u32; - - let mut results_logs: Vec = Vec::new(); - for decision in decisions { - if decision.result == true { - positive_count += 1; - } - - results_logs.push(decision); - - validators_on_edge += 1; - } - - let threshold = validators_on_edge / 2; - - let mut validation_result = false; - if positive_count > threshold { - validation_result = true; - } + let common_decisions = find_largest_group(decisions).unwrap(); + let decision_example = common_decisions.get(0).unwrap(); let final_decision= ValidationDecision { - result: validation_result, - payload: utils::get_hashed(&results_logs), + result: decision_example.result, + payload: utils::get_hashed(&common_decisions), totals: DacTotalAggregates { received: 0, sent: 0, @@ -595,3 +577,36 @@ pub(crate) fn get_validation_results( Ok(results) } + +fn find_largest_group(decisions: Vec) -> Option> { + let mut groups: Vec> = Vec::new(); + let half = decisions.len() / 2; + + for decision in decisions { + let mut found_group = false; + + for group in &mut groups { + if group.iter().all(|x| x.result == decision.result && x.received == decision.received && x.sent == decision.sent) { + group.push(decision.clone()); + found_group = true; + break; + } + } + + if !found_group { + groups.push(vec![decision]); + } + } + + let largest_group = groups + .into_iter() + .max_by_key(|group| group.len()) + .unwrap_or(Vec::new()); + + + if largest_group.len() > half { + Some(largest_group) + } else { + None + } +} From 9391f9ceec640b9574b4c0ac2cac6a3bea38da79 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 12 May 2023 09:51:22 +0200 Subject: [PATCH 133/583] Send tx --- src/dac.rs | 4 ++-- src/lib.rs | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index 5bcb53ce8..f964c5947 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -556,8 +556,8 @@ pub(crate) fn get_final_decision(decisions: Vec) -> Validation result: decision_example.result, payload: utils::get_hashed(&common_decisions), totals: DacTotalAggregates { - received: 0, - sent: 0, + received: decision_example.received, + sent: decision_example.sent, failed_by_client: 0, failure_rate: 0, }, diff --git a/src/lib.rs b/src/lib.rs index 10c359694..dfe80316e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -261,6 +261,17 @@ pub mod pallet { dac::get_validation_results(&data_provider_url, 5 as EraIndex, &assigned_edge) .unwrap(); let final_res = dac::get_final_decision(validations_res); + + let signer = Self::get_signer().unwrap(); + + let tx_res = signer.send_signed_transaction(|_acct| { + Call::set_validation_decision { + era: 5 as EraIndex, + cdn_node: utils::string_to_account::(assigned_edge.clone()), + validation_decision: final_res.clone(), + } + }); + log::info!("final_res: {:?}", final_res); // Print the number of broken sessions per CDN node. From b2a5309295bf95d51b99bed0fcc92e1a561a911a Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 12 May 2023 09:55:07 +0200 Subject: [PATCH 134/583] Cargo fmt --- src/dac.rs | 26 +++++++++----------------- src/lib.rs | 10 ++++------ src/utils.rs | 8 +++----- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index f964c5947..9f74e3093 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -1,5 +1,6 @@ //! A module with Data Activity Capture (DAC) interaction. +use crate::{utils, DacTotalAggregates, ValidationDecision}; use alloc::{format, string::String}; // ToDo: remove String usage use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use codec::{Decode, Encode}; @@ -19,7 +20,6 @@ pub use sp_std::{ collections::{btree_map::BTreeMap, btree_set::BTreeSet}, prelude::*, }; -use crate::{DacTotalAggregates, utils, ValidationDecision}; pub type TimestampInSec = u64; pub const HTTP_TIMEOUT_MS: u64 = 30_000; @@ -129,10 +129,6 @@ pub struct FileInfo { type EdgeId = String; type ValidatorId = String; -// #[derive(Debug, Deserialize, Serialize)] -// #[serde(crate = "alt_serde")] -// pub(crate) struct ValidationResults(BTreeMap); - #[derive(Debug, Deserialize, Serialize)] #[serde(crate = "alt_serde")] pub(crate) struct EdgesToResults(BTreeMap>); @@ -155,10 +151,6 @@ pub(crate) struct ValidationResult { era: EraIndex, } -// #[derive(Debug, Deserialize, Serialize)] -// #[serde(crate = "alt_serde")] -// pub(crate) struct ResultsLogs(Vec); - #[derive(Debug, Deserialize, Serialize)] #[serde(crate = "alt_serde")] pub(crate) struct FinalDecision { @@ -552,7 +544,7 @@ pub(crate) fn get_final_decision(decisions: Vec) -> Validation let common_decisions = find_largest_group(decisions).unwrap(); let decision_example = common_decisions.get(0).unwrap(); - let final_decision= ValidationDecision { + let final_decision = ValidationDecision { result: decision_example.result, payload: utils::get_hashed(&common_decisions), totals: DacTotalAggregates { @@ -586,10 +578,14 @@ fn find_largest_group(decisions: Vec) -> Option) -> Option half { Some(largest_group) diff --git a/src/lib.rs b/src/lib.rs index dfe80316e..fad5faab2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -264,12 +264,10 @@ pub mod pallet { let signer = Self::get_signer().unwrap(); - let tx_res = signer.send_signed_transaction(|_acct| { - Call::set_validation_decision { - era: 5 as EraIndex, - cdn_node: utils::string_to_account::(assigned_edge.clone()), - validation_decision: final_res.clone(), - } + let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { + era: 5 as EraIndex, + cdn_node: utils::string_to_account::(assigned_edge.clone()), + validation_decision: final_res.clone(), }); log::info!("final_res: {:?}", final_res); diff --git a/src/utils.rs b/src/utils.rs index bf3ed3cc4..3c5c90c80 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,11 +1,9 @@ +use crate::dac::ValidationResult; use alloc::string::String; use codec::{Decode, Encode}; use sp_core::crypto::AccountId32; use sp_io::hashing::blake2_256; -use crate::dac::ValidationResult; -pub use sp_std::{ - prelude::*, -}; +pub use sp_std::prelude::*; pub fn account_to_string(account: T::AccountId) -> String { let to32 = T::AccountId::encode(&account); @@ -32,7 +30,7 @@ pub(crate) fn hash(data: &String) -> [u8; 32] { pub(crate) fn get_hashed(data: &Vec) -> [u8; 256] { let results_log = serde_json::to_string(data).unwrap(); - let mut payload:[u8; 256] = [0; 256]; + let mut payload: [u8; 256] = [0; 256]; let hashed_results = hash(&results_log); payload[..32].copy_from_slice(&hashed_results); From 6d05d4935b1cde5eb543820dd0064cd8a7aefb03 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 12 May 2023 10:07:07 +0200 Subject: [PATCH 135/583] Put mocked era to get_validation_results --- src/dac.rs | 2 +- src/lib.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dac.rs b/src/dac.rs index 9f74e3093..68442f1b1 100644 --- a/src/dac.rs +++ b/src/dac.rs @@ -563,7 +563,7 @@ pub(crate) fn get_validation_results( era: EraIndex, edge: &String, ) -> Result, http::Error> { - let wrapper = fetch_validators_decisions(data_provider_url, era).unwrap(); + let wrapper = fetch_validators_decisions(data_provider_url, 5 as EraIndex).unwrap(); // Era is mocked for now let mut edges: EdgesToResults = serde_json::from_str(wrapper.decisions.as_str()).unwrap(); let results = edges.0.remove(edge).unwrap(); diff --git a/src/lib.rs b/src/lib.rs index fad5faab2..9bde10b40 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -246,6 +246,7 @@ pub mod pallet { return } + let current_era = Self::get_current_era(); let data_provider_url = Self::get_data_provider_url(); log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); @@ -258,14 +259,14 @@ pub mod pallet { let assigned_edge = String::from("0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1"); let validations_res = - dac::get_validation_results(&data_provider_url, 5 as EraIndex, &assigned_edge) + dac::get_validation_results(&data_provider_url, current_era, &assigned_edge) .unwrap(); let final_res = dac::get_final_decision(validations_res); let signer = Self::get_signer().unwrap(); let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { - era: 5 as EraIndex, + era: current_era, cdn_node: utils::string_to_account::(assigned_edge.clone()), validation_decision: final_res.clone(), }); @@ -308,7 +309,6 @@ pub mod pallet { } // Read from DAC. - let current_era = Self::get_current_era(); let (sent_query, sent, received_query, received) = dac::fetch_data2(&data_provider_url, current_era - 1); log::info!( From 8cc34ae2dbb6728081982565ad93c5c0f725f2b1 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 12 May 2023 17:21:28 +0600 Subject: [PATCH 136/583] Add `set_era_reward_points` call to ddc-validator --- src/lib.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index dbf0f1c27..2b7b3236e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -438,6 +438,34 @@ pub mod pallet { Ok(()) } + + /// Set reward points for CDN participants at the given era. + /// + /// ToDo: remove it when the off-chain worker will be able to set reward points using the + /// same call defined in `pallet-ddc-staking`. + /// + /// `stakers_points` is a vector of (stash account ID, reward points) pairs. The rewards + /// distribution will be based on total reward points, with each CDN participant receiving a + /// proportionate reward based on their individual reward points. + /// + /// See also [`pallet_ddc_staking::ErasEdgesRewardPoints`]. + #[pallet::weight(100_000)] + pub fn set_era_reward_points( + origin: OriginFor, + era: EraIndex, + stakers_points: Vec<(T::AccountId, u64)>, + ) -> DispatchResult { + ensure_signed(origin)?; + + >::mutate(era, |era_rewards| { + for (staker, points) in stakers_points.into_iter() { + *era_rewards.individual.entry(staker).or_default() += points; + era_rewards.total += points; + } + }); + + Ok(()) + } } impl Pallet From a10a664823aa933879bc58509c2260a38153ba8c Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 12 May 2023 19:55:54 +0600 Subject: [PATCH 137/583] Set era reward points from off-chain worker --- src/lib.rs | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 2b7b3236e..9f9dbdd30 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -398,6 +398,66 @@ pub mod pallet { edges.len(), current_era - 1 ); + + // Set CDN nodes' reward points + // ============================ + + // Let's use a mock data until we have a real final validation decisions for all the CDN + // nodes. + let mock_final_validation_decisions: Vec<(T::AccountId, ValidationDecision)> = vec![ + ( + utils::string_to_account::( + "0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1".into(), + ), + ValidationDecision { + result: true, + payload: [0u8; 256], + totals: DacTotalAggregates { + sent: 100, + received: 100, + failed_by_client: 0, + failure_rate: 0, + }, + }, + ), + ( + utils::string_to_account::( + "0xa2d14e71b52e5695e72c0567926bc68b68bda74df5c1ccf1d4ba612c153ff66b".into(), + ), + ValidationDecision { + result: true, + payload: [0u8; 256], + totals: DacTotalAggregates { + sent: 200, + received: 200, + failed_by_client: 0, + failure_rate: 0, + }, + }, + ), + ]; + + // Calculate CDN nodes reward points from validation decision aggregates + let cdn_nodes_reward_points: Vec<(T::AccountId, u64)> = mock_final_validation_decisions + .into_iter() + .filter(|(_, validation_decision)| validation_decision.result) // skip misbehaving + .map(|(cdn_node, validation_decision)| { + // ToDo: should we use `sent` or `received` or anything else as a reward point? + (cdn_node, validation_decision.totals.sent) + }) + .collect(); + + // Store CDN node reward points on-chain + let signer: Signer = Signer::<_, _>::any_account(); + if !signer.can_sign() { + log::warn!("No local accounts available to set era reward points. Consider adding one via `author_insertKey` RPC."); + return + } + // ToDo: replace local call by a call from `ddc-staking` pallet + let _tx_res = signer.send_signed_transaction(|_account| Call::set_era_reward_points { + era: current_era - 1, + stakers_points: cdn_nodes_reward_points.clone(), + }); } } From c63857813a6dab3c11f8dbe5d9889c3fd1ddf406 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 15 May 2023 14:05:53 +0600 Subject: [PATCH 138/583] Prevent panic on redis shared memory comm error --- src/lib.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 9f9dbdd30..36a708d99 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -390,8 +390,13 @@ pub mod pallet { validation_result, &validation_decision_base64_string, ); - let response_text = response.unwrap().to_string(); - log::info!("Redis response: {:?}", response_text) + match response { + Ok(response) => log::info!("Shared memory response: {:?}", response.to_string()), + Err(e) => { + log::error!("Shared memory error: {:?}", e); + continue + }, + } } log::info!( "Intermediate validation results published for {} CDN nodes in era {:?}", From ce1acf4546f322c3c41600015b4f47ca617640e6 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 12 May 2023 18:35:21 +0200 Subject: [PATCH 139/583] accounts first version --- Cargo.toml | 31 ++++ src/lib.rs | 416 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 447 insertions(+) create mode 100644 Cargo.toml create mode 100644 src/lib.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000..38e73bde4 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "pallet-ddc-accounts" +version = "0.1.0" +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } +scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } +sp-io = { version = "6.0.0", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "6.0.0", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "4.0.0-dev", default-features = false, path = "../../primitives/staking" } +sp-std = { version = "4.0.0-dev", default-features = false, path = "../../primitives/std" } +log = { version = "0.4.17", default-features = false } + +[dev-dependencies] +substrate-test-utils = { version = "4.0.0-dev", path = "../../test-utils" } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-support/std", + "frame-system/std", + "scale-info/std", + "sp-io/std", + "sp-runtime/std", + "sp-staking/std", + "sp-std/std", +] diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 000000000..2b0dca3eb --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,416 @@ +#![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] + +use codec::{Decode, Encode, HasCompact}; + +use frame_support::{ + parameter_types, + traits::{Currency, DefensiveSaturating, LockIdentifier, WithdrawReasons, ExistenceRequirement, UnixTime}, + BoundedVec, + PalletId +}; +use scale_info::TypeInfo; +use sp_runtime::{ + traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, Zero}, + RuntimeDebug, +}; + +use sp_staking::EraIndex; +use sp_std::prelude::*; + +pub use pallet::*; + +pub const TIME_START_MS: u128 = 1_672_531_200_000; +pub const ERA_DURATION_MS: u128 = 120_000; +pub const ERA_IN_BLOCKS: u8 = 20; + +/// The balance type of this pallet. +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + +parameter_types! { + /// A limit to the number of pending unlocks an account may have in parallel. + pub MaxUnlockingChunks: u32 = 32; +} + +/// Just a Balance/BlockNumber tuple to encode when a chunk of funds will be unlocked. +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] +pub struct UnlockChunk { + /// Amount of funds to be unlocked. + #[codec(compact)] + value: Balance, + /// Era number at which point it'll be unlocked. + #[codec(compact)] + era: EraIndex, +} + +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] +pub struct AccountsLedger { + /// The stash account whose balance is actually locked and can be used for CDN usage. + pub stash: AccountId, + /// The total amount of the stash's balance that we are currently accounting for. + /// It's just `active` plus all the `unlocking` balances. + #[codec(compact)] + pub total: Balance, + /// The total amount of the stash's balance that will be accessible for CDN payments in any forthcoming + /// rounds. + #[codec(compact)] + pub active: Balance, + /// Any balance that is becoming free, which may eventually be transferred out of the stash + /// (assuming that the content owner has to pay for network usage). It is assumed that this will be treated as a first + /// in, first out queue where the new (higher value) eras get pushed on the back. + pub unlocking: BoundedVec, MaxUnlockingChunks>, +} + +impl + AccountsLedger +{ + /// Initializes the default object using the given stash. + pub fn default_from(stash: AccountId) -> Self { + Self { stash, total: Zero::zero(), active: Zero::zero(), unlocking: Default::default() } + } + + /// Remove entries from `unlocking` that are sufficiently old and reduce the + /// total by the sum of their balances. + fn consolidate_unlocked(self, current_era: EraIndex) -> Self { + let mut total = self.total; + let unlocking: BoundedVec<_, _> = self + .unlocking + .into_iter() + .filter(|chunk| { + log::info!("Chunk era: {:?}", chunk.era); + if chunk.era > current_era { + true + } else { + total = total.saturating_sub(chunk.value); + false + } + }) + .collect::>() + .try_into() + .expect( + "filtering items from a bounded vec always leaves length less than bounds. qed", + ); + + Self { stash: self.stash, total, active: self.active, unlocking } + } +} + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use frame_support::{ + pallet_prelude::*, sp_runtime::traits::StaticLookup, traits::LockableCurrency, + Blake2_128Concat, + }; + use frame_system::pallet_prelude::*; + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + /// The accounts's pallet id, used for deriving its sovereign account ID. + #[pallet::constant] + type PalletId: Get; + type Currency: LockableCurrency; + type Event: From> + IsType<::Event>; + /// Number of eras that staked funds must remain bonded for. + #[pallet::constant] + type BondingDuration: Get; + type TimeProvider: UnixTime; + } + + /// Map from all locked "stash" accounts to the controller account. + #[pallet::storage] + #[pallet::getter(fn bonded)] + pub type Bonded = StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; + + /// Map from all (unlocked) "controller" accounts to the info regarding the staking. + #[pallet::storage] + #[pallet::getter(fn ledger)] + pub type Ledger = + StorageMap<_, Blake2_128Concat, T::AccountId, AccountsLedger>>; + + #[pallet::event] + #[pallet::generate_deposit(pub(crate) fn deposit_event)] + pub enum Event { + /// An account has bonded this amount. \[stash, amount\] + /// + /// NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, + /// it will not be emitted for staking rewards when they are added to stake. + Deposited(T::AccountId, BalanceOf), + /// An account has unbonded this amount. \[stash, amount\] + Unbonded(T::AccountId, BalanceOf), + /// An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` + /// from the unlocking queue. \[stash, amount\] + Withdrawn(T::AccountId, BalanceOf), + } + + #[pallet::error] + pub enum Error { + /// Not a controller account. + NotController, + /// Not a stash account. + NotStash, + /// Controller is already paired. + AlreadyPaired, + /// Cannot deposit dust + InsufficientDeposit, + /// Can not schedule more unlock chunks. + NoMoreChunks, + /// Internal state has become somehow corrupted and the operation cannot continue. + BadState, + } + + #[pallet::call] + impl Pallet { + /// Take the origin account as a stash and lock up `value` of its balance. `controller` will + /// be the account that controls it. + /// + /// `value` must be more than the `minimum_balance` specified by `T::Currency`. + /// + /// The dispatch origin for this call must be _Signed_ by the stash account. + /// + /// Emits `Deposited`. + #[pallet::weight(10_000)] pub fn deposit( + origin: OriginFor, + controller: ::Source, + #[pallet::compact] value: BalanceOf, + ) -> DispatchResult { + let stash = ensure_signed(origin)?; + + let controller = T::Lookup::lookup(controller)?; + + if >::contains_key(&controller) { + Err(Error::::AlreadyPaired)? + } + + // Reject a deposit which is considered to be _dust_. + if value < T::Currency::minimum_balance() { + Err(Error::::InsufficientDeposit)? + } + + frame_system::Pallet::::inc_consumers(&stash).map_err(|_| Error::::BadState)?; + + let stash_balance = T::Currency::free_balance(&stash); + let value = value.min(stash_balance); + Self::deposit_event(Event::::Deposited(stash.clone(), value)); + let item = + AccountsLedger { stash: stash.clone(), total: value, active: value, unlocking: Default::default() }; + Self::update_ledger_and_deposit( &stash, &controller, &item); + Ok(()) + } + + /// Add some extra amount that have appeared in the stash `free_balance` into the balance up + /// for CDN payments. + /// + /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. + /// + /// Emits `Deposited`. + #[pallet::weight(10_000)] + pub fn deposit_extra( + origin: OriginFor, + #[pallet::compact] max_additional: BalanceOf, + ) -> DispatchResult { + let stash = ensure_signed(origin)?; + + let controller = Self::bonded(&stash).ok_or(Error::::NotStash)?; + let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; + + let stash_balance = T::Currency::free_balance(&stash); + let extra = stash_balance.min(max_additional); + ledger.total += extra; + ledger.active += extra; + // Last check: the new active amount of ledger must be more than ED. + ensure!( + ledger.active >= T::Currency::minimum_balance(), + Error::::InsufficientDeposit + ); + + Self::update_ledger_and_deposit(&stash, &controller, &ledger); + + Self::deposit_event(Event::::Deposited(stash.clone(), extra)); + + Ok(()) + } + + /// Schedule a portion of the stash to be unlocked ready for transfer out after the bond + /// period ends. If this leaves an amount actively bonded less than + /// T::Currency::minimum_balance(), then it is increased to the full amount. + /// + /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. + /// + /// Once the unlock period is done, you can call `withdraw_unbonded` to actually move + /// the funds out of management ready for transfer. + /// + /// No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`) + /// can co-exists at the same time. In that case, [`Call::withdraw_unbonded`] need + /// to be called first to remove some of the chunks (if possible). + /// + /// Emits `Unbonded`. + /// + /// See also [`Call::withdraw_unbonded`]. + #[pallet::weight(10_000)] + pub fn unbond( + origin: OriginFor, + #[pallet::compact] value: BalanceOf, + ) -> DispatchResult { + let controller = ensure_signed(origin)?; + let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; + ensure!( + ledger.unlocking.len() < MaxUnlockingChunks::get() as usize, + Error::::NoMoreChunks, + ); + + let mut value = value.min(ledger.active); + + if !value.is_zero() { + ledger.active -= value; + + // Avoid there being a dust balance left in the accounts system. + if ledger.active < T::Currency::minimum_balance() { + value += ledger.active; + ledger.active = Zero::zero(); + } + + // Note: bonding for extra era to allow for accounting + let era = Self::get_current_era() + T::BondingDuration::get(); + log::info!("Era for the unbond: {:?}", era); + + if let Some(mut chunk) = + ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) + { + // To keep the chunk count down, we only keep one chunk per era. Since + // `unlocking` is a FiFo queue, if a chunk exists for `era` we know that it will + // be the last one. + chunk.value = chunk.value.defensive_saturating_add(value) + } else { + ledger + .unlocking + .try_push(UnlockChunk { value, era }) + .map_err(|_| Error::::NoMoreChunks)?; + }; + + Self::update_ledger(&controller, &ledger); + + Self::deposit_event(Event::::Unbonded(ledger.stash, value)); + } + Ok(()) + } + + + /// Remove any unlocked chunks from the `unlocking` queue from our management. + /// + /// This essentially frees up that balance to be used by the stash account to do + /// whatever it wants. + /// + /// The dispatch origin for this call must be _Signed_ by the controller. + /// + /// Emits `Withdrawn`. + /// + /// See also [`Call::unbond`]. + #[pallet::weight(10_000)] + pub fn withdraw_unbonded(origin: OriginFor) -> DispatchResult { + let controller = ensure_signed(origin)?; + let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; + let (stash, old_total) = (ledger.stash.clone(), ledger.total); + let current_era = Self::get_current_era(); + ledger = ledger.consolidate_unlocked(current_era); + log::info!("Current era: {:?}", current_era); + + if ledger.unlocking.is_empty() && ledger.active < T::Currency::minimum_balance() { + log::info!("Killing stash"); + // 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 accounts-related information. + Self::kill_stash(&stash)?; + } else { + log::info!("Updating ledger"); + // This was the consequence of a partial unbond. just update the ledger and move on. + Self::update_ledger(&controller, &ledger); + }; + + log::info!("Current total: {:?}", ledger.total); + log::info!("Old total: {:?}", old_total); + + // `old_total` should never be less than the new total because + // `consolidate_unlocked` strictly subtracts balance. + if ledger.total < old_total { + log::info!("Preparing for transfer"); + // Already checked that this won't overflow by entry condition. + let value = old_total - ledger.total; + + let account_id = Self::account_id(); + + T::Currency::transfer( + &account_id, + &stash, + value, + ExistenceRequirement::KeepAlive, + )?; + Self::deposit_event(Event::::Withdrawn(stash, value)); + } + + Ok(()) + } + } + + impl Pallet { + pub fn account_id() -> T::AccountId { + T::PalletId::get().into_account() + } + /// Update the ledger for a controller. + /// + /// This will also deposit the funds to pallet. + fn update_ledger_and_deposit( + stash: &T::AccountId, + controller: &T::AccountId, + ledger: &AccountsLedger>, + ) { + let account_id = Self::account_id(); + + T::Currency::transfer( + stash, + &account_id, + ledger.total, + ExistenceRequirement::KeepAlive, + )?; + >::insert(controller, ledger); + } + + /// Update the ledger for a controller. + fn update_ledger( + controller: &T::AccountId, + ledger: &AccountsLedger>, + ) { + >::insert(controller, ledger); + } + + /// Remove all associated data of a stash account from the accounts system. + /// + /// Assumes storage is upgraded before calling. + /// + /// This is called: + /// - after a `withdraw_unbonded()` call that frees all of a stash's bonded balance. + fn kill_stash(stash: &T::AccountId) -> DispatchResult { + let controller = >::get(stash).ok_or(Error::::NotStash)?; + + >::remove(stash); + >::remove(&controller); + + frame_system::Pallet::::dec_consumers(stash); + + Ok(()) + } + + // Get the current era. + fn get_current_era() -> EraIndex { + ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS) + .try_into() + .unwrap() + } + } +} From 98077dc0b8b8ba922b6a607aa4d9edd1da80a9dd Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 12 May 2023 19:28:07 +0200 Subject: [PATCH 140/583] fix code quality --- src/lib.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 2b0dca3eb..78f07c525 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,7 +5,7 @@ use codec::{Decode, Encode, HasCompact}; use frame_support::{ parameter_types, - traits::{Currency, DefensiveSaturating, LockIdentifier, WithdrawReasons, ExistenceRequirement, UnixTime}, + traits::{Currency, DefensiveSaturating, ExistenceRequirement, UnixTime}, BoundedVec, PalletId }; @@ -155,6 +155,8 @@ pub mod pallet { NotController, /// Not a stash account. NotStash, + /// Stash is already bonded. + AlreadyBonded, /// Controller is already paired. AlreadyPaired, /// Cannot deposit dust @@ -182,6 +184,10 @@ pub mod pallet { ) -> DispatchResult { let stash = ensure_signed(origin)?; + if >::contains_key(&stash) { + Err(Error::::AlreadyBonded)? + } + let controller = T::Lookup::lookup(controller)?; if >::contains_key(&controller) { @@ -195,12 +201,14 @@ pub mod pallet { frame_system::Pallet::::inc_consumers(&stash).map_err(|_| Error::::BadState)?; + >::insert(&stash, &controller); + let stash_balance = T::Currency::free_balance(&stash); let value = value.min(stash_balance); Self::deposit_event(Event::::Deposited(stash.clone(), value)); let item = AccountsLedger { stash: stash.clone(), total: value, active: value, unlocking: Default::default() }; - Self::update_ledger_and_deposit( &stash, &controller, &item); + Self::update_ledger_and_deposit( &stash, &controller, &item)?; Ok(()) } @@ -230,7 +238,7 @@ pub mod pallet { Error::::InsufficientDeposit ); - Self::update_ledger_and_deposit(&stash, &controller, &ledger); + Self::update_ledger_and_deposit(&stash, &controller, &ledger)?; Self::deposit_event(Event::::Deposited(stash.clone(), extra)); @@ -369,7 +377,7 @@ pub mod pallet { stash: &T::AccountId, controller: &T::AccountId, ledger: &AccountsLedger>, - ) { + ) -> DispatchResult { let account_id = Self::account_id(); T::Currency::transfer( @@ -379,6 +387,8 @@ pub mod pallet { ExistenceRequirement::KeepAlive, )?; >::insert(controller, ledger); + + Ok(()) } /// Update the ledger for a controller. From dacff9a1a820059c0191e03dba8c9aec555bbccf Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 15 May 2023 12:23:19 +0200 Subject: [PATCH 141/583] add existential balance for pallet accounts --- src/lib.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 78f07c525..62acb3a82 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -167,6 +167,27 @@ pub mod pallet { BadState, } + #[pallet::genesis_config] + pub struct GenesisConfig; + + #[cfg(feature = "std")] + impl Default for GenesisConfig { + fn default() -> Self { + Self + } + } + + #[pallet::genesis_build] + impl GenesisBuild for GenesisConfig { + fn build(&self) { + let account_id = >::account_id(); + let min = T::Currency::minimum_balance(); + if T::Currency::free_balance(&account_id) < min { + let _ = T::Currency::make_free_balance_be(&account_id, min); + } + } + } + #[pallet::call] impl Pallet { /// Take the origin account as a stash and lock up `value` of its balance. `controller` will From 5b580da8ca2c9c535516433f39c4ab84a59ea3d2 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Mon, 15 May 2023 09:58:37 +0200 Subject: [PATCH 142/583] Validate once per era --- src/lib.rs | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 36a708d99..bc10d8ea9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -248,31 +248,34 @@ pub mod pallet { } let current_era = Self::get_current_era(); + let last_managed_era = Self::last_managed_era().unwrap(); let data_provider_url = Self::get_data_provider_url(); log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); - let mock_data_url = Self::get_mock_data_url(); + if current_era > last_managed_era { + let mock_data_url = Self::get_mock_data_url(); - let file_request = dac::fetch_file_request(&mock_data_url); - let bytes_sum = dac::get_proved_delivered_bytes_sum(&file_request); - log::info!("Proved bytes sum: {:?}", bytes_sum); + let file_request = dac::fetch_file_request(&mock_data_url); + let bytes_sum = dac::get_proved_delivered_bytes_sum(&file_request); + log::info!("Proved bytes sum: {:?}", bytes_sum); - let assigned_edge = - String::from("0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1"); - let validations_res = - dac::get_validation_results(&data_provider_url, current_era, &assigned_edge) - .unwrap(); - let final_res = dac::get_final_decision(validations_res); + let assigned_edge = + String::from("0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1"); + let validations_res = + dac::get_validation_results(&data_provider_url, current_era, &assigned_edge) + .unwrap(); + let final_res = dac::get_final_decision(validations_res); - let signer = Self::get_signer().unwrap(); + let signer = Self::get_signer().unwrap(); - let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { - era: current_era, - cdn_node: utils::string_to_account::(assigned_edge.clone()), - validation_decision: final_res.clone(), - }); + let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { + era: current_era, + cdn_node: utils::string_to_account::(assigned_edge.clone()), + validation_decision: final_res.clone(), + }); - log::info!("final_res: {:?}", final_res); + log::info!("final_res: {:?}", final_res); + } // Print the number of broken sessions per CDN node. let aggregates_value = dac::fetch_aggregates(&data_provider_url, 77436).unwrap(); // 77436 is for a mock data From 03da8e215bdc96773f5207490b26ce95106f2f0d Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 16 May 2023 16:06:00 +0600 Subject: [PATCH 143/583] Return early if no `dacv` key found, don't panic --- src/lib.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index bc10d8ea9..671556d5f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -266,7 +266,13 @@ pub mod pallet { .unwrap(); let final_res = dac::get_final_decision(validations_res); - let signer = Self::get_signer().unwrap(); + let signer = match Self::get_signer() { + Ok(signer) => signer, + Err(e) => { + log::info!("{}", e); + return + }, + }; let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { era: current_era, From 213b4a8da7ce1b684ece2c57b0c729af91ffe559 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 18 May 2023 14:26:46 +0200 Subject: [PATCH 144/583] add charge payments to accounts --- pallets/ddc-accounts/src/lib.rs | 194 ++++++++++++++++++++++---------- 1 file changed, 136 insertions(+), 58 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index 62acb3a82..7ec367d5c 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -6,8 +6,7 @@ use codec::{Decode, Encode, HasCompact}; use frame_support::{ parameter_types, traits::{Currency, DefensiveSaturating, ExistenceRequirement, UnixTime}, - BoundedVec, - PalletId + BoundedVec, PalletId, }; use scale_info::TypeInfo; use sp_runtime::{ @@ -44,6 +43,26 @@ pub struct UnlockChunk { era: EraIndex, } +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] +pub struct Bucket { + bucket_id: u128, + owner_id: AccountId, + public_availability: bool, + resources_reserved: u128, +} + +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] +pub struct BucketsDetails { + bucket_id: u128, + amount: Balance, +} + +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] +pub struct ReceiverDetails { + cdn_owner: AccountId, + amount: Balance, +} + #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct AccountsLedger { /// The stash account whose balance is actually locked and can be used for CDN usage. @@ -52,13 +71,14 @@ pub struct AccountsLedger { /// It's just `active` plus all the `unlocking` balances. #[codec(compact)] pub total: Balance, - /// The total amount of the stash's balance that will be accessible for CDN payments in any forthcoming - /// rounds. + /// The total amount of the stash's balance that will be accessible for CDN payments in any + /// forthcoming rounds. #[codec(compact)] pub active: Balance, /// Any balance that is becoming free, which may eventually be transferred out of the stash - /// (assuming that the content owner has to pay for network usage). It is assumed that this will be treated as a first - /// in, first out queue where the new (higher value) eras get pushed on the back. + /// (assuming that the content owner has to pay for network usage). It is assumed that this + /// will be treated as a first in, first out queue where the new (higher value) eras get pushed + /// on the back. pub unlocking: BoundedVec, MaxUnlockingChunks>, } @@ -78,7 +98,7 @@ impl current_era { true } else { @@ -112,7 +132,7 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config { - /// The accounts's pallet id, used for deriving its sovereign account ID. + /// The accounts's pallet id, used for deriving its sovereign account ID. #[pallet::constant] type PalletId: Get; type Currency: LockableCurrency; @@ -120,7 +140,7 @@ pub mod pallet { /// Number of eras that staked funds must remain bonded for. #[pallet::constant] type BondingDuration: Get; - type TimeProvider: UnixTime; + type TimeProvider: UnixTime; } /// Map from all locked "stash" accounts to the controller account. @@ -134,6 +154,21 @@ pub mod pallet { pub type Ledger = StorageMap<_, Blake2_128Concat, T::AccountId, AccountsLedger>>; + #[pallet::type_value] + pub fn DefaultBucketCount() -> u128 { + 0_u128 + } + #[pallet::storage] + #[pallet::getter(fn buckets_count)] + pub type BucketsCount = + StorageValue>; + + /// Map from all locked accounts and their buckets to the bucket structure + #[pallet::storage] + #[pallet::getter(fn buckets)] + pub type Buckets = + StorageMap<_, Twox64Concat, u128, Bucket, OptionQuery>; + #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { @@ -155,7 +190,7 @@ pub mod pallet { NotController, /// Not a stash account. NotStash, - /// Stash is already bonded. + /// Stash is already bonded. AlreadyBonded, /// Controller is already paired. AlreadyPaired, @@ -168,12 +203,12 @@ pub mod pallet { } #[pallet::genesis_config] - pub struct GenesisConfig; + pub struct GenesisConfig; #[cfg(feature = "std")] impl Default for GenesisConfig { fn default() -> Self { - Self + Self } } @@ -190,6 +225,50 @@ pub mod pallet { #[pallet::call] impl Pallet { + #[pallet::weight(10_000)] + pub fn charge_payments( + origin: OriginFor, + paying_accounts: Vec>>, + ) -> DispatchResult { + let validator = ensure_signed(origin)?; + let account_id = Self::account_id(); + + for bucket_details in paying_accounts.iter() { + let bucket: Bucket = Self::buckets(bucket_details.bucket_id).unwrap(); + let content_owner = bucket.owner_id; + let amount = bucket_details.amount; + + let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotController)?; + ledger.total -= amount; + ledger.active -= amount; + + Self::update_ledger(&content_owner, &ledger); + } + + Ok(()) + } + + #[pallet::weight(10_000)] + pub fn create_bucket( + origin: OriginFor, + public_availability: bool, + resources_reserved: u128, + ) -> DispatchResult { + let bucket_owner = ensure_signed(origin)?; + let cur_bucket_id = Self::buckets_count(); + + let bucket = Bucket { + bucket_id: cur_bucket_id + 1, + owner_id: bucket_owner, + public_availability, + resources_reserved, + }; + + >::set(cur_bucket_id + 1); + >::insert(cur_bucket_id + 1, bucket); + Ok(()) + } + /// Take the origin account as a stash and lock up `value` of its balance. `controller` will /// be the account that controls it. /// @@ -198,14 +277,15 @@ pub mod pallet { /// The dispatch origin for this call must be _Signed_ by the stash account. /// /// Emits `Deposited`. - #[pallet::weight(10_000)] pub fn deposit( + #[pallet::weight(10_000)] + pub fn deposit( origin: OriginFor, controller: ::Source, #[pallet::compact] value: BalanceOf, ) -> DispatchResult { let stash = ensure_signed(origin)?; - if >::contains_key(&stash) { + if >::contains_key(&stash) { Err(Error::::AlreadyBonded)? } @@ -227,13 +307,17 @@ pub mod pallet { let stash_balance = T::Currency::free_balance(&stash); let value = value.min(stash_balance); Self::deposit_event(Event::::Deposited(stash.clone(), value)); - let item = - AccountsLedger { stash: stash.clone(), total: value, active: value, unlocking: Default::default() }; - Self::update_ledger_and_deposit( &stash, &controller, &item)?; + let item = AccountsLedger { + stash: stash.clone(), + total: value, + active: value, + unlocking: Default::default(), + }; + Self::update_ledger_and_deposit(&stash, &controller, &item)?; Ok(()) } - /// Add some extra amount that have appeared in the stash `free_balance` into the balance up + /// Add some extra amount that have appeared in the stash `free_balance` into the balance up /// for CDN payments. /// /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. @@ -250,23 +334,23 @@ pub mod pallet { let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; let stash_balance = T::Currency::free_balance(&stash); - let extra = stash_balance.min(max_additional); - ledger.total += extra; - ledger.active += extra; - // Last check: the new active amount of ledger must be more than ED. - ensure!( - ledger.active >= T::Currency::minimum_balance(), - Error::::InsufficientDeposit - ); - - Self::update_ledger_and_deposit(&stash, &controller, &ledger)?; - - Self::deposit_event(Event::::Deposited(stash.clone(), extra)); - + let extra = stash_balance.min(max_additional); + ledger.total += extra; + ledger.active += extra; + // Last check: the new active amount of ledger must be more than ED. + ensure!( + ledger.active >= T::Currency::minimum_balance(), + Error::::InsufficientDeposit + ); + + Self::update_ledger_and_deposit(&stash, &controller, &ledger)?; + + Self::deposit_event(Event::::Deposited(stash.clone(), extra)); + Ok(()) } - /// Schedule a portion of the stash to be unlocked ready for transfer out after the bond + /// Schedule a portion of the stash to be unlocked ready for transfer out after the bond /// period ends. If this leaves an amount actively bonded less than /// T::Currency::minimum_balance(), then it is increased to the full amount. /// @@ -307,7 +391,7 @@ pub mod pallet { // Note: bonding for extra era to allow for accounting let era = Self::get_current_era() + T::BondingDuration::get(); - log::info!("Era for the unbond: {:?}", era); + log::info!("Era for the unbond: {:?}", era); if let Some(mut chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) @@ -330,7 +414,6 @@ pub mod pallet { Ok(()) } - /// Remove any unlocked chunks from the `unlocking` queue from our management. /// /// This essentially frees up that balance to be used by the stash account to do @@ -346,40 +429,35 @@ pub mod pallet { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; let (stash, old_total) = (ledger.stash.clone(), ledger.total); - let current_era = Self::get_current_era(); + let current_era = Self::get_current_era(); ledger = ledger.consolidate_unlocked(current_era); - log::info!("Current era: {:?}", current_era); + log::info!("Current era: {:?}", current_era); if ledger.unlocking.is_empty() && ledger.active < T::Currency::minimum_balance() { - log::info!("Killing stash"); + log::info!("Killing stash"); // 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 accounts-related information. Self::kill_stash(&stash)?; } else { - log::info!("Updating ledger"); + log::info!("Updating ledger"); // This was the consequence of a partial unbond. just update the ledger and move on. Self::update_ledger(&controller, &ledger); }; - - log::info!("Current total: {:?}", ledger.total); - log::info!("Old total: {:?}", old_total); + + log::info!("Current total: {:?}", ledger.total); + log::info!("Old total: {:?}", old_total); // `old_total` should never be less than the new total because // `consolidate_unlocked` strictly subtracts balance. if ledger.total < old_total { - log::info!("Preparing for transfer"); + log::info!("Preparing for transfer"); // Already checked that this won't overflow by entry condition. let value = old_total - ledger.total; - let account_id = Self::account_id(); + let account_id = Self::account_id(); - T::Currency::transfer( - &account_id, - &stash, - value, - ExistenceRequirement::KeepAlive, - )?; + T::Currency::transfer(&account_id, &stash, value, ExistenceRequirement::KeepAlive)?; Self::deposit_event(Event::::Withdrawn(stash, value)); } @@ -388,18 +466,18 @@ pub mod pallet { } impl Pallet { - pub fn account_id() -> T::AccountId { - T::PalletId::get().into_account() - } + pub fn account_id() -> T::AccountId { + T::PalletId::get().into_account() + } /// Update the ledger for a controller. /// /// This will also deposit the funds to pallet. fn update_ledger_and_deposit( - stash: &T::AccountId, + stash: &T::AccountId, controller: &T::AccountId, ledger: &AccountsLedger>, ) -> DispatchResult { - let account_id = Self::account_id(); + let account_id = Self::account_id(); T::Currency::transfer( stash, @@ -409,10 +487,10 @@ pub mod pallet { )?; >::insert(controller, ledger); - Ok(()) + Ok(()) } - /// Update the ledger for a controller. + /// Update the ledger for a controller. fn update_ledger( controller: &T::AccountId, ledger: &AccountsLedger>, @@ -420,7 +498,7 @@ pub mod pallet { >::insert(controller, ledger); } - /// Remove all associated data of a stash account from the accounts system. + /// Remove all associated data of a stash account from the accounts system. /// /// Assumes storage is upgraded before calling. /// @@ -437,7 +515,7 @@ pub mod pallet { Ok(()) } - // Get the current era. + // Get the current era. fn get_current_era() -> EraIndex { ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS) .try_into() From 83e19fc784f59d3ed019ed39bd41717089ab3f63 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 18 May 2023 18:45:17 +0600 Subject: [PATCH 145/583] Don't panic in absence of `LastManagedEra` value --- pallets/ddc-validator/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 671556d5f..e91596394 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -248,7 +248,7 @@ pub mod pallet { } let current_era = Self::get_current_era(); - let last_managed_era = Self::last_managed_era().unwrap(); + let last_managed_era = Self::last_managed_era().unwrap_or(0); let data_provider_url = Self::get_data_provider_url(); log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); From f911d561afd6930644578dae5a091aecadd932da Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 18 May 2023 18:47:04 +0600 Subject: [PATCH 146/583] Autoformat DAC Validator files --- pallets/ddc-validator/src/lib.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index e91596394..bc985f1f2 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -259,8 +259,9 @@ pub mod pallet { let bytes_sum = dac::get_proved_delivered_bytes_sum(&file_request); log::info!("Proved bytes sum: {:?}", bytes_sum); - let assigned_edge = - String::from("0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1"); + let assigned_edge = String::from( + "0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1", + ); let validations_res = dac::get_validation_results(&data_provider_url, current_era, &assigned_edge) .unwrap(); @@ -274,11 +275,12 @@ pub mod pallet { }, }; - let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { - era: current_era, - cdn_node: utils::string_to_account::(assigned_edge.clone()), - validation_decision: final_res.clone(), - }); + let tx_res = + signer.send_signed_transaction(|_acct| Call::set_validation_decision { + era: current_era, + cdn_node: utils::string_to_account::(assigned_edge.clone()), + validation_decision: final_res.clone(), + }); log::info!("final_res: {:?}", final_res); } @@ -400,7 +402,8 @@ pub mod pallet { &validation_decision_base64_string, ); match response { - Ok(response) => log::info!("Shared memory response: {:?}", response.to_string()), + Ok(response) => + log::info!("Shared memory response: {:?}", response.to_string()), Err(e) => { log::error!("Shared memory error: {:?}", e); continue From a1fc29f5829809f30847dd7c00e1be55fc20080d Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 19 May 2023 12:18:29 +0600 Subject: [PATCH 147/583] Remove unwraps from bytes sent and received fetch --- pallets/ddc-validator/src/dac.rs | 8 ++++---- pallets/ddc-validator/src/lib.rs | 10 ++++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index 68442f1b1..442ab3661 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -393,16 +393,16 @@ pub(crate) fn fetch_data1( pub(crate) fn fetch_data2( data_provider_url: &String, era: EraIndex, -) -> (String, Vec, String, Vec) { +) -> Result<(String, Vec, String, Vec), ()> { let bytes_sent_query = get_bytes_sent_query_url(data_provider_url, era); - let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).unwrap(); + let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).map_err(|_|())?; let bytes_sent = BytesSent::get_all(bytes_sent_res); let bytes_received_query = get_bytes_received_query_url(data_provider_url, era); - let bytes_received_res: RedisFtAggregate = http_get_json(&bytes_received_query).unwrap(); + let bytes_received_res: RedisFtAggregate = http_get_json(&bytes_received_query).map_err(|_|())?; let bytes_received = BytesReceived::get_all(bytes_received_res); - (bytes_sent_query, bytes_sent, bytes_received_query, bytes_received) + Ok((bytes_sent_query, bytes_sent, bytes_received_query, bytes_received)) } fn get_bytes_received_query_url(data_provider_url: &String, era: EraIndex) -> String { diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index bc985f1f2..1dffcf5de 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -321,8 +321,14 @@ pub mod pallet { } // Read from DAC. - let (sent_query, sent, received_query, received) = - dac::fetch_data2(&data_provider_url, current_era - 1); + let response = dac::fetch_data2(&data_provider_url, current_era - 1); + let (sent_query, sent, received_query, received) = match response { + Ok(data) => data, + Err(_) => { + log::info!("🔎 DAC Validator failed to bytes sent and bytes received from DAC"); + return + }, + }; log::info!( "🔎 DAC Validator is fetching data from DAC, current era: {:?}, bytes sent query: {:?}, bytes sent response: {:?}, bytes received query: {:?}, bytes received response: {:?}", current_era, From b42c6c27f5886bd88d9d4b99ad361810f7c6266f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 19 May 2023 12:43:10 +0600 Subject: [PATCH 148/583] Print an account available to the off-chain worker --- pallets/ddc-validator/src/lib.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 1dffcf5de..2bfbd334b 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -247,6 +247,13 @@ pub mod pallet { return } + if let Some(pubkey) = sr25519_public_keys(KEY_TYPE).first() { + // May not work with some kinds of AccountId. Check + // https://substrate.stackexchange.com/questions/1484. + let account = T::AccountId::decode(&mut &pubkey.encode()[..]).unwrap(); + log::debug!("🔎 DAC Validator's local account {:?}", account); + } + let current_era = Self::get_current_era(); let last_managed_era = Self::last_managed_era().unwrap_or(0); let data_provider_url = Self::get_data_provider_url(); From b6dcc198bbd2bbc5fd568a3f00eabd6ee9078e45 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 19 May 2023 13:21:43 +0600 Subject: [PATCH 149/583] Typo fix --- pallets/ddc-validator/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 2bfbd334b..1cb6d0228 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -332,7 +332,7 @@ pub mod pallet { let (sent_query, sent, received_query, received) = match response { Ok(data) => data, Err(_) => { - log::info!("🔎 DAC Validator failed to bytes sent and bytes received from DAC"); + log::info!("🔎 DAC Validator failed to get bytes sent and received from DAC"); return }, }; From ca0995df557c91af1260a027b60bbeb1a77b5d86 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 19 May 2023 14:54:21 +0600 Subject: [PATCH 150/583] Add ddc-accounts dependency to ddc-validator --- Cargo.lock | 1 + pallets/ddc-validator/Cargo.toml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 8e63452b3..4e3536133 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4676,6 +4676,7 @@ dependencies = [ "log", "pallet-balances", "pallet-contracts", + "pallet-ddc-accounts", "pallet-ddc-staking", "pallet-randomness-collective-flip", "pallet-session", diff --git a/pallets/ddc-validator/Cargo.toml b/pallets/ddc-validator/Cargo.toml index 3cf75a246..a1cfef98d 100644 --- a/pallets/ddc-validator/Cargo.toml +++ b/pallets/ddc-validator/Cargo.toml @@ -14,6 +14,7 @@ frame-election-provider-support = { version = "4.0.0-dev", default-features = fa log = { version = "0.4.17", default-features = false } lite-json = { version = "0.2.0", default-features = false } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +pallet-ddc-accounts = { version = "0.1.0", default-features = false, path = "../ddc-accounts" } pallet-ddc-staking = { version = "0.1.0", default-features = false, path = "../ddc-staking" } pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22", default-features = false } pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } @@ -36,6 +37,7 @@ std = [ "frame-election-provider-support/std", "lite-json/std", "pallet-contracts/std", + "pallet-ddc-accounts/std", "pallet-ddc-staking/std", "pallet-session/std", "pallet-staking/std", From 2a3041d508ab0fc1f1d08b1aa4d6aa8e969eea62 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 19 May 2023 16:13:35 +0600 Subject: [PATCH 151/583] Price per byte storage item and a call to set it --- pallets/ddc-accounts/src/lib.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index 7ec367d5c..e70c60233 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -169,6 +169,11 @@ pub mod pallet { pub type Buckets = StorageMap<_, Twox64Concat, u128, Bucket, OptionQuery>; + /// Price per byte of the bucket traffic in smallest units of the currency. + #[pallet::storage] + #[pallet::getter(fn pricing)] + pub type Pricing = StorageValue<_, u128>; + #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { @@ -463,6 +468,16 @@ pub mod pallet { Ok(()) } + + /// Set price per byte of the bucket traffic in smallest units of the currency. + /// + /// The dispatch origin for this call must be _Root_. + #[pallet::weight(10_000)] + pub fn set_pricing(origin: OriginFor, price_per_byte: u128) -> DispatchResult { + ensure_root(origin)?; + >::set(Some(price_per_byte)); + Ok(()) + } } impl Pallet { From 9ab44b17284ae876552dc37bb5a86821e1683bd4 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 19 May 2023 16:23:49 +0600 Subject: [PATCH 152/583] Move pricing storage item and call to ddc-staking --- pallets/ddc-accounts/src/lib.rs | 15 --------------- pallets/ddc-staking/src/lib.rs | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index e70c60233..7ec367d5c 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -169,11 +169,6 @@ pub mod pallet { pub type Buckets = StorageMap<_, Twox64Concat, u128, Bucket, OptionQuery>; - /// Price per byte of the bucket traffic in smallest units of the currency. - #[pallet::storage] - #[pallet::getter(fn pricing)] - pub type Pricing = StorageValue<_, u128>; - #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { @@ -468,16 +463,6 @@ pub mod pallet { Ok(()) } - - /// Set price per byte of the bucket traffic in smallest units of the currency. - /// - /// The dispatch origin for this call must be _Root_. - #[pallet::weight(10_000)] - pub fn set_pricing(origin: OriginFor, price_per_byte: u128) -> DispatchResult { - ensure_root(origin)?; - >::set(Some(price_per_byte)); - Ok(()) - } } impl Pallet { diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index ced37c72a..0ac5652b7 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -211,6 +211,11 @@ pub mod pallet { pub type ErasEdgesRewardPoints = StorageMap<_, Twox64Concat, EraIndex, EraRewardPoints, ValueQuery>; + /// Price per byte of the bucket traffic in smallest units of the currency. + #[pallet::storage] + #[pallet::getter(fn pricing)] + pub type Pricing = StorageValue<_, u128>; + #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { @@ -579,6 +584,16 @@ pub mod pallet { Ok(()) } + + /// Set price per byte of the bucket traffic in smallest units of the currency. + /// + /// The dispatch origin for this call must be _Root_. + #[pallet::weight(10_000)] + pub fn set_pricing(origin: OriginFor, price_per_byte: u128) -> DispatchResult { + ensure_root(origin)?; + >::set(Some(price_per_byte)); + Ok(()) + } } impl Pallet { From 31a8bd053881859905c2f4d1b49545ba41c1e856 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 19 May 2023 17:43:59 +0600 Subject: [PATCH 153/583] Compute CDN payout using the price per byte --- pallets/ddc-staking/src/lib.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 0ac5652b7..d1e387b75 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -257,6 +257,10 @@ pub mod pallet { AlreadyInRole, /// Two or more occurrences of a staker account in rewards points list. DuplicateRewardPoints, + /// Price per byte of the traffic is unknown. + PricingNotSet, + /// Impossible budget value that overflows pallet's balance type. + BudgetOverflow, } #[pallet::call] @@ -601,19 +605,30 @@ pub mod pallet { // ToDo: check that the era is finished // ToDo: check reward points are set - // An account we withdraw the funds from and the amount of funds to withdraw. - let payout_source_account: T::AccountId = T::StakersPayoutSource::get().into_account(); - let payout_budget = T::Currency::free_balance(&payout_source_account); let era_reward_points: EraRewardPoints = >::get(&era); + + let price_per_byte: u128 = match Self::pricing() { + Some(pricing) => pricing, + None => Err(Error::::PricingNotSet)?, + }; + + // An account we withdraw the funds from and the amount of funds to withdraw. + let payout_source_account: T::AccountId = T::StakersPayoutSource::get().into_account(); + let payout_budget: BalanceOf = + match (price_per_byte * era_reward_points.total as u128).try_into() { + Ok(value) => value, + Err(_) => Err(Error::::BudgetOverflow)?, + }; log::debug!( "Will payout to DDC stakers for era {:?} from account {:?} with total budget {:?} \ - , there are {:?} stakers earned {:?} reward points", + , there are {:?} stakers earned {:?} reward points with price per byte {:?}", era, payout_source_account, payout_budget, era_reward_points.individual.len(), era_reward_points.total, + price_per_byte, ); // Transfer a part of the budget to each CDN participant rewarded this era. From 595bad18bbb8743862781892364e6d85b44ed959 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 19 May 2023 18:06:19 +0200 Subject: [PATCH 154/583] account for unlocking chunks for payments --- pallets/ddc-accounts/src/lib.rs | 67 ++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index 7ec367d5c..e31f3d27b 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -114,6 +114,33 @@ impl (Self, Balance) { + let mut unlocking_balance = Balance::zero(); + + while let Some(last) = self.unlocking.last_mut() { + if unlocking_balance + last.value <= value { + unlocking_balance += last.value; + self.active -= last.value; + self.unlocking.pop(); + } else { + let diff = value - unlocking_balance; + + unlocking_balance += diff; + self.active -= diff; + last.value -= diff; + } + + if unlocking_balance >= value { + break + } + } + + (self, unlocking_balance) + } } #[frame_support::pallet] @@ -182,6 +209,8 @@ pub mod pallet { /// An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` /// from the unlocking queue. \[stash, amount\] Withdrawn(T::AccountId, BalanceOf), + /// Total amount charged from all accounts to pay CDN nodes + Charged(BalanceOf), } #[pallet::error] @@ -231,19 +260,31 @@ pub mod pallet { paying_accounts: Vec>>, ) -> DispatchResult { let validator = ensure_signed(origin)?; - let account_id = Self::account_id(); - - for bucket_details in paying_accounts.iter() { - let bucket: Bucket = Self::buckets(bucket_details.bucket_id).unwrap(); - let content_owner = bucket.owner_id; - let amount = bucket_details.amount; - - let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotController)?; - ledger.total -= amount; - ledger.active -= amount; - - Self::update_ledger(&content_owner, &ledger); - } + let mut total_charged = BalanceOf::::zero(); + + for bucket_details in paying_accounts.iter() { + let bucket: Bucket = Self::buckets(bucket_details.bucket_id).unwrap(); + let content_owner = bucket.owner_id; + let amount = bucket_details.amount; + + let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotController)?; + if ledger.active >= amount { + ledger.total -= amount; + ledger.active -= amount; + total_charged += amount; + Self::update_ledger(&content_owner, &ledger); + } else { + let diff = amount - ledger.active; + total_charged += ledger.active; + ledger.total -= ledger.active; + ledger.active = BalanceOf::::zero(); + let (ledger, charged) = ledger.charge_unlocking(diff); + Self::update_ledger(&content_owner, &ledger); + total_charged += charged; + } + + } + Self::deposit_event(Event::::Charged(total_charged)); Ok(()) } From ca9a68994ddf08fb51115a517db5638c94d37609 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 22 May 2023 16:37:57 +0600 Subject: [PATCH 155/583] Autoformat DAC Validator files --- pallets/ddc-validator/src/dac.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index 442ab3661..af871abe8 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -395,11 +395,12 @@ pub(crate) fn fetch_data2( era: EraIndex, ) -> Result<(String, Vec, String, Vec), ()> { let bytes_sent_query = get_bytes_sent_query_url(data_provider_url, era); - let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).map_err(|_|())?; + let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).map_err(|_| ())?; let bytes_sent = BytesSent::get_all(bytes_sent_res); let bytes_received_query = get_bytes_received_query_url(data_provider_url, era); - let bytes_received_res: RedisFtAggregate = http_get_json(&bytes_received_query).map_err(|_|())?; + let bytes_received_res: RedisFtAggregate = + http_get_json(&bytes_received_query).map_err(|_| ())?; let bytes_received = BytesReceived::get_all(bytes_received_res); Ok((bytes_sent_query, bytes_sent, bytes_received_query, bytes_received)) From 03d208de2b3d69eccd6b37beb780c9201cdbe880 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Mon, 22 May 2023 18:39:55 +0200 Subject: [PATCH 156/583] Move code form the old repo --- pallets/ddc-validator/src/dac.rs | 37 +++-- pallets/ddc-validator/src/lib.rs | 238 ++++++++++++++++++++--------- pallets/ddc-validator/src/shm.rs | 107 ++++++++++++- pallets/ddc-validator/src/utils.rs | 36 ++++- 4 files changed, 319 insertions(+), 99 deletions(-) diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index af871abe8..9a0f27739 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -273,21 +273,24 @@ fn get_timestamps_with_ack(file_requests: &Requests) -> Vec { timestamps } -pub fn get_proved_delivered_bytes_sum(file_requests: &Requests) -> u64 { +pub fn get_served_bytes_sum(file_requests: &Requests) -> (u64, u64) { let ack_timestamps = get_timestamps_with_ack(file_requests); let mut total_bytes_received = 0u64; + let mut total_bytes_sent = 0u64; for (_, file_request) in file_requests { for (_, chunk) in &file_request.chunks { + total_bytes_sent += chunk.log.bytes_sent; + if let Some(ack) = &chunk.ack { - total_bytes_received += &chunk.log.bytes_sent; + total_bytes_received += ack.bytes_received; } else { total_bytes_received += get_proved_delivered_bytes(chunk, &ack_timestamps); } } } - total_bytes_received + (total_bytes_sent, total_bytes_received) } fn get_proved_delivered_bytes(chunk: &Chunk, ack_timestamps: &Vec) -> u64 { @@ -342,10 +345,13 @@ fn get_file_request_url(data_provider_url: &String) -> String { } pub(crate) fn fetch_file_request(url: &String) -> Requests { + log::info!("fetch_file_request | url: {:?}", url); let response: FileRequestWrapper = http_get_json(&url).unwrap(); let value: Value = serde_json::from_str(response.json.as_str()).unwrap(); let map: Requests = serde_json::from_value(value).unwrap(); + log::info!("response.json: {:?}", response.json); + map } @@ -410,7 +416,7 @@ fn get_bytes_received_query_url(data_provider_url: &String, era: EraIndex) -> St format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", data_provider_url, era, era) } -fn http_get_json(url: &str) -> crate::ResultStr { +pub(crate) fn http_get_json(url: &str) -> crate::ResultStr { let body = http_get_request(url).map_err(|err| { log::error!("[DAC Validator] Error while getting {}: {:?}", url, err); "HTTP GET error" @@ -541,16 +547,19 @@ pub(crate) fn post_final_decision( res } -pub(crate) fn get_final_decision(decisions: Vec) -> ValidationDecision { +pub(crate) fn get_final_decision(decisions: Vec) -> ValidationDecision { let common_decisions = find_largest_group(decisions).unwrap(); let decision_example = common_decisions.get(0).unwrap(); + let serialized_decisions = serde_json::to_string(&common_decisions).unwrap(); + let final_decision = ValidationDecision { + edge: decision_example.edge.clone(), result: decision_example.result, - payload: utils::get_hashed(&common_decisions), + payload: utils::hash(&serialized_decisions), totals: DacTotalAggregates { - received: decision_example.received, - sent: decision_example.sent, + received: decision_example.totals.received, + sent: decision_example.totals.sent, failed_by_client: 0, failure_rate: 0, }, @@ -559,7 +568,7 @@ pub(crate) fn get_final_decision(decisions: Vec) -> Validation final_decision } -pub(crate) fn get_validation_results( +pub(crate) fn fetch_validation_results( data_provider_url: &String, era: EraIndex, edge: &String, @@ -571,8 +580,8 @@ pub(crate) fn get_validation_results( Ok(results) } -fn find_largest_group(decisions: Vec) -> Option> { - let mut groups: Vec> = Vec::new(); +fn find_largest_group(decisions: Vec) -> Option> { + let mut groups: Vec> = Vec::new(); let half = decisions.len() / 2; for decision in decisions { @@ -581,12 +590,12 @@ fn find_largest_group(decisions: Vec) -> Option last_managed_era { - let mock_data_url = Self::get_mock_data_url(); - - let file_request = dac::fetch_file_request(&mock_data_url); - let bytes_sum = dac::get_proved_delivered_bytes_sum(&file_request); - log::info!("Proved bytes sum: {:?}", bytes_sum); - - let assigned_edge = String::from( - "0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1", - ); - let validations_res = - dac::get_validation_results(&data_provider_url, current_era, &assigned_edge) - .unwrap(); - let final_res = dac::get_final_decision(validations_res); - - let signer = match Self::get_signer() { - Ok(signer) => signer, - Err(e) => { - log::info!("{}", e); - return - }, - }; - - let tx_res = - signer.send_signed_transaction(|_acct| Call::set_validation_decision { - era: current_era, - cdn_node: utils::string_to_account::(assigned_edge.clone()), - validation_decision: final_res.clone(), - }); - - log::info!("final_res: {:?}", final_res); - } + // `If` commented for testing purposes + // if current_era > last_managed_era { + Self::validate_edges(); + //} // Print the number of broken sessions per CDN node. - let aggregates_value = dac::fetch_aggregates(&data_provider_url, 77436).unwrap(); // 77436 is for a mock data - let aggregates_obj = aggregates_value.as_object().unwrap(); - aggregates_obj - .into_iter() - .for_each(|(cdn_node_pubkey, cdn_node_aggregates_value)| { - // iterate over aggregates for each node - let cdn_node_aggregates_obj = cdn_node_aggregates_value.as_object().unwrap(); - // Extract `nodeInterruptedSessions` field - let (_, cdn_node_interrupted_sessions_value) = cdn_node_aggregates_obj - .into_iter() - .find(|(key, _)| key.iter().copied().eq("nodeInterruptedSessions".chars())) - .unwrap(); - let cdn_node_interrupted_sessions_obj = - cdn_node_interrupted_sessions_value.as_object().unwrap(); - // Prepare CDN pubkey without heap allocated string - let cdn_node_pubkey_vecu8: Vec = - cdn_node_pubkey.iter().map(|c| *c as u8).collect(); - let cdn_node_pubkey_str = - sp_std::str::from_utf8(&cdn_node_pubkey_vecu8).unwrap(); - log::info!( - "Broken sessions per CDN node | Node {}: {} sessions broken", - cdn_node_pubkey_str, - cdn_node_interrupted_sessions_obj.len(), /* count sessions broken by the - * node */ - ); - }); + // let aggregates_value = dac::fetch_aggregates(&data_provider_url, 77436).unwrap(); // 77436 is for a mock data + // let aggregates_obj = aggregates_value.as_object().unwrap(); + // aggregates_obj + // .into_iter() + // .for_each(|(cdn_node_pubkey, cdn_node_aggregates_value)| { + // // iterate over aggregates for each node + // let cdn_node_aggregates_obj = cdn_node_aggregates_value.as_object().unwrap(); + // // Extract `nodeInterruptedSessions` field + // let (_, cdn_node_interrupted_sessions_value) = cdn_node_aggregates_obj + // .into_iter() + // .find(|(key, _)| key.iter().copied().eq("nodeInterruptedSessions".chars())) + // .unwrap(); + // let cdn_node_interrupted_sessions_obj = + // cdn_node_interrupted_sessions_value.as_object().unwrap(); + // // Prepare CDN pubkey without heap allocated string + // let cdn_node_pubkey_vecu8: Vec = + // cdn_node_pubkey.iter().map(|c| *c as u8).collect(); + // let cdn_node_pubkey_str = + // sp_std::str::from_utf8(&cdn_node_pubkey_vecu8).unwrap(); + // log::info!( + // "Broken sessions per CDN node | Node {}: {} sessions broken", + // cdn_node_pubkey_str, + // cdn_node_interrupted_sessions_obj.len(), /* count sessions broken by the + // * node */ + // ); + // }); // Wait for signal. let signal = Signal::::get().unwrap_or(false); @@ -381,8 +352,9 @@ pub mod pallet { // Prepare an intermediate validation decision let validation_decision = ValidationDecision { + edge: utils::account_to_string::(edge.clone()), result: validation_result, - payload: [0u8; 256], // ToDo: put a hash of the validated data here + payload: [0u8; 32], // ToDo: put a hash of the validated data here totals: DacTotalAggregates { sent: node_sent.sum as u64, received: client_received.sum as u64, @@ -440,8 +412,9 @@ pub mod pallet { "0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1".into(), ), ValidationDecision { + edge: "test".into(), result: true, - payload: [0u8; 256], + payload: [0u8; 32], totals: DacTotalAggregates { sent: 100, received: 100, @@ -455,8 +428,9 @@ pub mod pallet { "0xa2d14e71b52e5695e72c0567926bc68b68bda74df5c1ccf1d4ba612c153ff66b".into(), ), ValidationDecision { + edge: "test".into(), result: true, - payload: [0u8; 256], + payload: [0u8; 32], totals: DacTotalAggregates { sent: 200, received: 200, @@ -612,6 +586,18 @@ pub mod pallet { } } + fn is_valid(bytes_sent: u64, bytes_received: u64) -> bool { + let percentage_difference = 1f32 - (bytes_received as f32 / bytes_sent as f32); + + return if percentage_difference > 0.0 && + (T::ValidationThreshold::get() as f32 - percentage_difference) > 0.0 + { + true + } else { + false + } + } + fn shuffle(mut list: Vec) -> Vec { let len = list.len(); for i in 1..len { @@ -645,6 +631,9 @@ pub mod pallet { let quorums = Self::split(validators_keys, quorum_size); let edges_groups = Self::split(shuffled_edges, quorums.len()); + info!("quorums: {:?}", quorums); + info!("edges_groups: {:?}", edges_groups); + let era = Self::get_current_era(); for (i, quorum) in quorums.iter().enumerate() { @@ -693,5 +682,112 @@ pub mod pallet { random_number } + + fn find_validators_from_quorum(validator_id: &T::AccountId, era: &EraIndex) -> Vec { + let validator_edges = Self::assignments(era, &validator_id).unwrap(); + let mut quorum_members: Vec = Vec::new(); + + >::iter_prefix(era).for_each(|(candidate_id, edges)| { + if validator_edges == edges { + let candidate_id_str = utils::account_to_string::(candidate_id); + quorum_members.push(candidate_id_str); + } + }); + + quorum_members + } + + fn get_public_key() -> Option { + match sr25519_public_keys(KEY_TYPE).first() { + Some(pubkey) => Some(T::AccountId::decode(&mut &pubkey.encode()[..]).unwrap()), + None => None + } + } + + fn validate_edges() { + let current_era = Self::get_current_era(); + let mock_data_url = Self::get_mock_data_url(); + let data_provider_url = Self::get_data_provider_url(); + + // let signer = Self::get_signer().unwrap(); + // let validator = signer.get_any_account().unwrap().id; + let validator = Self::get_public_key().unwrap(); + + info!("validator: {:?}", validator); + + let assigned_edges = Self::assignments(current_era - 1, validator.clone()).unwrap(); + + info!("assigned_edges: {:?}", assigned_edges); + + for assigned_edge in assigned_edges.iter() { + let file_request = dac::fetch_file_request(&mock_data_url); + let (bytes_sent, bytes_received) = dac::get_served_bytes_sum(&file_request); + let is_valid = Self::is_valid(bytes_sent, bytes_received); + + info!("bytes_sent, bytes_received: {:?}, {:?}", bytes_sent, bytes_received); + + let payload = serde_json::to_string(&file_request).unwrap(); + let decision = ValidationDecision { + edge: utils::account_to_string::(assigned_edge.clone()), + result: is_valid, + payload: utils::hash(&payload), + totals: DacTotalAggregates { + received: bytes_received, + sent: bytes_sent, + failed_by_client: 0, + failure_rate: 0, + } + }; + + info!("decision: {:?}", decision); + + let serialized_decision = serde_json::to_string(&decision).unwrap(); + let encoded_decision = shm::base64_encode(&serialized_decision.as_bytes().to_vec()); + let validator_str = utils::account_to_string::(validator.clone()); + let edge_str = utils::account_to_string::(assigned_edge.clone()); + + let encoded_decision_str = encoded_decision.iter().cloned().collect::(); + + let response = shm::share_intermediate_validation_result( + &data_provider_url, + current_era - 1, + &validator_str, + &edge_str, + is_valid, + &encoded_decision_str, + ); + + if let Err(res) = response.clone() { + log::error!("share_intermediate_validation_result request failed: {:?}", res); + } + + if let Ok(res) = response.clone() { + info!("shm res: {:?}", res.to_string()); + } + + if let Ok(res) = response { + let edge = utils::account_to_string::(assigned_edge.clone()); + let prev_era = (current_era - 1) as EraIndex; + let quorum = Self::find_validators_from_quorum(&validator, &prev_era); + let validations_res = shm::get_intermediate_decisions(&data_provider_url, &edge_str, &prev_era, quorum); + + log::info!("get_intermediate_decisions result: {:?}", validations_res); + + if validations_res.len() == QUORUM_SIZE { + let final_res = dac::get_final_decision(validations_res); + + let signer = Self::get_signer().unwrap(); + + let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { + era: current_era, + cdn_node: utils::string_to_account::(edge.clone()), + validation_decision: final_res.clone(), + }); + + log::info!("final_res: {:?}", final_res); + } + } + } + } } } diff --git a/pallets/ddc-validator/src/shm.rs b/pallets/ddc-validator/src/shm.rs index 777f31d11..1fe38e1cc 100644 --- a/pallets/ddc-validator/src/shm.rs +++ b/pallets/ddc-validator/src/shm.rs @@ -5,19 +5,52 @@ //! transactions pool or peers list in the future, but for now it works on the centralized Redis //! server which we maintain for DAC DataModel. -use alloc::{format, string::String}; // ToDo: remove String usage +use alloc::{format, string::String}; +pub use sp_std::{collections::btree_map::BTreeMap}; +// ToDo: remove String usage use base64::prelude::*; use lite_json::json::JsonValue; use sp_runtime::offchain::{http, Duration}; use sp_staking::EraIndex; use sp_std::prelude::*; +use crate::{dac, utils, ValidationDecision}; +use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; +use log::info; const HTTP_TIMEOUT_MS: u64 = 30_000; +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct IntermediateDecisionsWrapper { + #[serde(rename = "JSON.GET")] + json: String, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +#[serde(crate = "alt_serde")] +pub(crate) struct IntermediateDecisions { + validators_to_decisions: BTreeMap, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +#[serde(crate = "alt_serde")] +struct IntermediateDecision { + result: bool, + data: String, +} + +pub fn base64_decode(input: &String) -> Vec { + let mut buf = Vec::with_capacity(392); // ToDo: calculate capacity + buf.resize(392, 0); + BASE64_STANDARD.decode_slice(input, &mut buf).unwrap(); // ToDo: handle error + buf.iter().map(|&char| char as u8).collect() +} + /// Encodes a vector of bytes into a vector of characters using base64 encoding. pub fn base64_encode(input: &Vec) -> Vec { - let mut buf = Vec::with_capacity(1024); // ToDo: calculate capacity - buf.resize(1024, 0); + let mut buf = Vec::with_capacity(392); // ToDo: calculate capacity + buf.resize(392, 0); BASE64_STANDARD.encode_slice(input, &mut buf).unwrap(); // ToDo: handle error buf.iter().map(|&byte| byte as char).collect() } @@ -32,17 +65,27 @@ pub fn share_intermediate_validation_result( validation_decision_encoded: &String, ) -> Result { let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); - let validation_result_string = String::from(if validation_result { "true" } else { "false" }); let validation_decision_string = String::from(validation_decision_encoded); + let json = serde_json::json!({ + "result": validation_result, + "data": validation_decision_string, + }); + let json_str = serde_json::to_string(&json).unwrap(); + let unescaped_json = utils::unescape(&json_str); + let url_encoded_json = utils::url_encode(&unescaped_json); + + log::info!("json_str: {:?}", json_str); + let url = format!( - "{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{{\"result\":{},\"data\":\"{}\"}}", + "{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{}", shared_memory_webdis_url, validator, cdn_node, era, - validation_result_string, - validation_decision_string, + url_encoded_json, ); + + log::info!("share_intermediate_validation_result url: {:?}", url); let request = http::Request::get(url.as_str()); let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; @@ -55,9 +98,59 @@ pub fn share_intermediate_validation_result( log::warn!("No UTF-8 body"); http::Error::Unknown })?; + + log::info!("body_str: {:?}", body_str); + let json = lite_json::parse_json(body_str).map_err(|_| { log::warn!("No JSON body"); http::Error::Unknown })?; Ok(json) } + +pub(crate) fn get_intermediate_decisions(data_provider_url: &String, edge: &str, era: &EraIndex, quorum: Vec) -> Vec { + let url = format!("{}/JSON.GET/ddc:dac:shared:nodes:{}", data_provider_url, era); + + let response: IntermediateDecisionsWrapper = dac::http_get_json(url.as_str()).unwrap(); + let mut edges_to_validators_decisions: BTreeMap> = serde_json::from_str(&response.json).unwrap(); + let decisions_for_edge = IntermediateDecisions { + validators_to_decisions: edges_to_validators_decisions.remove(edge).unwrap() + }; + + let quorum_decisions = find_quorum_decisions(decisions_for_edge, quorum); + let decoded_decisions = decode_intermediate_decisions(quorum_decisions); + + decoded_decisions +} + +pub(crate) fn decode_intermediate_decisions(decisions: IntermediateDecisions) -> Vec { + let mut decoded_decisions: Vec = Vec::new(); + + for (_, decision) in decisions.validators_to_decisions.iter() { + let data = base64_decode(&decision.data); + + let data_str = String::from_utf8_lossy(&data); + let data_trimmed = data_str.trim_end_matches('\0'); + + info!("data_str: {:?}", data_trimmed); + + let decoded_decision: ValidationDecision = serde_json::from_str(&data_trimmed).unwrap(); + + decoded_decisions.push(decoded_decision); + } + + decoded_decisions +} + +pub(crate) fn find_quorum_decisions(all_decisions: IntermediateDecisions, quorum: Vec) -> IntermediateDecisions { + let mut quorum_decisions: BTreeMap = BTreeMap::new(); + for (validator_id, decision) in all_decisions.validators_to_decisions.iter() { + if quorum.contains(validator_id) { + quorum_decisions.insert(validator_id.clone(), decision.clone()); + } + } + + IntermediateDecisions { + validators_to_decisions: quorum_decisions + } +} diff --git a/pallets/ddc-validator/src/utils.rs b/pallets/ddc-validator/src/utils.rs index 3c5c90c80..36dc4492a 100644 --- a/pallets/ddc-validator/src/utils.rs +++ b/pallets/ddc-validator/src/utils.rs @@ -1,5 +1,5 @@ use crate::dac::ValidationResult; -use alloc::string::String; +use alloc::{format, string::String}; use codec::{Decode, Encode}; use sp_core::crypto::AccountId32; use sp_io::hashing::blake2_256; @@ -28,11 +28,33 @@ pub(crate) fn hash(data: &String) -> [u8; 32] { result } -pub(crate) fn get_hashed(data: &Vec) -> [u8; 256] { - let results_log = serde_json::to_string(data).unwrap(); - let mut payload: [u8; 256] = [0; 256]; - let hashed_results = hash(&results_log); - payload[..32].copy_from_slice(&hashed_results); +pub(crate) fn url_encode(input: &str) -> String { + let mut encoded = String::new(); - payload + for byte in input.bytes() { + match byte { + // Unreserved characters (alphanumeric and -_.~) + b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'_' | b'.' | b'~' => { + encoded.push(byte as char); + } + _ => { + encoded.push('%'); + encoded.push_str(&format!("{:02X}", byte)); + } + } + } + + encoded } + +pub(crate) fn unescape(json: &str) -> String { + let mut result = String::new(); + + for ch in json.chars() { + if ch != '\\' { + result.push(ch); + } + } + + result +} \ No newline at end of file From 414292a0a6bab72f19886f86d1a276487d83ca8f Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 23 May 2023 17:32:26 +0200 Subject: [PATCH 157/583] Fix job assignment --- pallets/ddc-validator/src/lib.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 99c0a56b6..8c16b2393 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -78,7 +78,7 @@ pub const ERA_IN_BLOCKS: u8 = 20; // pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; -pub const QUORUM_SIZE: usize = 1; +pub const QUORUM_SIZE: usize = 3; /// Aggregated values from DAC that describe CDN node's activity during a certain era. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen, Serialize, Deserialize)] @@ -609,7 +609,19 @@ pub mod pallet { } fn split(list: Vec, segment_len: usize) -> Vec> { - list.chunks(segment_len).map(|chunk| chunk.to_vec()).collect() + let mut result: Vec> = Vec::new(); + + if segment_len == 0 { + return result; + } + + for i in (0..list.len()).step_by(segment_len) { + let end = usize::min(i + segment_len, list.len()); + let chunk = list[i..end].to_vec(); + result.push(chunk); + } + + result } fn assign(quorum_size: usize) { @@ -629,7 +641,7 @@ pub mod pallet { .collect(); let quorums = Self::split(validators_keys, quorum_size); - let edges_groups = Self::split(shuffled_edges, quorums.len()); + let edges_groups = Self::split(shuffled_edges, quorum_size); info!("quorums: {:?}", quorums); info!("edges_groups: {:?}", edges_groups); From 61ca5fbc67fbe4948d16a9e0ef994a7e0ff1c481 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Wed, 24 May 2023 18:04:15 +0200 Subject: [PATCH 158/583] Incerease spec_version --- runtime/cere-dev/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index b764b42b5..60755e9fe 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -127,7 +127,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: 30700, + spec_version: 30800, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 2, From 33f8d51b18fb5837b4ed430ec28afa2d5d0730de Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 29 May 2023 14:22:21 +0600 Subject: [PATCH 159/583] Return result type from shm encode/decode funcs --- pallets/ddc-validator/src/shm.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pallets/ddc-validator/src/shm.rs b/pallets/ddc-validator/src/shm.rs index 1fe38e1cc..120d60103 100644 --- a/pallets/ddc-validator/src/shm.rs +++ b/pallets/ddc-validator/src/shm.rs @@ -40,19 +40,19 @@ struct IntermediateDecision { data: String, } -pub fn base64_decode(input: &String) -> Vec { +pub fn base64_decode(input: &String) -> Result, ()> { let mut buf = Vec::with_capacity(392); // ToDo: calculate capacity buf.resize(392, 0); - BASE64_STANDARD.decode_slice(input, &mut buf).unwrap(); // ToDo: handle error - buf.iter().map(|&char| char as u8).collect() + BASE64_STANDARD.decode_slice(input, &mut buf).map_err(|_| ())?; + Ok(buf.iter().map(|&char| char as u8).collect()) } /// Encodes a vector of bytes into a vector of characters using base64 encoding. -pub fn base64_encode(input: &Vec) -> Vec { +pub fn base64_encode(input: &Vec) -> Result, ()> { let mut buf = Vec::with_capacity(392); // ToDo: calculate capacity buf.resize(392, 0); - BASE64_STANDARD.encode_slice(input, &mut buf).unwrap(); // ToDo: handle error - buf.iter().map(|&byte| byte as char).collect() + BASE64_STANDARD.encode_slice(input, &mut buf).map_err(|_| ())?; + Ok(buf.iter().map(|&byte| byte as char).collect()) } /// Publish intermediate validation result to redis. From 19efd082c7b8c074645f24469add27b469c8e167 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 29 May 2023 14:49:37 +0600 Subject: [PATCH 160/583] Panic at higher level on shm coding errors --- pallets/ddc-validator/src/lib.rs | 7 ++++--- pallets/ddc-validator/src/shm.rs | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 8c16b2393..eb6dc2513 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -366,7 +366,7 @@ pub mod pallet { // Encode validation decision to base64 let validation_decision_serialized: Vec = validation_decision.encode(); let validation_decision_base64 = - shm::base64_encode(&validation_decision_serialized); + shm::base64_encode(&validation_decision_serialized).unwrap(); log::info!( "Intermediate validation decision for CDN node {:?}: , base64 encoded: {:?}", validation_decision, @@ -748,13 +748,14 @@ pub mod pallet { sent: bytes_sent, failed_by_client: 0, failure_rate: 0, - } + }, }; info!("decision: {:?}", decision); let serialized_decision = serde_json::to_string(&decision).unwrap(); - let encoded_decision = shm::base64_encode(&serialized_decision.as_bytes().to_vec()); + let encoded_decision = + shm::base64_encode(&serialized_decision.as_bytes().to_vec()).unwrap(); let validator_str = utils::account_to_string::(validator.clone()); let edge_str = utils::account_to_string::(assigned_edge.clone()); diff --git a/pallets/ddc-validator/src/shm.rs b/pallets/ddc-validator/src/shm.rs index 120d60103..31477ad1d 100644 --- a/pallets/ddc-validator/src/shm.rs +++ b/pallets/ddc-validator/src/shm.rs @@ -123,11 +123,13 @@ pub(crate) fn get_intermediate_decisions(data_provider_url: &String, edge: &str, decoded_decisions } -pub(crate) fn decode_intermediate_decisions(decisions: IntermediateDecisions) -> Vec { +pub(crate) fn decode_intermediate_decisions( + decisions: IntermediateDecisions, +) -> Vec { let mut decoded_decisions: Vec = Vec::new(); for (_, decision) in decisions.validators_to_decisions.iter() { - let data = base64_decode(&decision.data); + let data = base64_decode(&decision.data).unwrap(); let data_str = String::from_utf8_lossy(&data); let data_trimmed = data_str.trim_end_matches('\0'); From 23fa61e10db82bb96983acbd36a026c902fa124b Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Mon, 29 May 2023 17:37:31 +0200 Subject: [PATCH 161/583] Fix encoding/decoding --- pallets/ddc-validator/src/shm.rs | 8 ++++---- pallets/ddc-validator/src/utils.rs | 22 ++++++++++++++++++---- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/pallets/ddc-validator/src/shm.rs b/pallets/ddc-validator/src/shm.rs index 31477ad1d..ad7990b7f 100644 --- a/pallets/ddc-validator/src/shm.rs +++ b/pallets/ddc-validator/src/shm.rs @@ -41,16 +41,16 @@ struct IntermediateDecision { } pub fn base64_decode(input: &String) -> Result, ()> { - let mut buf = Vec::with_capacity(392); // ToDo: calculate capacity - buf.resize(392, 0); + let mut buf = Vec::with_capacity(1000); // ToDo: calculate capacity + buf.resize(1000, 0); BASE64_STANDARD.decode_slice(input, &mut buf).map_err(|_| ())?; Ok(buf.iter().map(|&char| char as u8).collect()) } /// Encodes a vector of bytes into a vector of characters using base64 encoding. pub fn base64_encode(input: &Vec) -> Result, ()> { - let mut buf = Vec::with_capacity(392); // ToDo: calculate capacity - buf.resize(392, 0); + let mut buf = Vec::with_capacity(1000); // ToDo: calculate capacity + buf.resize(1000, 0); BASE64_STANDARD.encode_slice(input, &mut buf).map_err(|_| ())?; Ok(buf.iter().map(|&byte| byte as char).collect()) } diff --git a/pallets/ddc-validator/src/utils.rs b/pallets/ddc-validator/src/utils.rs index 36dc4492a..93c282d03 100644 --- a/pallets/ddc-validator/src/utils.rs +++ b/pallets/ddc-validator/src/utils.rs @@ -49,12 +49,26 @@ pub(crate) fn url_encode(input: &str) -> String { pub(crate) fn unescape(json: &str) -> String { let mut result = String::new(); + let mut chars = json.chars().peekable(); - for ch in json.chars() { - if ch != '\\' { - result.push(ch); + while let Some(c) = chars.next() { + if c == '\\' { + match chars.peek() { + Some('u') => { + // Skip over the next 5 characters + for _ in 0..5 { + chars.next(); + } + } + _ => { + // Skip over the next character + chars.next(); + } + } + } else { + result.push(c); } } result -} \ No newline at end of file +} From cee3caa4a3096dd177013bd0bed04f3cdadf3f4f Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Mon, 29 May 2023 18:16:26 +0200 Subject: [PATCH 162/583] Assign job for current era if there is no assignment --- pallets/ddc-validator/src/lib.rs | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index eb6dc2513..d3f70f904 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -234,15 +234,20 @@ pub mod pallet { let era = Self::get_current_era(); log::info!("current era: {:?}", era); - if let Some(last_managed_era) = >::get() { - log::info!("last_managed_era: {:?}", last_managed_era); - if last_managed_era >= era { - return 0 + match >::get(){ + Some(last_managed_era) => { + if last_managed_era > era { + return 0 + } else { + Self::assign(3usize, era + 1); + >::put(era); + } + } + None => { + Self::assign(3usize, era); + >::put(era); } } - >::put(era); - - Self::assign(3usize); 0 } @@ -624,7 +629,7 @@ pub mod pallet { result } - fn assign(quorum_size: usize) { + fn assign(quorum_size: usize, era: EraIndex) { let validators: Vec = >::iter_keys().collect(); let edges: Vec = >::iter_keys().collect(); @@ -646,8 +651,6 @@ pub mod pallet { info!("quorums: {:?}", quorums); info!("edges_groups: {:?}", edges_groups); - let era = Self::get_current_era(); - for (i, quorum) in quorums.iter().enumerate() { let edges_group = &edges_groups[i]; for validator in quorum { @@ -727,7 +730,7 @@ pub mod pallet { info!("validator: {:?}", validator); - let assigned_edges = Self::assignments(current_era - 1, validator.clone()).unwrap(); + let assigned_edges = Self::assignments(current_era - 1, validator.clone()).expect("No assignments for the previous era"); info!("assigned_edges: {:?}", assigned_edges); From 82f890192b6a86342c847d0acbd55e8b7f94688d Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 12 Jun 2023 15:47:44 +0600 Subject: [PATCH 163/583] Fix `PalletId` to `AccountId` conversion --- pallets/ddc-accounts/src/lib.rs | 2 +- pallets/ddc-staking/src/lib.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index e31f3d27b..300ae61d5 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -508,7 +508,7 @@ pub mod pallet { impl Pallet { pub fn account_id() -> T::AccountId { - T::PalletId::get().into_account() + T::PalletId::get().into_account_truncating() } /// Update the ledger for a controller. /// diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index f66411934..5e2ed1691 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -615,7 +615,8 @@ pub mod pallet { }; // An account we withdraw the funds from and the amount of funds to withdraw. - let payout_source_account: T::AccountId = T::StakersPayoutSource::get().into_account(); + let payout_source_account: T::AccountId = + T::StakersPayoutSource::get().into_account_truncating(); let payout_budget: BalanceOf = match (price_per_byte * era_reward_points.total as u128).try_into() { Ok(value) => value, From cdb2be84f36b01201f0a1ae1ee83f3791978806e Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 31 May 2023 10:10:32 +0200 Subject: [PATCH 164/583] link payments --- pallets/ddc-accounts/src/lib.rs | 37 ++++++++++++++++++++++++++++++-- pallets/ddc-validator/src/dac.rs | 24 +++++++++++++++++++-- pallets/ddc-validator/src/lib.rs | 25 +++++++++++++++++++-- 3 files changed, 80 insertions(+), 6 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index 300ae61d5..fca422dc4 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -53,8 +53,8 @@ pub struct Bucket { #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct BucketsDetails { - bucket_id: u128, - amount: Balance, + pub bucket_id: u128, + pub amount: Balance, } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] @@ -562,5 +562,38 @@ pub mod pallet { .try_into() .unwrap() } + + // Charge payments from content owners + pub fn charge_payments_new( + paying_accounts: Vec>>, + ) -> DispatchResult { + let mut total_charged = BalanceOf::::zero(); + + for bucket_details in paying_accounts.iter() { + let bucket: Bucket = Self::buckets(bucket_details.bucket_id).unwrap(); + let content_owner = bucket.owner_id; + let amount = bucket_details.amount; + + let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotController)?; + if ledger.active >= amount { + ledger.total -= amount; + ledger.active -= amount; + total_charged += amount; + Self::update_ledger(&content_owner, &ledger); + } else { + let diff = amount - ledger.active; + total_charged += ledger.active; + ledger.total -= ledger.active; + ledger.active = BalanceOf::::zero(); + let (ledger, charged) = ledger.charge_unlocking(diff); + Self::update_ledger(&content_owner, &ledger); + total_charged += charged; + } + + } + Self::deposit_event(Event::::Charged(total_charged)); + + Ok(()) + } } } diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index 9a0f27739..dd1ec370b 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -71,7 +71,7 @@ pub type Requests = BTreeMap; pub struct FileRequest { file_request_id: String, file_info: FileInfo, - bucket_id: u64, + bucket_id: u128, timestamp: u64, chunks: BTreeMap, user_public_key: String, @@ -112,7 +112,7 @@ pub struct Log { timestamp: u64, node_public_key: String, signature: String, - bucket_id: u64, + bucket_id: u128, } #[derive(Serialize, Deserialize, Debug)] @@ -273,6 +273,26 @@ fn get_timestamps_with_ack(file_requests: &Requests) -> Vec { timestamps } +pub fn get_acknowledged_bytes_bucket<'a>(file_requests: &'a Requests, acknowledged_bytes_by_bucket: &'a mut Vec<(u128, u64)>) -> &'a Vec<(u128, u64)> { + let ack_timestamps = get_timestamps_with_ack(file_requests); + + for (_, file_request) in file_requests { + let mut total_bytes_received = 0u64; + let bucket_id = file_request.bucket_id; + for (_, chunk) in &file_request.chunks { + + if let Some(ack) = &chunk.ack { + total_bytes_received += ack.bytes_received; + } else { + total_bytes_received += get_proved_delivered_bytes(chunk, &ack_timestamps); + } + } + acknowledged_bytes_by_bucket.push((bucket_id, total_bytes_received)); + } + + acknowledged_bytes_by_bucket +} + pub fn get_served_bytes_sum(file_requests: &Requests) -> (u64, u64) { let ack_timestamps = get_timestamps_with_ack(file_requests); let mut total_bytes_received = 0u64; diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index d3f70f904..86bdeb6ad 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -47,6 +47,7 @@ pub use frame_system::{ }; pub use lite_json::json::JsonValue; pub use pallet::*; +pub use pallet_ddc_accounts::{self as ddc_accounts, BucketsDetails}; pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_session as session; pub use pallet_staking::{self as staking}; @@ -73,12 +74,13 @@ pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); pub const TIME_START_MS: u128 = 1_672_531_200_000; pub const ERA_DURATION_MS: u128 = 120_000; pub const ERA_IN_BLOCKS: u8 = 20; +pub const BYTES_TO_CERE: u64 = 1_000; /// Webdis in experimental cluster connected to Redis in dev. // pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; -pub const QUORUM_SIZE: usize = 3; +pub const QUORUM_SIZE: usize = 1; /// Aggregated values from DAC that describe CDN node's activity during a certain era. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen, Serialize, Deserialize)] @@ -150,6 +152,7 @@ pub mod pallet { + pallet_contracts::Config + pallet_session::Config::AccountId> + pallet_staking::Config + + ddc_accounts::Config + ddc_staking::Config + CreateSignedTransaction> where @@ -574,7 +577,7 @@ pub mod pallet { // Get the current era; Shall we start era count from 0 or from 1? fn get_current_era() -> EraIndex { - ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS) + ((::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS) .try_into() .unwrap() } @@ -631,7 +634,10 @@ pub mod pallet { fn assign(quorum_size: usize, era: EraIndex) { let validators: Vec = >::iter_keys().collect(); + log::info!("current validators: {:?}", validators); + let edges: Vec = >::iter_keys().collect(); + log::info!("current edges: {:?}", edges); if edges.len() == 0 { return @@ -735,7 +741,10 @@ pub mod pallet { info!("assigned_edges: {:?}", assigned_edges); for assigned_edge in assigned_edges.iter() { + // Store bucket payments + let payments_per_bucket = &mut Vec::new(); let file_request = dac::fetch_file_request(&mock_data_url); + dac::get_acknowledged_bytes_bucket(&file_request, payments_per_bucket); let (bytes_sent, bytes_received) = dac::get_served_bytes_sum(&file_request); let is_valid = Self::is_valid(bytes_sent, bytes_received); @@ -790,6 +799,18 @@ pub mod pallet { log::info!("get_intermediate_decisions result: {:?}", validations_res); if validations_res.len() == QUORUM_SIZE { + log::info!("payments per bucket: {:?}", payments_per_bucket); + + let mut payments = vec![]; + for bucket in payments_per_bucket.into_iter() { + let cere_payment: u32 = (bucket.1 / BYTES_TO_CERE) as u32; + let bucket_info = BucketsDetails {bucket_id: bucket.0, amount: cere_payment.into()}; + payments.push(bucket_info); + } + log::info!("final payments: {:?}", payments); + + ddc_accounts::pallet::Pallet::::charge_payments_new(payments); + let final_res = dac::get_final_decision(validations_res); let signer = Self::get_signer().unwrap(); From 22c85b8842f8463ff314a62cade67ab063ab1d15 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Sat, 3 Jun 2023 10:19:07 +0200 Subject: [PATCH 165/583] fix entry point for call --- pallets/ddc-accounts/src/lib.rs | 6 +++++- pallets/ddc-validator/src/lib.rs | 25 +++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index fca422dc4..d7e6e2560 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -579,6 +579,7 @@ pub mod pallet { ledger.total -= amount; ledger.active -= amount; total_charged += amount; + log::info!("Ledger updated state: {:?}", &ledger); Self::update_ledger(&content_owner, &ledger); } else { let diff = amount - ledger.active; @@ -586,12 +587,15 @@ pub mod pallet { ledger.total -= ledger.active; ledger.active = BalanceOf::::zero(); let (ledger, charged) = ledger.charge_unlocking(diff); + log::info!("Ledger updated state: {:?}", &ledger); Self::update_ledger(&content_owner, &ledger); total_charged += charged; } - } + log::info!("Total charged: {:?}", &total_charged); + Self::deposit_event(Event::::Charged(total_charged)); + log::info!("Deposit event executed"); Ok(()) } diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 86bdeb6ad..b45c59d41 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -74,7 +74,7 @@ pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); pub const TIME_START_MS: u128 = 1_672_531_200_000; pub const ERA_DURATION_MS: u128 = 120_000; pub const ERA_IN_BLOCKS: u8 = 20; -pub const BYTES_TO_CERE: u64 = 1_000; +pub const BYTES_TO_CERE: u64 = 1; // this should have a logic built on top and adjusted /// Webdis in experimental cluster connected to Redis in dev. // pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; @@ -538,6 +538,18 @@ pub mod pallet { Ok(()) } + + #[pallet::weight(100_000)] + pub fn charge_payments_cdn( + origin: OriginFor, + paying_accounts: Vec>>, + ) -> DispatchResult { + ensure_signed(origin)?; + + >::charge_payments_new(paying_accounts); + + Ok(()) + } } impl Pallet @@ -809,7 +821,16 @@ pub mod pallet { } log::info!("final payments: {:?}", payments); - ddc_accounts::pallet::Pallet::::charge_payments_new(payments); + // Store CDN node reward points on-chain + let signer: Signer = Signer::<_, _>::any_account(); + if !signer.can_sign() { + log::warn!("No local accounts available to charge payments for CDN. Consider adding one via `author_insertKey` RPC."); + return + } + // ToDo: replace local call by a call from `ddc-staking` pallet + let _tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = signer.send_signed_transaction(|_account| Call::charge_payments_cdn { + paying_accounts: payments.clone(), + }); let final_res = dac::get_final_decision(validations_res); From 1d44df5f3160bf9d8f682dab33703c7ee3bfdb46 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 23 Jun 2023 16:52:53 +0200 Subject: [PATCH 166/583] add OCWkeys --- pallets/ddc-validator/src/lib.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index b45c59d41..d76f5c495 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -209,9 +209,15 @@ pub mod pallet { #[pallet::getter(fn last_managed_era)] pub type LastManagedEra = StorageValue<_, EraIndex>; + /// The mapping of controller accounts to OCW public keys + #[pallet::storage] + #[pallet::getter(fn ocw_keys)] + pub type OffchainWorkerKeys = + StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; + #[pallet::error] pub enum Error { - // TBA + NotController } #[pallet::event] @@ -550,6 +556,21 @@ pub mod pallet { Ok(()) } + + #[pallet::weight(100_000)] + pub fn set_ocw_key( + origin: OriginFor, + ocw_pub: T::AccountId, + ) -> DispatchResult { + let controller = ensure_signed(origin)?; + ensure!( + staking::Ledger::::contains_key(&controller), + Error::::NotController + ); + + OffchainWorkerKeys::::insert(controller, ocw_pub); + Ok(()) + } } impl Pallet From 94c1048dbe657902f776923b1f374e7886f96f8b Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 23 Jun 2023 16:54:36 +0200 Subject: [PATCH 167/583] add rewards structure for cluster manager --- pallets/ddc-staking/src/lib.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 5e2ed1691..5363b40cc 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -191,6 +191,12 @@ pub mod pallet { pub type Ledger = StorageMap<_, Blake2_128Concat, T::AccountId, StakingLedger>>; + /// Map from all "stash" accounts to the paid out rewards + #[pallet::storage] + #[pallet::getter(fn rewards)] + pub type Rewards = + StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf>; + /// The map from (wannabe) storage network participant stash key to the preferences of that /// storage network participant. #[pallet::storage] @@ -652,6 +658,9 @@ pub mod pallet { reward, ExistenceRequirement::AllowDeath, )?; // ToDo: all success or noop + let mut total_rewards: BalanceOf = Self::rewards(&stash).unwrap(); + total_rewards += reward; + >::insert(&stash, total_rewards); } log::debug!( "Balance left on payout source account {:?}", From 676e10db57a55ede009ac2d7fa0d4992f5277b4e Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 26 Jun 2023 17:41:04 +0200 Subject: [PATCH 168/583] update access control --- pallets/ddc-validator/src/lib.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index d76f5c495..7953651e8 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -217,7 +217,8 @@ pub mod pallet { #[pallet::error] pub enum Error { - NotController + NotController, + OCWKeyNotRegistered, } #[pallet::event] @@ -550,7 +551,12 @@ pub mod pallet { origin: OriginFor, paying_accounts: Vec>>, ) -> DispatchResult { - ensure_signed(origin)?; + let controller = ensure_signed(origin)?; + ensure!( + OffchainWorkerKeys::::contains_key(&controller), + Error::::OCWKeyNotRegistered + ); + >::charge_payments_new(paying_accounts); @@ -563,11 +569,14 @@ pub mod pallet { ocw_pub: T::AccountId, ) -> DispatchResult { let controller = ensure_signed(origin)?; + let ledger = staking::Ledger::::get(&controller).ok_or(Error::::NotController)?; + let era = staking::Pallet::::current_era().unwrap(); + ensure!( - staking::Ledger::::contains_key(&controller), + staking::ErasStakers::::contains_key(era, &ledger.stash), Error::::NotController ); - + OffchainWorkerKeys::::insert(controller, ocw_pub); Ok(()) } From d6d5308e345c9d5381981bf63012339874912f38 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 30 Jun 2023 11:32:10 +0200 Subject: [PATCH 169/583] link payout to stakers --- pallets/ddc-validator/src/lib.rs | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 7953651e8..cd92bcbf1 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -547,7 +547,7 @@ pub mod pallet { } #[pallet::weight(100_000)] - pub fn charge_payments_cdn( + pub fn charge_payments_content_owners( origin: OriginFor, paying_accounts: Vec>>, ) -> DispatchResult { @@ -557,12 +557,27 @@ pub mod pallet { Error::::OCWKeyNotRegistered ); - >::charge_payments_new(paying_accounts); Ok(()) } + #[pallet::weight(100_000)] + pub fn payout_cdn_owners( + origin: OriginFor, + era: EraIndex, + ) -> DispatchResult { + let controller = ensure_signed(origin)?; + ensure!( + OffchainWorkerKeys::::contains_key(&controller), + Error::::OCWKeyNotRegistered + ); + + >::do_payout_stakers(era); + + Ok(()) + } + #[pallet::weight(100_000)] pub fn set_ocw_key( origin: OriginFor, @@ -858,10 +873,14 @@ pub mod pallet { return } // ToDo: replace local call by a call from `ddc-staking` pallet - let _tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = signer.send_signed_transaction(|_account| Call::charge_payments_cdn { + let _tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = signer.send_signed_transaction(|_account| Call::charge_payments_content_owners { paying_accounts: payments.clone(), }); + let _payout_tx_res = signer.send_signed_transaction(|_account| Call::payout_cdn_owners { + era: current_era, + }); + let final_res = dac::get_final_decision(validations_res); let signer = Self::get_signer().unwrap(); From 0b40de76edf13506c4549e0fc4f23f9a62025a24 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 30 Jun 2023 12:50:34 +0200 Subject: [PATCH 170/583] update staking --- pallets/ddc-staking/src/lib.rs | 488 ++++++++++++++++++++++----------- runtime/cere-dev/src/lib.rs | 12 + 2 files changed, 342 insertions(+), 158 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 5363b40cc..fcbfb0dfa 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -14,15 +14,17 @@ use codec::{Decode, Encode, HasCompact}; use frame_support::{ dispatch::Codec, + pallet_prelude::*, parameter_types, traits::{ - Currency, DefensiveSaturating, ExistenceRequirement, LockIdentifier, WithdrawReasons, + Currency, DefensiveSaturating, ExistenceRequirement, LockIdentifier, LockableCurrency, UnixTime, WithdrawReasons, }, BoundedVec, PalletId, }; +use frame_system::pallet_prelude::*; use scale_info::TypeInfo; use sp_runtime::{ - traits::{AccountIdConversion, AtLeast32BitUnsigned, CheckedSub, Saturating, Zero}, + traits::{AccountIdConversion, AtLeast32BitUnsigned, CheckedSub, Saturating, StaticLookup, Zero}, Perbill, RuntimeDebug, }; @@ -34,6 +36,14 @@ use sp_std::{ pub use pallet::*; +/// Two minutes. +/// +/// If you are changing this, check `on_finalize` hook to ensure `CurrentEra` is capable to hold the +/// value with the new era duration. +const DDC_ERA_DURATION_MS: u128 = 120_000; + +/// 2023-01-01 00:00:00 UTC +const DDC_ERA_START_MS: u128 = 1_672_531_200_000; const DDC_STAKING_ID: LockIdentifier = *b"ddcstake"; // DDC maintainer's stake /// Counter for the number of "reward" points earned by a given staker. @@ -43,6 +53,8 @@ pub type RewardPoint = u64; pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +pub type ClusterId = u32; + parameter_types! { /// A limit to the number of pending unlocks an account may have in parallel. pub MaxUnlockingChunks: u32 = 32; @@ -86,6 +98,8 @@ pub struct StakingLedger { /// rounds. #[codec(compact)] pub active: Balance, + /// Era number at which chilling will be allowed. + pub chilling: Option, /// Any balance that is becoming free, which may eventually be transferred out of the stash /// (assuming it doesn't get slashed first). It is assumed that this will be treated as a first /// in, first out queue where the new (higher value) eras get pushed on the back. @@ -97,7 +111,13 @@ impl Self { - Self { stash, total: Zero::zero(), active: Zero::zero(), unlocking: Default::default() } + Self { + stash, + total: Zero::zero(), + active: Zero::zero(), + chilling: Default::default(), + unlocking: Default::default(), + } } /// Remove entries from `unlocking` that are sufficiently old and reduce the @@ -121,7 +141,35 @@ impl { + /// The bond size required to become and maintain the role of a CDN participant. + #[codec(compact)] + pub edge_bond_size: BalanceOf, + /// Number of eras should pass before a CDN participant can chill. + pub edge_chill_delay: EraIndex, + /// The bond size required to become and maintain the role of a storage network participant. + #[codec(compact)] + pub storage_bond_size: BalanceOf, + /// Number of eras should pass before a storage network participant can chill. + pub storage_chill_delay: EraIndex, +} + +impl Default for ClusterSettings { + /// Default to the values specified in the runtime config. + fn default() -> Self { + Self { + edge_bond_size: T::DefaultEdgeBondSize::get(), + edge_chill_delay: T::DefaultEdgeChillDelay::get(), + storage_bond_size: T::DefaultStorageBondSize::get(), + storage_chill_delay: T::DefaultStorageChillDelay::get(), + } } } @@ -165,6 +213,23 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config { type Currency: LockableCurrency; + + /// Default bond size for a CDN participant. + #[pallet::constant] + type DefaultEdgeBondSize: Get>; + + /// Default number or DDC eras required to pass before a CDN participant can chill. + #[pallet::constant] + type DefaultEdgeChillDelay: Get; + + /// Default bond size for a storage network participant. + #[pallet::constant] + type DefaultStorageBondSize: Get>; + + /// Default number or DDC eras required to pass before a storage participant can chill. + #[pallet::constant] + type DefaultStorageChillDelay: Get; + type Event: From> + IsType<::Event>; /// Number of eras that staked funds must remain bonded for. #[pallet::constant] @@ -173,17 +238,23 @@ pub mod pallet { type StakersPayoutSource: Get; /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; + + /// Time used for computing era index. It is guaranteed to start being called from the first + /// `on_finalize`. + type UnixTime: UnixTime; } + /// Map from all locked "stash" accounts to the controller account. #[pallet::storage] #[pallet::getter(fn bonded)] pub type Bonded = StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; - /// The bond size required to become and maintain the role of a CDN or storage network - /// participant. + /// DDC clusters staking settings. #[pallet::storage] - pub type BondSize = StorageValue<_, BalanceOf, ValueQuery>; + #[pallet::getter(fn settings)] + pub type Settings = + StorageMap<_, Identity, ClusterId, ClusterSettings, ValueQuery>; /// Map from all (unlocked) "controller" accounts to the info regarding the staking. #[pallet::storage] @@ -191,24 +262,23 @@ pub mod pallet { pub type Ledger = StorageMap<_, Blake2_128Concat, T::AccountId, StakingLedger>>; - /// Map from all "stash" accounts to the paid out rewards + /// The map of (wannabe) CDN participants stash keys to the DDC cluster ID they wish to + /// participate into. #[pallet::storage] - #[pallet::getter(fn rewards)] - pub type Rewards = - StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf>; + #[pallet::getter(fn edges)] + pub type Edges = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; - /// The map from (wannabe) storage network participant stash key to the preferences of that - /// storage network participant. + /// The map of (wannabe) storage network participants stash keys to the DDC cluster ID they wish + /// to participate into.. #[pallet::storage] #[pallet::getter(fn storages)] - pub type Storages = - CountedStorageMap<_, Twox64Concat, T::AccountId, StoragePrefs, ValueQuery>; + pub type Storages = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; - /// The map from (wannabe) CDN participant stash key to the preferences of that CDN participant. + /// Map from all "stash" accounts to the paid out rewards #[pallet::storage] - #[pallet::getter(fn edges)] - pub type Edges = - CountedStorageMap<_, Twox64Concat, T::AccountId, EdgePrefs, ValueQuery>; + #[pallet::getter(fn rewards)] + pub type Rewards = + StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf>; /// The current era index. /// @@ -247,6 +317,9 @@ pub mod pallet { /// An account has stopped participating as either a storage network or CDN participant. /// \[stash\] Chilled(T::AccountId), + /// An account has declared desire to stop participating in CDN or storage network soon. + /// \[stash, cluster, era\] + ChillSoon(T::AccountId, ClusterId, EraIndex), } #[pallet::error] @@ -270,14 +343,28 @@ pub mod pallet { // An account already declared a desire to participate in the network with a certain role // and to take another role it should call `chill` first. AlreadyInRole, - /// Two or more occurrences of a staker account in rewards points list. + /// Action is allowed at some point of time in future not reached yet. + TooEarly, DuplicateRewardPoints, - /// Price per byte of the traffic is unknown. PricingNotSet, - /// Impossible budget value that overflows pallet's balance type. BudgetOverflow, } + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_finalize(_n: BlockNumberFor) { + // Check if we have a new era and if so bump the current era index. + let now_as_millis = T::UnixTime::now().as_millis(); + let computed_era: EraIndex = + ((now_as_millis - DDC_ERA_START_MS) / DDC_ERA_DURATION_MS) as u32; // saturated + if Self::current_era() >= Some(computed_era) { + return + } + CurrentEra::::put(computed_era); + // ToDo: add `on_initialize` hook to track `on_finalize` weight + } + } + #[pallet::call] impl Pallet { /// Take the origin account as a stash and lock up `value` of its balance. `controller` will @@ -292,6 +379,7 @@ pub mod pallet { pub fn bond( origin: OriginFor, controller: ::Source, + #[pallet::compact] value: BalanceOf, ) -> DispatchResult { let stash = ensure_signed(origin)?; @@ -305,39 +393,34 @@ pub mod pallet { Err(Error::::AlreadyPaired)? } - let stash_free = T::Currency::free_balance(&stash); - // Reject a bond which is considered to be _dust_. - if stash_free < T::Currency::minimum_balance() { - Err(Error::::InsufficientBond)? - } - - let bond_size = BondSize::::get(); - - // Reject a bond which is lower then required. - if stash_free < bond_size { + if value < T::Currency::minimum_balance() { Err(Error::::InsufficientBond)? } frame_system::Pallet::::inc_consumers(&stash).map_err(|_| Error::::BadState)?; // You're auto-bonded forever, here. We might improve this by only bonding when - // you actually store/serve and remove once you unbond. + // you actually store/serve and remove once you unbond __everything__. >::insert(&stash, &controller); - Self::deposit_event(Event::::Bonded(stash.clone(), bond_size)); + let stash_balance = T::Currency::free_balance(&stash); + let value = value.min(stash_balance); + Self::deposit_event(Event::::Bonded(stash.clone(), value)); let item = StakingLedger { stash, - total: bond_size, - active: bond_size, + total: value, + active: value, + chilling: Default::default(), unlocking: Default::default(), }; Self::update_ledger(&controller, &item); Ok(()) } - /// Schedule a bond of the stash to be unlocked ready for transfer out after the bond - /// period ends. + /// Schedule a portion of the stash to be unlocked ready for transfer out after the bond + /// period ends. If this leaves an amount actively bonded less than + /// T::Currency::minimum_balance(), then it is increased to the full amount. /// /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. /// @@ -346,10 +429,7 @@ pub mod pallet { /// /// No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`) /// can co-exists at the same time. In that case, [`Call::withdraw_unbonded`] need - /// to be called first to remove some of the chunks (if possible). This feature is actually - /// not required because we unlock the whole bond at once, means it is impossible to have - /// more then one unlocking at time. But this is inherited from the `pallet-staking` and we - /// may remove in some future version. + /// to be called first to remove some of the chunks (if possible). /// /// If a user encounters the `InsufficientBond` error when calling this extrinsic, /// they should call `chill` first in order to free up their bonded funds. @@ -360,48 +440,58 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::unbond())] pub fn unbond( origin: OriginFor, + #[pallet::compact] value: BalanceOf, ) -> DispatchResult { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - - if ledger.active.is_zero() { - // Nothing to unbond. - return Ok(()) - } - ensure!( ledger.unlocking.len() < MaxUnlockingChunks::get() as usize, Error::::NoMoreChunks, ); - // Make sure that the user maintains enough active bond for their role. - // If a user runs into this error, they should chill first. - ensure!(!Storages::::contains_key(&ledger.stash), Error::::InsufficientBond); - ensure!(!Edges::::contains_key(&ledger.stash), Error::::InsufficientBond); + let mut value = value.min(ledger.active); - let era = Self::current_era().unwrap_or(0) + T::BondingDuration::get(); + if !value.is_zero() { + ledger.active -= value; - // Unbond actual active stake instead of the current `BondSize` to allow users bond and - // unbond the same amount regardless of changes of the `BondSize`. - let unbond_value = ledger.active.clone(); - ledger.active = Zero::zero(); + // Avoid there being a dust balance left in the staking system. + if ledger.active < T::Currency::minimum_balance() { + value += ledger.active; + ledger.active = Zero::zero(); + } - if let Some(mut chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) { - // To keep the chunk count down, we only keep one chunk per era. Since - // `unlocking` is a FiFo queue, if a chunk exists for `era` we know that it will - // be the last one. - chunk.value = chunk.value.defensive_saturating_add(unbond_value) - } else { - ledger - .unlocking - .try_push(UnlockChunk { value: unbond_value, era }) - .map_err(|_| Error::::NoMoreChunks)?; - }; - // NOTE: ledger must be updated prior to calling `Self::weight_of`. - Self::update_ledger(&controller, &ledger); + let min_active_bond = if let Some(cluster_id) = Self::edges(&ledger.stash) { + Self::settings(cluster_id).edge_bond_size + } else if let Some(cluster_id) = Self::storages(&ledger.stash) { + Self::settings(cluster_id).storage_bond_size + } else { + Zero::zero() + }; - Self::deposit_event(Event::::Unbonded(ledger.stash, unbond_value)); + // Make sure that the user maintains enough active bond for their role in the + // cluster. If a user runs into this error, they should chill first. + ensure!(ledger.active >= min_active_bond, Error::::InsufficientBond); + + // Note: in case there is no current era it is fine to bond one era more. + let era = Self::current_era().unwrap_or(0) + T::BondingDuration::get(); + if let Some(mut chunk) = + ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) + { + // To keep the chunk count down, we only keep one chunk per era. Since + // `unlocking` is a FiFo queue, if a chunk exists for `era` we know that it will + // be the last one. + chunk.value = chunk.value.defensive_saturating_add(value) + } else { + ledger + .unlocking + .try_push(UnlockChunk { value, era }) + .map_err(|_| Error::::NoMoreChunks)?; + }; + Self::update_ledger(&controller, &ledger); + + Self::deposit_event(Event::::Unbonded(ledger.stash, value)); + } Ok(()) } @@ -447,58 +537,136 @@ pub mod pallet { Ok(()) } - /// Declare the desire to participate in storage network for the origin controller. + /// Declare the desire to participate in CDN for the origin controller. Also works to cancel + /// a previous "chill". /// - /// Effects will be felt at the beginning of the next era. + /// `cluster` is the ID of the DDC cluster the participant wishes to join. /// - /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. - #[pallet::weight(T::WeightInfo::store())] - pub fn store(origin: OriginFor, prefs: StoragePrefs) -> DispatchResult { + /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. The + /// bond size must be greater than or equal to the `EdgeBondSize`. + #[pallet::weight(T::WeightInfo::serve())] + pub fn serve(origin: OriginFor, cluster: ClusterId) -> DispatchResult { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - - ensure!(ledger.active >= BondSize::::get(), Error::::InsufficientBond); + ensure!( + ledger.active >= Self::settings(cluster).edge_bond_size, + Error::::InsufficientBond + ); let stash = &ledger.stash; - // Can't participate in storage network if already participating in CDN. - ensure!(!Edges::::contains_key(&stash), Error::::AlreadyInRole); + // Can't participate in CDN if already participating in storage network. + ensure!(!Storages::::contains_key(&stash), Error::::AlreadyInRole); + + // Is it an attempt to cancel a previous "chill"? + if let Some(current_cluster) = Self::edges(&stash) { + // Switching the cluster is prohibited. The user should chill first. + ensure!(current_cluster == cluster, Error::::AlreadyInRole); + // Cancel previous "chill" attempts + Self::reset_chilling(&controller); + return Ok(()) + } - Self::do_add_storage(stash, prefs); + Self::do_add_edge(stash, cluster); Ok(()) } - /// Declare the desire to participate in CDN for the origin controller. + /// Declare the desire to participate in storage network for the origin controller. Also + /// works to cancel a previous "chill". /// - /// Effects will be felt at the beginning of the next era. + /// `cluster` is the ID of the DDC cluster the participant wishes to join. /// - /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. - #[pallet::weight(T::WeightInfo::serve())] - pub fn serve(origin: OriginFor, prefs: EdgePrefs) -> DispatchResult { + /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. The + /// bond size must be greater than or equal to the `StorageBondSize`. + #[pallet::weight(T::WeightInfo::store())] + pub fn store(origin: OriginFor, cluster: ClusterId) -> DispatchResult { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - - ensure!(ledger.active >= BondSize::::get(), Error::::InsufficientBond); + ensure!( + ledger.active >= Self::settings(cluster).storage_bond_size, + Error::::InsufficientBond + ); let stash = &ledger.stash; - // Can't participate in CDN if already participating in storage network. - ensure!(!Storages::::contains_key(&stash), Error::::AlreadyInRole); + // Can't participate in storage network if already participating in CDN. + ensure!(!Edges::::contains_key(&stash), Error::::AlreadyInRole); + + // Is it an attempt to cancel a previous "chill"? + if let Some(current_cluster) = Self::storages(&stash) { + // Switching the cluster is prohibited. The user should chill first. + ensure!(current_cluster == cluster, Error::::AlreadyInRole); + // Cancel previous "chill" attempts + Self::reset_chilling(&controller); + return Ok(()) + } + + Self::do_add_storage(stash, cluster); - Self::do_add_edge(stash, prefs); Ok(()) } /// Declare no desire to either participate in storage network or CDN. /// - /// Effects will be felt at the beginning of the next era. + /// Only in case the delay for the role _origin_ maintains in the cluster is set to zero in + /// cluster settings, it removes the participant immediately. Otherwise, it requires at + /// least two invocations to effectively remove the participant. The first invocation only + /// updates the [`Ledger`] to note the DDC era at which the participant may "chill" (current + /// era + the delay from the cluster settings). The second invocation made at the noted era + /// (or any further era) will remove the participant from the list of CDN or storage network + /// participants. If the cluster settings updated significantly decreasing the delay, one + /// may invoke it again to decrease the era at with the participant may "chill". But it + /// never increases the era at which the participant may "chill" even when the cluster + /// settings updated increasing the delay. /// /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. + /// + /// Emits `ChillSoon`, `Chill`. #[pallet::weight(T::WeightInfo::chill())] pub fn chill(origin: OriginFor) -> DispatchResult { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; + let current_era = match Self::current_era() { + Some(era) => era, + None => Err(Error::::TooEarly)?, // can't chill before the first era + }; + + // Extract delay from the cluster settings. + let (cluster, delay) = if let Some(cluster) = Self::edges(&ledger.stash) { + (cluster, Self::settings(cluster).edge_chill_delay) + } else if let Some(cluster) = Self::storages(&ledger.stash) { + (cluster, Self::settings(cluster).storage_chill_delay) + } else { + return Ok(()) // already chilled + }; + + if delay == 0 { + // No delay is set, so we can chill right away. + Self::chill_stash(&ledger.stash); + return Ok(()) + } + + let can_chill_from = current_era.defensive_saturating_add(delay); + match ledger.chilling { + None => { + // No previous declarations of desire to chill. Note it to allow chilling soon. + Self::chill_stash_soon(&ledger.stash, &controller, cluster, can_chill_from); + return Ok(()) + }, + Some(chilling) if can_chill_from < chilling => { + // Time to chill is not reached yet, but it is allowed to chill earlier. Update + // to allow chilling sooner. + Self::chill_stash_soon(&ledger.stash, &controller, cluster, can_chill_from); + return Ok(()) + }, + Some(chilling) if chilling > current_era => Err(Error::::TooEarly)?, + Some(_) => (), + } + + // It's time to chill. Self::chill_stash(&ledger.stash); + Self::reset_chilling(&controller); // for future chilling + Ok(()) } @@ -527,6 +695,31 @@ pub mod pallet { Ok(()) } + /// Set custom DDC staking settings for a particular cluster. + /// + /// * `settings` - The new settings for the cluster. If `None`, the settings will be removed + /// from the storage and default settings will be used. + /// + /// RuntimeOrigin must be Root to call this function. + /// + /// NOTE: Existing CDN and storage network participants will not be affected by this + /// settings update. + #[pallet::weight(10_000)] + pub fn set_settings( + origin: OriginFor, + cluster: ClusterId, + settings: Option>, + ) -> DispatchResult { + ensure_root(origin)?; + + match settings { + None => Settings::::remove(cluster), + Some(settings) => Settings::::insert(cluster, settings), + } + + Ok(()) + } + /// Pay out all the stakers for a single era. #[pallet::weight(100_000)] pub fn payout_stakers(origin: OriginFor, era: EraIndex) -> DispatchResult { @@ -576,39 +769,10 @@ pub mod pallet { >::set(Some(price_per_byte)); Ok(()) } - - /// Update the DDC staking configurations . - /// - /// * `bond_size`: The active bond needed to be a Storage or Edge node. - /// - /// RuntimeOrigin must be Root to call this function. - /// - /// NOTE: Existing nominators and validators will not be affected by this update. - #[pallet::weight(10_000)] - pub fn set_staking_configs( - origin: OriginFor, - bond_size: ConfigOp>, - ) -> DispatchResult { - ensure_root(origin)?; - - macro_rules! config_op_exp { - ($storage:ty, $op:ident) => { - match $op { - ConfigOp::Noop => (), - ConfigOp::Set(v) => <$storage>::put(v), - ConfigOp::Remove => <$storage>::kill(), - } - }; - } - - config_op_exp!(BondSize, bond_size); - - Ok(()) - } } impl Pallet { - pub(super) fn do_payout_stakers(era: EraIndex) -> DispatchResult { + pub fn do_payout_stakers(era: EraIndex) -> DispatchResult { // ToDo: check that the era is finished // ToDo: check reward points are set @@ -695,6 +859,20 @@ pub mod pallet { } } + /// Note a desire of a stash account to chill soon. + fn chill_stash_soon( + stash: &T::AccountId, + controller: &T::AccountId, + cluster: ClusterId, + can_chill_from: EraIndex, + ) { + Ledger::::mutate(&controller, |maybe_ledger| { + if let Some(ref mut ledger) = maybe_ledger { + ledger.chilling = Some(can_chill_from) + } + }); + Self::deposit_event(Event::::ChillSoon(stash.clone(), cluster, can_chill_from)); + } /// Remove all associated data of a stash account from the staking system. /// /// Assumes storage is upgraded before calling. @@ -716,64 +894,58 @@ pub mod pallet { Ok(()) } - /// This function will add a storage network participant to the `Storages` storage map. + /// This function will add a CDN participant to the `Edges` storage map. /// - /// If the storage network participant already exists, their preferences will be updated. + /// If the CDN participant already exists, their cluster will be updated. /// - /// NOTE: you must ALWAYS use this function to add a storage network participant to the - /// system. Any access to `Storages` outside of this function is almost certainly + /// NOTE: you must ALWAYS use this function to add a CDN participant to the system. Any + /// access to `Edges` outside of this function is almost certainly /// wrong. - pub fn do_add_storage(who: &T::AccountId, prefs: StoragePrefs) { - Storages::::insert(who, prefs); + pub fn do_add_edge(who: &T::AccountId, cluster: ClusterId) { + Edges::::insert(who, cluster); } - /// This function will remove a storage network participant from the `Storages` storage map. + /// This function will remove a CDN participant from the `Edges` map. /// - /// Returns true if `who` was removed from `Storages`, otherwise false. + /// Returns true if `who` was removed from `Edges`, otherwise false. /// /// NOTE: you must ALWAYS use this function to remove a storage network participant from the - /// system. Any access to `Storages` outside of this function is almost certainly + /// system. Any access to `Edges` outside of this function is almost certainly /// wrong. - pub fn do_remove_storage(who: &T::AccountId) -> bool { - let outcome = if Storages::::contains_key(who) { - Storages::::remove(who); - true - } else { - false - }; - - outcome + pub fn do_remove_edge(who: &T::AccountId) -> bool { + Edges::::take(who).is_some() } - /// This function will add a CDN participant to the `Edges` storage map. + /// This function will add a storage network participant to the `Storages` storage map. /// - /// If the CDN participant already exists, their preferences will be updated. + /// If the storage network participant already exists, their cluster will be updated. /// - /// NOTE: you must ALWAYS use this function to add a CDN participant to the system. Any - /// access to `Edges` outside of this function is almost certainly + /// NOTE: you must ALWAYS use this function to add a storage network participant to the + /// system. Any access to `Storages` outside of this function is almost certainly /// wrong. - pub fn do_add_edge(who: &T::AccountId, prefs: EdgePrefs) { - Edges::::insert(who, prefs); + pub fn do_add_storage(who: &T::AccountId, cluster: ClusterId) { + Storages::::insert(who, cluster); } - /// This function will remove a CDN participant from the `Edges` storage map. + /// This function will remove a storage network participant from the `Storages` map. /// - /// Returns true if `who` was removed from `Edges`, otherwise false. + /// Returns true if `who` was removed from `Storages`, otherwise false. /// /// NOTE: you must ALWAYS use this function to remove a storage network participant from the - /// system. Any access to `Edges` outside of this function is almost certainly + /// system. Any access to `Storages` outside of this function is almost certainly /// wrong. - pub fn do_remove_edge(who: &T::AccountId) -> bool { - let outcome = if Edges::::contains_key(who) { - Storages::::remove(who); - true - } else { - false - }; - - outcome + pub fn do_remove_storage(who: &T::AccountId) -> bool { + Storages::::take(who).is_some() } + /// Reset the chilling era for a controller. + pub fn reset_chilling(controller: &T::AccountId) { + Ledger::::mutate(&controller, |maybe_ledger| { + if let Some(ref mut ledger) = maybe_ledger { + ledger.chilling = None + } + }); + } /// Add reward points to CDN participants using their stash account ID. pub fn reward_by_ids( era: EraIndex, diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 572b91a90..6e882828d 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -75,6 +75,7 @@ use sp_runtime::{ transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedPointNumber, Perbill, Percent, Permill, Perquintill, }; +use sp_staking::EraIndex; use sp_std::prelude::*; #[cfg(any(feature = "std", test))] use sp_version::NativeVersion; @@ -1254,10 +1255,21 @@ impl pallet_ddc_metrics_offchain_worker::Config for Runtime { type Call = Call; } +parameter_types! { + pub const DefaultEdgeBondSize: Balance = 100 * DOLLARS; + pub const DefaultEdgeChillDelay: EraIndex = 7 * 24 * 60 / 2; // approx. 1 week with 2 min DDC era + pub const DefaultStorageBondSize: Balance = 100 * DOLLARS; + pub const DefaultStorageChillDelay: EraIndex = 7 * 24 * 60 / 2; // approx. 1 week with 2 min DDC era +} impl pallet_ddc_staking::Config for Runtime { type BondingDuration = BondingDuration; type Currency = Balances; + type DefaultEdgeBondSize = DefaultEdgeBondSize; + type DefaultEdgeChillDelay = DefaultEdgeChillDelay; + type DefaultStorageBondSize = DefaultStorageBondSize; + type DefaultStorageChillDelay = DefaultStorageChillDelay; type Event = Event; + type UnixTime = Timestamp; type StakersPayoutSource = Ddc_Accounts_Pallet_Id; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; } From f9963815008226c1444218510be2c5a998756330 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 4 Jul 2023 13:00:44 +0600 Subject: [PATCH 171/583] Update dependencies versions to fix build --- Cargo.lock | 58 ++++++++++++++++++++++++++++++++ pallets/ddc-accounts/Cargo.toml | 14 ++++---- pallets/ddc-validator/Cargo.toml | 34 +++++++++---------- 3 files changed, 82 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3d4c9b4ca..d3b91b58f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -168,6 +168,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "array-bytes" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b1c5a481ec30a5abd8dfbd94ab5cf1bb4e9a66be7f1b3b322f2f1170c200fd" + [[package]] name = "arrayref" version = "0.3.7" @@ -794,8 +800,10 @@ dependencies = [ "pallet-contracts", "pallet-contracts-primitives", "pallet-contracts-rpc-runtime-api", + "pallet-ddc-accounts", "pallet-ddc-metrics-offchain-worker", "pallet-ddc-staking", + "pallet-ddc-validator", "pallet-democracy", "pallet-election-provider-multi-phase", "pallet-election-provider-support-benchmarking", @@ -4819,6 +4827,22 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-ddc-accounts" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", + "substrate-test-utils", +] + [[package]] name = "pallet-ddc-metrics-offchain-worker" version = "4.7.0" @@ -4852,6 +4876,7 @@ dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "log", "parity-scale-codec", "scale-info", "sp-io", @@ -4861,6 +4886,39 @@ dependencies = [ "substrate-test-utils", ] +[[package]] +name = "pallet-ddc-validator" +version = "0.1.0" +dependencies = [ + "alt_serde", + "array-bytes", + "base64 0.21.2", + "frame-election-provider-support", + "frame-support", + "frame-system", + "lite-json", + "log", + "pallet-balances", + "pallet-contracts", + "pallet-ddc-accounts", + "pallet-ddc-staking", + "pallet-randomness-collective-flip", + "pallet-session", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "serde", + "serde_json 1.0.44", + "sp-core", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-staking", + "sp-std", +] + [[package]] name = "pallet-democracy" version = "4.0.0-dev" diff --git a/pallets/ddc-accounts/Cargo.toml b/pallets/ddc-accounts/Cargo.toml index df6dbf097..4d5b3aa30 100644 --- a/pallets/ddc-accounts/Cargo.toml +++ b/pallets/ddc-accounts/Cargo.toml @@ -5,17 +5,17 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } log = { version = "0.4.17", default-features = false } [dev-dependencies] -substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } +substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } [features] default = ["std"] diff --git a/pallets/ddc-validator/Cargo.toml b/pallets/ddc-validator/Cargo.toml index 0c29be547..a412f0776 100644 --- a/pallets/ddc-validator/Cargo.toml +++ b/pallets/ddc-validator/Cargo.toml @@ -8,25 +8,25 @@ array-bytes = "6.0.0" alt_serde = { version = "1", default-features = false, features = ["derive"] } base64 = { version = "0.21.0", default-features = false } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } log = { version = "0.4.17", default-features = false } lite-json = { version = "0.2.0", default-features = false } -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } +pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } pallet-ddc-accounts = { version = "0.1.0", default-features = false, path = "../ddc-accounts" } -pallet-ddc-staking = { version = "0.1.0", default-features = false, path = "../ddc-staking" } -pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25", default-features = false } -pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } +pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } +pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false } +pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25", optional = true } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } [features] default = ["std"] @@ -52,7 +52,7 @@ std = [ ] [dev-dependencies] -pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } -pallet-staking-reward-curve = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.25" } \ No newline at end of file +pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +pallet-staking-reward-curve = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } \ No newline at end of file From 13470682a1ad2615c6d3ad0db30fc2c4226bad8f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 4 Jul 2023 13:01:18 +0600 Subject: [PATCH 172/583] Fix weight return --- pallets/ddc-validator/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 7953651e8..74d240d3f 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -236,7 +236,7 @@ pub mod pallet { { fn on_initialize(block_number: T::BlockNumber) -> Weight { if block_number <= 1u32.into() { - return 0 + return Weight::from_ref_time(0) } Signal::::set(Some(false)); @@ -247,7 +247,7 @@ pub mod pallet { match >::get(){ Some(last_managed_era) => { if last_managed_era > era { - return 0 + return Weight::from_ref_time(0) } else { Self::assign(3usize, era + 1); >::put(era); @@ -259,7 +259,7 @@ pub mod pallet { } } - 0 + Weight::from_ref_time(0) } fn offchain_worker(block_number: T::BlockNumber) { From a8fe7d424c3c0e04af2946e68e2f492f7361ce25 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 4 Jul 2023 13:05:34 +0600 Subject: [PATCH 173/583] Sort `pallet-ddc-validator` dependencies --- pallets/ddc-validator/Cargo.toml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pallets/ddc-validator/Cargo.toml b/pallets/ddc-validator/Cargo.toml index a412f0776..7672fbfbd 100644 --- a/pallets/ddc-validator/Cargo.toml +++ b/pallets/ddc-validator/Cargo.toml @@ -4,15 +4,15 @@ version = "0.1.0" edition = "2021" [dependencies] -array-bytes = "6.0.0" alt_serde = { version = "1", default-features = false, features = ["derive"] } +array-bytes = "6.0.0" base64 = { version = "0.21.0", default-features = false } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -log = { version = "0.4.17", default-features = false } lite-json = { version = "0.2.0", default-features = false } +log = { version = "0.4.17", default-features = false } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } pallet-ddc-accounts = { version = "0.1.0", default-features = false, path = "../ddc-accounts" } pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } @@ -28,13 +28,19 @@ sp-runtime = { version = "6.0.0", default-features = false, git = "https://githu sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +[dev-dependencies] +pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +pallet-staking-reward-curve = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } + [features] default = ["std"] std = [ "codec/std", + "frame-election-provider-support/std", "frame-support/std", "frame-system/std", - "frame-election-provider-support/std", "lite-json/std", "pallet-contracts/std", "pallet-ddc-accounts/std", @@ -50,9 +56,3 @@ std = [ "sp-staking/std", "sp-std/std", ] - -[dev-dependencies] -pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-staking-reward-curve = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } \ No newline at end of file From a901c920d6accd040f3a14f39a257e6fd20e0d02 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 4 Jul 2023 13:06:31 +0600 Subject: [PATCH 174/583] Autoformat DDC pallets --- pallets/ddc-accounts/src/lib.rs | 99 +++++++++++++++--------------- pallets/ddc-staking/src/lib.rs | 3 +- pallets/ddc-validator/src/dac.rs | 8 ++- pallets/ddc-validator/src/lib.rs | 78 +++++++++++++---------- pallets/ddc-validator/src/shm.rs | 37 ++++++----- pallets/ddc-validator/src/utils.rs | 8 +-- 6 files changed, 127 insertions(+), 106 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index d7e6e2560..1b5e4156a 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -210,7 +210,7 @@ pub mod pallet { /// from the unlocking queue. \[stash, amount\] Withdrawn(T::AccountId, BalanceOf), /// Total amount charged from all accounts to pay CDN nodes - Charged(BalanceOf), + Charged(BalanceOf), } #[pallet::error] @@ -260,31 +260,30 @@ pub mod pallet { paying_accounts: Vec>>, ) -> DispatchResult { let validator = ensure_signed(origin)?; - let mut total_charged = BalanceOf::::zero(); - - for bucket_details in paying_accounts.iter() { - let bucket: Bucket = Self::buckets(bucket_details.bucket_id).unwrap(); - let content_owner = bucket.owner_id; - let amount = bucket_details.amount; - - let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotController)?; - if ledger.active >= amount { - ledger.total -= amount; - ledger.active -= amount; - total_charged += amount; - Self::update_ledger(&content_owner, &ledger); - } else { - let diff = amount - ledger.active; - total_charged += ledger.active; - ledger.total -= ledger.active; - ledger.active = BalanceOf::::zero(); - let (ledger, charged) = ledger.charge_unlocking(diff); - Self::update_ledger(&content_owner, &ledger); - total_charged += charged; - } - - } - Self::deposit_event(Event::::Charged(total_charged)); + let mut total_charged = BalanceOf::::zero(); + + for bucket_details in paying_accounts.iter() { + let bucket: Bucket = Self::buckets(bucket_details.bucket_id).unwrap(); + let content_owner = bucket.owner_id; + let amount = bucket_details.amount; + + let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotController)?; + if ledger.active >= amount { + ledger.total -= amount; + ledger.active -= amount; + total_charged += amount; + Self::update_ledger(&content_owner, &ledger); + } else { + let diff = amount - ledger.active; + total_charged += ledger.active; + ledger.total -= ledger.active; + ledger.active = BalanceOf::::zero(); + let (ledger, charged) = ledger.charge_unlocking(diff); + Self::update_ledger(&content_owner, &ledger); + total_charged += charged; + } + } + Self::deposit_event(Event::::Charged(total_charged)); Ok(()) } @@ -567,34 +566,34 @@ pub mod pallet { pub fn charge_payments_new( paying_accounts: Vec>>, ) -> DispatchResult { - let mut total_charged = BalanceOf::::zero(); - - for bucket_details in paying_accounts.iter() { - let bucket: Bucket = Self::buckets(bucket_details.bucket_id).unwrap(); - let content_owner = bucket.owner_id; - let amount = bucket_details.amount; - - let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotController)?; - if ledger.active >= amount { - ledger.total -= amount; - ledger.active -= amount; - total_charged += amount; + let mut total_charged = BalanceOf::::zero(); + + for bucket_details in paying_accounts.iter() { + let bucket: Bucket = Self::buckets(bucket_details.bucket_id).unwrap(); + let content_owner = bucket.owner_id; + let amount = bucket_details.amount; + + let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotController)?; + if ledger.active >= amount { + ledger.total -= amount; + ledger.active -= amount; + total_charged += amount; log::info!("Ledger updated state: {:?}", &ledger); - Self::update_ledger(&content_owner, &ledger); - } else { - let diff = amount - ledger.active; - total_charged += ledger.active; - ledger.total -= ledger.active; - ledger.active = BalanceOf::::zero(); - let (ledger, charged) = ledger.charge_unlocking(diff); + Self::update_ledger(&content_owner, &ledger); + } else { + let diff = amount - ledger.active; + total_charged += ledger.active; + ledger.total -= ledger.active; + ledger.active = BalanceOf::::zero(); + let (ledger, charged) = ledger.charge_unlocking(diff); log::info!("Ledger updated state: {:?}", &ledger); - Self::update_ledger(&content_owner, &ledger); - total_charged += charged; - } - } + Self::update_ledger(&content_owner, &ledger); + total_charged += charged; + } + } log::info!("Total charged: {:?}", &total_charged); - Self::deposit_event(Event::::Charged(total_charged)); + Self::deposit_event(Event::::Charged(total_charged)); log::info!("Deposit event executed"); Ok(()) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index f2ece5379..8bdbf9f54 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -234,8 +234,7 @@ pub mod pallet { /// Map from all "stash" accounts to the paid out rewards #[pallet::storage] #[pallet::getter(fn rewards)] - pub type Rewards = - StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf>; + pub type Rewards = StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf>; /// The map of (wannabe) CDN participants stash keys to the DDC cluster ID they wish to /// participate into. diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index dd1ec370b..63244a6e2 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -273,14 +273,16 @@ fn get_timestamps_with_ack(file_requests: &Requests) -> Vec { timestamps } -pub fn get_acknowledged_bytes_bucket<'a>(file_requests: &'a Requests, acknowledged_bytes_by_bucket: &'a mut Vec<(u128, u64)>) -> &'a Vec<(u128, u64)> { +pub fn get_acknowledged_bytes_bucket<'a>( + file_requests: &'a Requests, + acknowledged_bytes_by_bucket: &'a mut Vec<(u128, u64)>, +) -> &'a Vec<(u128, u64)> { let ack_timestamps = get_timestamps_with_ack(file_requests); for (_, file_request) in file_requests { let mut total_bytes_received = 0u64; let bucket_id = file_request.bucket_id; for (_, chunk) in &file_request.chunks { - if let Some(ack) = &chunk.ack { total_bytes_received += ack.bytes_received; } else { @@ -615,7 +617,7 @@ fn find_largest_group(decisions: Vec) -> Option = - StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; + pub type OffchainWorkerKeys = + StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; #[pallet::error] pub enum Error { @@ -244,19 +255,18 @@ pub mod pallet { let era = Self::get_current_era(); log::info!("current era: {:?}", era); - match >::get(){ - Some(last_managed_era) => { + match >::get() { + Some(last_managed_era) => if last_managed_era > era { return Weight::from_ref_time(0) } else { Self::assign(3usize, era + 1); >::put(era); - } - } + }, None => { Self::assign(3usize, era); >::put(era); - } + }, } Weight::from_ref_time(0) @@ -279,8 +289,8 @@ pub mod pallet { //} // Print the number of broken sessions per CDN node. - // let aggregates_value = dac::fetch_aggregates(&data_provider_url, 77436).unwrap(); // 77436 is for a mock data - // let aggregates_obj = aggregates_value.as_object().unwrap(); + // let aggregates_value = dac::fetch_aggregates(&data_provider_url, 77436).unwrap(); // + // 77436 is for a mock data let aggregates_obj = aggregates_value.as_object().unwrap(); // aggregates_obj // .into_iter() // .for_each(|(cdn_node_pubkey, cdn_node_aggregates_value)| { @@ -556,18 +566,14 @@ pub mod pallet { OffchainWorkerKeys::::contains_key(&controller), Error::::OCWKeyNotRegistered ); - - >::charge_payments_new(paying_accounts); + >::charge_payments_new(paying_accounts); Ok(()) } #[pallet::weight(100_000)] - pub fn set_ocw_key( - origin: OriginFor, - ocw_pub: T::AccountId, - ) -> DispatchResult { + pub fn set_ocw_key(origin: OriginFor, ocw_pub: T::AccountId) -> DispatchResult { let controller = ensure_signed(origin)?; let ledger = staking::Ledger::::get(&controller).ok_or(Error::::NotController)?; let era = staking::Pallet::::current_era().unwrap(); @@ -619,7 +625,8 @@ pub mod pallet { // Get the current era; Shall we start era count from 0 or from 1? fn get_current_era() -> EraIndex { - ((::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS) + ((::TimeProvider::now().as_millis() - TIME_START_MS) / + ERA_DURATION_MS) .try_into() .unwrap() } @@ -662,7 +669,7 @@ pub mod pallet { let mut result: Vec> = Vec::new(); if segment_len == 0 { - return result; + return result } for i in (0..list.len()).step_by(segment_len) { @@ -763,7 +770,7 @@ pub mod pallet { fn get_public_key() -> Option { match sr25519_public_keys(KEY_TYPE).first() { Some(pubkey) => Some(T::AccountId::decode(&mut &pubkey.encode()[..]).unwrap()), - None => None + None => None, } } @@ -778,7 +785,8 @@ pub mod pallet { info!("validator: {:?}", validator); - let assigned_edges = Self::assignments(current_era - 1, validator.clone()).expect("No assignments for the previous era"); + let assigned_edges = Self::assignments(current_era - 1, validator.clone()) + .expect("No assignments for the previous era"); info!("assigned_edges: {:?}", assigned_edges); @@ -836,7 +844,12 @@ pub mod pallet { let edge = utils::account_to_string::(assigned_edge.clone()); let prev_era = (current_era - 1) as EraIndex; let quorum = Self::find_validators_from_quorum(&validator, &prev_era); - let validations_res = shm::get_intermediate_decisions(&data_provider_url, &edge_str, &prev_era, quorum); + let validations_res = shm::get_intermediate_decisions( + &data_provider_url, + &edge_str, + &prev_era, + quorum, + ); log::info!("get_intermediate_decisions result: {:?}", validations_res); @@ -846,7 +859,8 @@ pub mod pallet { let mut payments = vec![]; for bucket in payments_per_bucket.into_iter() { let cere_payment: u32 = (bucket.1 / BYTES_TO_CERE) as u32; - let bucket_info = BucketsDetails {bucket_id: bucket.0, amount: cere_payment.into()}; + let bucket_info = + BucketsDetails { bucket_id: bucket.0, amount: cere_payment.into() }; payments.push(bucket_info); } log::info!("final payments: {:?}", payments); @@ -858,19 +872,21 @@ pub mod pallet { return } // ToDo: replace local call by a call from `ddc-staking` pallet - let _tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = signer.send_signed_transaction(|_account| Call::charge_payments_cdn { - paying_accounts: payments.clone(), - }); + let _tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = + signer.send_signed_transaction(|_account| Call::charge_payments_cdn { + paying_accounts: payments.clone(), + }); let final_res = dac::get_final_decision(validations_res); let signer = Self::get_signer().unwrap(); - let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { - era: current_era, - cdn_node: utils::string_to_account::(edge.clone()), - validation_decision: final_res.clone(), - }); + let tx_res = + signer.send_signed_transaction(|_acct| Call::set_validation_decision { + era: current_era, + cdn_node: utils::string_to_account::(edge.clone()), + validation_decision: final_res.clone(), + }); log::info!("final_res: {:?}", final_res); } diff --git a/pallets/ddc-validator/src/shm.rs b/pallets/ddc-validator/src/shm.rs index ad7990b7f..72c293745 100644 --- a/pallets/ddc-validator/src/shm.rs +++ b/pallets/ddc-validator/src/shm.rs @@ -6,16 +6,16 @@ //! server which we maintain for DAC DataModel. use alloc::{format, string::String}; -pub use sp_std::{collections::btree_map::BTreeMap}; +pub use sp_std::collections::btree_map::BTreeMap; // ToDo: remove String usage +use crate::{dac, utils, ValidationDecision}; +use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use base64::prelude::*; use lite_json::json::JsonValue; +use log::info; use sp_runtime::offchain::{http, Duration}; use sp_staking::EraIndex; use sp_std::prelude::*; -use crate::{dac, utils, ValidationDecision}; -use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; -use log::info; const HTTP_TIMEOUT_MS: u64 = 30_000; @@ -78,11 +78,7 @@ pub fn share_intermediate_validation_result( let url = format!( "{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{}", - shared_memory_webdis_url, - validator, - cdn_node, - era, - url_encoded_json, + shared_memory_webdis_url, validator, cdn_node, era, url_encoded_json, ); log::info!("share_intermediate_validation_result url: {:?}", url); @@ -108,13 +104,21 @@ pub fn share_intermediate_validation_result( Ok(json) } -pub(crate) fn get_intermediate_decisions(data_provider_url: &String, edge: &str, era: &EraIndex, quorum: Vec) -> Vec { +pub(crate) fn get_intermediate_decisions( + data_provider_url: &String, + edge: &str, + era: &EraIndex, + quorum: Vec, +) -> Vec { let url = format!("{}/JSON.GET/ddc:dac:shared:nodes:{}", data_provider_url, era); let response: IntermediateDecisionsWrapper = dac::http_get_json(url.as_str()).unwrap(); - let mut edges_to_validators_decisions: BTreeMap> = serde_json::from_str(&response.json).unwrap(); + let mut edges_to_validators_decisions: BTreeMap< + String, + BTreeMap, + > = serde_json::from_str(&response.json).unwrap(); let decisions_for_edge = IntermediateDecisions { - validators_to_decisions: edges_to_validators_decisions.remove(edge).unwrap() + validators_to_decisions: edges_to_validators_decisions.remove(edge).unwrap(), }; let quorum_decisions = find_quorum_decisions(decisions_for_edge, quorum); @@ -144,7 +148,10 @@ pub(crate) fn decode_intermediate_decisions( decoded_decisions } -pub(crate) fn find_quorum_decisions(all_decisions: IntermediateDecisions, quorum: Vec) -> IntermediateDecisions { +pub(crate) fn find_quorum_decisions( + all_decisions: IntermediateDecisions, + quorum: Vec, +) -> IntermediateDecisions { let mut quorum_decisions: BTreeMap = BTreeMap::new(); for (validator_id, decision) in all_decisions.validators_to_decisions.iter() { if quorum.contains(validator_id) { @@ -152,7 +159,5 @@ pub(crate) fn find_quorum_decisions(all_decisions: IntermediateDecisions, quorum } } - IntermediateDecisions { - validators_to_decisions: quorum_decisions - } + IntermediateDecisions { validators_to_decisions: quorum_decisions } } diff --git a/pallets/ddc-validator/src/utils.rs b/pallets/ddc-validator/src/utils.rs index 93c282d03..709c3aa1a 100644 --- a/pallets/ddc-validator/src/utils.rs +++ b/pallets/ddc-validator/src/utils.rs @@ -36,11 +36,11 @@ pub(crate) fn url_encode(input: &str) -> String { // Unreserved characters (alphanumeric and -_.~) b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'_' | b'.' | b'~' => { encoded.push(byte as char); - } + }, _ => { encoded.push('%'); encoded.push_str(&format!("{:02X}", byte)); - } + }, } } @@ -59,11 +59,11 @@ pub(crate) fn unescape(json: &str) -> String { for _ in 0..5 { chars.next(); } - } + }, _ => { // Skip over the next character chars.next(); - } + }, } } else { result.push(c); From 8a727a978c6df75e34d796d73f4be8435c2b99f1 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 4 Jul 2023 16:24:05 +0600 Subject: [PATCH 175/583] Fix faulty testing --- pallets/ddc-validator/src/mock.rs | 54 ++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index cfbd37992..10ff240cf 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -4,6 +4,7 @@ use frame_support::{ parameter_types, traits::{ConstU16, ConstU64, Currency, Everything, Nothing, U128CurrencyToVote}, weights::Weight, + PalletId, }; use frame_system::{offchain::SendTransactionTypes, EnsureRoot}; use pallet_contracts as contracts; @@ -40,6 +41,7 @@ frame_support::construct_runtime!( Timestamp: pallet_timestamp, Session: pallet_session, Staking: pallet_staking, + DdcAccounts: pallet_ddc_accounts, DdcStaking: pallet_ddc_staking, RandomnessCollectiveFlip: pallet_randomness_collective_flip, DdcValidator: pallet_ddc_validator, @@ -48,7 +50,7 @@ frame_support::construct_runtime!( parameter_types! { pub const BlockHashCount: BlockNumber = 250; - pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockWeight: Weight = Weight::from_ref_time(1024); pub const MaximumBlockLength: u32 = 2 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::one(); } @@ -106,22 +108,27 @@ impl Convert for TestWeightToFee { } impl contracts::Config for Test { - type Time = Timestamp; - type Randomness = RandomnessCollectiveFlip; - type Currency = Balances; - type Event = Event; + type AddressGenerator = pallet_contracts::DefaultAddressGenerator; + type Call = Call; + type CallFilter = Nothing; type CallStack = [pallet_contracts::Frame; 31]; - type WeightPrice = TestWeightToFee; //pallet_transaction_payment::Module; - type WeightInfo = (); type ChainExtension = (); + // type ContractAccessWeight = pallet_contracts::DefaultContractAccessWeight; + type ContractAccessWeight = (); + type Currency = Balances; type DeletionQueueDepth = (); type DeletionWeightLimit = (); - type Schedule = Schedule; - type Call = Call; - type CallFilter = Nothing; type DepositPerByte = DepositPerByte; type DepositPerItem = DepositPerItem; - type AddressGenerator = pallet_contracts::DefaultAddressGenerator; + type Event = Event; + type MaxCodeLen = ConstU32<{ 128 * 1024 }>; + type MaxStorageKeyLen = ConstU32<128>; + type Randomness = RandomnessCollectiveFlip; + type RelaxedMaxCodeLen = ConstU32<{ 256 * 1024 }>; + type Schedule = Schedule; + type Time = Timestamp; + type WeightInfo = (); + type WeightPrice = (); } parameter_types! { @@ -236,10 +243,35 @@ impl pallet_staking::Config for Test { type OnStakerSlash = (); } +parameter_types! { + pub const DdcAccountsPalletId: PalletId = PalletId(*b"accounts"); +} + +impl pallet_ddc_accounts::Config for Test { + type BondingDuration = BondingDuration; + type Currency = Balances; + type Event = Event; + type PalletId = DdcAccountsPalletId; + type TimeProvider = pallet_timestamp::Pallet; +} + +parameter_types! { + pub const DefaultEdgeBondSize: Balance = 100; + pub const DefaultEdgeChillDelay: EraIndex = 2; + pub const DefaultStorageBondSize: Balance = 100; + pub const DefaultStorageChillDelay: EraIndex = 2; +} + impl pallet_ddc_staking::Config for Test { type BondingDuration = BondingDuration; type Currency = Balances; + type DefaultEdgeBondSize = DefaultEdgeBondSize; + type DefaultEdgeChillDelay = DefaultEdgeChillDelay; + type DefaultStorageBondSize = DefaultStorageBondSize; + type DefaultStorageChillDelay = DefaultStorageChillDelay; type Event = Event; + type StakersPayoutSource = DdcAccountsPalletId; + type UnixTime = Timestamp; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; } From 7ce7022b7fa485a3eb6f56474d03c25aa29b8737 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 4 Jul 2023 17:28:45 +0600 Subject: [PATCH 176/583] Remove comment line --- pallets/ddc-validator/src/mock.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index 10ff240cf..58f2cc4bf 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -113,7 +113,6 @@ impl contracts::Config for Test { type CallFilter = Nothing; type CallStack = [pallet_contracts::Frame; 31]; type ChainExtension = (); - // type ContractAccessWeight = pallet_contracts::DefaultContractAccessWeight; type ContractAccessWeight = (); type Currency = Balances; type DeletionQueueDepth = (); From 51c053d8d2ab9dbdd40e3be8e63e91dd4ea488b8 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 5 Jul 2023 14:04:29 +0600 Subject: [PATCH 177/583] Add job assignment related comments --- pallets/ddc-validator/src/lib.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 9651eb0a7..afefb4aea 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -199,6 +199,7 @@ pub mod pallet { type ValidationThreshold: Get; } + /// The map from the era and validator stash key to the list of CDN nodes to validate. #[pallet::storage] #[pallet::getter(fn assignments)] pub(super) type Assignments = @@ -655,6 +656,7 @@ pub mod pallet { } } + /// Shuffle the `list` swapping it's random elements `list.len()` times. fn shuffle(mut list: Vec) -> Vec { let len = list.len(); for i in 1..len { @@ -665,6 +667,10 @@ pub mod pallet { list } + /// Split the `list` to several chunks `segment_len` length each. + /// + /// The very last chunk will be shorter than `segment_len` if `list.len()` is not divisible + /// by `segment_len`. fn split(list: Vec, segment_len: usize) -> Vec> { let mut result: Vec> = Vec::new(); @@ -681,6 +687,10 @@ pub mod pallet { result } + /// Assign which CDN nodes data each validator shall process. + /// + /// Each CDN node is assigned to `quorum_size` validators randomly picked from the validator + /// set. fn assign(quorum_size: usize, era: EraIndex) { let validators: Vec = >::iter_keys().collect(); log::info!("current validators: {:?}", validators); @@ -700,12 +710,17 @@ pub mod pallet { .map(|v| utils::account_to_string::(v.clone())) .collect(); + // Create several groups of validators and edges, both group types contain the same + // `quorum_size` number of participants. let quorums = Self::split(validators_keys, quorum_size); let edges_groups = Self::split(shuffled_edges, quorum_size); info!("quorums: {:?}", quorums); info!("edges_groups: {:?}", edges_groups); + // Write an assignment to each validator in each quorum. If the number of edges groups + // in higher than the number of validators groups, remaining CDN nodes will not be + // assigned to any validator. for (i, quorum) in quorums.iter().enumerate() { let edges_group = &edges_groups[i]; for validator in quorum { From b581671359b9ddeab3c04b49f03772d75fe5e288 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 5 Jul 2023 16:48:59 +0600 Subject: [PATCH 178/583] Fix validation job assignment --- pallets/ddc-validator/src/lib.rs | 34 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index afefb4aea..fd7f970a1 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -32,7 +32,7 @@ pub use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; pub use codec::{Decode, Encode, HasCompact, MaxEncodedLen}; pub use core::fmt::Debug; pub use frame_support::{ - decl_event, decl_module, decl_storage, + decl_event, decl_module, decl_storage, defensive, dispatch::DispatchResult, pallet_prelude::*, parameter_types, storage, @@ -710,26 +710,26 @@ pub mod pallet { .map(|v| utils::account_to_string::(v.clone())) .collect(); - // Create several groups of validators and edges, both group types contain the same - // `quorum_size` number of participants. + // Create several groups of validators `quorum_size` length each. let quorums = Self::split(validators_keys, quorum_size); - let edges_groups = Self::split(shuffled_edges, quorum_size); - - info!("quorums: {:?}", quorums); - info!("edges_groups: {:?}", edges_groups); - - // Write an assignment to each validator in each quorum. If the number of edges groups - // in higher than the number of validators groups, remaining CDN nodes will not be - // assigned to any validator. - for (i, quorum) in quorums.iter().enumerate() { - let edges_group = &edges_groups[i]; - for validator in quorum { - Assignments::::insert( + + // Write an assignment to each validator in each quorum. The difference between the + // number of edges assigned to each validator is not higher then 1. If the number of + // edges is less then the number of quorums, some quorums will not have any edges + // assigned. + let mut quorums_cycle = quorums.iter().cycle(); + for edge in shuffled_edges { + let Some(quorum_validators) = quorums_cycle.next() else { + defensive!("unexpectedly ran out of quorums"); + return + }; + quorum_validators.iter().for_each(|validator| { + Assignments::::append( era, utils::string_to_account::(validator.clone()), - edges_group, + edge.clone(), ); - } + }); } } From 7d9bfacd3728468f9571e909d92ad40e234d7422 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 5 Jul 2023 17:20:40 +0600 Subject: [PATCH 179/583] Fix to assign validation tasks once per DDC era --- pallets/ddc-validator/src/lib.rs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index fd7f970a1..98a561f6f 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -256,19 +256,13 @@ pub mod pallet { let era = Self::get_current_era(); log::info!("current era: {:?}", era); - match >::get() { - Some(last_managed_era) => - if last_managed_era > era { - return Weight::from_ref_time(0) - } else { - Self::assign(3usize, era + 1); - >::put(era); - }, - None => { + match Self::last_managed_era() { + Some(last_managed_era) if era <= last_managed_era => (), + _ => { Self::assign(3usize, era); >::put(era); }, - } + }; Weight::from_ref_time(0) } From 54a1cdc0965b1281422bfe9586459f824c41ee62 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 5 Jul 2023 16:53:53 +0200 Subject: [PATCH 180/583] update redis url --- pallets/ddc-staking/src/lib.rs | 2 +- pallets/ddc-validator/src/dac.rs | 74 +++++++++++++++++------ pallets/ddc-validator/src/lib.rs | 100 +++++++++++++++++++++++-------- 3 files changed, 132 insertions(+), 44 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 09f92641c..7717261c5 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -838,7 +838,7 @@ pub mod pallet { } impl Pallet { - pub(super) fn do_payout_stakers(era: EraIndex) -> DispatchResult { + pub fn do_payout_stakers(era: EraIndex) -> DispatchResult { // ToDo: check that the era is finished // ToDo: check reward points are set diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index 63244a6e2..29fea51b5 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -48,7 +48,7 @@ pub struct BytesSent { pub sum: u32, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct FileRequestWrapper { @@ -56,7 +56,32 @@ pub struct FileRequestWrapper { json: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct CDNNodeAggregates { + aggregate: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct CDNNodeAggregate { + total_bytes_sent: u64, + total_queries: u64, + total_reads: u64, + total_reads_acked: u64, + total_queries_acked: u64, + average_response_time_ms: f64, + total_bytes_received: u64, + pub request_ids: Vec, + total_writes_acked: u64, + average_response_time_ms_samples: u64, + total_writes: u64, +} + + +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct FileRequests { @@ -65,11 +90,11 @@ pub struct FileRequests { pub type Requests = BTreeMap; -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct FileRequest { - file_request_id: String, + pub file_request_id: String, file_info: FileInfo, bucket_id: u128, timestamp: u64, @@ -77,7 +102,7 @@ pub struct FileRequest { user_public_key: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct Chunk { @@ -86,46 +111,50 @@ pub struct Chunk { ack: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct Ack { - bytes_received: u64, user_timestamp: u64, nonce: String, - node_public_key: String, + signature: Option, + aggregated: u64, user_public_key: String, - signature: String, + bytes_received: u64, + requested_chunk_cids: Vec, + node_public_key: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct Log { #[serde(rename = "type")] log_type: u64, - session_id: String, + signature: Option, + aggregated: u64, user_public_key: String, era: u64, + bucket_id: u128, user_address: String, bytes_sent: u64, timestamp: u64, node_public_key: String, - signature: String, - bucket_id: u128, + session_id: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct FileInfo { #[serde(rename = "chunkCids")] - chunk_cids: Vec, + chunk_cids: Vec , #[serde(rename = "requestedChunkCids")] requested_chunk_cids: Vec, } + type EdgeId = String; type ValidatorId = String; @@ -366,14 +395,23 @@ fn get_file_request_url(data_provider_url: &String) -> String { res } -pub(crate) fn fetch_file_request(url: &String) -> Requests { +pub(crate) fn fetch_cdn_node_aggregates_request(url: &String) -> Vec { log::info!("fetch_file_request | url: {:?}", url); let response: FileRequestWrapper = http_get_json(&url).unwrap(); - let value: Value = serde_json::from_str(response.json.as_str()).unwrap(); - let map: Requests = serde_json::from_value(value).unwrap(); + log::info!("response.json: {:?}", response.json); + let map: Vec = serde_json::from_str(response.json.as_str()).unwrap(); + // log::info!("response.json: {:?}", response.json); + map +} + +pub(crate) fn fetch_file_request(url: &String) -> FileRequest { + log::info!("fetch_file_request | url: {:?}", url); + let response: FileRequestWrapper = http_get_json(&url).unwrap(); log::info!("response.json: {:?}", response.json); + let map: FileRequest = serde_json::from_str(response.json.as_str()).unwrap(); + map } diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 98a561f6f..7b52b0738 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -78,7 +78,7 @@ pub const BYTES_TO_CERE: u64 = 1; // this should have a logic built on top and a /// Webdis in experimental cluster connected to Redis in dev. // pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; -pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; +pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://redis:6379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; pub const QUORUM_SIZE: usize = 1; @@ -567,6 +567,38 @@ pub mod pallet { Ok(()) } + #[pallet::weight(100_000)] + pub fn charge_payments_content_owners( + origin: OriginFor, + paying_accounts: Vec>>, + ) -> DispatchResult { + let controller = ensure_signed(origin)?; + // ensure!( + // OffchainWorkerKeys::::contains_key(&controller), + // Error::::OCWKeyNotRegistered + // ); + + >::charge_payments_new(paying_accounts); + + Ok(()) + } + + #[pallet::weight(100_000)] + pub fn payout_cdn_owners( + origin: OriginFor, + era: EraIndex, + ) -> DispatchResult { + let controller = ensure_signed(origin)?; + // ensure!( + // OffchainWorkerKeys::::contains_key(&controller), + // Error::::OCWKeyNotRegistered + // ); + + >::do_payout_stakers(era); + + Ok(()) + } + #[pallet::weight(100_000)] pub fn set_ocw_key(origin: OriginFor, ocw_pub: T::AccountId) -> DispatchResult { let controller = ensure_signed(origin)?; @@ -603,7 +635,7 @@ pub mod pallet { fn get_mock_data_url() -> String { let data_url = Self::get_data_provider_url(); - let mock_url = "/JSON.GET/testddc:dac:data"; + let mock_url = "/JSON.GET/"; let url = format!("{}{}", data_url, mock_url); url @@ -800,16 +832,38 @@ pub mod pallet { info!("assigned_edges: {:?}", assigned_edges); for assigned_edge in assigned_edges.iter() { + info!("assigned edge: {:?}", assigned_edge); + + // form url for each node + let edge_url = format!("{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:132855/$.", utils::account_to_string::(assigned_edge.clone())); + info!("edge url: {:?}", edge_url); + + let node_aggregates = dac::fetch_cdn_node_aggregates_request(&edge_url); + info!("node aggregates: {:?}", node_aggregates); + + // No data for node + if (node_aggregates.len() == 0) { + continue + } + + let request_ids = &node_aggregates[0].request_ids; + info!("request_ids: {:?}", request_ids); + // Store bucket payments let payments_per_bucket = &mut Vec::new(); - let file_request = dac::fetch_file_request(&mock_data_url); - dac::get_acknowledged_bytes_bucket(&file_request, payments_per_bucket); - let (bytes_sent, bytes_received) = dac::get_served_bytes_sum(&file_request); + let requests = &mut dac::Requests::new(); + for request_id in request_ids.iter() { + let request_id_url = format!("{}{}{}", mock_data_url, "ddc:dac:data:file:", request_id.clone()); + let file_request = dac::fetch_file_request(&request_id_url); + requests.insert(file_request.file_request_id.clone(), file_request.clone()); + } + dac::get_acknowledged_bytes_bucket(&requests, payments_per_bucket); + let (bytes_sent, bytes_received) = dac::get_served_bytes_sum(&requests); let is_valid = Self::is_valid(bytes_sent, bytes_received); info!("bytes_sent, bytes_received: {:?}, {:?}", bytes_sent, bytes_received); - let payload = serde_json::to_string(&file_request).unwrap(); + let payload = serde_json::to_string(&requests).unwrap(); let decision = ValidationDecision { edge: utils::account_to_string::(assigned_edge.clone()), result: is_valid, @@ -853,12 +907,7 @@ pub mod pallet { let edge = utils::account_to_string::(assigned_edge.clone()); let prev_era = (current_era - 1) as EraIndex; let quorum = Self::find_validators_from_quorum(&validator, &prev_era); - let validations_res = shm::get_intermediate_decisions( - &data_provider_url, - &edge_str, - &prev_era, - quorum, - ); + let validations_res = shm::get_intermediate_decisions(&data_provider_url, &edge_str, &prev_era, quorum); log::info!("get_intermediate_decisions result: {:?}", validations_res); @@ -868,8 +917,7 @@ pub mod pallet { let mut payments = vec![]; for bucket in payments_per_bucket.into_iter() { let cere_payment: u32 = (bucket.1 / BYTES_TO_CERE) as u32; - let bucket_info = - BucketsDetails { bucket_id: bucket.0, amount: cere_payment.into() }; + let bucket_info = BucketsDetails {bucket_id: bucket.0, amount: cere_payment.into()}; payments.push(bucket_info); } log::info!("final payments: {:?}", payments); @@ -881,21 +929,23 @@ pub mod pallet { return } // ToDo: replace local call by a call from `ddc-staking` pallet - let _tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = - signer.send_signed_transaction(|_account| Call::charge_payments_cdn { - paying_accounts: payments.clone(), - }); - + let _tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = signer.send_signed_transaction(|_account| Call::charge_payments_content_owners { + paying_accounts: payments.clone(), + }); + + let _payout_tx_res = signer.send_signed_transaction(|_account| Call::payout_cdn_owners { + era: current_era, + }); + let final_res = dac::get_final_decision(validations_res); let signer = Self::get_signer().unwrap(); - let tx_res = - signer.send_signed_transaction(|_acct| Call::set_validation_decision { - era: current_era, - cdn_node: utils::string_to_account::(edge.clone()), - validation_decision: final_res.clone(), - }); + let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { + era: current_era, + cdn_node: utils::string_to_account::(edge.clone()), + validation_decision: final_res.clone(), + }); log::info!("final_res: {:?}", final_res); } From 7bbbe836463dea85bc03cf5959fc371a7135c8c5 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 5 Jul 2023 17:02:03 +0200 Subject: [PATCH 181/583] update validator --- pallets/ddc-validator/src/dac.rs | 90 +++++++++++++++++++++++++------- pallets/ddc-validator/src/lib.rs | 63 ++++++++++++++++------ 2 files changed, 117 insertions(+), 36 deletions(-) diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index dd1ec370b..1c721a937 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -5,8 +5,9 @@ use alloc::{format, string::String}; // ToDo: remove String usage use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use codec::{Decode, Encode}; use lite_json::json::JsonValue; +use lite_json::json_parser::parse_json; use log::info; -use serde_json::Value; +use serde_json::{Value, Map}; use sp_runtime::{ generic::Era, offchain::{ @@ -48,7 +49,7 @@ pub struct BytesSent { pub sum: u32, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct FileRequestWrapper { @@ -56,7 +57,32 @@ pub struct FileRequestWrapper { json: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct CDNNodeAggregates { + aggregate: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(crate = "alt_serde")] +#[serde(rename_all = "camelCase")] +pub struct CDNNodeAggregate { + total_bytes_sent: u64, + total_queries: u64, + total_reads: u64, + total_reads_acked: u64, + total_queries_acked: u64, + average_response_time_ms: f64, + total_bytes_received: u64, + pub request_ids: Vec, + total_writes_acked: u64, + average_response_time_ms_samples: u64, + total_writes: u64, +} + + +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct FileRequests { @@ -65,11 +91,11 @@ pub struct FileRequests { pub type Requests = BTreeMap; -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct FileRequest { - file_request_id: String, + pub file_request_id: String, file_info: FileInfo, bucket_id: u128, timestamp: u64, @@ -77,7 +103,7 @@ pub struct FileRequest { user_public_key: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct Chunk { @@ -86,41 +112,44 @@ pub struct Chunk { ack: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct Ack { - bytes_received: u64, user_timestamp: u64, nonce: String, - node_public_key: String, + signature: Option, + aggregated: u64, user_public_key: String, - signature: String, + bytes_received: u64, + requested_chunk_cids: Vec, + node_public_key: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct Log { #[serde(rename = "type")] log_type: u64, - session_id: String, + signature: Option, + aggregated: u64, user_public_key: String, era: u64, + bucket_id: u128, user_address: String, bytes_sent: u64, timestamp: u64, node_public_key: String, - signature: String, - bucket_id: u128, + session_id: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct FileInfo { #[serde(rename = "chunkCids")] - chunk_cids: Vec, + chunk_cids: Vec , #[serde(rename = "requestedChunkCids")] requested_chunk_cids: Vec, @@ -364,14 +393,23 @@ fn get_file_request_url(data_provider_url: &String) -> String { res } -pub(crate) fn fetch_file_request(url: &String) -> Requests { +pub(crate) fn fetch_cdn_node_aggregates_request(url: &String) -> Vec { log::info!("fetch_file_request | url: {:?}", url); let response: FileRequestWrapper = http_get_json(&url).unwrap(); - let value: Value = serde_json::from_str(response.json.as_str()).unwrap(); - let map: Requests = serde_json::from_value(value).unwrap(); + log::info!("response.json: {:?}", response.json); + let map: Vec = serde_json::from_str(response.json.as_str()).unwrap(); + // log::info!("response.json: {:?}", response.json); + + map +} +pub(crate) fn fetch_file_request(url: &String) -> FileRequest { + log::info!("fetch_file_request | url: {:?}", url); + let response: FileRequestWrapper = http_get_json(&url).unwrap(); log::info!("response.json: {:?}", response.json); + let map: FileRequest = serde_json::from_str(response.json.as_str()).unwrap(); + map } @@ -450,6 +488,20 @@ pub(crate) fn http_get_json(url: &str) -> crate::ResultSt parsed } +// pub(crate) fn http_get_json_lite(url: &str) -> crate::ResultStr { +// let body = http_get_request(url).map_err(|err| { +// log::error!("[DAC Validator] Error while getting {}: {:?}", url, err); +// "HTTP GET error" +// })?; + +// let parsed = serde_json::from_slice(&body).map_err(|err| { +// log::warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); +// "HTTP JSON parse error" +// }); + +// parsed +// } + fn http_get_request(http_url: &str) -> Result, http::Error> { // log::info!("[DAC Validator] Sending request to: {:?}", http_url); diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index cd92bcbf1..a521840c5 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -78,7 +78,7 @@ pub const BYTES_TO_CERE: u64 = 1; // this should have a logic built on top and a /// Webdis in experimental cluster connected to Redis in dev. // pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; -pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; +pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://redis:6379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; pub const QUORUM_SIZE: usize = 1; @@ -244,17 +244,21 @@ pub mod pallet { let era = Self::get_current_era(); log::info!("current era: {:?}", era); - match >::get(){ + match >::get() { Some(last_managed_era) => { if last_managed_era > era { return 0 } else { - Self::assign(3usize, era + 1); + log::info!("Assigned era again: {:?}", era); + + Self::assign(1usize, era - 1); >::put(era); } } None => { - Self::assign(3usize, era); + log::info!("Assigned era the first time: {:?}", era); + + Self::assign(1usize, era - 1); >::put(era); } } @@ -552,10 +556,10 @@ pub mod pallet { paying_accounts: Vec>>, ) -> DispatchResult { let controller = ensure_signed(origin)?; - ensure!( - OffchainWorkerKeys::::contains_key(&controller), - Error::::OCWKeyNotRegistered - ); + // ensure!( + // OffchainWorkerKeys::::contains_key(&controller), + // Error::::OCWKeyNotRegistered + // ); >::charge_payments_new(paying_accounts); @@ -568,10 +572,10 @@ pub mod pallet { era: EraIndex, ) -> DispatchResult { let controller = ensure_signed(origin)?; - ensure!( - OffchainWorkerKeys::::contains_key(&controller), - Error::::OCWKeyNotRegistered - ); + // ensure!( + // OffchainWorkerKeys::::contains_key(&controller), + // Error::::OCWKeyNotRegistered + // ); >::do_payout_stakers(era); @@ -617,7 +621,7 @@ pub mod pallet { fn get_mock_data_url() -> String { let data_url = Self::get_data_provider_url(); - let mock_url = "/JSON.GET/testddc:dac:data"; + let mock_url = "/JSON.GET/"; let url = format!("{}{}", data_url, mock_url); url @@ -716,7 +720,10 @@ pub mod pallet { for (i, quorum) in quorums.iter().enumerate() { let edges_group = &edges_groups[i]; + for validator in quorum { + info!("edges_groups to be assigned {:?} for validator {:?}", edges_groups.clone(), validator.clone()); + Assignments::::insert( era, utils::string_to_account::(validator.clone()), @@ -798,16 +805,38 @@ pub mod pallet { info!("assigned_edges: {:?}", assigned_edges); for assigned_edge in assigned_edges.iter() { + info!("assigned edge: {:?}", assigned_edge); + + // form url for each node + let edge_url = format!("{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:132855/$.", utils::account_to_string::(assigned_edge.clone())); + info!("edge url: {:?}", edge_url); + + let node_aggregates = dac::fetch_cdn_node_aggregates_request(&edge_url); + info!("node aggregates: {:?}", node_aggregates); + + // No data for node + if (node_aggregates.len() == 0) { + continue + } + + let request_ids = &node_aggregates[0].request_ids; + info!("request_ids: {:?}", request_ids); + // Store bucket payments let payments_per_bucket = &mut Vec::new(); - let file_request = dac::fetch_file_request(&mock_data_url); - dac::get_acknowledged_bytes_bucket(&file_request, payments_per_bucket); - let (bytes_sent, bytes_received) = dac::get_served_bytes_sum(&file_request); + let requests = &mut dac::Requests::new(); + for request_id in request_ids.iter() { + let request_id_url = format!("{}{}{}", mock_data_url, "ddc:dac:data:file:", request_id.clone()); + let file_request = dac::fetch_file_request(&request_id_url); + requests.insert(file_request.file_request_id.clone(), file_request.clone()); + } + dac::get_acknowledged_bytes_bucket(&requests, payments_per_bucket); + let (bytes_sent, bytes_received) = dac::get_served_bytes_sum(&requests); let is_valid = Self::is_valid(bytes_sent, bytes_received); info!("bytes_sent, bytes_received: {:?}, {:?}", bytes_sent, bytes_received); - let payload = serde_json::to_string(&file_request).unwrap(); + let payload = serde_json::to_string(&requests).unwrap(); let decision = ValidationDecision { edge: utils::account_to_string::(assigned_edge.clone()), result: is_valid, From 570878ad76863dd30f9542cf117e9a45980389ae Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 5 Jul 2023 19:47:13 +0200 Subject: [PATCH 182/583] update job assignment --- pallets/ddc-validator/src/lib.rs | 53 +++++++++++++------------------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index a521840c5..193549d81 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -32,7 +32,7 @@ pub use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; pub use codec::{Decode, Encode, HasCompact, MaxEncodedLen}; pub use core::fmt::Debug; pub use frame_support::{ - decl_event, decl_module, decl_storage, + decl_event, decl_module, decl_storage, defensive, dispatch::DispatchResult, pallet_prelude::*, parameter_types, storage, @@ -244,24 +244,13 @@ pub mod pallet { let era = Self::get_current_era(); log::info!("current era: {:?}", era); - match >::get() { - Some(last_managed_era) => { - if last_managed_era > era { - return 0 - } else { - log::info!("Assigned era again: {:?}", era); - - Self::assign(1usize, era - 1); - >::put(era); - } - } - None => { - log::info!("Assigned era the first time: {:?}", era); - - Self::assign(1usize, era - 1); + match Self::last_managed_era() { + Some(last_managed_era) if era <= last_managed_era => (), + _ => { + Self::assign(3usize, era); >::put(era); - } - } + }, + }; 0 } @@ -712,24 +701,26 @@ pub mod pallet { .map(|v| utils::account_to_string::(v.clone())) .collect(); + // Create several groups of validators `quorum_size` length each. let quorums = Self::split(validators_keys, quorum_size); - let edges_groups = Self::split(shuffled_edges, quorum_size); - - info!("quorums: {:?}", quorums); - info!("edges_groups: {:?}", edges_groups); - - for (i, quorum) in quorums.iter().enumerate() { - let edges_group = &edges_groups[i]; - - for validator in quorum { - info!("edges_groups to be assigned {:?} for validator {:?}", edges_groups.clone(), validator.clone()); - Assignments::::insert( + // Write an assignment to each validator in each quorum. The difference between the + // number of edges assigned to each validator is not higher then 1. If the number of + // edges is less then the number of quorums, some quorums will not have any edges + // assigned. + let mut quorums_cycle = quorums.iter().cycle(); + for edge in shuffled_edges { + let Some(quorum_validators) = quorums_cycle.next() else { + defensive!("unexpectedly ran out of quorums"); + return + }; + quorum_validators.iter().for_each(|validator| { + Assignments::::append( era, utils::string_to_account::(validator.clone()), - edges_group, + edge.clone(), ); - } + }); } } From c722ffe88d6fa95ce828745c0f115dab8c2ee0ed Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 5 Jul 2023 21:27:48 +0200 Subject: [PATCH 183/583] fix url bug --- pallets/ddc-validator/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 193549d81..bdc89cc72 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -78,7 +78,7 @@ pub const BYTES_TO_CERE: u64 = 1; // this should have a logic built on top and a /// Webdis in experimental cluster connected to Redis in dev. // pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; -pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://redis:6379"; +pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; pub const QUORUM_SIZE: usize = 1; @@ -781,7 +781,7 @@ pub mod pallet { } fn validate_edges() { - let current_era = Self::get_current_era(); + let current_era = Self::get_current_era() - 1; let mock_data_url = Self::get_mock_data_url(); let data_provider_url = Self::get_data_provider_url(); @@ -799,7 +799,7 @@ pub mod pallet { info!("assigned edge: {:?}", assigned_edge); // form url for each node - let edge_url = format!("{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:132855/$.", utils::account_to_string::(assigned_edge.clone())); + let edge_url = format!("{}{}{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:", current_era, "/$.", utils::account_to_string::(assigned_edge.clone())); info!("edge url: {:?}", edge_url); let node_aggregates = dac::fetch_cdn_node_aggregates_request(&edge_url); From 6dfb42405a3bcd2ab4c8c5d1b80ec4ceb6590545 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 5 Jul 2023 22:07:37 +0200 Subject: [PATCH 184/583] use webdis --- pallets/ddc-validator/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index bdc89cc72..c2ade8670 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -78,7 +78,7 @@ pub const BYTES_TO_CERE: u64 = 1; // this should have a logic built on top and a /// Webdis in experimental cluster connected to Redis in dev. // pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; -pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; +pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://webdis:7379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; pub const QUORUM_SIZE: usize = 1; From 4b4a303b07adbd5a9ffb811537bc2e7b280a41e4 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 6 Jul 2023 13:36:34 +0600 Subject: [PATCH 185/583] Produce tasks assignment for the next era --- pallets/ddc-validator/src/lib.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 7b52b0738..6e314ffb6 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -256,11 +256,12 @@ pub mod pallet { let era = Self::get_current_era(); log::info!("current era: {:?}", era); + // Produce an assignment for the next era if it's not produced yet. match Self::last_managed_era() { - Some(last_managed_era) if era <= last_managed_era => (), + Some(last_managed_era) if era < last_managed_era => (), _ => { - Self::assign(3usize, era); - >::put(era); + Self::assign(3usize, era + 1); + >::put(era + 1); }, }; From fe90373ef6eb7983a8f94969b79f0ec19465569c Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 6 Jul 2023 16:58:40 +0600 Subject: [PATCH 186/583] Autoformat `pallet-ddc-validator` files --- pallets/ddc-validator/src/dac.rs | 6 ++-- pallets/ddc-validator/src/lib.rs | 57 ++++++++++++++++++++------------ 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index 29fea51b5..ed77c84eb 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -60,7 +60,7 @@ pub struct FileRequestWrapper { #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct CDNNodeAggregates { - aggregate: Vec, + aggregate: Vec, } #[derive(Serialize, Deserialize, Debug, Clone)] @@ -80,7 +80,6 @@ pub struct CDNNodeAggregate { total_writes: u64, } - #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] @@ -148,13 +147,12 @@ pub struct Log { #[serde(rename_all = "camelCase")] pub struct FileInfo { #[serde(rename = "chunkCids")] - chunk_cids: Vec , + chunk_cids: Vec, #[serde(rename = "requestedChunkCids")] requested_chunk_cids: Vec, } - type EdgeId = String; type ValidatorId = String; diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 6e314ffb6..bdce4eee7 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -578,24 +578,21 @@ pub mod pallet { // OffchainWorkerKeys::::contains_key(&controller), // Error::::OCWKeyNotRegistered // ); - - >::charge_payments_new(paying_accounts); + + >::charge_payments_new(paying_accounts); Ok(()) } #[pallet::weight(100_000)] - pub fn payout_cdn_owners( - origin: OriginFor, - era: EraIndex, - ) -> DispatchResult { + pub fn payout_cdn_owners(origin: OriginFor, era: EraIndex) -> DispatchResult { let controller = ensure_signed(origin)?; // ensure!( // OffchainWorkerKeys::::contains_key(&controller), // Error::::OCWKeyNotRegistered // ); - >::do_payout_stakers(era); + >::do_payout_stakers(era); Ok(()) } @@ -836,7 +833,12 @@ pub mod pallet { info!("assigned edge: {:?}", assigned_edge); // form url for each node - let edge_url = format!("{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:132855/$.", utils::account_to_string::(assigned_edge.clone())); + let edge_url = format!( + "{}{}{}", + mock_data_url, + "ddc:dac:aggregation:nodes:132855/$.", + utils::account_to_string::(assigned_edge.clone()) + ); info!("edge url: {:?}", edge_url); let node_aggregates = dac::fetch_cdn_node_aggregates_request(&edge_url); @@ -854,7 +856,8 @@ pub mod pallet { let payments_per_bucket = &mut Vec::new(); let requests = &mut dac::Requests::new(); for request_id in request_ids.iter() { - let request_id_url = format!("{}{}{}", mock_data_url, "ddc:dac:data:file:", request_id.clone()); + let request_id_url = + format!("{}{}{}", mock_data_url, "ddc:dac:data:file:", request_id.clone()); let file_request = dac::fetch_file_request(&request_id_url); requests.insert(file_request.file_request_id.clone(), file_request.clone()); } @@ -908,7 +911,12 @@ pub mod pallet { let edge = utils::account_to_string::(assigned_edge.clone()); let prev_era = (current_era - 1) as EraIndex; let quorum = Self::find_validators_from_quorum(&validator, &prev_era); - let validations_res = shm::get_intermediate_decisions(&data_provider_url, &edge_str, &prev_era, quorum); + let validations_res = shm::get_intermediate_decisions( + &data_provider_url, + &edge_str, + &prev_era, + quorum, + ); log::info!("get_intermediate_decisions result: {:?}", validations_res); @@ -918,7 +926,8 @@ pub mod pallet { let mut payments = vec![]; for bucket in payments_per_bucket.into_iter() { let cere_payment: u32 = (bucket.1 / BYTES_TO_CERE) as u32; - let bucket_info = BucketsDetails {bucket_id: bucket.0, amount: cere_payment.into()}; + let bucket_info = + BucketsDetails { bucket_id: bucket.0, amount: cere_payment.into() }; payments.push(bucket_info); } log::info!("final payments: {:?}", payments); @@ -930,23 +939,27 @@ pub mod pallet { return } // ToDo: replace local call by a call from `ddc-staking` pallet - let _tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = signer.send_signed_transaction(|_account| Call::charge_payments_content_owners { - paying_accounts: payments.clone(), + let _tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = + signer.send_signed_transaction(|_account| { + Call::charge_payments_content_owners { + paying_accounts: payments.clone(), + } + }); + + let _payout_tx_res = signer.send_signed_transaction(|_account| { + Call::payout_cdn_owners { era: current_era } }); - let _payout_tx_res = signer.send_signed_transaction(|_account| Call::payout_cdn_owners { - era: current_era, - }); - let final_res = dac::get_final_decision(validations_res); let signer = Self::get_signer().unwrap(); - let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { - era: current_era, - cdn_node: utils::string_to_account::(edge.clone()), - validation_decision: final_res.clone(), - }); + let tx_res = + signer.send_signed_transaction(|_acct| Call::set_validation_decision { + era: current_era, + cdn_node: utils::string_to_account::(edge.clone()), + validation_decision: final_res.clone(), + }); log::info!("final_res: {:?}", final_res); } From f9a49812ff6243810d4fb19bf4c46bbddb24d5d2 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 6 Jul 2023 17:00:21 +0600 Subject: [PATCH 187/583] Run validation once per DDC era --- pallets/ddc-validator/src/lib.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index bdce4eee7..dd0f4e2e9 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -69,6 +69,10 @@ type BalanceOf = <::Currency as Currency< type ResultStr = Result; +/// Offchain local storage key that holds the last era in which the validator completed its +/// assignment. +const LAST_VALIDATED_ERA_KEY: &[u8; 40] = b"pallet-ddc-validator::last_validated_era"; + pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); pub const TIME_START_MS: u128 = 1_672_531_200_000; @@ -274,8 +278,19 @@ pub mod pallet { return } + let last_validated_era_storage = StorageValueRef::persistent(LAST_VALIDATED_ERA_KEY); + let last_validated_era = match last_validated_era_storage.get::() { + Ok(Some(last_validated_era)) => last_validated_era, + _ => 0, // let's consider an absent or undecodable data as we never did a validation + }; + let current_era = Self::get_current_era(); - let last_managed_era = Self::last_managed_era().unwrap_or(0); + + // Skip if the validation is already complete for the era. + if current_era <= last_validated_era { + return + } + let data_provider_url = Self::get_data_provider_url(); log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); From ef10b57b15adc8f025c961da9d2cd413e226c8fb Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 6 Jul 2023 17:06:08 +0600 Subject: [PATCH 188/583] Fix duplicate validation start each block --- pallets/ddc-validator/src/lib.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index dd0f4e2e9..2be7a3022 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -56,7 +56,9 @@ pub use scale_info::TypeInfo; pub use serde_json::Value; pub use sp_core::crypto::{AccountId32, KeyTypeId, UncheckedFrom}; pub use sp_io::crypto::sr25519_public_keys; -pub use sp_runtime::offchain::{http, storage::StorageValueRef, Duration, Timestamp}; +pub use sp_runtime::offchain::{ + http, storage::StorageValueRef, storage_lock, storage_lock::StorageLock, Duration, Timestamp, +}; pub use sp_staking::EraIndex; pub use sp_std::{collections::btree_map::BTreeMap, prelude::*}; @@ -278,6 +280,14 @@ pub mod pallet { return } + let mut validation_lock = + StorageLock::::new(LAST_VALIDATED_ERA_KEY); + + // Skip if the validation is already in progress. + let Ok(_) = validation_lock.try_lock() else { + return + }; + let last_validated_era_storage = StorageValueRef::persistent(LAST_VALIDATED_ERA_KEY); let last_validated_era = match last_validated_era_storage.get::() { Ok(Some(last_validated_era)) => last_validated_era, From bc6cd62226162c318166ca4cd6bc4945d42dfd82 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 6 Jul 2023 17:49:08 +0600 Subject: [PATCH 189/583] Remove an obsolete comment --- pallets/ddc-validator/src/lib.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 2be7a3022..584fe743a 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -304,10 +304,7 @@ pub mod pallet { let data_provider_url = Self::get_data_provider_url(); log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); - // `If` commented for testing purposes - // if current_era > last_managed_era { Self::validate_edges(); - //} // Print the number of broken sessions per CDN node. // let aggregates_value = dac::fetch_aggregates(&data_provider_url, 77436).unwrap(); // From 1221e9be6c5ea32f2bc577f1404437175fd97571 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 6 Jul 2023 18:01:05 +0600 Subject: [PATCH 190/583] Fix validators signal check skipping --- pallets/ddc-validator/src/lib.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 584fe743a..b8f9f222a 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -280,13 +280,15 @@ pub mod pallet { return } + let mut should_validate_because_new_era = true; + let mut validation_lock = StorageLock::::new(LAST_VALIDATED_ERA_KEY); // Skip if the validation is already in progress. - let Ok(_) = validation_lock.try_lock() else { - return - }; + if validation_lock.try_lock().is_err() { + should_validate_because_new_era = false; + } let last_validated_era_storage = StorageValueRef::persistent(LAST_VALIDATED_ERA_KEY); let last_validated_era = match last_validated_era_storage.get::() { @@ -298,13 +300,15 @@ pub mod pallet { // Skip if the validation is already complete for the era. if current_era <= last_validated_era { - return + should_validate_because_new_era = false; } let data_provider_url = Self::get_data_provider_url(); log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); - Self::validate_edges(); + if should_validate_because_new_era { + Self::validate_edges(); + } // Print the number of broken sessions per CDN node. // let aggregates_value = dac::fetch_aggregates(&data_provider_url, 77436).unwrap(); // From b76c5c8e75bd497415abf5c50da18834bd9d0dd5 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 6 Jul 2023 18:10:49 +0600 Subject: [PATCH 191/583] Remove obsolete validation code used data mockups --- pallets/ddc-validator/src/lib.rs | 165 ------------------------------- 1 file changed, 165 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index b8f9f222a..ef037de1d 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -344,171 +344,6 @@ pub mod pallet { log::info!("🔎 DAC Validator is idle at block {:?}, waiting for a signal, signal state is {:?}", block_number, signal); return } - - // Read from DAC. - let response = dac::fetch_data2(&data_provider_url, current_era - 1); - let (sent_query, sent, received_query, received) = match response { - Ok(data) => data, - Err(_) => { - log::info!("🔎 DAC Validator failed to get bytes sent and received from DAC"); - return - }, - }; - log::info!( - "🔎 DAC Validator is fetching data from DAC, current era: {:?}, bytes sent query: {:?}, bytes sent response: {:?}, bytes received query: {:?}, bytes received response: {:?}", - current_era, - sent_query, - sent, - received_query, - received, - ); - - // Create intermediate validation decisions - // ======================================== - - // All validators validate all CDN nodes. - let edges: Vec = >::iter_keys().collect(); - for edge in edges.iter() { - // Get string type CDN node pubkey - let edge_pubkey: String = utils::account_to_string::(edge.clone()); - - // Get bytes sent and received for the CDN node - let node_sent: &dac::BytesSent = match sent - .iter() - .find(|bytes_sent| bytes_sent.node_public_key == edge_pubkey) - { - Some(node_sent) => node_sent, - None => { - log::warn!("No logs to validate {:?}", edge); - continue - }, - }; - let client_received: &dac::BytesReceived = match received - .iter() - .find(|bytes_received| bytes_received.node_public_key == edge_pubkey) - { - Some(client_received) => client_received, - None => { - log::warn!("No acks to validate {:?}", edge); - continue - }, - }; - - // Proof-of-delivery validation - let validation_result = Self::validate(node_sent, client_received); - - // Prepare an intermediate validation decision - let validation_decision = ValidationDecision { - edge: utils::account_to_string::(edge.clone()), - result: validation_result, - payload: [0u8; 32], // ToDo: put a hash of the validated data here - totals: DacTotalAggregates { - sent: node_sent.sum as u64, - received: client_received.sum as u64, - failed_by_client: 0, // ToDo - failure_rate: 0, // ToDo - }, - }; - - // Encode validation decision to base64 - let validation_decision_serialized: Vec = validation_decision.encode(); - let validation_decision_base64 = - shm::base64_encode(&validation_decision_serialized).unwrap(); - log::info!( - "Intermediate validation decision for CDN node {:?}: , base64 encoded: {:?}", - validation_decision, - validation_decision_base64, - ); - - // Prepare values to publish validation decision and publish it - let validator_id_string = String::from("validator1"); // ToDo: get validator ID - let edge_id_string = utils::account_to_string::(edge.clone()); - let validation_decision_base64_string = - validation_decision_base64.iter().cloned().collect::(); - let response = shm::share_intermediate_validation_result( - &data_provider_url, - current_era - 1, - &validator_id_string, - &edge_id_string, - validation_result, - &validation_decision_base64_string, - ); - match response { - Ok(response) => - log::info!("Shared memory response: {:?}", response.to_string()), - Err(e) => { - log::error!("Shared memory error: {:?}", e); - continue - }, - } - } - log::info!( - "Intermediate validation results published for {} CDN nodes in era {:?}", - edges.len(), - current_era - 1 - ); - - // Set CDN nodes' reward points - // ============================ - - // Let's use a mock data until we have a real final validation decisions for all the CDN - // nodes. - let mock_final_validation_decisions: Vec<(T::AccountId, ValidationDecision)> = vec![ - ( - utils::string_to_account::( - "0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1".into(), - ), - ValidationDecision { - edge: "test".into(), - result: true, - payload: [0u8; 32], - totals: DacTotalAggregates { - sent: 100, - received: 100, - failed_by_client: 0, - failure_rate: 0, - }, - }, - ), - ( - utils::string_to_account::( - "0xa2d14e71b52e5695e72c0567926bc68b68bda74df5c1ccf1d4ba612c153ff66b".into(), - ), - ValidationDecision { - edge: "test".into(), - result: true, - payload: [0u8; 32], - totals: DacTotalAggregates { - sent: 200, - received: 200, - failed_by_client: 0, - failure_rate: 0, - }, - }, - ), - ]; - - // Calculate CDN nodes reward points from validation decision aggregates - let cdn_nodes_reward_points: Vec<(T::AccountId, u64)> = mock_final_validation_decisions - .into_iter() - .filter(|(_, validation_decision)| validation_decision.result) // skip misbehaving - .map(|(cdn_node, validation_decision)| { - // ToDo: should we use `sent` or `received` or anything else as a reward point? - (cdn_node, validation_decision.totals.sent) - }) - .collect(); - - // Store CDN node reward points on-chain - let signer: Signer = Signer::<_, _>::any_account(); - if !signer.can_sign() { - log::warn!("No local accounts available to set era reward points. Consider adding one via `author_insertKey` RPC."); - return - } - // ToDo: replace local call by a call from `ddc-staking` pallet - let _tx_res = signer.send_signed_transaction(|_account| Call::set_era_reward_points { - era: current_era - 1, - stakers_points: cdn_nodes_reward_points.clone(), - }); } } From 37e5232b734000dbe16b7d87b5b7cb83498433ef Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 6 Jul 2023 18:11:58 +0600 Subject: [PATCH 192/583] Remove commented out broken sessions detection --- pallets/ddc-validator/src/lib.rs | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index ef037de1d..d80d25fdd 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -310,34 +310,6 @@ pub mod pallet { Self::validate_edges(); } - // Print the number of broken sessions per CDN node. - // let aggregates_value = dac::fetch_aggregates(&data_provider_url, 77436).unwrap(); // - // 77436 is for a mock data let aggregates_obj = aggregates_value.as_object().unwrap(); - // aggregates_obj - // .into_iter() - // .for_each(|(cdn_node_pubkey, cdn_node_aggregates_value)| { - // // iterate over aggregates for each node - // let cdn_node_aggregates_obj = cdn_node_aggregates_value.as_object().unwrap(); - // // Extract `nodeInterruptedSessions` field - // let (_, cdn_node_interrupted_sessions_value) = cdn_node_aggregates_obj - // .into_iter() - // .find(|(key, _)| key.iter().copied().eq("nodeInterruptedSessions".chars())) - // .unwrap(); - // let cdn_node_interrupted_sessions_obj = - // cdn_node_interrupted_sessions_value.as_object().unwrap(); - // // Prepare CDN pubkey without heap allocated string - // let cdn_node_pubkey_vecu8: Vec = - // cdn_node_pubkey.iter().map(|c| *c as u8).collect(); - // let cdn_node_pubkey_str = - // sp_std::str::from_utf8(&cdn_node_pubkey_vecu8).unwrap(); - // log::info!( - // "Broken sessions per CDN node | Node {}: {} sessions broken", - // cdn_node_pubkey_str, - // cdn_node_interrupted_sessions_obj.len(), /* count sessions broken by the - // * node */ - // ); - // }); - // Wait for signal. let signal = Signal::::get().unwrap_or(false); if !signal { From 3989ccf0b46516ed55a8710c032bc5f7a9e50217 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 6 Jul 2023 18:18:22 +0600 Subject: [PATCH 193/583] Fix validation start by the signal --- pallets/ddc-validator/src/lib.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index d80d25fdd..a99ac1d7f 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -306,15 +306,11 @@ pub mod pallet { let data_provider_url = Self::get_data_provider_url(); log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); - if should_validate_because_new_era { - Self::validate_edges(); - } + // Validation start forced externally? + let should_validate_because_signal = Signal::::get().unwrap_or(false); - // Wait for signal. - let signal = Signal::::get().unwrap_or(false); - if !signal { - log::info!("🔎 DAC Validator is idle at block {:?}, waiting for a signal, signal state is {:?}", block_number, signal); - return + if should_validate_because_new_era || should_validate_because_signal { + Self::validate_edges(); } } } From 79f1c70ec29acbf2771e380040f78a55e4f4700a Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 6 Jul 2023 18:19:28 +0600 Subject: [PATCH 194/583] Print data provider URL only if validation starts --- pallets/ddc-validator/src/lib.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index a99ac1d7f..37c6aaa94 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -303,9 +303,6 @@ pub mod pallet { should_validate_because_new_era = false; } - let data_provider_url = Self::get_data_provider_url(); - log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); - // Validation start forced externally? let should_validate_because_signal = Signal::::get().unwrap_or(false); @@ -646,6 +643,7 @@ pub mod pallet { let current_era = Self::get_current_era(); let mock_data_url = Self::get_mock_data_url(); let data_provider_url = Self::get_data_provider_url(); + info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); // let signer = Self::get_signer().unwrap(); // let validator = signer.get_any_account().unwrap().id; From 22e9543ef42fcc0af10982375e50c46dfdc7dce9 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 7 Jul 2023 11:10:46 +0200 Subject: [PATCH 195/583] Update substrate dependencies --- CHANGELOG.md | 2 +- Cargo.lock | 330 +++++++++--------- Cargo.toml | 4 +- cli/Cargo.toml | 10 +- node/client/Cargo.toml | 54 +-- node/service/Cargo.toml | 66 ++-- pallets/chainbridge/Cargo.toml | 18 +- .../ddc-metrics-offchain-worker/Cargo.toml | 24 +- pallets/ddc-staking/Cargo.toml | 16 +- pallets/ddc/Cargo.toml | 12 +- pallets/erc20/Cargo.toml | 18 +- pallets/erc721/Cargo.toml | 16 +- rpc/Cargo.toml | 46 +-- runtime/cere-dev/Cargo.toml | 138 ++++---- runtime/cere-dev/constants/Cargo.toml | 4 +- runtime/cere/Cargo.toml | 138 ++++---- runtime/cere/constants/Cargo.toml | 4 +- runtime/common/Cargo.toml | 8 +- 18 files changed, 454 insertions(+), 454 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b08d051a..eb8b3e386 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- [C,D] Updated Substrate to polkadot-v0.9.30 +- [C,D] Updated Substrate to polkadot-v0.9.31 ## [4.7.0] diff --git a/Cargo.lock b/Cargo.lock index eefbb30af..bcbf762ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2050,7 +2050,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", ] @@ -2067,7 +2067,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2090,7 +2090,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "array-bytes", @@ -2141,7 +2141,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2152,7 +2152,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2168,7 +2168,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2197,7 +2197,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2229,7 +2229,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "cfg-expr", @@ -2243,7 +2243,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2255,7 +2255,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -2265,7 +2265,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "log", @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -2298,7 +2298,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -2307,7 +2307,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "parity-scale-codec", @@ -4355,7 +4355,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system", "parity-scale-codec", @@ -4564,7 +4564,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4580,7 +4580,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4595,7 +4595,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4619,7 +4619,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4639,7 +4639,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4654,7 +4654,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4705,7 +4705,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4724,7 +4724,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4741,7 +4741,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4769,7 +4769,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -4784,7 +4784,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -4794,7 +4794,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-contracts-primitives", @@ -4811,7 +4811,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -4866,7 +4866,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4882,7 +4882,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4906,7 +4906,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4919,7 +4919,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4975,7 +4975,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4996,7 +4996,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5019,7 +5019,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5035,7 +5035,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5055,7 +5055,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5072,7 +5072,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5089,7 +5089,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5104,7 +5104,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5121,7 +5121,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5141,7 +5141,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -5151,7 +5151,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5168,7 +5168,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5191,7 +5191,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5206,7 +5206,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5220,7 +5220,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5235,7 +5235,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5251,7 +5251,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5272,7 +5272,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5288,7 +5288,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5302,7 +5302,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5325,7 +5325,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5350,7 +5350,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5368,7 +5368,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5387,7 +5387,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5403,7 +5403,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5418,7 +5418,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5429,7 +5429,7 @@ dependencies = [ [[package]] name = "pallet-transaction-storage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5447,7 +5447,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5480,7 +5480,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6354,7 +6354,7 @@ checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "env_logger 0.9.3", "jsonrpsee", @@ -6613,7 +6613,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -6624,7 +6624,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6651,7 +6651,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -6674,7 +6674,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6690,7 +6690,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6707,7 +6707,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6718,7 +6718,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "chrono", @@ -6758,7 +6758,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fnv", "futures", @@ -6786,7 +6786,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "kvdb", @@ -6811,7 +6811,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6835,7 +6835,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "fork-tree", @@ -6877,7 +6877,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -6899,7 +6899,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6912,7 +6912,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6936,7 +6936,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sc-client-api", "sp-authorship", @@ -6947,7 +6947,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "lru", @@ -6974,7 +6974,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -6990,7 +6990,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7005,7 +7005,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cfg-if", "libc", @@ -7025,7 +7025,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "array-bytes", @@ -7066,7 +7066,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "futures", @@ -7087,7 +7087,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7104,7 +7104,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "async-trait", @@ -7119,7 +7119,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "async-trait", @@ -7166,7 +7166,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cid", "futures", @@ -7186,7 +7186,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7212,7 +7212,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "futures", @@ -7230,7 +7230,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "futures", @@ -7251,7 +7251,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "fork-tree", @@ -7279,7 +7279,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "futures", @@ -7298,7 +7298,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "bytes", @@ -7328,7 +7328,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libp2p", @@ -7341,7 +7341,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7350,7 +7350,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "hash-db", @@ -7380,7 +7380,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7403,7 +7403,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7416,7 +7416,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "directories", @@ -7486,7 +7486,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7519,7 +7519,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libc", @@ -7538,7 +7538,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "chrono", "futures", @@ -7556,7 +7556,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7587,7 +7587,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7598,7 +7598,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -7624,7 +7624,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -7637,7 +7637,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -8060,7 +8060,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8078,7 +8078,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "proc-macro-crate", @@ -8090,7 +8090,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8103,7 +8103,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "integer-sqrt", "num-traits", @@ -8118,7 +8118,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8131,7 +8131,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "parity-scale-codec", @@ -8143,7 +8143,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -8155,7 +8155,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -8173,7 +8173,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8192,7 +8192,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "merlin", @@ -8215,7 +8215,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8229,7 +8229,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8242,7 +8242,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "base58", @@ -8288,7 +8288,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "byteorder", @@ -8302,7 +8302,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8313,7 +8313,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8322,7 +8322,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8332,7 +8332,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -8343,7 +8343,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "log", @@ -8361,7 +8361,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8375,7 +8375,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "futures", @@ -8401,7 +8401,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "sp-core", @@ -8412,7 +8412,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8429,7 +8429,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "thiserror", "zstd", @@ -8438,7 +8438,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8452,7 +8452,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-core", @@ -8462,7 +8462,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "backtrace", "lazy_static", @@ -8472,7 +8472,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "rustc-hash", "serde", @@ -8482,7 +8482,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "either", "hash256-std-hasher", @@ -8505,7 +8505,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8523,7 +8523,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "proc-macro-crate", @@ -8535,7 +8535,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -8549,7 +8549,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8563,7 +8563,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8574,7 +8574,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8596,12 +8596,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8614,7 +8614,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -8627,7 +8627,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures-timer", @@ -8643,7 +8643,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-std", @@ -8655,7 +8655,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-runtime", @@ -8664,7 +8664,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "log", @@ -8680,7 +8680,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "hash-db", @@ -8703,7 +8703,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8720,7 +8720,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8731,7 +8731,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "log", @@ -8744,7 +8744,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8885,7 +8885,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "platforms 2.0.0", ] @@ -8893,7 +8893,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -8914,7 +8914,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures-util", "hyper", @@ -8927,7 +8927,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "log", @@ -8948,7 +8948,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "substrate-test-utils-derive", @@ -8958,7 +8958,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8969,7 +8969,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -9430,7 +9430,7 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "clap", "frame-try-runtime", diff --git a/Cargo.toml b/Cargo.toml index de64bd006..71ec58205 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,11 +11,11 @@ build = "build.rs" [dependencies] cere-cli = { path = "cli", features = [ "cere-dev-native" ] } -sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } ss58-registry = { version = "1.38.0", default-features = false } [build-dependencies] -substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [workspace] members = [ diff --git a/cli/Cargo.toml b/cli/Cargo.toml index a82623a91..21b8066f0 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -13,17 +13,17 @@ crate-type = ["cdylib", "rlib"] [dependencies] clap = { version = "3.1", features = ["derive"], optional = true } -sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } -sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } -frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } -try-runtime-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true , branch = "polkadot-v0.9.30" } +sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.31" } +sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.31" } +frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.31" } +try-runtime-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true , branch = "polkadot-v0.9.31" } # Local cere-service = { path = "../node/service", default-features = false, optional = true } cere-client = { path = "../node/client", optional = true } [build-dependencies] -substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } [features] default = ["cli", "cere-native"] diff --git a/node/client/Cargo.toml b/node/client/Cargo.toml index db9fb8525..fbf8e921f 100644 --- a/node/client/Cargo.toml +++ b/node/client/Cargo.toml @@ -4,33 +4,33 @@ version = "4.7.0" edition = "2021" [dependencies] -sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-offchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-storage = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-inherents = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-keyring = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.31" } +sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +frame-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-offchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-storage = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sp-inherents = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-keyring = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } # Local cere-runtime = { path = "../../runtime/cere", optional = true } diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index a55498ebb..c36442994 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -10,39 +10,39 @@ rand = "0.8" futures = "0.3.21" jsonrpsee = { version = "0.15.1", features = ["server"] } -sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } -sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } -sc-telemetry = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-sysinfo = { version = "6.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-consensus-slots = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-consensus-uncles = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-authority-discovery = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-network = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-network-common = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-transaction-storage-proof = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-authorship = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-basic-authorship = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-trie = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", features = ["wasmtime"] } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", features = ["wasmtime"] } +sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", features = ["wasmtime"] } +sc-telemetry = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-sysinfo = { version = "6.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-consensus-slots = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-consensus-uncles = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-authority-discovery = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-network = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-network-common = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sp-transaction-storage-proof = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-authorship = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-basic-authorship = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-trie = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } # Local cere-client = { path = "../client", default-features = false, optional = true } diff --git a/pallets/chainbridge/Cargo.toml b/pallets/chainbridge/Cargo.toml index 36908f14e..c5d6bc607 100644 --- a/pallets/chainbridge/Cargo.toml +++ b/pallets/chainbridge/Cargo.toml @@ -14,18 +14,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } lite-json = { version = "0.2.0", default-features = false } -sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } +pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } [features] default = ["std"] diff --git a/pallets/ddc-metrics-offchain-worker/Cargo.toml b/pallets/ddc-metrics-offchain-worker/Cargo.toml index 2516727bb..680e717dc 100644 --- a/pallets/ddc-metrics-offchain-worker/Cargo.toml +++ b/pallets/ddc-metrics-offchain-worker/Cargo.toml @@ -14,19 +14,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["full"] } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } serde = { version = "1.0.136", optional = true } -sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts = { version = '4.0.0-dev', default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-contracts = { version = '4.0.0-dev', default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } lite-json = { version = "0.2.0", default-features = false } alt_serde = { version = "1", default-features = false, features = ["derive"] } serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } -# pallet-contracts-rpc-runtime-api = { version = "0.8.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +# pallet-contracts-rpc-runtime-api = { version = "0.8.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } hex-literal = "^0.3.1" hex = { version = "0.4", default-features = false } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } @@ -49,7 +49,7 @@ std = [ ] [dev-dependencies] -pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pretty_assertions = "0.6.1" diff --git a/pallets/ddc-staking/Cargo.toml b/pallets/ddc-staking/Cargo.toml index 054094b61..6596c227a 100644 --- a/pallets/ddc-staking/Cargo.toml +++ b/pallets/ddc-staking/Cargo.toml @@ -5,18 +5,18 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } [dev-dependencies] -substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [features] default = ["std"] diff --git a/pallets/ddc/Cargo.toml b/pallets/ddc/Cargo.toml index 9e73fed88..f43d2f16f 100644 --- a/pallets/ddc/Cargo.toml +++ b/pallets/ddc/Cargo.toml @@ -14,15 +14,15 @@ targets = ['x86_64-unknown-linux-gnu'] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } [dev-dependencies] -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } serde = { version = "1.0.101" } [features] diff --git a/pallets/erc20/Cargo.toml b/pallets/erc20/Cargo.toml index b7ac7dea6..4405950f4 100644 --- a/pallets/erc20/Cargo.toml +++ b/pallets/erc20/Cargo.toml @@ -15,19 +15,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.136", optional = true } codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } -sp-arithmetic = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false } +sp-arithmetic = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false } pallet-chainbridge = { version = "4.2.0", default-features = false, path = "../chainbridge" } pallet-erc721 = { version = "4.2.0", default-features = false, path = "../erc721" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } [features] default = ["std"] diff --git a/pallets/erc721/Cargo.toml b/pallets/erc721/Cargo.toml index 295975765..4853b940e 100644 --- a/pallets/erc721/Cargo.toml +++ b/pallets/erc721/Cargo.toml @@ -15,17 +15,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.136", optional = true } codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false,git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-std = { version = "4.0.0", default-features = false,git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false } pallet-chainbridge = { version = "4.2.0", default-features = false, path = "../chainbridge" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } [features] default = ["std"] diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 1803e3d08..c7877f0d6 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -5,26 +5,26 @@ edition = "2021" [dependencies] jsonrpsee = { version = "0.15.1", features = ["server"] } -sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-rpc-api = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-consensus-babe-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-consensus-epochs = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-finality-grandpa-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -substrate-frame-rpc-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -pallet-transaction-payment-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -substrate-state-trie-migration-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sc-rpc-api = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sc-consensus-babe-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sc-consensus-epochs = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sc-finality-grandpa-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +substrate-frame-rpc-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +pallet-transaction-payment-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +substrate-state-trie-migration-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index f3e63bbc2..6d5f7d797 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -24,76 +24,76 @@ hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.16", default-features = false } # primitives -sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, version = "4.0.0-dev" } -sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false, version = "4.0.0-dev" } +sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } # frame dependencies -frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-authorship = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-bags-list = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -pallet-elections-phragmen = { version = "5.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-indices = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-membership = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-multisig = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true , branch = "polkadot-v0.9.30" } -pallet-offences = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-offences-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } -pallet-proxy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-recovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } -pallet-session-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } -pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-tips = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-storage = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } +frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } +pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-authorship = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-bags-list = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } +pallet-elections-phragmen = { version = "5.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.31" } +pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-indices = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-membership = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-multisig = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.31" } +pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.31" } +pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true , branch = "polkadot-v0.9.31" } +pallet-offences = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-offences-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false, optional = true } +pallet-proxy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-recovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false } +pallet-session-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false, optional = true } +pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-tips = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-transaction-storage = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } cere-runtime-common = { path = "../common", default-features = false } cere-dev-runtime-constants = { path = "./constants", default-features = false } pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../../pallets/ddc-staking" } @@ -104,7 +104,7 @@ pallet-erc20 = { version = "4.7.0", default-features = false, path = "../../pall pallet-ddc-metrics-offchain-worker = { version = "4.7.0", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } [build-dependencies] -substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [features] default = ["std"] diff --git a/runtime/cere-dev/constants/Cargo.toml b/runtime/cere-dev/constants/Cargo.toml index 0169aac24..eb495a2ab 100644 --- a/runtime/cere-dev/constants/Cargo.toml +++ b/runtime/cere-dev/constants/Cargo.toml @@ -5,8 +5,8 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.31" } [features] default = ["std"] diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index 48b83825f..a720b32aa 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -24,76 +24,76 @@ hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.16", default-features = false } # primitives -sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, version = "4.0.0-dev" } -sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false, version = "4.0.0-dev" } +sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } # frame dependencies -frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-authorship = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-bags-list = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -pallet-elections-phragmen = { version = "5.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-indices = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-membership = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-multisig = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true , branch = "polkadot-v0.9.30" } -pallet-offences = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-offences-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } -pallet-proxy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-recovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } -pallet-session-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } -pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-tips = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-storage = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } +frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } +pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-authorship = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-bags-list = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } +pallet-elections-phragmen = { version = "5.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.31" } +pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-indices = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-membership = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-multisig = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.31" } +pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.31" } +pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true , branch = "polkadot-v0.9.31" } +pallet-offences = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-offences-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false, optional = true } +pallet-proxy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-recovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false } +pallet-session-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false, optional = true } +pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-tips = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-transaction-storage = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } cere-runtime-common = { path = "../common", default-features = false } cere-runtime-constants = { path = "./constants", default-features = false } pallet-chainbridge = { version = "4.7.0", default-features = false, path = "../../pallets/chainbridge" } @@ -103,7 +103,7 @@ pallet-erc20 = { version = "4.7.0", default-features = false, path = "../../pall pallet-ddc-metrics-offchain-worker = { version = "4.7.0", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } [build-dependencies] -substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [features] default = ["std"] diff --git a/runtime/cere/constants/Cargo.toml b/runtime/cere/constants/Cargo.toml index 91dfa4484..60ff8c131 100644 --- a/runtime/cere/constants/Cargo.toml +++ b/runtime/cere/constants/Cargo.toml @@ -5,8 +5,8 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.31" } [features] default = ["std"] diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index bb0963462..2ceab7414 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -10,7 +10,7 @@ no_std = [] std = [] [dependencies] -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -frame-support = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } -sp-core = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } -node-primitives = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.31" } +frame-support = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.31" } +sp-core = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.31" } +node-primitives = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.31" } From 5c6e3f8db7badce69edafd75d95d7f8a26d3c0b2 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 7 Jul 2023 11:22:55 +0200 Subject: [PATCH 196/583] Update rpc --- Cargo.lock | 1 - rpc/Cargo.toml | 1 - rpc/src/lib.rs | 3 --- 3 files changed, 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bcbf762ad..34f50e0ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -884,7 +884,6 @@ version = "4.7.0" dependencies = [ "jsonrpsee", "node-primitives", - "pallet-contracts-rpc", "pallet-transaction-payment-rpc", "sc-chain-spec", "sc-client-api", diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index c7877f0d6..d7533e526 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -27,4 +27,3 @@ sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech substrate-state-trie-migration-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs index a47380803..6820c0eee 100644 --- a/rpc/src/lib.rs +++ b/rpc/src/lib.rs @@ -84,7 +84,6 @@ where + Send + 'static, C::Api: substrate_frame_rpc_system::AccountNonceApi, - C::Api: pallet_contracts_rpc::ContractsRuntimeApi, C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, C::Api: BabeApi, C::Api: BlockBuilder, @@ -93,7 +92,6 @@ where B: sc_client_api::Backend + Send + Sync + 'static, B::State: sc_client_api::backend::StateBackend>, { - use pallet_contracts_rpc::{ContractsApiServer, Contracts}; use pallet_transaction_payment_rpc::{TransactionPaymentApiServer, TransactionPayment}; use sc_consensus_babe_rpc::{BabeApiServer, Babe}; use sc_finality_grandpa_rpc::GrandpaApiServer; @@ -118,7 +116,6 @@ where // Making synchronous calls in light client freezes the browser currently, // more context: https://github.com/paritytech/substrate/pull/3480 // These RPCs should use an asynchronous caller instead. - io.merge(Contracts::new(client.clone()).into_rpc())?; io.merge(TransactionPayment::new(client.clone()).into_rpc())?; io.merge( Babe::new( From d33d20802fc874733a916e6371d462877ddef5de Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 7 Jul 2023 13:45:25 +0200 Subject: [PATCH 197/583] Update runtimes --- pallets/ddc-staking/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 27d430ede..bd978c05f 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -100,7 +100,7 @@ pub struct StakingLedger { pub unlocking: BoundedVec, MaxUnlockingChunks>, } -impl +impl StakingLedger { /// Initializes the default object using the given stash. From cc67414a33d796a95141b4cf1908a42244b33017 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 7 Jul 2023 15:40:39 +0200 Subject: [PATCH 198/583] Update to polkadot-v0.9.31 --- Cargo.lock | 1424 ++++++++--------- cli/Cargo.toml | 2 +- node/client/Cargo.toml | 1 - node/client/src/lib.rs | 40 +- .../ddc-metrics-offchain-worker/Cargo.toml | 2 - pallets/ddc-staking/src/lib.rs | 4 +- runtime/cere-dev/Cargo.toml | 2 - runtime/cere-dev/src/lib.rs | 58 +- runtime/cere/Cargo.toml | 2 - runtime/cere/src/lib.rs | 57 +- 10 files changed, 711 insertions(+), 881 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 34f50e0ec..50241e1ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,7 +52,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ "cfg-if", - "cipher 0.3.0", + "cipher", "cpufeatures", "opaque-debug 0.3.0", ] @@ -65,7 +65,7 @@ checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" dependencies = [ "aead", "aes", - "cipher 0.3.0", + "cipher", "ctr", "ghash", "subtle", @@ -153,6 +153,55 @@ dependencies = [ "winapi", ] +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" + +[[package]] +name = "anstyle-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle", + "windows-sys 0.48.0", +] + [[package]] name = "anyhow" version = "1.0.71" @@ -261,7 +310,7 @@ dependencies = [ "log", "parking", "polling", - "rustix 0.37.22", + "rustix 0.37.23", "slab", "socket2 0.4.9", "waker-fn", @@ -289,7 +338,7 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix 0.37.22", + "rustix 0.37.23", "signal-hook", "windows-sys 0.48.0", ] @@ -323,9 +372,9 @@ dependencies = [ [[package]] name = "async-std-resolver" -version = "0.21.2" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2f8a4a203be3325981310ab243a28e6e4ea55b6519bffce05d41ab60e09ad8" +checksum = "6ba50e24d9ee0a8950d3d03fc6d0dd10aa14b5de3b101949b4e160f7fee7c723" dependencies = [ "async-std", "async-trait", @@ -344,9 +393,9 @@ checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" [[package]] name = "async-trait" -version = "0.1.69" +version = "0.1.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2d0f03b3640e3a630367e40c468cb7f309529c708ed1d88597047b0e7c6ef7" +checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" dependencies = [ "proc-macro2", "quote", @@ -449,12 +498,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bimap" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" - [[package]] name = "bincode" version = "1.3.3" @@ -466,9 +509,9 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.65.1" +version = "0.64.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" +checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" dependencies = [ "bitflags 1.3.2", "cexpr", @@ -476,13 +519,12 @@ dependencies = [ "lazy_static", "lazycell", "peeking_take_while", - "prettyplease 0.2.9", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "syn 2.0.23", + "syn 1.0.109", ] [[package]] @@ -552,15 +594,15 @@ dependencies = [ [[package]] name = "blake3" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729b71f35bd3fa1a4c86b85d32c8b9069ea7fe14f7a53cfabb65f62d4265b888" +checksum = "199c42ab6972d92c9f8995f086273d25c42fc0f7b2a1fcefba465c1352d25ba5" dependencies = [ "arrayref", "arrayvec 0.7.4", "cc", "cfg-if", - "constant_time_eq 0.2.6", + "constant_time_eq 0.3.0", ] [[package]] @@ -625,9 +667,9 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bstr" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" dependencies = [ "memchr", "serde", @@ -711,7 +753,7 @@ dependencies = [ "cargo-platform", "semver 1.0.17", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", ] [[package]] @@ -758,7 +800,6 @@ dependencies = [ "frame-system", "frame-system-rpc-runtime-api", "node-primitives", - "pallet-contracts-rpc", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", "sc-client-api", @@ -811,7 +852,6 @@ dependencies = [ "pallet-collective", "pallet-contracts", "pallet-contracts-primitives", - "pallet-contracts-rpc-runtime-api", "pallet-ddc-metrics-offchain-worker", "pallet-ddc-staking", "pallet-democracy", @@ -936,7 +976,6 @@ dependencies = [ "pallet-collective", "pallet-contracts", "pallet-contracts-primitives", - "pallet-contracts-rpc-runtime-api", "pallet-ddc-metrics-offchain-worker", "pallet-democracy", "pallet-election-provider-multi-phase", @@ -1099,7 +1138,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" dependencies = [ "cfg-if", - "cipher 0.3.0", + "cipher", "cpufeatures", "zeroize", ] @@ -1112,7 +1151,7 @@ checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" dependencies = [ "aead", "chacha20", - "cipher 0.3.0", + "cipher", "poly1305", "zeroize", ] @@ -1154,16 +1193,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - [[package]] name = "clang-sys" version = "1.6.1" @@ -1172,56 +1201,55 @@ checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" dependencies = [ "glob", "libc", - "libloading 0.7.4", + "libloading", ] [[package]] name = "clap" -version = "3.2.25" +version = "4.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +checksum = "1640e5cc7fb47dbb8338fd471b105e7ed6c3cb2aeb00c2e067127ffd3764a05d" dependencies = [ - "atty", - "bitflags 1.3.2", + "clap_builder", "clap_derive", - "clap_lex", - "indexmap", "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98c59138d527eeaf9b53f35a77fcc1fad9d883116070c63d5de1c7dc7b00c72b" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", "strsim", - "termcolor", - "textwrap", ] [[package]] name = "clap_derive" -version = "3.2.25" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" +checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" dependencies = [ "heck", - "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.23", ] [[package]] name = "clap_lex" -version = "0.2.4" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" [[package]] -name = "cmake" -version = "0.1.50" +name = "colorchoice" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "comfy-table" @@ -1261,6 +1289,12 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + [[package]] name = "core-foundation" version = "0.9.3" @@ -1297,9 +1331,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -1518,18 +1552,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" dependencies = [ - "cipher 0.3.0", -] - -[[package]] -name = "cuckoofilter" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b810a8449931679f64cd7eef1bbd0fa315801b6d5d9cdc1ace2804d6529eee18" -dependencies = [ - "byteorder", - "fnv", - "rand 0.7.3", + "cipher", ] [[package]] @@ -1624,6 +1647,12 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + [[package]] name = "digest" version = "0.8.1" @@ -1704,6 +1733,12 @@ dependencies = [ "quick-error", ] +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + [[package]] name = "downcast-rs" version = "1.2.0" @@ -1712,9 +1747,9 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "dtoa" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c904bbebf8a5ecde84d81e5d3e5fe085104462a4bec7888608a4b408b117fecf" +checksum = "519b83cd10f5f6e969625a409f735182bea5558cd8b64c655806ceaae36f1999" [[package]] name = "dyn-clonable" @@ -1818,9 +1853,9 @@ dependencies = [ [[package]] name = "enum-as-inner" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" +checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ "heck", "proc-macro2", @@ -2013,9 +2048,9 @@ dependencies = [ [[package]] name = "fixed-hash" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", "rand 0.8.5", @@ -2040,6 +2075,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + [[package]] name = "fnv" version = "1.0.7" @@ -2049,7 +2093,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", ] @@ -2063,10 +2107,16 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fragile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" + [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -2089,7 +2139,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "array-bytes", @@ -2119,7 +2169,7 @@ dependencies = [ "sc-service", "sc-sysinfo", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "serde_nanos", "sp-api", "sp-blockchain", @@ -2140,7 +2190,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2151,7 +2201,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2167,7 +2217,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -2196,7 +2246,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2228,7 +2278,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "cfg-expr", @@ -2242,7 +2292,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2254,7 +2304,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -2264,7 +2314,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "log", @@ -2282,7 +2332,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -2297,7 +2347,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -2306,7 +2356,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "parity-scale-codec", @@ -2315,18 +2365,6 @@ dependencies = [ "sp-std", ] -[[package]] -name = "fs-swap" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d47dad3685eceed8488986cad3d5027165ea5edb164331770e2059555f10a5" -dependencies = [ - "lazy_static", - "libc", - "libloading 0.5.2", - "winapi", -] - [[package]] name = "fs2" version = "0.4.3" @@ -2337,12 +2375,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "funty" version = "2.0.0" @@ -2631,7 +2663,7 @@ dependencies = [ "pest", "pest_derive", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "thiserror", ] @@ -2676,9 +2708,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hex" @@ -2692,12 +2724,6 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" -[[package]] -name = "hex_fmt" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" - [[package]] name = "hmac" version = "0.8.1" @@ -2748,7 +2774,7 @@ checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", - "itoa 1.0.7", + "itoa 1.0.8", ] [[package]] @@ -2795,7 +2821,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.7", + "itoa 1.0.8", "pin-project-lite 0.2.10", "socket2 0.4.9", "tokio", @@ -2875,9 +2901,9 @@ dependencies = [ [[package]] name = "if-watch" -version = "1.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "015a7df1eb6dda30df37f34b63ada9b7b352984b0e84de2a20ed526345000791" +checksum = "065c008e570a43c00de6aed9714035e5ea6a498c255323db9091722af6ee67dd" dependencies = [ "async-io", "core-foundation", @@ -2902,9 +2928,9 @@ dependencies = [ [[package]] name = "impl-serde" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4551f042f3438e64dbd6226b20527fc84a6e1fe65688b58746a2f53623f25f5c" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" dependencies = [ "serde", ] @@ -2931,15 +2957,6 @@ dependencies = [ "serde", ] -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array 0.14.7", -] - [[package]] name = "instant" version = "0.1.12" @@ -2970,7 +2987,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi 0.3.2", "libc", "windows-sys 0.48.0", ] @@ -3001,12 +3018,12 @@ checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "is-terminal" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24fddda5af7e54bf7da53067d6e802dbcc381d0a8eef629df528e3ebf68755cb" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi 0.3.1", - "rustix 0.38.2", + "hermit-abi 0.3.2", + "rustix 0.38.3", "windows-sys 0.48.0", ] @@ -3027,9 +3044,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0aa48fab2893d8a49caa94082ae8488f4e1050d73b367881dcd2198f4199fd8" +checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" [[package]] name = "jobserver" @@ -3108,7 +3125,7 @@ dependencies = [ "rand 0.8.5", "rustc-hash", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "soketto", "thiserror", "tokio", @@ -3129,7 +3146,7 @@ dependencies = [ "jsonrpsee-core", "jsonrpsee-types", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "tokio", "tracing", "tracing-futures", @@ -3156,7 +3173,7 @@ dependencies = [ "anyhow", "beef", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "thiserror", "tracing", ] @@ -3184,7 +3201,7 @@ dependencies = [ "http", "jsonrpsee-core", "jsonrpsee-types", - "serde_json 1.0.99", + "serde_json 1.0.100", "soketto", "tokio", "tokio-stream", @@ -3225,9 +3242,9 @@ dependencies = [ [[package]] name = "kvdb" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a301d8ecb7989d4a6e2c57a49baca77d353bdbf879909debe3f375fe25d61f86" +checksum = "585089ceadba0197ffe9af6740ab350b325e3c1f5fccfbc3522e0250c750409b" dependencies = [ "parity-util-mem", "smallvec", @@ -3235,9 +3252,9 @@ dependencies = [ [[package]] name = "kvdb-memorydb" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece7e668abd21387aeb6628130a6f4c802787f014fa46bc83221448322250357" +checksum = "40d109c87bfb7759edd2a49b2649c1afe25af785d930ad6a38479b4dc70dd873" dependencies = [ "kvdb", "parity-util-mem", @@ -3246,15 +3263,13 @@ dependencies = [ [[package]] name = "kvdb-rocksdb" -version = "0.15.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca7fbdfd71cd663dceb0faf3367a99f8cf724514933e9867cec4995b6027cbc1" +checksum = "c076cc2cdbac89b9910c853a36c957d3862a779f31c2661174222cefb49ee597" dependencies = [ - "fs-swap", "kvdb", "log", "num_cpus", - "owning_ref", "parity-util-mem", "parking_lot 0.12.1", "regex", @@ -3280,16 +3295,6 @@ version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" -[[package]] -name = "libloading" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -dependencies = [ - "cc", - "winapi", -] - [[package]] name = "libloading" version = "0.7.4" @@ -3314,9 +3319,9 @@ checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" [[package]] name = "libp2p" -version = "0.46.1" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81327106887e42d004fbdab1fef93675be2e2e07c1b95fce45e2cc813485611d" +checksum = "ec878fda12ebec479186b3914ebc48ff180fa4c51847e11a1a68bf65249e02c1" dependencies = [ "bytes", "futures", @@ -3324,12 +3329,8 @@ dependencies = [ "getrandom 0.2.10", "instant", "lazy_static", - "libp2p-autonat", "libp2p-core", - "libp2p-deflate", "libp2p-dns", - "libp2p-floodsub", - "libp2p-gossipsub", "libp2p-identify", "libp2p-kad", "libp2p-mdns", @@ -3337,49 +3338,24 @@ dependencies = [ "libp2p-mplex", "libp2p-noise", "libp2p-ping", - "libp2p-plaintext", - "libp2p-pnet", - "libp2p-relay", - "libp2p-rendezvous", "libp2p-request-response", "libp2p-swarm", "libp2p-swarm-derive", "libp2p-tcp", - "libp2p-uds", "libp2p-wasm-ext", "libp2p-websocket", "libp2p-yamux", "multiaddr", "parking_lot 0.12.1", "pin-project", - "rand 0.7.3", "smallvec", ] -[[package]] -name = "libp2p-autonat" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4decc51f3573653a9f4ecacb31b1b922dd20c25a6322bb15318ec04287ec46f9" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "instant", - "libp2p-core", - "libp2p-request-response", - "libp2p-swarm", - "log", - "prost 0.10.4", - "prost-build 0.10.4", - "rand 0.8.5", -] - [[package]] name = "libp2p-core" -version = "0.34.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf9b94cefab7599b2d3dff2f93bee218c6621d68590b23ede4485813cbcece6" +checksum = "799676bb0807c788065e57551c6527d461ad572162b0519d1958946ff9e0539d" dependencies = [ "asn1_der", "bs58", @@ -3390,17 +3366,15 @@ dependencies = [ "futures-timer", "instant", "lazy_static", - "libsecp256k1", "log", "multiaddr", "multihash", "multistream-select", "parking_lot 0.12.1", "pin-project", - "prost 0.10.4", - "prost-build 0.10.4", + "prost", + "prost-build", "rand 0.8.5", - "ring", "rw-stream-sink", "sha2 0.10.7", "smallvec", @@ -3410,22 +3384,11 @@ dependencies = [ "zeroize", ] -[[package]] -name = "libp2p-deflate" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0183dc2a3da1fbbf85e5b6cf51217f55b14f5daea0c455a9536eef646bfec71" -dependencies = [ - "flate2", - "futures", - "libp2p-core", -] - [[package]] name = "libp2p-dns" -version = "0.34.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cbf54723250fa5d521383be789bf60efdabe6bacfb443f87da261019a49b4b5" +checksum = "2322c9fb40d99101def6a01612ee30500c89abbbecb6297b3cd252903a4c1720" dependencies = [ "async-std-resolver", "futures", @@ -3436,57 +3399,11 @@ dependencies = [ "trust-dns-resolver", ] -[[package]] -name = "libp2p-floodsub" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98a4b6ffd53e355775d24b76f583fdda54b3284806f678499b57913adb94f231" -dependencies = [ - "cuckoofilter", - "fnv", - "futures", - "libp2p-core", - "libp2p-swarm", - "log", - "prost 0.10.4", - "prost-build 0.10.4", - "rand 0.7.3", - "smallvec", -] - -[[package]] -name = "libp2p-gossipsub" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b4b888cfbeb1f5551acd3aa1366e01bf88ede26cc3c4645d0d2d004d5ca7b0" -dependencies = [ - "asynchronous-codec", - "base64 0.13.1", - "byteorder", - "bytes", - "fnv", - "futures", - "hex_fmt", - "instant", - "libp2p-core", - "libp2p-swarm", - "log", - "prometheus-client", - "prost 0.10.4", - "prost-build 0.10.4", - "rand 0.7.3", - "regex", - "sha2 0.10.7", - "smallvec", - "unsigned-varint", - "wasm-timer", -] - [[package]] name = "libp2p-identify" -version = "0.37.0" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50b585518f8efd06f93ac2f976bd672e17cdac794644b3117edd078e96bda06" +checksum = "dcf9a121f699e8719bda2e6e9e9b6ddafc6cff4602471d6481c1067930ccb29b" dependencies = [ "asynchronous-codec", "futures", @@ -3494,9 +3411,9 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log", - "lru", - "prost 0.10.4", - "prost-build 0.10.4", + "lru 0.8.1", + "prost", + "prost-build", "prost-codec", "smallvec", "thiserror", @@ -3505,9 +3422,9 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.38.0" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740862893bb5f06ac24acc9d49bdeadc3a5e52e51818a30a25c1f3519da2c851" +checksum = "6721c200e2021f6c3fab8b6cf0272ead8912d871610ee194ebd628cecf428f22" dependencies = [ "arrayvec 0.7.4", "asynchronous-codec", @@ -3520,9 +3437,9 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log", - "prost 0.10.4", - "prost-build 0.10.4", - "rand 0.7.3", + "prost", + "prost-build", + "rand 0.8.5", "sha2 0.10.7", "smallvec", "thiserror", @@ -3533,16 +3450,15 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.38.0" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66e5e5919509603281033fd16306c61df7a4428ce274b67af5e14b07de5cdcb2" +checksum = "761704e727f7d68d58d7bc2231eafae5fc1b9814de24290f126df09d4bd37a15" dependencies = [ "async-io", "data-encoding", "dns-parser", "futures", "if-watch", - "lazy_static", "libp2p-core", "libp2p-swarm", "log", @@ -3554,25 +3470,23 @@ dependencies = [ [[package]] name = "libp2p-metrics" -version = "0.7.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8aff4a1abef42328fbb30b17c853fff9be986dc39af17ee39f9c5f755c5e0c" +checksum = "9ee31b08e78b7b8bfd1c4204a9dd8a87b4fcdf6dafc57eb51701c1c264a81cb9" dependencies = [ "libp2p-core", - "libp2p-gossipsub", "libp2p-identify", "libp2p-kad", "libp2p-ping", - "libp2p-relay", "libp2p-swarm", "prometheus-client", ] [[package]] name = "libp2p-mplex" -version = "0.34.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61fd1b20638ec209c5075dfb2e8ce6a7ea4ec3cd3ad7b77f7a477c06d53322e2" +checksum = "692664acfd98652de739a8acbb0a0d670f1d67190a49be6b4395e22c37337d89" dependencies = [ "asynchronous-codec", "bytes", @@ -3581,16 +3495,16 @@ dependencies = [ "log", "nohash-hasher", "parking_lot 0.12.1", - "rand 0.7.3", + "rand 0.8.5", "smallvec", "unsigned-varint", ] [[package]] name = "libp2p-noise" -version = "0.37.0" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "762408cb5d84b49a600422d7f9a42c18012d8da6ebcd570f9a4a4290ba41fb6f" +checksum = "048155686bd81fe6cb5efdef0c6290f25ad32a0a42e8f4f72625cf6a505a206f" dependencies = [ "bytes", "curve25519-dalek 3.2.0", @@ -3598,8 +3512,8 @@ dependencies = [ "lazy_static", "libp2p-core", "log", - "prost 0.10.4", - "prost-build 0.10.4", + "prost", + "prost-build", "rand 0.8.5", "sha2 0.10.7", "snow", @@ -3610,105 +3524,25 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "100a6934ae1dbf8a693a4e7dd1d730fd60b774dafc45688ed63b554497c6c925" -dependencies = [ - "futures", - "futures-timer", - "instant", - "libp2p-core", - "libp2p-swarm", - "log", - "rand 0.7.3", - "void", -] - -[[package]] -name = "libp2p-plaintext" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be27bf0820a6238a4e06365b096d428271cce85a129cf16f2fe9eb1610c4df86" -dependencies = [ - "asynchronous-codec", - "bytes", - "futures", - "libp2p-core", - "log", - "prost 0.10.4", - "prost-build 0.10.4", - "unsigned-varint", - "void", -] - -[[package]] -name = "libp2p-pnet" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6468f382568da936b4fa1cff273ce59b1debf873ff5f4ca412c3b91d0b37442c" -dependencies = [ - "futures", - "log", - "pin-project", - "rand 0.8.5", - "salsa20", - "sha3", -] - -[[package]] -name = "libp2p-relay" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4931547ee0cce03971ccc1733ff05bb0c4349fd89120a39e9861e2bbe18843c3" -dependencies = [ - "asynchronous-codec", - "bytes", - "either", - "futures", - "futures-timer", - "instant", - "libp2p-core", - "libp2p-swarm", - "log", - "pin-project", - "prost 0.10.4", - "prost-build 0.10.4", - "prost-codec", - "rand 0.8.5", - "smallvec", - "static_assertions", - "thiserror", - "void", -] - -[[package]] -name = "libp2p-rendezvous" -version = "0.7.0" +version = "0.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9511c9672ba33284838e349623319c8cad2d18cfad243ae46c6b7e8a2982ea4e" +checksum = "7228b9318d34689521349a86eb39a3c3a802c9efc99a0568062ffb80913e3f91" dependencies = [ - "asynchronous-codec", - "bimap", "futures", "futures-timer", "instant", "libp2p-core", "libp2p-swarm", "log", - "prost 0.10.4", - "prost-build 0.10.4", "rand 0.8.5", - "sha2 0.10.7", - "thiserror", - "unsigned-varint", "void", ] [[package]] name = "libp2p-request-response" -version = "0.19.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "508a189e2795d892c8f5c1fa1e9e0b1845d32d7b0b249dbf7b05b18811361843" +checksum = "8827af16a017b65311a410bb626205a9ad92ec0473967618425039fa5231adc1" dependencies = [ "async-trait", "bytes", @@ -3717,16 +3551,16 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log", - "rand 0.7.3", + "rand 0.8.5", "smallvec", "unsigned-varint", ] [[package]] name = "libp2p-swarm" -version = "0.37.0" +version = "0.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ac5be6c2de2d1ff3f7693fda6faf8a827b1f3e808202277783fea9f527d114" +checksum = "46d13df7c37807965d82930c0e4b04a659efcb6cca237373b206043db5398ecf" dependencies = [ "either", "fnv", @@ -3736,7 +3570,7 @@ dependencies = [ "libp2p-core", "log", "pin-project", - "rand 0.7.3", + "rand 0.8.5", "smallvec", "thiserror", "void", @@ -3744,48 +3578,36 @@ dependencies = [ [[package]] name = "libp2p-swarm-derive" -version = "0.28.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f54a64b6957249e0ce782f8abf41d97f69330d02bf229f0672d864f0650cc76" +checksum = "a0eddc4497a8b5a506013c40e8189864f9c3a00db2b25671f428ae9007f3ba32" dependencies = [ + "heck", "quote", "syn 1.0.109", ] [[package]] name = "libp2p-tcp" -version = "0.34.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a6771dc19aa3c65d6af9a8c65222bfc8fcd446630ddca487acd161fa6096f3b" +checksum = "9839d96761491c6d3e238e70554b856956fca0ab60feb9de2cd08eed4473fa92" dependencies = [ "async-io", "futures", "futures-timer", "if-watch", - "ipnet", "libc", "libp2p-core", "log", "socket2 0.4.9", ] -[[package]] -name = "libp2p-uds" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d125e3e5f0d58f3c6ac21815b20cf4b6a88b8db9dc26368ea821838f4161fd4d" -dependencies = [ - "async-std", - "futures", - "libp2p-core", - "log", -] - [[package]] name = "libp2p-wasm-ext" -version = "0.34.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec894790eec3c1608f8d1a8a0bdf0dbeb79ed4de2dce964222011c2896dfa05a" +checksum = "a17b5b8e7a73e379e47b1b77f8a82c4721e97eca01abcd18e9cd91a23ca6ce97" dependencies = [ "futures", "js-sys", @@ -3797,9 +3619,9 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.36.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9808e57e81be76ff841c106b4c5974fb4d41a233a7bdd2afbf1687ac6def3818" +checksum = "3758ae6f89b2531a24b6d9f5776bda6a626b60a57600d7185d43dfa75ca5ecc4" dependencies = [ "either", "futures", @@ -3816,12 +3638,13 @@ dependencies = [ [[package]] name = "libp2p-yamux" -version = "0.38.0" +version = "0.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6dea686217a06072033dc025631932810e2f6ad784e4fafa42e27d311c7a81c" +checksum = "0d6874d66543c4f7e26e3b8ca9a6bead351563a13ab4fafd43c7927f7c0d6c12" dependencies = [ "futures", "libp2p-core", + "log", "parking_lot 0.12.1", "thiserror", "yamux", @@ -3829,9 +3652,9 @@ dependencies = [ [[package]] name = "librocksdb-sys" -version = "0.6.3+6.28.2" +version = "0.8.3+7.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "184ce2a189a817be2731070775ad053b6804a340fee05c6686d711db27455917" +checksum = "557b255ff04123fcc176162f56ed0c9cd42d8f357cf55b3fabeb60f7413741b3" dependencies = [ "bindgen", "bzip2-sys", @@ -3990,6 +3813,15 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "lru" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" +dependencies = [ + "hashbrown", +] + [[package]] name = "lru-cache" version = "0.1.2" @@ -4040,7 +3872,7 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -4071,7 +3903,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e" dependencies = [ - "rustix 0.37.22", + "rustix 0.37.23", ] [[package]] @@ -4103,9 +3935,9 @@ dependencies = [ [[package]] name = "memory-db" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6566c70c1016f525ced45d7b7f97730a2bafb037c788211d0c186ef5b2189f0a" +checksum = "34ac11bb793c28fa095b7554466f53b3a60a2cd002afdac01bcf135cbd73a269" dependencies = [ "hash-db", "hashbrown", @@ -4156,6 +3988,33 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mockall" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" +dependencies = [ + "cfg-if", + "downcast", + "fragile", + "lazy_static", + "mockall_derive", + "predicates", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "multiaddr" version = "0.14.0" @@ -4224,9 +4083,9 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "multistream-select" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "363a84be6453a70e63513660f4894ef815daf88e3356bffcda9ca27d810ce83b" +checksum = "c8552ab875c1313b97b8d20cb857b9fd63e2d1d6a0a1b53ce9821e575405f27a" dependencies = [ "bytes", "futures", @@ -4354,7 +4213,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-system", "parity-scale-codec", @@ -4386,6 +4245,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + [[package]] name = "num-bigint" version = "0.2.6" @@ -4424,7 +4289,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" dependencies = [ "arrayvec 0.7.4", - "itoa 1.0.7", + "itoa 1.0.8", ] [[package]] @@ -4477,7 +4342,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi 0.3.2", "libc", ] @@ -4526,12 +4391,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" -[[package]] -name = "os_str_bytes" -version = "6.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" - [[package]] name = "output_vt100" version = "0.1.3" @@ -4541,15 +4400,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "owning_ref" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" -dependencies = [ - "stable_deref_trait", -] - [[package]] name = "packed_simd_2" version = "0.3.8" @@ -4563,7 +4413,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -4579,7 +4429,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -4594,7 +4444,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4618,7 +4468,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4638,7 +4488,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4653,7 +4503,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4704,7 +4554,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4723,7 +4573,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4740,7 +4590,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4756,6 +4606,7 @@ dependencies = [ "scale-info", "serde", "smallvec", + "sp-api", "sp-core", "sp-io", "sp-runtime", @@ -4768,58 +4619,25 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-rpc", "sp-runtime", "sp-std", + "sp-weights", ] [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", ] -[[package]] -name = "pallet-contracts-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" -dependencies = [ - "jsonrpsee", - "pallet-contracts-primitives", - "pallet-contracts-rpc-runtime-api", - "parity-scale-codec", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-rpc", - "sp-runtime", -] - -[[package]] -name = "pallet-contracts-rpc-runtime-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" -dependencies = [ - "pallet-contracts-primitives", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-runtime", - "sp-std", -] - [[package]] name = "pallet-ddc-metrics-offchain-worker" version = "4.7.0" @@ -4865,14 +4683,16 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "log", "parity-scale-codec", "scale-info", "serde", + "sp-core", "sp-io", "sp-runtime", "sp-std", @@ -4881,7 +4701,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4905,7 +4725,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4918,7 +4738,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4974,7 +4794,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4995,7 +4815,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5018,7 +4838,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5034,7 +4854,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5054,7 +4874,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5071,7 +4891,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5088,11 +4908,12 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "log", "parity-scale-codec", "scale-info", "sp-io", @@ -5103,7 +4924,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5120,7 +4941,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5140,7 +4961,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -5150,7 +4971,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5167,7 +4988,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5190,7 +5011,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5205,7 +5026,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5219,7 +5040,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5234,7 +5055,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5250,7 +5071,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5271,7 +5092,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5287,7 +5108,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5301,7 +5122,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5324,7 +5145,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5335,7 +5156,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5349,7 +5170,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5367,7 +5188,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5386,7 +5207,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5402,7 +5223,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5417,7 +5238,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5428,7 +5249,7 @@ dependencies = [ [[package]] name = "pallet-transaction-storage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5446,7 +5267,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5463,7 +5284,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5479,7 +5300,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5545,9 +5366,9 @@ checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" [[package]] name = "parity-util-mem" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c32561d248d352148124f036cac253a644685a21dc9fea383eb4907d7bd35a8f" +checksum = "0d32c34f4f5ca7f9196001c0aba5a1f9a5a12382c8944b8b0f90233282d1e8f8" dependencies = [ "cfg-if", "hashbrown", @@ -5641,9 +5462,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35" [[package]] name = "pbkdf2" @@ -5841,6 +5662,36 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "predicates" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +dependencies = [ + "difflib", + "float-cmp", + "itertools", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" + +[[package]] +name = "predicates-tree" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +dependencies = [ + "predicates-core", + "termtree", +] + [[package]] name = "pretty_assertions" version = "0.6.1" @@ -5863,21 +5714,11 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "prettyplease" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9825a04601d60621feed79c4e6b56d65db77cdca55cef43b46b0de1096d1c282" -dependencies = [ - "proc-macro2", - "syn 2.0.23", -] - [[package]] name = "primitive-types" -version = "0.11.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28720988bff275df1f51b171e1b2a18c30d194c4d2b61defdacecd625a5d94a" +checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" dependencies = [ "fixed-hash", "impl-codec", @@ -5945,37 +5786,27 @@ dependencies = [ [[package]] name = "prometheus-client" -version = "0.16.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1abe0255c04d15f571427a2d1e00099016506cf3297b53853acd2b7eb87825" +checksum = "83cd1b99916654a69008fd66b4f9397fbe08e6e51dfe23d4417acf5d3b8cb87c" dependencies = [ "dtoa", - "itoa 1.0.7", - "owning_ref", + "itoa 1.0.8", + "parking_lot 0.12.1", "prometheus-client-derive-text-encode", ] [[package]] name = "prometheus-client-derive-text-encode" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8e12d01b9d66ad9eb4529c57666b6263fc1993cb30261d83ead658fdd932652" +checksum = "66a455fbcb954c1a7decf3c586e860fd7889cddf4b8e164be736dbac95a953cd" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", ] -[[package]] -name = "prost" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" -dependencies = [ - "bytes", - "prost-derive 0.10.1", -] - [[package]] name = "prost" version = "0.11.9" @@ -5983,29 +5814,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" dependencies = [ "bytes", - "prost-derive 0.11.9", -] - -[[package]] -name = "prost-build" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae5a4388762d5815a9fc0dea33c56b021cdc8dde0c55e0c9ca57197254b0cab" -dependencies = [ - "bytes", - "cfg-if", - "cmake", - "heck", - "itertools", - "lazy_static", - "log", - "multimap", - "petgraph", - "prost 0.10.4", - "prost-types 0.10.1", - "regex", - "tempfile", - "which", + "prost-derive", ] [[package]] @@ -6021,9 +5830,9 @@ dependencies = [ "log", "multimap", "petgraph", - "prettyplease 0.1.25", - "prost 0.11.9", - "prost-types 0.11.9", + "prettyplease", + "prost", + "prost-types", "regex", "syn 1.0.109", "tempfile", @@ -6032,30 +5841,17 @@ dependencies = [ [[package]] name = "prost-codec" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00af1e92c33b4813cc79fda3f2dbf56af5169709be0202df730e9ebc3e4cd007" +checksum = "011ae9ff8359df7915f97302d591cdd9e0e27fbd5a4ddc5bd13b71079bb20987" dependencies = [ "asynchronous-codec", "bytes", - "prost 0.10.4", + "prost", "thiserror", "unsigned-varint", ] -[[package]] -name = "prost-derive" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b670f45da57fb8542ebdbb6105a925fe571b67f9e7ed9f47a06a84e72b4e7cc" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "prost-derive" version = "0.11.9" @@ -6069,23 +5865,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "prost-types" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d0a014229361011dc8e69c8a1ec6c2e8d0f2af7c91e3ea3f5b2170298461e68" -dependencies = [ - "bytes", - "prost 0.10.4", -] - [[package]] name = "prost-types" version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" dependencies = [ - "prost 0.11.9", + "prost", ] [[package]] @@ -6288,18 +6074,18 @@ dependencies = [ [[package]] name = "ref-cast" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43faa91b1c8b36841ee70e97188a869d37ae21759da6846d4be66de5bf7b12c" +checksum = "1641819477c319ef452a075ac34a4be92eb9ba09f6841f62d594d50fdcf0bf6b" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d2275aab483050ab2a7364c1a46604865ee7d6906684e08db0f090acf74f9e7" +checksum = "68bf53dad9b6086826722cdc99140793afd9f62faa14a1ad07eb4f955e7a7216" dependencies = [ "proc-macro2", "quote", @@ -6320,13 +6106,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.4" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +checksum = "89089e897c013b3deb627116ae56a6955a72b8bed395c9526af31c9fe528b484" dependencies = [ "aho-corasick 1.0.2", "memchr", - "regex-syntax 0.7.2", + "regex-automata 0.3.0", + "regex-syntax 0.7.3", ] [[package]] @@ -6338,6 +6125,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa250384981ea14565685dea16a9ccc4d1c541a13f82b9c168572264d1df8c56" +dependencies = [ + "aho-corasick 1.0.2", + "memchr", + "regex-syntax 0.7.3", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -6346,25 +6144,25 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +checksum = "2ab07dc67230e4a4718e70fd5c20055a4334b121f1f9db8fe63ef39ce9b8c846" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "env_logger 0.9.3", - "jsonrpsee", "log", "parity-scale-codec", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-core", "sp-io", "sp-runtime", "sp-version", + "substrate-rpc-client", ] [[package]] @@ -6405,9 +6203,9 @@ dependencies = [ [[package]] name = "rocksdb" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "620f4129485ff1a7128d184bc687470c21c7951b64779ebc9cfdad3dcd920290" +checksum = "7e9562ea1d70c0cc63a34a22d977753b50cca91cc6b6527750463bd5dd8697bc" dependencies = [ "libc", "librocksdb-sys", @@ -6487,9 +6285,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.35.13" +version = "0.35.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727a1a6d65f786ec22df8a81ca3121107f235970dc1705ed681d3e6e8b9cd5f9" +checksum = "6380889b07a03b5ecf1d44dc9ede6fd2145d84b502a2a9ca0b03c48e0cc3220f" dependencies = [ "bitflags 1.3.2", "errno 0.2.8", @@ -6501,9 +6299,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.22" +version = "0.37.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8818fa822adcc98b18fedbb3632a6a33213c070556b5aa7c4c8cc21cff565c4c" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" dependencies = [ "bitflags 1.3.2", "errno 0.3.1", @@ -6515,9 +6313,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.2" +version = "0.38.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabcb0461ebd01d6b79945797c27f8529082226cb630a9865a71870ff63532a4" +checksum = "ac5ffa1efe7548069688cd7028f32591853cd7b5b756d41bcffd2353e4fc75b4" dependencies = [ "bitflags 2.3.3", "errno 0.3.1", @@ -6561,9 +6359,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" [[package]] name = "rw-stream-sink" @@ -6578,9 +6376,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" [[package]] name = "safe-mix" @@ -6591,15 +6389,6 @@ dependencies = [ "rustc_version 0.2.3", ] -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher 0.4.4", -] - [[package]] name = "same-file" version = "1.0.6" @@ -6612,7 +6401,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "sp-core", @@ -6623,7 +6412,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6632,8 +6421,8 @@ dependencies = [ "libp2p", "log", "parity-scale-codec", - "prost 0.10.4", - "prost-build 0.10.4", + "prost", + "prost-build", "rand 0.7.3", "sc-client-api", "sc-network-common", @@ -6650,7 +6439,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "futures-timer", @@ -6673,7 +6462,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6689,7 +6478,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6698,7 +6487,7 @@ dependencies = [ "sc-network-common", "sc-telemetry", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-core", "sp-runtime", ] @@ -6706,7 +6495,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6717,7 +6506,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "chrono", @@ -6741,7 +6530,7 @@ dependencies = [ "sc-tracing", "sc-utils", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-blockchain", "sp-core", "sp-keyring", @@ -6757,7 +6546,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "fnv", "futures", @@ -6785,7 +6574,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "kvdb", @@ -6810,7 +6599,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6834,7 +6623,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "fork-tree", @@ -6876,7 +6665,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -6898,7 +6687,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6911,7 +6700,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6935,7 +6724,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sc-client-api", "sp-authorship", @@ -6946,10 +6735,10 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "lazy_static", - "lru", + "lru 0.7.8", "parity-scale-codec", "parking_lot 0.12.1", "sc-executor-common", @@ -6973,7 +6762,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "environmental", "parity-scale-codec", @@ -6989,7 +6778,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -7004,7 +6793,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "cfg-if", "libc", @@ -7012,7 +6801,7 @@ dependencies = [ "once_cell", "parity-scale-codec", "parity-wasm 0.45.0", - "rustix 0.35.13", + "rustix 0.35.14", "sc-allocator", "sc-executor-common", "sp-runtime-interface", @@ -7024,7 +6813,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "array-bytes", @@ -7048,7 +6837,7 @@ dependencies = [ "sc-network-gossip", "sc-telemetry", "sc-utils", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-api", "sp-application-crypto", "sp-arithmetic", @@ -7065,7 +6854,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "finality-grandpa", "futures", @@ -7076,7 +6865,7 @@ dependencies = [ "sc-finality-grandpa", "sc-rpc", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-blockchain", "sp-core", "sp-runtime", @@ -7086,7 +6875,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7103,12 +6892,12 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "async-trait", "parking_lot 0.12.1", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-application-crypto", "sp-core", "sp-keystore", @@ -7118,7 +6907,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "async-trait", @@ -7136,11 +6925,11 @@ dependencies = [ "linked-hash-map", "linked_hash_set", "log", - "lru", + "lru 0.7.8", "parity-scale-codec", "parking_lot 0.12.1", "pin-project", - "prost 0.10.4", + "prost", "rand 0.7.3", "sc-block-builder", "sc-client-api", @@ -7149,7 +6938,7 @@ dependencies = [ "sc-peerset", "sc-utils", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "smallvec", "sp-arithmetic", "sp-blockchain", @@ -7165,14 +6954,14 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "cid", "futures", "libp2p", "log", - "prost 0.11.9", - "prost-build 0.11.9", + "prost", + "prost-build", "sc-client-api", "sc-network-common", "sp-blockchain", @@ -7185,7 +6974,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7195,7 +6984,7 @@ dependencies = [ "libp2p", "linked_hash_set", "parity-scale-codec", - "prost-build 0.10.4", + "prost-build", "sc-consensus", "sc-peerset", "serde", @@ -7211,14 +7000,14 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "futures", "futures-timer", "libp2p", "log", - "lru", + "lru 0.7.8", "sc-network-common", "sc-peerset", "sp-runtime", @@ -7229,15 +7018,15 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "futures", "libp2p", "log", "parity-scale-codec", - "prost 0.10.4", - "prost-build 0.10.4", + "prost", + "prost-build", "sc-client-api", "sc-network-common", "sc-peerset", @@ -7250,21 +7039,23 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "fork-tree", "futures", "libp2p", "log", - "lru", + "lru 0.7.8", + "mockall", "parity-scale-codec", - "prost 0.10.4", - "prost-build 0.10.4", + "prost", + "prost-build", "sc-client-api", "sc-consensus", "sc-network-common", "sc-peerset", + "sc-utils", "smallvec", "sp-arithmetic", "sp-blockchain", @@ -7278,7 +7069,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "futures", @@ -7297,7 +7088,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "bytes", @@ -7327,20 +7118,20 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "libp2p", "log", "sc-utils", - "serde_json 1.0.99", + "serde_json 1.0.100", "wasm-timer", ] [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7349,7 +7140,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "hash-db", @@ -7364,7 +7155,7 @@ dependencies = [ "sc-tracing", "sc-transaction-pool-api", "sc-utils", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-api", "sp-blockchain", "sp-core", @@ -7379,7 +7170,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -7390,7 +7181,7 @@ dependencies = [ "sc-transaction-pool-api", "scale-info", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-core", "sp-rpc", "sp-runtime", @@ -7402,20 +7193,39 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", "log", - "serde_json 1.0.99", + "serde_json 1.0.100", "substrate-prometheus-endpoint", "tokio", ] +[[package]] +name = "sc-rpc-spec-v2" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +dependencies = [ + "futures", + "hex", + "jsonrpsee", + "parity-scale-codec", + "sc-chain-spec", + "sc-transaction-pool-api", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-runtime", + "thiserror", +] + [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "directories", @@ -7447,6 +7257,7 @@ dependencies = [ "sc-offchain", "sc-rpc", "sc-rpc-server", + "sc-rpc-spec-v2", "sc-sysinfo", "sc-telemetry", "sc-tracing", @@ -7454,7 +7265,7 @@ dependencies = [ "sc-transaction-pool-api", "sc-utils", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-api", "sp-application-crypto", "sp-block-builder", @@ -7485,7 +7296,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -7499,7 +7310,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7509,7 +7320,7 @@ dependencies = [ "sc-consensus-epochs", "sc-finality-grandpa", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-blockchain", "sp-runtime", "thiserror", @@ -7518,7 +7329,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "libc", @@ -7528,7 +7339,7 @@ dependencies = [ "regex", "sc-telemetry", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-core", "sp-io", "sp-std", @@ -7537,7 +7348,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "chrono", "futures", @@ -7547,7 +7358,7 @@ dependencies = [ "pin-project", "rand 0.7.3", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "thiserror", "wasm-timer", ] @@ -7555,7 +7366,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7586,7 +7397,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7597,8 +7408,9 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ + "async-trait", "futures", "futures-timer", "linked-hash-map", @@ -7623,8 +7435,9 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ + "async-trait", "futures", "log", "serde", @@ -7636,7 +7449,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "futures-timer", @@ -7648,9 +7461,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad560913365790f17cbf12479491169f01b9d46d29cfc7422bf8c64bdc61b731" +checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" dependencies = [ "bitvec", "cfg-if", @@ -7662,9 +7475,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19df9bd9ace6cc2fe19387c96ce677e823e07d017ceed253e7bb3d1d1bd9c73b" +checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7813,18 +7626,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.165" +version = "1.0.167" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c939f902bb7d0ccc5bce4f03297e161543c2dcb30914faf032c2bd0b7a0d48fc" +checksum = "7daf513456463b42aa1d94cff7e0c24d682b429f020b9afa4f5ba5c40a22b237" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.165" +version = "1.0.167" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eaae920e25fffe4019b75ff65e7660e72091e59dd204cb5849bbd6a3fd343d7" +checksum = "b69b106b68bc8054f0e974e70d19984040f8a5cf9215ca82626ea4853f82c4b9" dependencies = [ "proc-macro2", "quote", @@ -7843,11 +7656,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" +checksum = "0f1e14e89be7aa4c4b78bdbdc9eb5bf8517829a600ae8eaa39a6e1d960b5185c" dependencies = [ - "itoa 1.0.7", + "itoa 1.0.8", "ryu", "serde", ] @@ -7993,9 +7806,9 @@ checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "snap" @@ -8059,7 +7872,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "log", @@ -8077,7 +7890,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "blake2", "proc-macro-crate", @@ -8089,7 +7902,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8102,7 +7915,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "integer-sqrt", "num-traits", @@ -8117,7 +7930,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8130,7 +7943,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "parity-scale-codec", @@ -8142,7 +7955,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -8154,11 +7967,11 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "log", - "lru", + "lru 0.7.8", "parity-scale-codec", "parking_lot 0.12.1", "sp-api", @@ -8172,7 +7985,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -8191,7 +8004,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "merlin", @@ -8214,7 +8027,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8228,7 +8041,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8241,7 +8054,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "base58", @@ -8287,7 +8100,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "blake2", "byteorder", @@ -8301,7 +8114,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -8312,7 +8125,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8321,7 +8134,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -8331,7 +8144,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "environmental", "parity-scale-codec", @@ -8342,7 +8155,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "finality-grandpa", "log", @@ -8360,7 +8173,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8374,7 +8187,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bytes", "futures", @@ -8400,7 +8213,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "lazy_static", "sp-core", @@ -8411,7 +8224,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -8428,7 +8241,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "thiserror", "zstd", @@ -8437,7 +8250,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8451,7 +8264,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sp-api", "sp-core", @@ -8461,7 +8274,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "backtrace", "lazy_static", @@ -8471,7 +8284,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "rustc-hash", "serde", @@ -8481,7 +8294,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "either", "hash256-std-hasher", @@ -8504,7 +8317,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8522,7 +8335,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "proc-macro-crate", @@ -8534,7 +8347,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -8548,7 +8361,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8562,7 +8375,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8573,7 +8386,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "log", @@ -8595,12 +8408,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8613,7 +8426,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "sp-core", @@ -8626,7 +8439,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures-timer", @@ -8642,7 +8455,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-std", @@ -8654,7 +8467,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sp-api", "sp-runtime", @@ -8663,7 +8476,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "log", @@ -8679,13 +8492,13 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "hash-db", "hashbrown", "lazy_static", - "lru", + "lru 0.7.8", "memory-db", "nohash-hasher", "parity-scale-codec", @@ -8702,7 +8515,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8719,7 +8532,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8730,7 +8543,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "log", @@ -8743,7 +8556,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8783,7 +8596,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "unicode-xid", ] @@ -8884,7 +8697,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "platforms 2.0.0", ] @@ -8892,7 +8705,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -8902,7 +8715,7 @@ dependencies = [ "sc-client-api", "sc-rpc-api", "sc-transaction-pool-api", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-api", "sp-block-builder", "sp-blockchain", @@ -8913,7 +8726,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures-util", "hyper", @@ -8923,10 +8736,23 @@ dependencies = [ "tokio", ] +[[package]] +name = "substrate-rpc-client" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +dependencies = [ + "async-trait", + "jsonrpsee", + "log", + "sc-rpc-api", + "serde", + "sp-runtime", +] + [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "log", @@ -8947,7 +8773,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "substrate-test-utils-derive", @@ -8957,7 +8783,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8968,7 +8794,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -9065,7 +8891,7 @@ dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.22", + "rustix 0.37.23", "windows-sys 0.48.0", ] @@ -9079,25 +8905,25 @@ dependencies = [ ] [[package]] -name = "textwrap" -version = "0.16.0" +name = "termtree" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" dependencies = [ "proc-macro2", "quote", @@ -9131,12 +8957,11 @@ dependencies = [ [[package]] name = "tikv-jemalloc-sys" -version = "0.4.3+5.2.1-patched.2" +version = "0.5.3+5.3.0-patched" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1792ccb507d955b46af42c123ea8863668fae24d03721e40cad6a41773dbb49" +checksum = "a678df20055b43e57ef8cddde41cdfda9a3c1a060b67f4c5836dfb1d78543ba8" dependencies = [ "cc", - "fs_extra", "libc", ] @@ -9345,7 +9170,7 @@ dependencies = [ "parking_lot 0.11.2", "regex", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sharded-slab", "smallvec", "thread_local", @@ -9379,9 +9204,9 @@ dependencies = [ [[package]] name = "trust-dns-proto" -version = "0.21.2" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" +checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" dependencies = [ "async-trait", "cfg-if", @@ -9393,30 +9218,30 @@ dependencies = [ "idna 0.2.3", "ipnet", "lazy_static", - "log", "rand 0.8.5", "smallvec", "thiserror", "tinyvec", + "tracing", "url", ] [[package]] name = "trust-dns-resolver" -version = "0.21.2" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" +checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" dependencies = [ "cfg-if", "futures-util", "ipconfig", "lazy_static", - "log", "lru-cache", "parking_lot 0.12.1", "resolv-conf", "smallvec", "thiserror", + "tracing", "trust-dns-proto", ] @@ -9429,11 +9254,10 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "clap", "frame-try-runtime", - "jsonrpsee", "log", "parity-scale-codec", "remote-externalities", @@ -9449,6 +9273,8 @@ dependencies = [ "sp-runtime", "sp-state-machine", "sp-version", + "sp-weights", + "substrate-rpc-client", "zstd", ] @@ -9511,9 +9337,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" [[package]] name = "unicode-normalization" @@ -9575,6 +9401,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "valuable" version = "0.1.0" @@ -9840,7 +9672,7 @@ dependencies = [ "directories-next", "file-per-thread-logger", "log", - "rustix 0.35.13", + "rustix 0.35.14", "serde", "sha2 0.9.9", "toml", @@ -9903,7 +9735,7 @@ dependencies = [ "log", "object 0.29.0", "rustc-demangle", - "rustix 0.35.13", + "rustix 0.35.14", "serde", "target-lexicon", "thiserror", @@ -9921,7 +9753,7 @@ checksum = "f671b588486f5ccec8c5a3dba6b4c07eac2e66ab8c60e6f4e53717c77f709731" dependencies = [ "object 0.29.0", "once_cell", - "rustix 0.35.13", + "rustix 0.35.14", ] [[package]] @@ -9941,7 +9773,7 @@ dependencies = [ "memoffset 0.6.5", "paste", "rand 0.8.5", - "rustix 0.35.13", + "rustix 0.35.14", "thiserror", "wasmtime-asm-macros", "wasmtime-environ", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 21b8066f0..a2d022a6e 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -12,7 +12,7 @@ wasm-opt = false crate-type = ["cdylib", "rlib"] [dependencies] -clap = { version = "3.1", features = ["derive"], optional = true } +clap = { version = "4.0.9", features = ["derive"], optional = true } sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.31" } sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.31" } frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.31" } diff --git a/node/client/Cargo.toml b/node/client/Cargo.toml index fbf8e921f..8a4d26500 100644 --- a/node/client/Cargo.toml +++ b/node/client/Cargo.toml @@ -21,7 +21,6 @@ sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/pari sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-offchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/node/client/src/lib.rs b/node/client/src/lib.rs index 8de68a06a..65fe29ad9 100644 --- a/node/client/src/lib.rs +++ b/node/client/src/lib.rs @@ -259,63 +259,63 @@ impl sc_client_api::BlockBackend for Client { impl sc_client_api::StorageProvider for Client { fn storage( &self, - id: &BlockId, + hash: &::Hash, key: &StorageKey, ) -> sp_blockchain::Result> { with_client! { self, client, { - client.storage(id, key) + client.storage(hash, key) } } } fn storage_keys( &self, - id: &BlockId, + hash: &::Hash, key_prefix: &StorageKey, ) -> sp_blockchain::Result> { with_client! { self, client, { - client.storage_keys(id, key_prefix) + client.storage_keys(hash, key_prefix) } } } fn storage_hash( &self, - id: &BlockId, + hash: &::Hash, key: &StorageKey, ) -> sp_blockchain::Result::Hash>> { with_client! { self, client, { - client.storage_hash(id, key) + client.storage_hash(hash, key) } } } fn storage_pairs( &self, - id: &BlockId, + hash: &::Hash, key_prefix: &StorageKey, ) -> sp_blockchain::Result> { with_client! { self, client, { - client.storage_pairs(id, key_prefix) + client.storage_pairs(hash, key_prefix) } } } fn storage_keys_iter<'a>( &self, - id: &BlockId, + hash: &::Hash, prefix: Option<&'a StorageKey>, start_key: Option<&StorageKey>, ) -> sp_blockchain::Result< @@ -325,14 +325,14 @@ impl sc_client_api::StorageProvider for Client { self, client, { - client.storage_keys_iter(id, prefix, start_key) + client.storage_keys_iter(hash, prefix, start_key) } } } fn child_storage( &self, - id: &BlockId, + hash: &::Hash, child_info: &ChildInfo, key: &StorageKey, ) -> sp_blockchain::Result> { @@ -340,14 +340,14 @@ impl sc_client_api::StorageProvider for Client { self, client, { - client.child_storage(id, child_info, key) + client.child_storage(hash, child_info, key) } } } fn child_storage_keys( &self, - id: &BlockId, + hash: &::Hash, child_info: &ChildInfo, key_prefix: &StorageKey, ) -> sp_blockchain::Result> { @@ -355,14 +355,14 @@ impl sc_client_api::StorageProvider for Client { self, client, { - client.child_storage_keys(id, child_info, key_prefix) + client.child_storage_keys(hash, child_info, key_prefix) } } } fn child_storage_keys_iter<'a>( &self, - id: &BlockId, + hash: &::Hash, child_info: ChildInfo, prefix: Option<&'a StorageKey>, start_key: Option<&StorageKey>, @@ -373,14 +373,14 @@ impl sc_client_api::StorageProvider for Client { self, client, { - client.child_storage_keys_iter(id, child_info, prefix, start_key) + client.child_storage_keys_iter(hash, child_info, prefix, start_key) } } } fn child_storage_hash( &self, - id: &BlockId, + hash: &::Hash, child_info: &ChildInfo, key: &StorageKey, ) -> sp_blockchain::Result::Hash>> { @@ -388,7 +388,7 @@ impl sc_client_api::StorageProvider for Client { self, client, { - client.child_storage_hash(id, child_info, key) + client.child_storage_hash(hash, child_info, key) } } } @@ -577,7 +577,6 @@ pub trait RuntimeApiCollection: + sp_offchain::OffchainWorkerApi + sp_session::SessionKeys + sp_authority_discovery::AuthorityDiscoveryApi - + pallet_contracts_rpc::ContractsRuntimeApi where >::StateBackend: sp_api::StateBackend, { @@ -595,8 +594,7 @@ where + sp_api::Metadata + sp_offchain::OffchainWorkerApi + sp_session::SessionKeys - + sp_authority_discovery::AuthorityDiscoveryApi - + pallet_contracts_rpc::ContractsRuntimeApi, + + sp_authority_discovery::AuthorityDiscoveryApi, >::StateBackend: sp_api::StateBackend, { } diff --git a/pallets/ddc-metrics-offchain-worker/Cargo.toml b/pallets/ddc-metrics-offchain-worker/Cargo.toml index 680e717dc..46f24be43 100644 --- a/pallets/ddc-metrics-offchain-worker/Cargo.toml +++ b/pallets/ddc-metrics-offchain-worker/Cargo.toml @@ -26,7 +26,6 @@ pallet-contracts = { version = '4.0.0-dev', default-features = false, git = "ht lite-json = { version = "0.2.0", default-features = false } alt_serde = { version = "1", default-features = false, features = ["derive"] } serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } -# pallet-contracts-rpc-runtime-api = { version = "0.8.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } hex-literal = "^0.3.1" hex = { version = "0.4", default-features = false } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } @@ -45,7 +44,6 @@ std = [ "sp-runtime/std", "sp-std/std", "pallet-contracts/std", - # "pallet-contracts-rpc-runtime-api/std", ] [dev-dependencies] diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index bd978c05f..37b890bd3 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -45,7 +45,7 @@ use sp_runtime::{ }; use sp_staking::EraIndex; use sp_std::prelude::*; - +use core::fmt::Debug; pub use pallet::*; /// Two minutes. @@ -100,7 +100,7 @@ pub struct StakingLedger { pub unlocking: BoundedVec, MaxUnlockingChunks>, } -impl +impl StakingLedger { /// Initializes the default object using the given stash. diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 6d5f7d797..83a2c205c 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -59,7 +59,6 @@ pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } @@ -124,7 +123,6 @@ std = [ "pallet-collective/std", "pallet-contracts/std", "pallet-contracts-primitives/std", - "pallet-contracts-rpc-runtime-api/std", "pallet-democracy/std", "pallet-fast-unstake/std", "pallet-elections-phragmen/std", diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 19ab9cbe7..82610d5c9 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -33,7 +33,7 @@ use frame_support::{ traits::{ ConstU16, ConstU32, ConstU128, Currency, EitherOfDiverse, EqualPrivilegeOnly, Everything, Imbalance, InstanceFilter, KeyOwnerProofSystem, LockIdentifier, Nothing, OnUnbalanced, - U128CurrencyToVote, + U128CurrencyToVote, WithdrawReasons, }, weights::{ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, @@ -71,7 +71,7 @@ use sp_runtime::{ generic, impl_opaque_keys, traits::{ self, BlakeTwo256, Block as BlockT, ConvertInto, NumberFor, OpaqueKeys, - SaturatedConversion, StaticLookup, + SaturatedConversion, StaticLookup, Bounded, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedU128, FixedPointNumber, Perbill, Percent, Permill, Perquintill, @@ -174,8 +174,8 @@ const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); /// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used /// by Operational extrinsics. const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); -/// We allow for 2 seconds of compute with a 6 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = WEIGHT_PER_SECOND.saturating_mul(2); +/// We allow for 2 seconds of compute with a 6 second average block time, with maximum proof size. +const MAXIMUM_BLOCK_WEIGHT: Weight = WEIGHT_PER_SECOND.saturating_mul(2).set_proof_size(u64::MAX); parameter_types! { pub const BlockHashCount: BlockNumber = 2400; @@ -350,11 +350,10 @@ impl pallet_scheduler::Config for Runtime { type RuntimeCall = RuntimeCall; type MaximumWeight = MaximumSchedulerWeight; type ScheduleOrigin = EnsureRoot; - type MaxScheduledPerBlock = ConstU32<50>; + type MaxScheduledPerBlock = ConstU32<512>; type WeightInfo = pallet_scheduler::weights::SubstrateWeight; type OriginPrivilegeCmp = EqualPrivilegeOnly; - type PreimageProvider = (); - type NoPreimagePostponement = (); + type Preimages = (); } parameter_types! { @@ -429,6 +428,7 @@ parameter_types! { pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(1, 100_000); pub MinimumMultiplier: Multiplier = Multiplier::saturating_from_rational(1, 1_000_000_000u128); + pub MaximumMultiplier: Multiplier = Bounded::max_value(); } impl pallet_transaction_payment::Config for Runtime { @@ -437,8 +437,13 @@ impl pallet_transaction_payment::Config for Runtime { type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = IdentityFee; type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = - TargetedFeeAdjustment; + type FeeMultiplierUpdate = TargetedFeeAdjustment< + Self, + TargetBlockFullness, + AdjustmentVariable, + MinimumMultiplier, + MaximumMultiplier, + >; } parameter_types! { @@ -731,7 +736,6 @@ parameter_types! { } impl pallet_democracy::Config for Runtime { - type Proposal = RuntimeCall; type RuntimeEvent = RuntimeEvent; type Currency = Balances; type EnactmentPeriod = EnactmentPeriod; @@ -771,14 +775,15 @@ impl pallet_democracy::Config for Runtime { // only do it once and it lasts only for the cool-off period. type VetoOrigin = pallet_collective::EnsureMember; type CooloffPeriod = CooloffPeriod; - type PreimageByteDeposit = (); - type OperationalPreimageOrigin = pallet_collective::EnsureMember; type Slash = Treasury; type Scheduler = Scheduler; type PalletsOrigin = OriginCaller; type MaxVotes = ConstU32<100>; type WeightInfo = pallet_democracy::weights::SubstrateWeight; type MaxProposals = MaxProposals; + type Preimages = (); + type MaxDeposits = ConstU32<100>; + type MaxBlacklisted = ConstU32<100>; } parameter_types! { @@ -996,7 +1001,6 @@ impl pallet_contracts::Config for Runtime { type DeletionWeightLimit = DeletionWeightLimit; type Schedule = Schedule; type AddressGenerator = pallet_contracts::DefaultAddressGenerator; - type ContractAccessWeight = pallet_contracts::DefaultContractAccessWeight; type MaxCodeLen = ConstU32<{ 128 * 1024 }>; type MaxStorageKeyLen = ConstU32<128>; } @@ -1192,6 +1196,8 @@ impl pallet_society::Config for Runtime { parameter_types! { pub const MinVestedTransfer: Balance = 1 * DOLLARS; + pub UnvestedFundsAllowedWithdrawReasons: WithdrawReasons = + WithdrawReasons::except(WithdrawReasons::TRANSFER | WithdrawReasons::RESERVE); } impl pallet_vesting::Config for Runtime { @@ -1200,6 +1206,7 @@ impl pallet_vesting::Config for Runtime { type BlockNumberToBalance = ConvertInto; type MinVestedTransfer = MinVestedTransfer; type WeightInfo = pallet_vesting::weights::SubstrateWeight; + type UnvestedFundsAllowedWithdrawReasons = UnvestedFundsAllowedWithdrawReasons; // `VestingInfo` encode length is 36bytes. 28 schedules gets encoded as 1009 bytes, which is the // highest number of schedules that encodes less than 2^10. const MAX_VESTING_SCHEDULES: u32 = 28; @@ -1435,12 +1442,9 @@ pub type Executive = frame_executive::Executive< Runtime, AllPalletsWithSystem, ( - pallet_staking::migrations::v11::MigrateToV11< - Runtime, - VoterList, - StakingMigrationV11OldPallet, - >, - pallet_staking::migrations::v12::MigrateToV12, + pallet_scheduler::migration::v3::MigrateToV4, + pallet_democracy::migrations::v1::Migration, + pallet_multisig::migrations::v1::MigrateToV1, ), >; @@ -1638,33 +1642,33 @@ impl_runtime_apis! { } } - impl pallet_contracts_rpc_runtime_api::ContractsApi< - Block, AccountId, Balance, BlockNumber, Hash, - > - for Runtime + + impl pallet_contracts::ContractsApi for Runtime { fn call( origin: AccountId, dest: AccountId, value: Balance, - gas_limit: u64, + gas_limit: Option, storage_deposit_limit: Option, input_data: Vec, ) -> pallet_contracts_primitives::ContractExecResult { - Contracts::bare_call(origin, dest, value, Weight::from_ref_time(gas_limit), storage_deposit_limit, input_data, true) + let gas_limit = gas_limit.unwrap_or(RuntimeBlockWeights::get().max_block); + Contracts::bare_call(origin, dest, value, gas_limit, storage_deposit_limit, input_data, true) } fn instantiate( origin: AccountId, value: Balance, - gas_limit: u64, + gas_limit: Option, storage_deposit_limit: Option, code: pallet_contracts_primitives::Code, data: Vec, salt: Vec, ) -> pallet_contracts_primitives::ContractInstantiateResult { - Contracts::bare_instantiate(origin, value, Weight::from_ref_time(gas_limit), storage_deposit_limit, code, data, salt, true) + let gas_limit = gas_limit.unwrap_or(RuntimeBlockWeights::get().max_block); + Contracts::bare_instantiate(origin, value, gas_limit, storage_deposit_limit, code, data, salt, true) } fn upload_code( diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index a720b32aa..2ea78b8d9 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -59,7 +59,6 @@ pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } @@ -123,7 +122,6 @@ std = [ "pallet-collective/std", "pallet-contracts/std", "pallet-contracts-primitives/std", - "pallet-contracts-rpc-runtime-api/std", "pallet-democracy/std", "pallet-fast-unstake/std", "pallet-elections-phragmen/std", diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 84938a0cf..d656d0ac6 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -33,7 +33,7 @@ use frame_support::{ traits::{ ConstU16, ConstU32, ConstU128, Currency, EitherOfDiverse, EqualPrivilegeOnly, Everything, Imbalance, InstanceFilter, KeyOwnerProofSystem, LockIdentifier, Nothing, OnUnbalanced, - U128CurrencyToVote, + U128CurrencyToVote, WithdrawReasons }, weights::{ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, @@ -70,7 +70,7 @@ use sp_runtime::{ generic, impl_opaque_keys, traits::{ self, BlakeTwo256, Block as BlockT, ConvertInto, NumberFor, OpaqueKeys, - SaturatedConversion, StaticLookup, + SaturatedConversion, StaticLookup, Bounded, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedU128, FixedPointNumber, Perbill, Percent, Permill, Perquintill, @@ -172,8 +172,8 @@ const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); /// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used /// by Operational extrinsics. const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); -/// We allow for 2 seconds of compute with a 6 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = WEIGHT_PER_SECOND.saturating_mul(2); +/// We allow for 2 seconds of compute with a 6 second average block time, with maximum proof size. +const MAXIMUM_BLOCK_WEIGHT: Weight = WEIGHT_PER_SECOND.saturating_mul(2).set_proof_size(u64::MAX); parameter_types! { pub const BlockHashCount: BlockNumber = 2400; @@ -348,11 +348,10 @@ impl pallet_scheduler::Config for Runtime { type RuntimeCall = RuntimeCall; type MaximumWeight = MaximumSchedulerWeight; type ScheduleOrigin = EnsureRoot; - type MaxScheduledPerBlock = ConstU32<50>; + type MaxScheduledPerBlock = ConstU32<512>; type WeightInfo = pallet_scheduler::weights::SubstrateWeight; type OriginPrivilegeCmp = EqualPrivilegeOnly; - type PreimageProvider = (); - type NoPreimagePostponement = (); + type Preimages = (); } parameter_types! { @@ -427,6 +426,7 @@ parameter_types! { pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(1, 100_000); pub MinimumMultiplier: Multiplier = Multiplier::saturating_from_rational(1, 1_000_000_000u128); + pub MaximumMultiplier: Multiplier = Bounded::max_value(); } impl pallet_transaction_payment::Config for Runtime { @@ -435,8 +435,13 @@ impl pallet_transaction_payment::Config for Runtime { type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = IdentityFee; type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = - TargetedFeeAdjustment; + type FeeMultiplierUpdate = TargetedFeeAdjustment< + Self, + TargetBlockFullness, + AdjustmentVariable, + MinimumMultiplier, + MaximumMultiplier, + >; } parameter_types! { @@ -730,7 +735,6 @@ parameter_types! { } impl pallet_democracy::Config for Runtime { - type Proposal = RuntimeCall; type RuntimeEvent = RuntimeEvent; type Currency = Balances; type EnactmentPeriod = EnactmentPeriod; @@ -770,14 +774,15 @@ impl pallet_democracy::Config for Runtime { // only do it once and it lasts only for the cool-off period. type VetoOrigin = pallet_collective::EnsureMember; type CooloffPeriod = CooloffPeriod; - type PreimageByteDeposit = (); - type OperationalPreimageOrigin = pallet_collective::EnsureMember; type Slash = Treasury; type Scheduler = Scheduler; type PalletsOrigin = OriginCaller; type MaxVotes = ConstU32<100>; type WeightInfo = pallet_democracy::weights::SubstrateWeight; type MaxProposals = MaxProposals; + type Preimages = (); + type MaxDeposits = ConstU32<100>; + type MaxBlacklisted = ConstU32<100>; } parameter_types! { @@ -995,7 +1000,6 @@ impl pallet_contracts::Config for Runtime { type DeletionWeightLimit = DeletionWeightLimit; type Schedule = Schedule; type AddressGenerator = pallet_contracts::DefaultAddressGenerator; - type ContractAccessWeight = pallet_contracts::DefaultContractAccessWeight; type MaxCodeLen = ConstU32<{ 128 * 1024 }>; type MaxStorageKeyLen = ConstU32<128>; } @@ -1191,6 +1195,8 @@ impl pallet_society::Config for Runtime { parameter_types! { pub const MinVestedTransfer: Balance = 1 * DOLLARS; + pub UnvestedFundsAllowedWithdrawReasons: WithdrawReasons = + WithdrawReasons::except(WithdrawReasons::TRANSFER | WithdrawReasons::RESERVE); } impl pallet_vesting::Config for Runtime { @@ -1199,6 +1205,7 @@ impl pallet_vesting::Config for Runtime { type BlockNumberToBalance = ConvertInto; type MinVestedTransfer = MinVestedTransfer; type WeightInfo = pallet_vesting::weights::SubstrateWeight; + type UnvestedFundsAllowedWithdrawReasons = UnvestedFundsAllowedWithdrawReasons; // `VestingInfo` encode length is 36bytes. 28 schedules gets encoded as 1009 bytes, which is the // highest number of schedules that encodes less than 2^10. const MAX_VESTING_SCHEDULES: u32 = 28; @@ -1415,12 +1422,9 @@ pub type Executive = frame_executive::Executive< Runtime, AllPalletsWithSystem, ( - pallet_staking::migrations::v11::MigrateToV11< - Runtime, - VoterList, - StakingMigrationV11OldPallet, - >, - pallet_staking::migrations::v12::MigrateToV12, + pallet_scheduler::migration::v3::MigrateToV4, + pallet_democracy::migrations::v1::Migration, + pallet_multisig::migrations::v1::MigrateToV1, ), >; @@ -1617,33 +1621,32 @@ impl_runtime_apis! { } } - impl pallet_contracts_rpc_runtime_api::ContractsApi< - Block, AccountId, Balance, BlockNumber, Hash, - > - for Runtime + impl pallet_contracts::ContractsApi for Runtime { fn call( origin: AccountId, dest: AccountId, value: Balance, - gas_limit: u64, + gas_limit: Option, storage_deposit_limit: Option, input_data: Vec, ) -> pallet_contracts_primitives::ContractExecResult { - Contracts::bare_call(origin, dest, value, Weight::from_ref_time(gas_limit), storage_deposit_limit, input_data, true) + let gas_limit = gas_limit.unwrap_or(RuntimeBlockWeights::get().max_block); + Contracts::bare_call(origin, dest, value, gas_limit, storage_deposit_limit, input_data, true) } fn instantiate( origin: AccountId, value: Balance, - gas_limit: u64, + gas_limit: Option, storage_deposit_limit: Option, code: pallet_contracts_primitives::Code, data: Vec, salt: Vec, ) -> pallet_contracts_primitives::ContractInstantiateResult { - Contracts::bare_instantiate(origin, value, Weight::from_ref_time(gas_limit), storage_deposit_limit, code, data, salt, true) + let gas_limit = gas_limit.unwrap_or(RuntimeBlockWeights::get().max_block); + Contracts::bare_instantiate(origin, value, gas_limit, storage_deposit_limit, code, data, salt, true) } fn upload_code( From 6ab92fbf97f76c2a03765e1f34a3600249a51866 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 7 Jul 2023 16:08:36 +0200 Subject: [PATCH 199/583] Apply migrations and update changelog --- CHANGELOG.md | 12 +++++++++--- runtime/cere-dev/src/lib.rs | 4 ++-- runtime/cere/src/lib.rs | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb8b3e386..0033b1653 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). # Legend -[C] Cere Runtime
-[D] Cere Dev Runtime +[C] Changes is `Cere` Runtime
+[D] Changes is `Cere Dev` Runtime + +## [vNext + 1] + +### Changed + +- [C,D] Updated Substrate to polkadot-v0.9.31 ## [vNext] @@ -19,7 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- [C,D] Updated Substrate to polkadot-v0.9.31 +- [C,D] Updated Substrate to polkadot-v0.9.30 ## [4.7.0] diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 82610d5c9..952bd980d 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -130,10 +130,10 @@ 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: 47001, + spec_version: 47002, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 5, + transaction_version: 6, state_version: 0, }; diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index d656d0ac6..51ec11c45 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -128,10 +128,10 @@ 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: 47001, + spec_version: 47002, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 5, + transaction_version: 6, state_version: 0, }; From bc06cf8f285b5ebfc0d6bda45f95b2435d1e43e9 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 11 Jul 2023 13:06:03 +0600 Subject: [PATCH 200/583] Autoformat with `rustfmt` --- runtime/cere-dev/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index efb6f9673..074918ba1 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -51,9 +51,9 @@ use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; pub use pallet_cere_ddc; pub use pallet_chainbridge; use pallet_contracts::weights::WeightInfo; +pub use pallet_ddc_accounts; pub use pallet_ddc_metrics_offchain_worker; pub use pallet_ddc_staking; -pub use pallet_ddc_accounts; use pallet_election_provider_multi_phase::SolutionAccuracyOf; use pallet_grandpa::{ fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList, From 91b8f391890a9729737a21cf4a0d8d771ac0640e Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 11 Jul 2023 11:30:41 +0200 Subject: [PATCH 201/583] fix eras for exstrinsics & accumulate payments for buckets --- pallets/ddc-validator/src/lib.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index c2ade8670..e42f52125 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -878,13 +878,21 @@ pub mod pallet { if validations_res.len() == QUORUM_SIZE { log::info!("payments per bucket: {:?}", payments_per_bucket); - let mut payments = vec![]; + let mut payments: BTreeMap>> = BTreeMap::new(); for bucket in payments_per_bucket.into_iter() { let cere_payment: u32 = (bucket.1 / BYTES_TO_CERE) as u32; - let bucket_info = BucketsDetails {bucket_id: bucket.0, amount: cere_payment.into()}; - payments.push(bucket_info); + if payments.contains_key(&bucket.0) { + payments.entry(bucket.0).and_modify(|bucket_info| bucket_info.amount += cere_payment.into()); + } else { + let bucket_info = BucketsDetails {bucket_id: bucket.0, amount: cere_payment.into()}; + payments.insert(bucket.0, bucket_info); + } } - log::info!("final payments: {:?}", payments); + let mut final_payments = vec![]; + for (_, bucket_info) in payments { + final_payments.push(bucket_info); + } + log::info!("final payments: {:?}", final_payments); // Store CDN node reward points on-chain let signer: Signer = Signer::<_, _>::any_account(); @@ -894,11 +902,11 @@ pub mod pallet { } // ToDo: replace local call by a call from `ddc-staking` pallet let _tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = signer.send_signed_transaction(|_account| Call::charge_payments_content_owners { - paying_accounts: payments.clone(), + paying_accounts: final_payments.clone(), }); let _payout_tx_res = signer.send_signed_transaction(|_account| Call::payout_cdn_owners { - era: current_era, + era: current_era - 1, }); let final_res = dac::get_final_decision(validations_res); @@ -906,7 +914,7 @@ pub mod pallet { let signer = Self::get_signer().unwrap(); let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { - era: current_era, + era: current_era - 1, cdn_node: utils::string_to_account::(edge.clone()), validation_decision: final_res.clone(), }); From 9549c64278fc4299452f28d409311803abff9894 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 12 Jul 2023 09:56:14 +0200 Subject: [PATCH 202/583] add events for cluster management --- pallets/ddc-staking/src/lib.rs | 8 ++++++-- pallets/ddc-validator/src/lib.rs | 11 ++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index fcbfb0dfa..44a1b083a 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -61,7 +61,7 @@ parameter_types! { } /// Reward points of an era. Used to split era total payout between stakers. -#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo)] +#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Clone)] pub struct EraRewardPoints { /// Total number of points. Equals the sum of reward points for each staker. pub total: RewardPoint, @@ -320,6 +320,8 @@ pub mod pallet { /// An account has declared desire to stop participating in CDN or storage network soon. /// \[stash, cluster, era\] ChillSoon(T::AccountId, ClusterId, EraIndex), + // Payout CDN nodes' stash accounts + PayoutNodes(EraIndex, EraRewardPoints, u128) } #[pallet::error] @@ -804,7 +806,7 @@ pub mod pallet { ); // Transfer a part of the budget to each CDN participant rewarded this era. - for (stash, points) in era_reward_points.individual { + for (stash, points) in era_reward_points.clone().individual { let part = Perbill::from_rational(points, era_reward_points.total); let reward: BalanceOf = part * payout_budget; log::debug!( @@ -826,6 +828,8 @@ pub mod pallet { total_rewards += reward; >::insert(&stash, total_rewards); } + Self::deposit_event(Event::::PayoutNodes(era, era_reward_points.clone() ,price_per_byte)); + log::debug!( "Balance left on payout source account {:?}", T::Currency::free_balance(&payout_source_account), diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index e42f52125..c20983d73 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -226,7 +226,10 @@ pub mod pallet { pub enum Event where ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, {} + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { + // Validator submits decision for an era + ValidationDecision(EraIndex, T::AccountId, ValidationDecision), + } #[pallet::hooks] impl Hooks> for Pallet @@ -635,7 +638,7 @@ pub mod pallet { fn validate(bytes_sent: &dac::BytesSent, bytes_received: &dac::BytesReceived) -> bool { let percentage_difference = 1f32 - (bytes_received.sum as f32 / bytes_sent.sum as f32); - return if percentage_difference > 0.0 && + return if percentage_difference >= 0.0 && (T::ValidationThreshold::get() as f32 - percentage_difference) > 0.0 { true @@ -647,7 +650,7 @@ pub mod pallet { fn is_valid(bytes_sent: u64, bytes_received: u64) -> bool { let percentage_difference = 1f32 - (bytes_received as f32 / bytes_sent as f32); - return if percentage_difference > 0.0 && + return if percentage_difference >= 0.0 && (T::ValidationThreshold::get() as f32 - percentage_difference) > 0.0 { true @@ -919,6 +922,8 @@ pub mod pallet { validation_decision: final_res.clone(), }); + Self::deposit_event(Event::::ValidationDecision(current_era - 1, utils::string_to_account::(edge.clone()), final_res.clone())); + log::info!("final_res: {:?}", final_res); } } From 686091c48c358c270e10175f1e903bcedec6fb7a Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 12 Jul 2023 17:25:37 +0200 Subject: [PATCH 203/583] update events for cluster management; incorporate missing logic for setting rewards --- pallets/ddc-staking/src/lib.rs | 7 +- pallets/ddc-validator/src/lib.rs | 264 +++++++------------------------ 2 files changed, 61 insertions(+), 210 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 44a1b083a..365e19a7a 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -794,7 +794,7 @@ pub mod pallet { Ok(value) => value, Err(_) => Err(Error::::BudgetOverflow)?, }; - log::debug!( + log::info!( "Will payout to DDC stakers for era {:?} from account {:?} with total budget {:?} \ , there are {:?} stakers earned {:?} reward points with price per byte {:?}", era, @@ -809,7 +809,7 @@ pub mod pallet { for (stash, points) in era_reward_points.clone().individual { let part = Perbill::from_rational(points, era_reward_points.total); let reward: BalanceOf = part * payout_budget; - log::debug!( + log::info!( "Rewarding {:?} with {:?} points, its part is {:?}, reward size {:?}, balance \ on payout source account {:?}", stash, @@ -826,9 +826,12 @@ pub mod pallet { )?; // ToDo: all success or noop let mut total_rewards: BalanceOf = Self::rewards(&stash).unwrap(); total_rewards += reward; + log::info!("Total rewards to be inserted: {:?}", total_rewards.clone()); + >::insert(&stash, total_rewards); } Self::deposit_event(Event::::PayoutNodes(era, era_reward_points.clone() ,price_per_byte)); + log::info!("Payout event executed"); log::debug!( "Balance left on payout source account {:?}", diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index c20983d73..0ac87d9f5 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -54,8 +54,10 @@ pub use pallet_staking::{self as staking}; pub use scale_info::TypeInfo; pub use serde_json::Value; pub use sp_core::crypto::{AccountId32, KeyTypeId, UncheckedFrom}; -pub use sp_io::crypto::sr25519_public_keys; -pub use sp_runtime::offchain::{http, storage::StorageValueRef, Duration, Timestamp}; +pub use sp_io::{crypto::sr25519_public_keys, offchain_index}; +pub use sp_runtime::offchain::{ + http, storage::StorageValueRef, storage_lock, storage_lock::StorageLock, Duration, Timestamp +}; pub use sp_staking::EraIndex; pub use sp_std::{collections::btree_map::BTreeMap, prelude::*}; use log::info; @@ -76,9 +78,13 @@ pub const ERA_DURATION_MS: u128 = 120_000; pub const ERA_IN_BLOCKS: u8 = 20; pub const BYTES_TO_CERE: u64 = 1; // this should have a logic built on top and adjusted +/// Offchain local storage key that holds the last era in which the validator completed its +/// assignment. +const LAST_VALIDATED_ERA_KEY: &[u8; 40] = b"pallet-ddc-validator::last_validated_era"; /// Webdis in experimental cluster connected to Redis in dev. // pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://webdis:7379"; +// pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; pub const QUORUM_SIZE: usize = 1; @@ -229,6 +235,8 @@ pub mod pallet { as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { // Validator submits decision for an era ValidationDecision(EraIndex, T::AccountId, ValidationDecision), + // Set era reward points + EraRewardPoints(EraIndex, Vec<(T::AccountId, u64)>), } #[pallet::hooks] @@ -264,215 +272,43 @@ pub mod pallet { return } - let current_era = Self::get_current_era(); - let last_managed_era = Self::last_managed_era().unwrap_or(0); - let data_provider_url = Self::get_data_provider_url(); - log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); + let mut should_validate_because_new_era = true; - // `If` commented for testing purposes - // if current_era > last_managed_era { - Self::validate_edges(); - //} - - // Print the number of broken sessions per CDN node. - // let aggregates_value = dac::fetch_aggregates(&data_provider_url, 77436).unwrap(); // 77436 is for a mock data - // let aggregates_obj = aggregates_value.as_object().unwrap(); - // aggregates_obj - // .into_iter() - // .for_each(|(cdn_node_pubkey, cdn_node_aggregates_value)| { - // // iterate over aggregates for each node - // let cdn_node_aggregates_obj = cdn_node_aggregates_value.as_object().unwrap(); - // // Extract `nodeInterruptedSessions` field - // let (_, cdn_node_interrupted_sessions_value) = cdn_node_aggregates_obj - // .into_iter() - // .find(|(key, _)| key.iter().copied().eq("nodeInterruptedSessions".chars())) - // .unwrap(); - // let cdn_node_interrupted_sessions_obj = - // cdn_node_interrupted_sessions_value.as_object().unwrap(); - // // Prepare CDN pubkey without heap allocated string - // let cdn_node_pubkey_vecu8: Vec = - // cdn_node_pubkey.iter().map(|c| *c as u8).collect(); - // let cdn_node_pubkey_str = - // sp_std::str::from_utf8(&cdn_node_pubkey_vecu8).unwrap(); - // log::info!( - // "Broken sessions per CDN node | Node {}: {} sessions broken", - // cdn_node_pubkey_str, - // cdn_node_interrupted_sessions_obj.len(), /* count sessions broken by the - // * node */ - // ); - // }); - - // Wait for signal. - let signal = Signal::::get().unwrap_or(false); - if !signal { - log::info!("🔎 DAC Validator is idle at block {:?}, waiting for a signal, signal state is {:?}", block_number, signal); - return + let mut validation_lock = + StorageLock::::new(LAST_VALIDATED_ERA_KEY); + + // Skip if the validation is already in progress. + if validation_lock.try_lock().is_err() { + should_validate_because_new_era = false; } + log::info!("Should validate {:?}", should_validate_because_new_era); - // Read from DAC. - let response = dac::fetch_data2(&data_provider_url, current_era - 1); - let (sent_query, sent, received_query, received) = match response { - Ok(data) => data, - Err(_) => { - log::info!("🔎 DAC Validator failed to get bytes sent and received from DAC"); - return - }, + let last_validated_era_storage = StorageValueRef::persistent(LAST_VALIDATED_ERA_KEY); + let last_validated_era = match last_validated_era_storage.get::() { + Ok(Some(last_validated_era)) => last_validated_era, + _ => 0, // let's consider an absent or undecodable data as we never did a validation }; - log::info!( - "🔎 DAC Validator is fetching data from DAC, current era: {:?}, bytes sent query: {:?}, bytes sent response: {:?}, bytes received query: {:?}, bytes received response: {:?}", - current_era, - sent_query, - sent, - received_query, - received, - ); - - // Create intermediate validation decisions - // ======================================== - // All validators validate all CDN nodes. - let edges: Vec = >::iter_keys().collect(); - for edge in edges.iter() { - // Get string type CDN node pubkey - let edge_pubkey: String = utils::account_to_string::(edge.clone()); - - // Get bytes sent and received for the CDN node - let node_sent: &dac::BytesSent = match sent - .iter() - .find(|bytes_sent| bytes_sent.node_public_key == edge_pubkey) - { - Some(node_sent) => node_sent, - None => { - log::warn!("No logs to validate {:?}", edge); - continue - }, - }; - let client_received: &dac::BytesReceived = match received - .iter() - .find(|bytes_received| bytes_received.node_public_key == edge_pubkey) - { - Some(client_received) => client_received, - None => { - log::warn!("No acks to validate {:?}", edge); - continue - }, - }; - - // Proof-of-delivery validation - let validation_result = Self::validate(node_sent, client_received); + let current_era = Self::get_current_era(); - // Prepare an intermediate validation decision - let validation_decision = ValidationDecision { - edge: utils::account_to_string::(edge.clone()), - result: validation_result, - payload: [0u8; 32], // ToDo: put a hash of the validated data here - totals: DacTotalAggregates { - sent: node_sent.sum as u64, - received: client_received.sum as u64, - failed_by_client: 0, // ToDo - failure_rate: 0, // ToDo - }, - }; + // Skip if the validation is already complete for the era. + if current_era <= last_validated_era { + should_validate_because_new_era = false; + } - // Encode validation decision to base64 - let validation_decision_serialized: Vec = validation_decision.encode(); - let validation_decision_base64 = - shm::base64_encode(&validation_decision_serialized).unwrap(); - log::info!( - "Intermediate validation decision for CDN node {:?}: , base64 encoded: {:?}", - validation_decision, - validation_decision_base64, - ); + log::info!("Should validate {:?}", should_validate_because_new_era); - // Prepare values to publish validation decision and publish it - let validator_id_string = String::from("validator1"); // ToDo: get validator ID - let edge_id_string = utils::account_to_string::(edge.clone()); - let validation_decision_base64_string = - validation_decision_base64.iter().cloned().collect::(); - let response = shm::share_intermediate_validation_result( - &data_provider_url, - current_era - 1, - &validator_id_string, - &edge_id_string, - validation_result, - &validation_decision_base64_string, - ); - match response { - Ok(response) => - log::info!("Shared memory response: {:?}", response.to_string()), - Err(e) => { - log::error!("Shared memory error: {:?}", e); - continue - }, - } - } - log::info!( - "Intermediate validation results published for {} CDN nodes in era {:?}", - edges.len(), - current_era - 1 - ); + let data_provider_url = Self::get_data_provider_url(); + log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); - // Set CDN nodes' reward points - // ============================ - - // Let's use a mock data until we have a real final validation decisions for all the CDN - // nodes. - let mock_final_validation_decisions: Vec<(T::AccountId, ValidationDecision)> = vec![ - ( - utils::string_to_account::( - "0xd4160f567d7265b9de2c7cbf1a5c931e5b3195efb2224f8706bfb53ea6eaacd1".into(), - ), - ValidationDecision { - edge: "test".into(), - result: true, - payload: [0u8; 32], - totals: DacTotalAggregates { - sent: 100, - received: 100, - failed_by_client: 0, - failure_rate: 0, - }, - }, - ), - ( - utils::string_to_account::( - "0xa2d14e71b52e5695e72c0567926bc68b68bda74df5c1ccf1d4ba612c153ff66b".into(), - ), - ValidationDecision { - edge: "test".into(), - result: true, - payload: [0u8; 32], - totals: DacTotalAggregates { - sent: 200, - received: 200, - failed_by_client: 0, - failure_rate: 0, - }, - }, - ), - ]; + // Validation start forced externally? + let should_validate_because_signal = Signal::::get().unwrap_or(false); - // Calculate CDN nodes reward points from validation decision aggregates - let cdn_nodes_reward_points: Vec<(T::AccountId, u64)> = mock_final_validation_decisions - .into_iter() - .filter(|(_, validation_decision)| validation_decision.result) // skip misbehaving - .map(|(cdn_node, validation_decision)| { - // ToDo: should we use `sent` or `received` or anything else as a reward point? - (cdn_node, validation_decision.totals.sent) - }) - .collect(); + log::info!("Should validate {:?}", should_validate_because_new_era); - // Store CDN node reward points on-chain - let signer: Signer = Signer::<_, _>::any_account(); - if !signer.can_sign() { - log::warn!("No local accounts available to set era reward points. Consider adding one via `author_insertKey` RPC."); - return + if should_validate_because_new_era || should_validate_because_signal { + Self::validate_edges(); } - // ToDo: replace local call by a call from `ddc-staking` pallet - let _tx_res = signer.send_signed_transaction(|_account| Call::set_era_reward_points { - era: current_era - 1, - stakers_points: cdn_nodes_reward_points.clone(), - }); } } @@ -507,9 +343,9 @@ pub mod pallet { // ToDo: check if the validation decision is not set yet. // ToDo: check cdn_node is known to ddc-staking. - ValidationDecisions::::insert(era, cdn_node, validation_decision); + ValidationDecisions::::insert(era, cdn_node.clone(), validation_decision.clone()); - // ToDo: emit event. + Self::deposit_event(Event::::ValidationDecision(era, cdn_node, validation_decision)); Ok(()) } @@ -533,12 +369,14 @@ pub mod pallet { ensure_signed(origin)?; >::mutate(era, |era_rewards| { - for (staker, points) in stakers_points.into_iter() { + for (staker, points) in stakers_points.clone().into_iter() { *era_rewards.individual.entry(staker).or_default() += points; era_rewards.total += points; } }); + Self::deposit_event(Event::::EraRewardPoints(era, stakers_points)); + Ok(()) } @@ -798,11 +636,15 @@ pub mod pallet { info!("assigned_edges: {:?}", assigned_edges); + // Calculate CDN nodes reward points from validation decision aggregates + let mut cdn_nodes_reward_points: Vec<(T::AccountId, u64)> = vec![]; + for assigned_edge in assigned_edges.iter() { info!("assigned edge: {:?}", assigned_edge); // form url for each node let edge_url = format!("{}{}{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:", current_era, "/$.", utils::account_to_string::(assigned_edge.clone())); + // let edge_url = format!("{}{}{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:", 132855, "/$.", utils::account_to_string::(assigned_edge.clone())); info!("edge url: {:?}", edge_url); let node_aggregates = dac::fetch_cdn_node_aggregates_request(&edge_url); @@ -908,10 +750,6 @@ pub mod pallet { paying_accounts: final_payments.clone(), }); - let _payout_tx_res = signer.send_signed_transaction(|_account| Call::payout_cdn_owners { - era: current_era - 1, - }); - let final_res = dac::get_final_decision(validations_res); let signer = Self::get_signer().unwrap(); @@ -922,12 +760,22 @@ pub mod pallet { validation_decision: final_res.clone(), }); - Self::deposit_event(Event::::ValidationDecision(current_era - 1, utils::string_to_account::(edge.clone()), final_res.clone())); - log::info!("final_res: {:?}", final_res); + + cdn_nodes_reward_points.push((utils::string_to_account::(final_res.edge), final_res.totals.sent)); } } } + let signer = Self::get_signer().unwrap(); + + // ToDo: replace local call by a call from `ddc-staking` pallet + let _tx_res = signer.send_signed_transaction(|_account| Call::set_era_reward_points { + era: current_era - 1, + stakers_points: cdn_nodes_reward_points.clone(), + }); + + // Set era as validated + offchain_index::set(LAST_VALIDATED_ERA_KEY, &(current_era - 1).encode()); } } } From 21dbeb2d4ea8229676d1d055f67bcb5ae60f7618 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 13 Jul 2023 13:27:55 +0200 Subject: [PATCH 204/583] fix storage mutation for aggregate node rewards --- pallets/ddc-staking/src/lib.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 365e19a7a..31ea79181 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -278,7 +278,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn rewards)] pub type Rewards = - StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf>; + StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf, ValueQuery>; /// The current era index. /// @@ -824,11 +824,10 @@ pub mod pallet { reward, ExistenceRequirement::AllowDeath, )?; // ToDo: all success or noop - let mut total_rewards: BalanceOf = Self::rewards(&stash).unwrap(); - total_rewards += reward; - log::info!("Total rewards to be inserted: {:?}", total_rewards.clone()); - - >::insert(&stash, total_rewards); + Rewards::::mutate(&stash, |current_balance| { + *current_balance += reward; + }); + log::info!("Total rewards to be inserted: {:?}", Self::rewards(&stash)); } Self::deposit_event(Event::::PayoutNodes(era, era_reward_points.clone() ,price_per_byte)); log::info!("Payout event executed"); From fd03198fa15117b0c6c9d892aba298da5932de3c Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 13 Jul 2023 13:28:29 +0200 Subject: [PATCH 205/583] fix last era validation lock to avoid repeptitive validation --- pallets/ddc-validator/src/lib.rs | 73 +++++++++++++++++--------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 0ac87d9f5..2f3765bae 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -80,7 +80,8 @@ pub const BYTES_TO_CERE: u64 = 1; // this should have a logic built on top and a /// Offchain local storage key that holds the last era in which the validator completed its /// assignment. -const LAST_VALIDATED_ERA_KEY: &[u8; 40] = b"pallet-ddc-validator::last_validated_era"; +const LAST_VALIDATED_ERA_LOCK_KEY: &[u8; 45] = b"pallet-ddc-validator::last-validated-era-lock"; +const LAST_VALIDATED_ERA_STORAGE_KEY: &[u8; 48] = b"pallet-ddc-validator::last-validated-era-storage"; /// Webdis in experimental cluster connected to Redis in dev. // pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://webdis:7379"; @@ -275,40 +276,47 @@ pub mod pallet { let mut should_validate_because_new_era = true; let mut validation_lock = - StorageLock::::new(LAST_VALIDATED_ERA_KEY); + StorageLock::::new(LAST_VALIDATED_ERA_LOCK_KEY); // Skip if the validation is already in progress. - if validation_lock.try_lock().is_err() { - should_validate_because_new_era = false; - } - log::info!("Should validate {:?}", should_validate_because_new_era); - - let last_validated_era_storage = StorageValueRef::persistent(LAST_VALIDATED_ERA_KEY); - let last_validated_era = match last_validated_era_storage.get::() { - Ok(Some(last_validated_era)) => last_validated_era, - _ => 0, // let's consider an absent or undecodable data as we never did a validation - }; - - let current_era = Self::get_current_era(); - - // Skip if the validation is already complete for the era. - if current_era <= last_validated_era { - should_validate_because_new_era = false; - } - - log::info!("Should validate {:?}", should_validate_because_new_era); - - let data_provider_url = Self::get_data_provider_url(); - log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); + if let Ok(_guard) = validation_lock.try_lock() { - // Validation start forced externally? - let should_validate_because_signal = Signal::::get().unwrap_or(false); + log::info!("Should validate {:?}", should_validate_because_new_era); - log::info!("Should validate {:?}", should_validate_because_new_era); - - if should_validate_because_new_era || should_validate_because_signal { - Self::validate_edges(); - } + let last_validated_era_storage = StorageValueRef::persistent(LAST_VALIDATED_ERA_STORAGE_KEY); + let last_validated_era = match last_validated_era_storage.get::() { + Ok(Some(last_validated_era)) => last_validated_era, + _ => 0, // let's consider an absent or undecodable data as we never did a validation + }; + + if let Ok(Some(res)) = last_validated_era_storage.get::() { + log::info!("cached result for last validated era: {:?}", res); + return (); + } + + let current_era = Self::get_current_era(); + + // Skip if the validation is already complete for the era. + if current_era <= last_validated_era { + should_validate_because_new_era = false; + } + + log::info!("Should validate {:?}", should_validate_because_new_era); + + let data_provider_url = Self::get_data_provider_url(); + log::info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); + + // Validation start forced externally? + let should_validate_because_signal = Signal::::get().unwrap_or(false); + + log::info!("Should validate {:?}", should_validate_because_new_era); + + if should_validate_because_new_era || should_validate_because_signal { + Self::validate_edges(); + } + + last_validated_era_storage.set(&(current_era - 1)); + }; } } @@ -773,9 +781,6 @@ pub mod pallet { era: current_era - 1, stakers_points: cdn_nodes_reward_points.clone(), }); - - // Set era as validated - offchain_index::set(LAST_VALIDATED_ERA_KEY, &(current_era - 1).encode()); } } } From 956ff78c5099e6899222d4c2fae47664698f3892 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 13 Jul 2023 15:05:24 +0200 Subject: [PATCH 206/583] fix typos --- pallets/ddc-validator/src/lib.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 2f3765bae..ba2895f46 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -84,8 +84,8 @@ const LAST_VALIDATED_ERA_LOCK_KEY: &[u8; 45] = b"pallet-ddc-validator::last-vali const LAST_VALIDATED_ERA_STORAGE_KEY: &[u8; 48] = b"pallet-ddc-validator::last-validated-era-storage"; /// Webdis in experimental cluster connected to Redis in dev. // pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; -pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://webdis:7379"; -// pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; +// pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://webdis:7379"; +pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; pub const QUORUM_SIZE: usize = 1; @@ -291,13 +291,12 @@ pub mod pallet { if let Ok(Some(res)) = last_validated_era_storage.get::() { log::info!("cached result for last validated era: {:?}", res); - return (); } let current_era = Self::get_current_era(); // Skip if the validation is already complete for the era. - if current_era <= last_validated_era { + if current_era - 1 <= last_validated_era { should_validate_because_new_era = false; } @@ -630,7 +629,7 @@ pub mod pallet { } fn validate_edges() { - let current_era = Self::get_current_era() - 1; + let current_era = Self::get_current_era(); let mock_data_url = Self::get_mock_data_url(); let data_provider_url = Self::get_data_provider_url(); @@ -651,8 +650,8 @@ pub mod pallet { info!("assigned edge: {:?}", assigned_edge); // form url for each node - let edge_url = format!("{}{}{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:", current_era, "/$.", utils::account_to_string::(assigned_edge.clone())); - // let edge_url = format!("{}{}{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:", 132855, "/$.", utils::account_to_string::(assigned_edge.clone())); + // let edge_url = format!("{}{}{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:", current_era, "/$.", utils::account_to_string::(assigned_edge.clone())); + let edge_url = format!("{}{}{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:", 132855, "/$.", utils::account_to_string::(assigned_edge.clone())); info!("edge url: {:?}", edge_url); let node_aggregates = dac::fetch_cdn_node_aggregates_request(&edge_url); From 685f3785cd5299fbc15deae45d3221bfe186f0c7 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 13 Jul 2023 16:30:31 +0200 Subject: [PATCH 207/583] fix urls --- pallets/ddc-validator/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index ba2895f46..8d55c983e 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -84,8 +84,8 @@ const LAST_VALIDATED_ERA_LOCK_KEY: &[u8; 45] = b"pallet-ddc-validator::last-vali const LAST_VALIDATED_ERA_STORAGE_KEY: &[u8; 48] = b"pallet-ddc-validator::last-validated-era-storage"; /// Webdis in experimental cluster connected to Redis in dev. // pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; -// pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://webdis:7379"; -pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; +pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://webdis:7379"; +// pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; pub const QUORUM_SIZE: usize = 1; @@ -650,8 +650,8 @@ pub mod pallet { info!("assigned edge: {:?}", assigned_edge); // form url for each node - // let edge_url = format!("{}{}{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:", current_era, "/$.", utils::account_to_string::(assigned_edge.clone())); - let edge_url = format!("{}{}{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:", 132855, "/$.", utils::account_to_string::(assigned_edge.clone())); + let edge_url = format!("{}{}{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:", current_era, "/$.", utils::account_to_string::(assigned_edge.clone())); + // let edge_url = format!("{}{}{}{}{}", mock_data_url, "ddc:dac:aggregation:nodes:", 132855, "/$.", utils::account_to_string::(assigned_edge.clone())); info!("edge url: {:?}", edge_url); let node_aggregates = dac::fetch_cdn_node_aggregates_request(&edge_url); From 2f4caf8cd1b5ead728791cfe0c69aebbb81edea9 Mon Sep 17 00:00:00 2001 From: Alexander Dobrodey <8377544+ADobrodey@users.noreply.github.com> Date: Fri, 14 Jul 2023 10:59:15 +0200 Subject: [PATCH 208/583] Simple ECR deployment --- .github/workflows/dev.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/dev.yml diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml new file mode 100644 index 000000000..440d32269 --- /dev/null +++ b/.github/workflows/dev.yml @@ -0,0 +1,19 @@ +name: Release to dev +on: + push: + branches: + - dev + workflow_dispatch: + +permissions: + id-token: write + contents: read + +jobs: + build: + uses: Cerebellum-Network/reusable-workflows/.github/workflows/deploy-to-ecr.yaml@master + with: + environment: dev + aws_account_id: ${{ vars.DEV_NETWORK_AWS_ACCOUNT_ID }} + repository: pos-network-node + secrets: inherit From 0064d3d0c5d70c27fb98e6e071f59ab08d27dd8a Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 17 Jul 2023 16:04:26 +0600 Subject: [PATCH 209/583] Update dependencies --- Cargo.lock | 10423 +++++++++++++++++++++++++++++ pallets/ddc-accounts/Cargo.toml | 14 +- pallets/ddc-validator/Cargo.toml | 32 +- 3 files changed, 10446 insertions(+), 23 deletions(-) create mode 100644 Cargo.lock diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 000000000..69bf795f9 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,10423 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli 0.26.2", +] + +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli 0.27.3", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher 0.3.0", + "cpufeatures", + "opaque-debug 0.3.0", +] + +[[package]] +name = "aes-gcm" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" +dependencies = [ + "aead", + "aes", + "cipher 0.3.0", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.10", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "alt_serde" +version = "1.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbdd08f26bc9972e3597a32bb7fe2b0de4e85ccfb4214acec94165b940aa537e" +dependencies = [ + "alt_serde_derive", +] + +[[package]] +name = "alt_serde_derive" +version = "1.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629ddaf5b2675d9a27e9521a88870f8edea113e4a83d6d5178268b0d70e9a9a3" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "array-bytes" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" + +[[package]] +name = "array-bytes" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b1c5a481ec30a5abd8dfbd94ab5cf1bb4e9a66be7f1b3b322f2f1170c200fd" + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" +dependencies = [ + "nodrop", +] + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "asn1_der" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "155a5a185e42c6b77ac7b88a15143d930a9e9727a5b7b77eed417404ab15c247" + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-executor" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" +dependencies = [ + "async-lock", + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +dependencies = [ + "async-channel", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite", + "log", + "parking", + "polling", + "rustix 0.37.23", + "slab", + "socket2 0.4.9", + "waker-fn", +] + +[[package]] +name = "async-lock" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-process" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" +dependencies = [ + "async-io", + "async-lock", + "autocfg", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix 0.37.23", + "signal-hook", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-std" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +dependencies = [ + "async-channel", + "async-global-executor", + "async-io", + "async-lock", + "async-process", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite 0.2.10", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-std-resolver" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2f8a4a203be3325981310ab243a28e6e4ea55b6519bffce05d41ab60e09ad8" +dependencies = [ + "async-std", + "async-trait", + "futures-io", + "futures-util", + "pin-utils", + "socket2 0.4.9", + "trust-dns-resolver", +] + +[[package]] +name = "async-task" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" + +[[package]] +name = "async-trait" +version = "0.1.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "asynchronous-codec" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06a0daa378f5fd10634e44b0a29b2a87b890657658e072a30d6f26e57ddee182" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite 0.2.10", +] + +[[package]] +name = "atomic-waker" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line 0.20.0", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object 0.31.1", + "rustc-demangle", +] + +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base58" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +dependencies = [ + "serde", +] + +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.65.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" +dependencies = [ + "bitflags 1.3.2", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "prettyplease 0.2.10", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.26", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "blake2-rfc" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" +dependencies = [ + "arrayvec 0.4.12", + "constant_time_eq 0.1.5", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" +dependencies = [ + "arrayref", + "arrayvec 0.7.4", + "constant_time_eq 0.2.6", +] + +[[package]] +name = "blake2s_simd" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637f448b9e61dfadbdcbae9a885fadee1f3eaffb1f8d3c1965d3ade8bdfd44f" +dependencies = [ + "arrayref", + "arrayvec 0.7.4", + "constant_time_eq 0.2.6", +] + +[[package]] +name = "blake3" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "199c42ab6972d92c9f8995f086273d25c42fc0f7b2a1fcefba465c1352d25ba5" +dependencies = [ + "arrayref", + "arrayvec 0.7.4", + "cc", + "cfg-if", + "constant_time_eq 0.3.0", +] + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + +[[package]] +name = "blocking" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" +dependencies = [ + "async-channel", + "async-lock", + "async-task", + "atomic-waker", + "fastrand", + "futures-lite", + "log", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bstr" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "build-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" +dependencies = [ + "semver 0.6.0", +] + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "camino" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.18", + "serde", + "serde_json 1.0.103", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cere" +version = "4.8.0" +dependencies = [ + "cere-cli", + "sc-cli", + "ss58-registry", + "substrate-build-script-utils", +] + +[[package]] +name = "cere-cli" +version = "4.8.0" +dependencies = [ + "cere-client", + "cere-service", + "clap", + "frame-benchmarking-cli", + "sc-cli", + "sc-service", + "substrate-build-script-utils", + "try-runtime-cli", +] + +[[package]] +name = "cere-client" +version = "4.8.0" +dependencies = [ + "cere-dev-runtime", + "cere-runtime", + "frame-benchmarking", + "frame-benchmarking-cli", + "frame-system", + "frame-system-rpc-runtime-api", + "node-primitives", + "pallet-contracts-rpc", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "sc-client-api", + "sc-executor", + "sc-service", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-finality-grandpa", + "sp-inherents", + "sp-keyring", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-storage", + "sp-timestamp", + "sp-transaction-pool", +] + +[[package]] +name = "cere-dev-runtime" +version = "4.8.0" +dependencies = [ + "cere-dev-runtime-constants", + "cere-runtime-common", + "frame-benchmarking", + "frame-election-provider-support", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal", + "log", + "node-primitives", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-bags-list", + "pallet-balances", + "pallet-bounties", + "pallet-cere-ddc", + "pallet-chainbridge", + "pallet-child-bounties", + "pallet-collective", + "pallet-contracts", + "pallet-contracts-primitives", + "pallet-contracts-rpc-runtime-api", + "pallet-ddc-accounts", + "pallet-ddc-metrics-offchain-worker", + "pallet-ddc-staking", + "pallet-ddc-validator", + "pallet-democracy", + "pallet-election-provider-multi-phase", + "pallet-election-provider-support-benchmarking", + "pallet-elections-phragmen", + "pallet-erc20", + "pallet-erc721", + "pallet-fast-unstake", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-membership", + "pallet-multisig", + "pallet-nomination-pools", + "pallet-nomination-pools-benchmarking", + "pallet-nomination-pools-runtime-api", + "pallet-offences", + "pallet-offences-benchmarking", + "pallet-proxy", + "pallet-randomness-collective-flip", + "pallet-recovery", + "pallet-scheduler", + "pallet-session", + "pallet-session-benchmarking", + "pallet-society", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-sudo", + "pallet-timestamp", + "pallet-tips", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-transaction-storage", + "pallet-treasury", + "pallet-utility", + "pallet-vesting", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", + "static_assertions", + "substrate-wasm-builder", +] + +[[package]] +name = "cere-dev-runtime-constants" +version = "4.8.0" +dependencies = [ + "node-primitives", + "sp-runtime", +] + +[[package]] +name = "cere-rpc" +version = "4.8.0" +dependencies = [ + "jsonrpsee", + "node-primitives", + "pallet-contracts-rpc", + "pallet-transaction-payment-rpc", + "sc-chain-spec", + "sc-client-api", + "sc-consensus-babe", + "sc-consensus-babe-rpc", + "sc-consensus-epochs", + "sc-finality-grandpa", + "sc-finality-grandpa-rpc", + "sc-rpc", + "sc-rpc-api", + "sc-sync-state-rpc", + "sc-transaction-pool-api", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-keystore", + "sp-runtime", + "substrate-frame-rpc-system", + "substrate-state-trie-migration-rpc", +] + +[[package]] +name = "cere-runtime" +version = "4.8.0" +dependencies = [ + "cere-runtime-common", + "cere-runtime-constants", + "frame-benchmarking", + "frame-election-provider-support", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal", + "log", + "node-primitives", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-bags-list", + "pallet-balances", + "pallet-bounties", + "pallet-cere-ddc", + "pallet-chainbridge", + "pallet-child-bounties", + "pallet-collective", + "pallet-contracts", + "pallet-contracts-primitives", + "pallet-contracts-rpc-runtime-api", + "pallet-ddc-metrics-offchain-worker", + "pallet-democracy", + "pallet-election-provider-multi-phase", + "pallet-election-provider-support-benchmarking", + "pallet-elections-phragmen", + "pallet-erc20", + "pallet-erc721", + "pallet-fast-unstake", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-membership", + "pallet-multisig", + "pallet-nomination-pools", + "pallet-nomination-pools-benchmarking", + "pallet-nomination-pools-runtime-api", + "pallet-offences", + "pallet-offences-benchmarking", + "pallet-proxy", + "pallet-randomness-collective-flip", + "pallet-recovery", + "pallet-scheduler", + "pallet-session", + "pallet-session-benchmarking", + "pallet-society", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-sudo", + "pallet-timestamp", + "pallet-tips", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-transaction-storage", + "pallet-treasury", + "pallet-utility", + "pallet-vesting", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", + "static_assertions", + "substrate-wasm-builder", +] + +[[package]] +name = "cere-runtime-common" +version = "4.8.0" +dependencies = [ + "frame-support", + "node-primitives", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "cere-runtime-constants" +version = "4.8.0" +dependencies = [ + "node-primitives", + "sp-runtime", +] + +[[package]] +name = "cere-service" +version = "4.8.0" +dependencies = [ + "cere-client", + "cere-dev-runtime", + "cere-dev-runtime-constants", + "cere-rpc", + "cere-runtime", + "cere-runtime-constants", + "futures", + "jsonrpsee", + "node-primitives", + "pallet-im-online", + "parity-scale-codec", + "rand 0.8.5", + "sc-authority-discovery", + "sc-basic-authorship", + "sc-chain-spec", + "sc-cli", + "sc-client-api", + "sc-consensus", + "sc-consensus-babe", + "sc-consensus-slots", + "sc-consensus-uncles", + "sc-executor", + "sc-finality-grandpa", + "sc-network", + "sc-network-common", + "sc-rpc", + "sc-service", + "sc-sync-state-rpc", + "sc-sysinfo", + "sc-telemetry", + "sc-transaction-pool", + "serde", + "sp-api", + "sp-authority-discovery", + "sp-authorship", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-finality-grandpa", + "sp-runtime", + "sp-timestamp", + "sp-transaction-storage-proof", + "sp-trie", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-expr" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aacacf4d96c24b2ad6eb8ee6df040e4f27b0d0b39a5710c30091baa830485db" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "chacha20" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" +dependencies = [ + "cfg-if", + "cipher 0.3.0", + "cpufeatures", + "zeroize", +] + +[[package]] +name = "chacha20poly1305" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" +dependencies = [ + "aead", + "chacha20", + "cipher 0.3.0", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "time", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "cid" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ed9c8b2d17acb8110c46f1da5bf4a696d745e1474a16db0cd2b49cd0249bf2" +dependencies = [ + "core2", + "multibase", + "multihash", + "serde", + "unsigned-varint", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clang-sys" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +dependencies = [ + "glob", + "libc", + "libloading 0.7.4", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "atty", + "bitflags 1.3.2", + "clap_derive", + "clap_lex", + "indexmap", + "once_cell", + "strsim", + "termcolor", + "textwrap", +] + +[[package]] +name = "clap_derive" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + +[[package]] +name = "comfy-table" +version = "6.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e959d788268e3bf9d35ace83e81b124190378e4c91c9067524675e33394b8ba" +dependencies = [ + "strum", + "strum_macros", + "unicode-width", +] + +[[package]] +name = "concurrent-queue" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "constant_time_eq" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpp_demangle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "cpufeatures" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +dependencies = [ + "libc", +] + +[[package]] +name = "cranelift-bforest" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52056f6d0584484b57fa6c1a65c1fcb15f3780d8b6a758426d9e3084169b2ddd" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fed94c8770dc25d01154c3ffa64ed0b3ba9d583736f305fed7beebe5d9cf74" +dependencies = [ + "arrayvec 0.7.4", + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "cranelift-isle", + "gimli 0.26.2", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c451b81faf237d11c7e4f3165eeb6bac61112762c5cfe7b4c0fb7241474358f" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c940133198426d26128f08be2b40b0bd117b84771fd36798969c4d712d81fc" + +[[package]] +name = "cranelift-entity" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87a0f1b2fdc18776956370cf8d9b009ded3f855350c480c1c52142510961f352" +dependencies = [ + "serde", +] + +[[package]] +name = "cranelift-frontend" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34897538b36b216cc8dd324e73263596d51b8cf610da6498322838b2546baf8a" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b2629a569fae540f16a76b70afcc87ad7decb38dc28fa6c648ac73b51e78470" + +[[package]] +name = "cranelift-native" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20937dab4e14d3e225c5adfc9c7106bafd4ac669bdb43027b911ff794c6fb318" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-wasm" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80fc2288957a94fd342a015811479de1837850924166d1f1856d8406e6f3609b" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools", + "log", + "smallvec", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset 0.9.0", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array 0.14.7", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array 0.14.7", + "subtle", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array 0.14.7", + "subtle", +] + +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher 0.3.0", +] + +[[package]] +name = "cuckoofilter" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b810a8449931679f64cd7eef1bbd0fa315801b6d5d9cdc1ace2804d6529eee18" +dependencies = [ + "byteorder", + "fnv", + "rand 0.7.3", +] + +[[package]] +name = "curve25519-dalek" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" +dependencies = [ + "byteorder", + "digest 0.8.1", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "4.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d4ba9852b42210c7538b75484f9daa0655e9a3ac04f693747bb0f02cf3cfe16" +dependencies = [ + "cfg-if", + "fiat-crypto", + "packed_simd_2", + "platforms 3.0.2", + "subtle", + "zeroize", +] + +[[package]] +name = "data-encoding" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" + +[[package]] +name = "data-encoding-macro" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c904b33cc60130e1aeea4956ab803d08a3f4a0ca82d64ed757afac3891f2bb99" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fdf3fce3ce863539ec1d7fd1b6dcc3c645663376b43ed376bbf887733e4f772" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] + +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +dependencies = [ + "const-oid", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "difference" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dns-parser" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" +dependencies = [ + "byteorder", + "quick-error", +] + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dyn-clonable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +dependencies = [ + "dyn-clonable-impl", + "dyn-clone", +] + +[[package]] +name = "dyn-clonable-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dyn-clone" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" + +[[package]] +name = "ecdsa" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d69ae62e0ce582d56380743515fefaf1a8c70cec685d9677636d7e30ae9dc9" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek 3.2.0", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek 3.2.0", + "hashbrown", + "hex", + "rand_core 0.6.4", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "elliptic-curve" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b477563c2bfed38a3b7a60964c49e058b2510ad3f12ba3483fd8f62c2306d6" +dependencies = [ + "base16ct", + "crypto-bigint", + "der", + "ff", + "generic-array 0.14.7", + "group", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "enum-as-inner" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "enumflags2" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" +dependencies = [ + "enumflags2_derive", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "env_logger" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "environmental" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" + +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "exit-future" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" +dependencies = [ + "futures", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fdlimit" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4c9e43643f5a3be4ca5b67d26b98031ff9db6806c3440ae32e02e3ceac3f1b" +dependencies = [ + "libc", +] + +[[package]] +name = "ff" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "131655483be284720a17d74ff97592b8e76576dc25563148601df2d7c9080924" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" + +[[package]] +name = "file-per-thread-logger" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f2e425d9790201ba4af4630191feac6dcc98765b118d4d18e91d23c2353866" +dependencies = [ + "env_logger 0.10.0", + "log", +] + +[[package]] +name = "filetime" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "windows-sys 0.48.0", +] + +[[package]] +name = "finality-grandpa" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36530797b9bf31cd4ff126dcfee8170f86b00cfdcea3269d73133cc0415945c3" +dependencies = [ + "either", + "futures", + "futures-timer", + "log", + "num-traits", + "parity-scale-codec", + "parking_lot 0.12.1", + "scale-info", +] + +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "libz-sys", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fork-tree" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "frame-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "frame-system", + "linregress", + "log", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-runtime-interface", + "sp-std", + "sp-storage", +] + +[[package]] +name = "frame-benchmarking-cli" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "Inflector", + "array-bytes 4.2.0", + "chrono", + "clap", + "comfy-table", + "frame-benchmarking", + "frame-support", + "frame-system", + "gethostname", + "handlebars", + "hash-db", + "itertools", + "kvdb", + "lazy_static", + "linked-hash-map", + "log", + "memory-db", + "parity-scale-codec", + "rand 0.8.5", + "rand_pcg 0.3.1", + "sc-block-builder", + "sc-cli", + "sc-client-api", + "sc-client-db", + "sc-executor", + "sc-service", + "sc-sysinfo", + "serde", + "serde_json 1.0.103", + "serde_nanos", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-database", + "sp-externalities", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-state-machine", + "sp-storage", + "sp-trie", + "tempfile", + "thiserror", + "thousands", +] + +[[package]] +name = "frame-election-provider-solution-type" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "frame-election-provider-support" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-election-provider-solution-type", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-npos-elections", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "frame-executive" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "frame-system", + "frame-try-runtime", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-tracing", +] + +[[package]] +name = "frame-metadata" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" +dependencies = [ + "cfg-if", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "frame-support" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "bitflags 1.3.2", + "frame-metadata", + "frame-support-procedural", + "impl-trait-for-tuples", + "k256", + "log", + "once_cell", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "smallvec", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-core-hashing-proc-macro", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-state-machine", + "sp-std", + "sp-tracing", + "sp-weights", + "tt-call", +] + +[[package]] +name = "frame-support-procedural" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "Inflector", + "cfg-expr", + "frame-support-procedural-tools", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "frame-support-procedural-tools" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support-procedural-tools-derive", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "frame-support-procedural-tools-derive" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "frame-system" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", + "sp-weights", +] + +[[package]] +name = "frame-system-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "frame-system-rpc-runtime-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "sp-api", +] + +[[package]] +name = "frame-try-runtime" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "parity-scale-codec", + "sp-api", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "fs-swap" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d47dad3685eceed8488986cad3d5027165ea5edb164331770e2059555f10a5" +dependencies = [ + "lazy_static", + "libc", + "libloading 0.5.2", + "winapi", +] + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite 0.2.10", + "waker-fn", +] + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "futures-rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" +dependencies = [ + "futures-io", + "rustls", + "webpki", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-timer" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite 0.2.10", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "ghash" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" +dependencies = [ + "opaque-debug 0.3.0", + "polyval", +] + +[[package]] +name = "gimli" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1391ab1f92ffcc08911957149833e682aa3fe252b9f45f966d2ef972274c97df" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "group" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5ac374b108929de78460075f3dc439fa66df9d8fc77e8f12caa5165fcf0c89" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "handlebars" +version = "4.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83c3372087601b532857d332f5957cbae686da52bb7810bf038c3e3c3cc2fa0d" +dependencies = [ + "log", + "pest", + "pest_derive", + "serde", + "serde_json 1.0.103", + "thiserror", +] + +[[package]] +name = "hash-db" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" + +[[package]] +name = "hash256-std-hasher" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" +dependencies = [ + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-literal" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" + +[[package]] +name = "hex_fmt" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac 0.8.0", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac 0.11.1", + "digest 0.9.0", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array 0.14.7", + "hmac 0.8.1", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.9", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite 0.2.10", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa 1.0.9", + "pin-project-lite 0.2.10", + "socket2 0.4.9", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" +dependencies = [ + "http", + "hyper", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows 0.48.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "if-addrs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "if-watch" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "015a7df1eb6dda30df37f34b63ada9b7b352984b0e84de2a20ed526345000791" +dependencies = [ + "async-io", + "core-foundation", + "fnv", + "futures", + "if-addrs", + "ipnet", + "log", + "rtnetlink", + "system-configuration", + "windows 0.34.0", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-serde" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4551f042f3438e64dbd6226b20527fc84a6e1fe65688b58746a2f53623f25f5c" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", + "serde", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + +[[package]] +name = "io-lifetimes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ce5ef949d49ee85593fc4d3f3f95ad61657076395cbbce23e2121fc5542074" + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.2", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ip_network" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2 0.5.3", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + +[[package]] +name = "ipnet" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" + +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi 0.3.2", + "rustix 0.38.4", + "windows-sys 0.48.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "jobserver" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpsee" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bd0d559d5e679b1ab2f869b486a11182923863b1b3ee8b421763cdd707b783a" +dependencies = [ + "jsonrpsee-core", + "jsonrpsee-http-server", + "jsonrpsee-proc-macros", + "jsonrpsee-types", + "jsonrpsee-ws-client", + "jsonrpsee-ws-server", + "tracing", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8752740ecd374bcbf8b69f3e80b0327942df76f793f8d4e60d3355650c31fb74" +dependencies = [ + "futures-util", + "http", + "jsonrpsee-core", + "jsonrpsee-types", + "pin-project", + "rustls-native-certs", + "soketto", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "webpki-roots", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3dc3e9cf2ba50b7b1d7d76a667619f82846caa39e8e8daa8a4962d74acaddca" +dependencies = [ + "anyhow", + "arrayvec 0.7.4", + "async-lock", + "async-trait", + "beef", + "futures-channel", + "futures-timer", + "futures-util", + "globset", + "http", + "hyper", + "jsonrpsee-types", + "lazy_static", + "parking_lot 0.12.1", + "rand 0.8.5", + "rustc-hash", + "serde", + "serde_json 1.0.103", + "soketto", + "thiserror", + "tokio", + "tracing", + "tracing-futures", + "unicase", +] + +[[package]] +name = "jsonrpsee-http-server" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03802f0373a38c2420c70b5144742d800b509e2937edc4afb116434f07120117" +dependencies = [ + "futures-channel", + "futures-util", + "hyper", + "jsonrpsee-core", + "jsonrpsee-types", + "serde", + "serde_json 1.0.103", + "tokio", + "tracing", + "tracing-futures", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd67957d4280217247588ac86614ead007b301ca2fa9f19c19f880a536f029e3" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e290bba767401b646812f608c099b922d8142603c9e73a50fb192d3ac86f4a0d" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json 1.0.103", + "thiserror", + "tracing", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ee5feddd5188e62ac08fcf0e56478138e581509d4730f3f7be9b57dd402a4ff" +dependencies = [ + "http", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", +] + +[[package]] +name = "jsonrpsee-ws-server" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d488ba74fb369e5ab68926feb75a483458b88e768d44319f37e4ecad283c7325" +dependencies = [ + "futures-channel", + "futures-util", + "http", + "jsonrpsee-core", + "jsonrpsee-types", + "serde_json 1.0.103", + "soketto", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "tracing-futures", +] + +[[package]] +name = "k256" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19c3a5e0a0b8450278feda242592512e09f61c72e018b8cd5c859482802daf2d" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "sec1", +] + +[[package]] +name = "keccak" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "kvdb" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a301d8ecb7989d4a6e2c57a49baca77d353bdbf879909debe3f375fe25d61f86" +dependencies = [ + "parity-util-mem", + "smallvec", +] + +[[package]] +name = "kvdb-memorydb" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ece7e668abd21387aeb6628130a6f4c802787f014fa46bc83221448322250357" +dependencies = [ + "kvdb", + "parity-util-mem", + "parking_lot 0.12.1", +] + +[[package]] +name = "kvdb-rocksdb" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca7fbdfd71cd663dceb0faf3367a99f8cf724514933e9867cec4995b6027cbc1" +dependencies = [ + "fs-swap", + "kvdb", + "log", + "num_cpus", + "owning_ref", + "parity-util-mem", + "parking_lot 0.12.1", + "regex", + "rocksdb", + "smallvec", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "libloading" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" +dependencies = [ + "cc", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" + +[[package]] +name = "libm" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" + +[[package]] +name = "libp2p" +version = "0.46.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81327106887e42d004fbdab1fef93675be2e2e07c1b95fce45e2cc813485611d" +dependencies = [ + "bytes", + "futures", + "futures-timer", + "getrandom 0.2.10", + "instant", + "lazy_static", + "libp2p-autonat", + "libp2p-core", + "libp2p-deflate", + "libp2p-dns", + "libp2p-floodsub", + "libp2p-gossipsub", + "libp2p-identify", + "libp2p-kad", + "libp2p-mdns", + "libp2p-metrics", + "libp2p-mplex", + "libp2p-noise", + "libp2p-ping", + "libp2p-plaintext", + "libp2p-pnet", + "libp2p-relay", + "libp2p-rendezvous", + "libp2p-request-response", + "libp2p-swarm", + "libp2p-swarm-derive", + "libp2p-tcp", + "libp2p-uds", + "libp2p-wasm-ext", + "libp2p-websocket", + "libp2p-yamux", + "multiaddr", + "parking_lot 0.12.1", + "pin-project", + "rand 0.7.3", + "smallvec", +] + +[[package]] +name = "libp2p-autonat" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4decc51f3573653a9f4ecacb31b1b922dd20c25a6322bb15318ec04287ec46f9" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-request-response", + "libp2p-swarm", + "log", + "prost 0.10.4", + "prost-build 0.10.4", + "rand 0.8.5", +] + +[[package]] +name = "libp2p-core" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf9b94cefab7599b2d3dff2f93bee218c6621d68590b23ede4485813cbcece6" +dependencies = [ + "asn1_der", + "bs58", + "ed25519-dalek", + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "lazy_static", + "libsecp256k1", + "log", + "multiaddr", + "multihash", + "multistream-select", + "parking_lot 0.12.1", + "pin-project", + "prost 0.10.4", + "prost-build 0.10.4", + "rand 0.8.5", + "ring", + "rw-stream-sink", + "sha2 0.10.7", + "smallvec", + "thiserror", + "unsigned-varint", + "void", + "zeroize", +] + +[[package]] +name = "libp2p-deflate" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0183dc2a3da1fbbf85e5b6cf51217f55b14f5daea0c455a9536eef646bfec71" +dependencies = [ + "flate2", + "futures", + "libp2p-core", +] + +[[package]] +name = "libp2p-dns" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cbf54723250fa5d521383be789bf60efdabe6bacfb443f87da261019a49b4b5" +dependencies = [ + "async-std-resolver", + "futures", + "libp2p-core", + "log", + "parking_lot 0.12.1", + "smallvec", + "trust-dns-resolver", +] + +[[package]] +name = "libp2p-floodsub" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98a4b6ffd53e355775d24b76f583fdda54b3284806f678499b57913adb94f231" +dependencies = [ + "cuckoofilter", + "fnv", + "futures", + "libp2p-core", + "libp2p-swarm", + "log", + "prost 0.10.4", + "prost-build 0.10.4", + "rand 0.7.3", + "smallvec", +] + +[[package]] +name = "libp2p-gossipsub" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74b4b888cfbeb1f5551acd3aa1366e01bf88ede26cc3c4645d0d2d004d5ca7b0" +dependencies = [ + "asynchronous-codec", + "base64 0.13.1", + "byteorder", + "bytes", + "fnv", + "futures", + "hex_fmt", + "instant", + "libp2p-core", + "libp2p-swarm", + "log", + "prometheus-client", + "prost 0.10.4", + "prost-build 0.10.4", + "rand 0.7.3", + "regex", + "sha2 0.10.7", + "smallvec", + "unsigned-varint", + "wasm-timer", +] + +[[package]] +name = "libp2p-identify" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50b585518f8efd06f93ac2f976bd672e17cdac794644b3117edd078e96bda06" +dependencies = [ + "asynchronous-codec", + "futures", + "futures-timer", + "libp2p-core", + "libp2p-swarm", + "log", + "lru", + "prost 0.10.4", + "prost-build 0.10.4", + "prost-codec", + "smallvec", + "thiserror", + "void", +] + +[[package]] +name = "libp2p-kad" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740862893bb5f06ac24acc9d49bdeadc3a5e52e51818a30a25c1f3519da2c851" +dependencies = [ + "arrayvec 0.7.4", + "asynchronous-codec", + "bytes", + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-swarm", + "log", + "prost 0.10.4", + "prost-build 0.10.4", + "rand 0.7.3", + "sha2 0.10.7", + "smallvec", + "thiserror", + "uint", + "unsigned-varint", + "void", +] + +[[package]] +name = "libp2p-mdns" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66e5e5919509603281033fd16306c61df7a4428ce274b67af5e14b07de5cdcb2" +dependencies = [ + "async-io", + "data-encoding", + "dns-parser", + "futures", + "if-watch", + "lazy_static", + "libp2p-core", + "libp2p-swarm", + "log", + "rand 0.8.5", + "smallvec", + "socket2 0.4.9", + "void", +] + +[[package]] +name = "libp2p-metrics" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8aff4a1abef42328fbb30b17c853fff9be986dc39af17ee39f9c5f755c5e0c" +dependencies = [ + "libp2p-core", + "libp2p-gossipsub", + "libp2p-identify", + "libp2p-kad", + "libp2p-ping", + "libp2p-relay", + "libp2p-swarm", + "prometheus-client", +] + +[[package]] +name = "libp2p-mplex" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61fd1b20638ec209c5075dfb2e8ce6a7ea4ec3cd3ad7b77f7a477c06d53322e2" +dependencies = [ + "asynchronous-codec", + "bytes", + "futures", + "libp2p-core", + "log", + "nohash-hasher", + "parking_lot 0.12.1", + "rand 0.7.3", + "smallvec", + "unsigned-varint", +] + +[[package]] +name = "libp2p-noise" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "762408cb5d84b49a600422d7f9a42c18012d8da6ebcd570f9a4a4290ba41fb6f" +dependencies = [ + "bytes", + "curve25519-dalek 3.2.0", + "futures", + "lazy_static", + "libp2p-core", + "log", + "prost 0.10.4", + "prost-build 0.10.4", + "rand 0.8.5", + "sha2 0.10.7", + "snow", + "static_assertions", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "libp2p-ping" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "100a6934ae1dbf8a693a4e7dd1d730fd60b774dafc45688ed63b554497c6c925" +dependencies = [ + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-swarm", + "log", + "rand 0.7.3", + "void", +] + +[[package]] +name = "libp2p-plaintext" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be27bf0820a6238a4e06365b096d428271cce85a129cf16f2fe9eb1610c4df86" +dependencies = [ + "asynchronous-codec", + "bytes", + "futures", + "libp2p-core", + "log", + "prost 0.10.4", + "prost-build 0.10.4", + "unsigned-varint", + "void", +] + +[[package]] +name = "libp2p-pnet" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6468f382568da936b4fa1cff273ce59b1debf873ff5f4ca412c3b91d0b37442c" +dependencies = [ + "futures", + "log", + "pin-project", + "rand 0.8.5", + "salsa20", + "sha3", +] + +[[package]] +name = "libp2p-relay" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4931547ee0cce03971ccc1733ff05bb0c4349fd89120a39e9861e2bbe18843c3" +dependencies = [ + "asynchronous-codec", + "bytes", + "either", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-swarm", + "log", + "pin-project", + "prost 0.10.4", + "prost-build 0.10.4", + "prost-codec", + "rand 0.8.5", + "smallvec", + "static_assertions", + "thiserror", + "void", +] + +[[package]] +name = "libp2p-rendezvous" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9511c9672ba33284838e349623319c8cad2d18cfad243ae46c6b7e8a2982ea4e" +dependencies = [ + "asynchronous-codec", + "bimap", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-swarm", + "log", + "prost 0.10.4", + "prost-build 0.10.4", + "rand 0.8.5", + "sha2 0.10.7", + "thiserror", + "unsigned-varint", + "void", +] + +[[package]] +name = "libp2p-request-response" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "508a189e2795d892c8f5c1fa1e9e0b1845d32d7b0b249dbf7b05b18811361843" +dependencies = [ + "async-trait", + "bytes", + "futures", + "instant", + "libp2p-core", + "libp2p-swarm", + "log", + "rand 0.7.3", + "smallvec", + "unsigned-varint", +] + +[[package]] +name = "libp2p-swarm" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ac5be6c2de2d1ff3f7693fda6faf8a827b1f3e808202277783fea9f527d114" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "log", + "pin-project", + "rand 0.7.3", + "smallvec", + "thiserror", + "void", +] + +[[package]] +name = "libp2p-swarm-derive" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f54a64b6957249e0ce782f8abf41d97f69330d02bf229f0672d864f0650cc76" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "libp2p-tcp" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a6771dc19aa3c65d6af9a8c65222bfc8fcd446630ddca487acd161fa6096f3b" +dependencies = [ + "async-io", + "futures", + "futures-timer", + "if-watch", + "ipnet", + "libc", + "libp2p-core", + "log", + "socket2 0.4.9", +] + +[[package]] +name = "libp2p-uds" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d125e3e5f0d58f3c6ac21815b20cf4b6a88b8db9dc26368ea821838f4161fd4d" +dependencies = [ + "async-std", + "futures", + "libp2p-core", + "log", +] + +[[package]] +name = "libp2p-wasm-ext" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec894790eec3c1608f8d1a8a0bdf0dbeb79ed4de2dce964222011c2896dfa05a" +dependencies = [ + "futures", + "js-sys", + "libp2p-core", + "parity-send-wrapper", + "wasm-bindgen", + "wasm-bindgen-futures", +] + +[[package]] +name = "libp2p-websocket" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9808e57e81be76ff841c106b4c5974fb4d41a233a7bdd2afbf1687ac6def3818" +dependencies = [ + "either", + "futures", + "futures-rustls", + "libp2p-core", + "log", + "parking_lot 0.12.1", + "quicksink", + "rw-stream-sink", + "soketto", + "url", + "webpki-roots", +] + +[[package]] +name = "libp2p-yamux" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6dea686217a06072033dc025631932810e2f6ad784e4fafa42e27d311c7a81c" +dependencies = [ + "futures", + "libp2p-core", + "parking_lot 0.12.1", + "thiserror", + "yamux", +] + +[[package]] +name = "librocksdb-sys" +version = "0.6.3+6.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "184ce2a189a817be2731070775ad053b6804a340fee05c6686d711db27455917" +dependencies = [ + "bindgen", + "bzip2-sys", + "cc", + "glob", + "libc", + "libz-sys", + "tikv-jemalloc-sys", +] + +[[package]] +name = "libsecp256k1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +dependencies = [ + "arrayref", + "base64 0.13.1", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.8.5", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libz-sys" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linked_hash_set" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "linregress" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6c601a85f5ecd1aba625247bca0031585fb1c446461b142878a16f8245ddeb8" +dependencies = [ + "nalgebra", + "statrs", +] + +[[package]] +name = "linux-raw-sys" +version = "0.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" + +[[package]] +name = "lite-json" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0e787ffe1153141a0f6f6d759fdf1cc34b1226e088444523812fd412a5cca2" +dependencies = [ + "lite-parser", +] + +[[package]] +name = "lite-parser" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d5f9dc37c52d889a21fd701983d02bb6a84f852c5140a6c80ef4557f7dc29e" +dependencies = [ + "paste", +] + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +dependencies = [ + "value-bag", +] + +[[package]] +name = "lru" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "lz4" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +dependencies = [ + "libc", + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matrixmultiply" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memfd" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e" +dependencies = [ + "rustix 0.37.23", +] + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memory-db" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6566c70c1016f525ced45d7b7f97730a2bafb037c788211d0c186ef5b2189f0a" +dependencies = [ + "hash-db", + "hashbrown", + "parity-util-mem", +] + +[[package]] +name = "memory_units" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" + +[[package]] +name = "merlin" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.5.1", + "zeroize", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "multiaddr" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c580bfdd8803cce319b047d239559a22f809094aaea4ac13902a1fdcfcd4261" +dependencies = [ + "arrayref", + "bs58", + "byteorder", + "data-encoding", + "multihash", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc" +dependencies = [ + "blake2b_simd", + "blake2s_simd", + "blake3", + "core2", + "digest 0.10.7", + "multihash-derive", + "sha2 0.10.7", + "sha3", + "unsigned-varint", +] + +[[package]] +name = "multihash-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" +dependencies = [ + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "multistream-select" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "363a84be6453a70e63513660f4894ef815daf88e3356bffcda9ca27d810ce83b" +dependencies = [ + "bytes", + "futures", + "log", + "pin-project", + "smallvec", + "unsigned-varint", +] + +[[package]] +name = "nalgebra" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "462fffe4002f4f2e1f6a9dcf12cc1a6fc0e15989014efc02a941d3e0f5dc2120" +dependencies = [ + "approx", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational 0.4.1", + "num-traits", + "rand 0.8.5", + "rand_distr", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "names" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7d66043b25d4a6cccb23619d10c19c25304b355a7dccd4a8e11423dd2382146" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "netlink-packet-core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" +dependencies = [ + "anyhow", + "byteorder", + "libc", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" +dependencies = [ + "anyhow", + "bitflags 1.3.2", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror", +] + +[[package]] +name = "netlink-proto" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror", + "tokio", +] + +[[package]] +name = "netlink-sys" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" +dependencies = [ + "async-io", + "bytes", + "futures", + "libc", + "log", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "node-primitives" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[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-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec 0.7.4", + "itoa 1.0.9", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint 0.4.3", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", + "libm 0.2.7", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.2", + "libc", +] + +[[package]] +name = "object" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +dependencies = [ + "crc32fast", + "hashbrown", + "indexmap", + "memchr", +] + +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "os_str_bytes" +version = "6.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" + +[[package]] +name = "output_vt100" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" +dependencies = [ + "winapi", +] + +[[package]] +name = "owning_ref" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "packed_simd_2" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" +dependencies = [ + "cfg-if", + "libm 0.1.4", +] + +[[package]] +name = "pallet-authority-discovery" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "frame-system", + "pallet-session", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-authority-discovery", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-authorship" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-authorship", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-babe" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-consensus-babe", + "sp-consensus-vrf", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-bags-list" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-tracing", +] + +[[package]] +name = "pallet-balances" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-bounties" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-treasury", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-cere-ddc" +version = "4.8.0" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-chainbridge" +version = "4.8.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "lite-json", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-child-bounties" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-bounties", + "pallet-treasury", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-collective" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-contracts" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "bitflags 1.3.2", + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-contracts-primitives", + "pallet-contracts-proc-macro", + "parity-scale-codec", + "rand 0.8.5", + "rand_pcg 0.3.1", + "scale-info", + "serde", + "smallvec", + "sp-core", + "sp-io", + "sp-runtime", + "sp-sandbox", + "sp-std", + "wasm-instrument", + "wasmi-validation", +] + +[[package]] +name = "pallet-contracts-primitives" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "bitflags 1.3.2", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-contracts-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "pallet-contracts-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "jsonrpsee", + "pallet-contracts-primitives", + "pallet-contracts-rpc-runtime-api", + "parity-scale-codec", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", +] + +[[package]] +name = "pallet-contracts-rpc-runtime-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "pallet-contracts-primitives", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-ddc-accounts" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", + "substrate-test-utils", +] + +[[package]] +name = "pallet-ddc-metrics-offchain-worker" +version = "4.8.0" +dependencies = [ + "alt_serde", + "frame-support", + "frame-system", + "hex", + "hex-literal", + "lite-json", + "pallet-balances", + "pallet-contracts", + "pallet-randomness-collective-flip", + "pallet-timestamp", + "parity-scale-codec", + "pretty_assertions", + "scale-info", + "serde", + "serde_json 1.0.44", + "sp-core", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-ddc-staking" +version = "4.8.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", + "sp-tracing", + "substrate-test-utils", +] + +[[package]] +name = "pallet-ddc-validator" +version = "0.1.0" +dependencies = [ + "alt_serde", + "array-bytes 6.1.0", + "base64 0.21.2", + "frame-election-provider-support", + "frame-support", + "frame-system", + "lite-json", + "log", + "pallet-balances", + "pallet-contracts", + "pallet-ddc-accounts", + "pallet-ddc-staking", + "pallet-randomness-collective-flip", + "pallet-session", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "serde", + "serde_json 1.0.44", + "sp-core", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-democracy" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-election-provider-multi-phase" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-election-provider-support-benchmarking", + "parity-scale-codec", + "rand 0.7.3", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-std", + "static_assertions", + "strum", +] + +[[package]] +name = "pallet-election-provider-support-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-system", + "parity-scale-codec", + "sp-npos-elections", + "sp-runtime", +] + +[[package]] +name = "pallet-elections-phragmen" +version = "5.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-erc20" +version = "4.8.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-chainbridge", + "pallet-erc721", + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-erc721" +version = "4.8.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-chainbridge", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-fast-unstake" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "pallet-staking", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-grandpa" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-core", + "sp-finality-grandpa", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-identity" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "enumflags2", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-im-online" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-indices" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-membership" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-multisig" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-nomination-pools" +version = "1.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-nomination-pools-benchmarking" +version = "1.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "pallet-bags-list", + "pallet-nomination-pools", + "pallet-staking", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-runtime-interface", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-nomination-pools-runtime-api" +version = "1.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "sp-api", + "sp-std", +] + +[[package]] +name = "pallet-offences" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "serde", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-offences-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "pallet-babe", + "pallet-balances", + "pallet-grandpa", + "pallet-im-online", + "pallet-offences", + "pallet-session", + "pallet-staking", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-proxy" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-randomness-collective-flip" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "safe-mix", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-recovery" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-scheduler" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-session" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-trie", +] + +[[package]] +name = "pallet-session-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-session", + "pallet-staking", + "rand 0.7.3", + "sp-runtime", + "sp-session", + "sp-std", +] + +[[package]] +name = "pallet-society" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "rand_chacha 0.2.2", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-staking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "rand_chacha 0.2.2", + "scale-info", + "serde", + "sp-application-crypto", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-staking-reward-curve" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "pallet-sudo" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-timestamp" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std", + "sp-timestamp", +] + +[[package]] +name = "pallet-tips" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-treasury", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-transaction-payment" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-transaction-payment-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "jsonrpsee", + "pallet-transaction-payment-rpc-runtime-api", + "parity-scale-codec", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", +] + +[[package]] +name = "pallet-transaction-payment-rpc-runtime-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "pallet-transaction-payment", + "parity-scale-codec", + "sp-api", + "sp-runtime", +] + +[[package]] +name = "pallet-transaction-storage" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std", + "sp-transaction-storage-proof", +] + +[[package]] +name = "pallet-treasury" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "serde", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-utility" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-vesting" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "parity-db" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8fdb726a43661fa54b43e7114e6b88b2289cae388eb3ad766d9d1754d83fce" +dependencies = [ + "blake2-rfc", + "crc32fast", + "fs2", + "hex", + "libc", + "log", + "lz4", + "memmap2", + "parking_lot 0.12.1", + "rand 0.8.5", + "snap", +] + +[[package]] +name = "parity-scale-codec" +version = "3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756d439303e94fae44f288ba881ad29670c65b0c4b0e05674ca81061bb65f2c5" +dependencies = [ + "arrayvec 0.7.4", + "bitvec", + "byte-slice-cast", + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d884d78fcf214d70b1e239fcd1c6e5e95aa3be1881918da2e488cc946c7a476" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parity-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" + +[[package]] +name = "parity-util-mem" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c32561d248d352148124f036cac253a644685a21dc9fea383eb4907d7bd35a8f" +dependencies = [ + "cfg-if", + "hashbrown", + "impl-trait-for-tuples", + "parity-util-mem-derive", + "parking_lot 0.12.1", + "primitive-types", + "smallvec", + "winapi", +] + +[[package]] +name = "parity-util-mem-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" +dependencies = [ + "proc-macro2", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "parity-wasm" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" +dependencies = [ + "byteorder", +] + +[[package]] +name = "parity-wasm" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" + +[[package]] +name = "parking" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.8", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.3.5", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pbkdf2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +dependencies = [ + "crypto-mac 0.8.0", +] + +[[package]] +name = "pbkdf2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +dependencies = [ + "crypto-mac 0.11.1", +] + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "pest" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f73935e4d55e2abf7f130186537b19e7a4abc886a0252380b59248af473a3fc9" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef623c9bbfa0eedf5a0efba11a5ee83209c326653ca31ff019bec3a95bfff2b" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3e8cba4ec22bada7fc55ffe51e2deb6a0e0db2d0b7ab0b103acc80d2510c190" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "pest_meta" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01f71cb40bd8bb94232df14b946909e14660e33fc05db3e50ae2a82d7ea0ca0" +dependencies = [ + "once_cell", + "pest", + "sha2 0.10.7", +] + +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "pin-project-lite" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" + +[[package]] +name = "pin-project-lite" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" +dependencies = [ + "der", + "spki", + "zeroize", +] + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "platforms" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d0eef3571242013a0d5dc84861c3ae4a652e56e12adf8bdc26ff5f8cb34c94" + +[[package]] +name = "platforms" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" + +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite 0.2.10", + "windows-sys 0.48.0", +] + +[[package]] +name = "poly1305" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" +dependencies = [ + "cpufeatures", + "opaque-debug 0.3.0", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug 0.3.0", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "pretty_assertions" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" +dependencies = [ + "ansi_term 0.11.0", + "ctor", + "difference", + "output_vt100", +] + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "prettyplease" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92139198957b410250d43fad93e630d956499a625c527eda65175c8680f83387" +dependencies = [ + "proc-macro2", + "syn 2.0.26", +] + +[[package]] +name = "primitive-types" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28720988bff275df1f51b171e1b2a18c30d194c4d2b61defdacecd625a5d94a" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-serde", + "scale-info", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +dependencies = [ + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prometheus" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "memchr", + "parking_lot 0.12.1", + "thiserror", +] + +[[package]] +name = "prometheus-client" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1abe0255c04d15f571427a2d1e00099016506cf3297b53853acd2b7eb87825" +dependencies = [ + "dtoa", + "itoa 1.0.9", + "owning_ref", + "prometheus-client-derive-text-encode", +] + +[[package]] +name = "prometheus-client-derive-text-encode" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e12d01b9d66ad9eb4529c57666b6263fc1993cb30261d83ead658fdd932652" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" +dependencies = [ + "bytes", + "prost-derive 0.10.1", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive 0.11.9", +] + +[[package]] +name = "prost-build" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae5a4388762d5815a9fc0dea33c56b021cdc8dde0c55e0c9ca57197254b0cab" +dependencies = [ + "bytes", + "cfg-if", + "cmake", + "heck", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prost 0.10.4", + "prost-types 0.10.1", + "regex", + "tempfile", + "which", +] + +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease 0.1.25", + "prost 0.11.9", + "prost-types 0.11.9", + "regex", + "syn 1.0.109", + "tempfile", + "which", +] + +[[package]] +name = "prost-codec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00af1e92c33b4813cc79fda3f2dbf56af5169709be0202df730e9ebc3e4cd007" +dependencies = [ + "asynchronous-codec", + "bytes", + "prost 0.10.4", + "thiserror", + "unsigned-varint", +] + +[[package]] +name = "prost-derive" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b670f45da57fb8542ebdbb6105a925fe571b67f9e7ed9f47a06a84e72b4e7cc" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost-types" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d0a014229361011dc8e69c8a1ec6c2e8d0f2af7c91e3ea3f5b2170298461e68" +dependencies = [ + "bytes", + "prost 0.10.4", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost 0.11.9", +] + +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quicksink" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858" +dependencies = [ + "futures-core", + "futures-sink", + "pin-project-lite 0.1.12", +] + +[[package]] +name = "quote" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg 0.2.1", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.10", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.10", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "ref-cast" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1641819477c319ef452a075ac34a4be92eb9ba09f6841f62d594d50fdcf0bf6b" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68bf53dad9b6086826722cdc99140793afd9f62faa14a1ad07eb4f955e7a7216" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "regalloc2" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43a209257d978ef079f3d446331d0f1794f5e0fc19b306a199983857833a779" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.3.3", + "regex-syntax 0.7.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.4", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + +[[package]] +name = "remote-externalities" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "env_logger 0.9.3", + "jsonrpsee", + "log", + "parity-scale-codec", + "serde", + "serde_json 1.0.103", + "sp-core", + "sp-io", + "sp-runtime", + "sp-version", +] + +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] + +[[package]] +name = "rfc6979" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ef608575f6392792f9ecf7890c00086591d29a83910939d430753f7c050525" +dependencies = [ + "crypto-bigint", + "hmac 0.11.0", + "zeroize", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rocksdb" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "620f4129485ff1a7128d184bc687470c21c7951b64779ebc9cfdad3dcd920290" +dependencies = [ + "libc", + "librocksdb-sys", +] + +[[package]] +name = "rpassword" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678cf63ab3491898c0d021b493c94c9b221d91295294a2a5746eacbe5928322" +dependencies = [ + "libc", + "rtoolbox", + "winapi", +] + +[[package]] +name = "rtnetlink" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" +dependencies = [ + "async-global-executor", + "futures", + "log", + "netlink-packet-route", + "netlink-proto", + "nix", + "thiserror", +] + +[[package]] +name = "rtoolbox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "034e22c514f5c0cb8a10ff341b9b048b5ceb21591f31c8f44c43b960f9b3524a" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver 0.9.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.18", +] + +[[package]] +name = "rustix" +version = "0.35.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6380889b07a03b5ecf1d44dc9ede6fd2145d84b502a2a9ca0b03c48e0cc3220f" +dependencies = [ + "bitflags 1.3.2", + "errno 0.2.8", + "io-lifetimes 0.7.5", + "libc", + "linux-raw-sys 0.0.46", + "windows-sys 0.42.0", +] + +[[package]] +name = "rustix" +version = "0.37.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +dependencies = [ + "bitflags 1.3.2", + "errno 0.3.1", + "io-lifetimes 1.0.11", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" +dependencies = [ + "bitflags 2.3.3", + "errno 0.3.1", + "libc", + "linux-raw-sys 0.4.3", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +dependencies = [ + "base64 0.21.2", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "rw-stream-sink" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04" +dependencies = [ + "futures", + "pin-project", + "static_assertions", +] + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "safe-mix" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d3d055a2582e6b00ed7a31c1524040aa391092bf636328350813f3a0605215c" +dependencies = [ + "rustc_version 0.2.3", +] + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher 0.4.4", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "sc-allocator" +version = "4.1.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "log", + "sp-core", + "sp-wasm-interface", + "thiserror", +] + +[[package]] +name = "sc-authority-discovery" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "ip_network", + "libp2p", + "log", + "parity-scale-codec", + "prost 0.10.4", + "prost-build 0.10.4", + "rand 0.7.3", + "sc-client-api", + "sc-network-common", + "sp-api", + "sp-authority-discovery", + "sp-blockchain", + "sp-core", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-basic-authorship" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures", + "futures-timer", + "log", + "parity-scale-codec", + "sc-block-builder", + "sc-client-api", + "sc-proposer-metrics", + "sc-telemetry", + "sc-transaction-pool-api", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-inherents", + "sp-runtime", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "sc-block-builder" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "sc-client-api", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", +] + +[[package]] +name = "sc-chain-spec" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "impl-trait-for-tuples", + "memmap2", + "parity-scale-codec", + "sc-chain-spec-derive", + "sc-network-common", + "sc-telemetry", + "serde", + "serde_json 1.0.103", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "sc-chain-spec-derive" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sc-cli" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "array-bytes 4.2.0", + "chrono", + "clap", + "fdlimit", + "futures", + "libp2p", + "log", + "names", + "parity-scale-codec", + "rand 0.7.3", + "regex", + "rpassword", + "sc-client-api", + "sc-client-db", + "sc-keystore", + "sc-network", + "sc-network-common", + "sc-service", + "sc-telemetry", + "sc-tracing", + "sc-utils", + "serde", + "serde_json 1.0.103", + "sp-blockchain", + "sp-core", + "sp-keyring", + "sp-keystore", + "sp-panic-handler", + "sp-runtime", + "sp-version", + "thiserror", + "tiny-bip39", + "tokio", +] + +[[package]] +name = "sc-client-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "fnv", + "futures", + "hash-db", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-executor", + "sc-transaction-pool-api", + "sc-utils", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-database", + "sp-externalities", + "sp-keystore", + "sp-runtime", + "sp-state-machine", + "sp-storage", + "sp-trie", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "sc-client-db" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "hash-db", + "kvdb", + "kvdb-memorydb", + "kvdb-rocksdb", + "linked-hash-map", + "log", + "parity-db", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-client-api", + "sc-state-db", + "sp-arithmetic", + "sp-blockchain", + "sp-core", + "sp-database", + "sp-runtime", + "sp-state-machine", + "sp-trie", +] + +[[package]] +name = "sc-consensus" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "libp2p", + "log", + "parking_lot 0.12.1", + "sc-client-api", + "sc-utils", + "serde", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "sp-state-machine", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-consensus-babe" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "fork-tree", + "futures", + "log", + "merlin", + "num-bigint 0.2.6", + "num-rational 0.2.4", + "num-traits", + "parity-scale-codec", + "parking_lot 0.12.1", + "rand 0.7.3", + "sc-client-api", + "sc-consensus", + "sc-consensus-epochs", + "sc-consensus-slots", + "sc-keystore", + "sc-telemetry", + "schnorrkel", + "serde", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-consensus-slots", + "sp-consensus-vrf", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-version", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-consensus-babe-rpc" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures", + "jsonrpsee", + "sc-consensus-babe", + "sc-consensus-epochs", + "sc-rpc-api", + "serde", + "sp-api", + "sp-application-crypto", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-keystore", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-consensus-epochs" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "fork-tree", + "parity-scale-codec", + "sc-client-api", + "sc-consensus", + "sp-blockchain", + "sp-runtime", +] + +[[package]] +name = "sc-consensus-slots" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-consensus", + "sc-telemetry", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "thiserror", +] + +[[package]] +name = "sc-consensus-uncles" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "sc-client-api", + "sp-authorship", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-executor" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "lazy_static", + "lru", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-executor-common", + "sc-executor-wasmi", + "sc-executor-wasmtime", + "sp-api", + "sp-core", + "sp-core-hashing-proc-macro", + "sp-externalities", + "sp-io", + "sp-panic-handler", + "sp-runtime-interface", + "sp-tasks", + "sp-trie", + "sp-version", + "sp-wasm-interface", + "tracing", + "wasmi", +] + +[[package]] +name = "sc-executor-common" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "environmental", + "parity-scale-codec", + "sc-allocator", + "sp-maybe-compressed-blob", + "sp-sandbox", + "sp-wasm-interface", + "thiserror", + "wasm-instrument", + "wasmi", +] + +[[package]] +name = "sc-executor-wasmi" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "log", + "parity-scale-codec", + "sc-allocator", + "sc-executor-common", + "sp-runtime-interface", + "sp-sandbox", + "sp-wasm-interface", + "wasmi", +] + +[[package]] +name = "sc-executor-wasmtime" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "cfg-if", + "libc", + "log", + "once_cell", + "parity-scale-codec", + "parity-wasm 0.45.0", + "rustix 0.35.14", + "sc-allocator", + "sc-executor-common", + "sp-runtime-interface", + "sp-sandbox", + "sp-wasm-interface", + "wasmtime", +] + +[[package]] +name = "sc-finality-grandpa" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "ahash", + "array-bytes 4.2.0", + "async-trait", + "dyn-clone", + "finality-grandpa", + "fork-tree", + "futures", + "futures-timer", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "rand 0.8.5", + "sc-block-builder", + "sc-chain-spec", + "sc-client-api", + "sc-consensus", + "sc-keystore", + "sc-network", + "sc-network-common", + "sc-network-gossip", + "sc-telemetry", + "sc-utils", + "serde_json 1.0.103", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-finality-grandpa", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-finality-grandpa-rpc" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "finality-grandpa", + "futures", + "jsonrpsee", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-finality-grandpa", + "sc-rpc", + "serde", + "serde_json 1.0.103", + "sp-blockchain", + "sp-core", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-informant" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "ansi_term 0.12.1", + "futures", + "futures-timer", + "log", + "parity-util-mem", + "sc-client-api", + "sc-network-common", + "sc-transaction-pool-api", + "sp-blockchain", + "sp-runtime", +] + +[[package]] +name = "sc-keystore" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "array-bytes 4.2.0", + "async-trait", + "parking_lot 0.12.1", + "serde_json 1.0.103", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "thiserror", +] + +[[package]] +name = "sc-network" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "array-bytes 4.2.0", + "async-trait", + "asynchronous-codec", + "bitflags 1.3.2", + "bytes", + "cid", + "either", + "fnv", + "fork-tree", + "futures", + "futures-timer", + "ip_network", + "libp2p", + "linked-hash-map", + "linked_hash_set", + "log", + "lru", + "parity-scale-codec", + "parking_lot 0.12.1", + "pin-project", + "prost 0.10.4", + "rand 0.7.3", + "sc-block-builder", + "sc-client-api", + "sc-consensus", + "sc-network-common", + "sc-peerset", + "sc-utils", + "serde", + "serde_json 1.0.103", + "smallvec", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", + "unsigned-varint", + "zeroize", +] + +[[package]] +name = "sc-network-bitswap" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "cid", + "futures", + "libp2p", + "log", + "prost 0.11.9", + "prost-build 0.11.9", + "sc-client-api", + "sc-network-common", + "sp-blockchain", + "sp-runtime", + "thiserror", + "unsigned-varint", + "void", +] + +[[package]] +name = "sc-network-common" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "bitflags 1.3.2", + "bytes", + "futures", + "futures-timer", + "libp2p", + "linked_hash_set", + "parity-scale-codec", + "prost-build 0.10.4", + "sc-consensus", + "sc-peerset", + "serde", + "smallvec", + "sp-blockchain", + "sp-consensus", + "sp-finality-grandpa", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-network-gossip" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "ahash", + "futures", + "futures-timer", + "libp2p", + "log", + "lru", + "sc-network-common", + "sc-peerset", + "sp-runtime", + "substrate-prometheus-endpoint", + "tracing", +] + +[[package]] +name = "sc-network-light" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "array-bytes 4.2.0", + "futures", + "libp2p", + "log", + "parity-scale-codec", + "prost 0.10.4", + "prost-build 0.10.4", + "sc-client-api", + "sc-network-common", + "sc-peerset", + "sp-blockchain", + "sp-core", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-network-sync" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "array-bytes 4.2.0", + "fork-tree", + "futures", + "libp2p", + "log", + "lru", + "parity-scale-codec", + "prost 0.10.4", + "prost-build 0.10.4", + "sc-client-api", + "sc-consensus", + "sc-network-common", + "sc-peerset", + "smallvec", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-finality-grandpa", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-network-transactions" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "array-bytes 4.2.0", + "futures", + "hex", + "libp2p", + "log", + "parity-scale-codec", + "pin-project", + "sc-network-common", + "sc-peerset", + "sp-consensus", + "sp-runtime", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "sc-offchain" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "array-bytes 4.2.0", + "bytes", + "fnv", + "futures", + "futures-timer", + "hyper", + "hyper-rustls", + "libp2p", + "num_cpus", + "once_cell", + "parity-scale-codec", + "parking_lot 0.12.1", + "rand 0.7.3", + "sc-client-api", + "sc-network-common", + "sc-peerset", + "sc-utils", + "sp-api", + "sp-core", + "sp-offchain", + "sp-runtime", + "threadpool", + "tracing", +] + +[[package]] +name = "sc-peerset" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures", + "libp2p", + "log", + "sc-utils", + "serde_json 1.0.103", + "wasm-timer", +] + +[[package]] +name = "sc-proposer-metrics" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "log", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "sc-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures", + "hash-db", + "jsonrpsee", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-block-builder", + "sc-chain-spec", + "sc-client-api", + "sc-rpc-api", + "sc-tracing", + "sc-transaction-pool-api", + "sc-utils", + "serde_json 1.0.103", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-keystore", + "sp-offchain", + "sp-rpc", + "sp-runtime", + "sp-session", + "sp-version", +] + +[[package]] +name = "sc-rpc-api" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures", + "jsonrpsee", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-chain-spec", + "sc-transaction-pool-api", + "scale-info", + "serde", + "serde_json 1.0.103", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-tracing", + "sp-version", + "thiserror", +] + +[[package]] +name = "sc-rpc-server" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures", + "jsonrpsee", + "log", + "serde_json 1.0.103", + "substrate-prometheus-endpoint", + "tokio", +] + +[[package]] +name = "sc-service" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "directories", + "exit-future", + "futures", + "futures-timer", + "hash-db", + "jsonrpsee", + "log", + "parity-scale-codec", + "parity-util-mem", + "parking_lot 0.12.1", + "pin-project", + "rand 0.7.3", + "sc-block-builder", + "sc-chain-spec", + "sc-client-api", + "sc-client-db", + "sc-consensus", + "sc-executor", + "sc-informant", + "sc-keystore", + "sc-network", + "sc-network-bitswap", + "sc-network-common", + "sc-network-light", + "sc-network-sync", + "sc-network-transactions", + "sc-offchain", + "sc-rpc", + "sc-rpc-server", + "sc-sysinfo", + "sc-telemetry", + "sc-tracing", + "sc-transaction-pool", + "sc-transaction-pool-api", + "sc-utils", + "serde", + "serde_json 1.0.103", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-externalities", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-session", + "sp-state-machine", + "sp-storage", + "sp-tracing", + "sp-transaction-pool", + "sp-transaction-storage-proof", + "sp-trie", + "sp-version", + "static_init", + "substrate-prometheus-endpoint", + "tempfile", + "thiserror", + "tokio", + "tracing", + "tracing-futures", +] + +[[package]] +name = "sc-state-db" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "log", + "parity-scale-codec", + "parity-util-mem", + "parity-util-mem-derive", + "parking_lot 0.12.1", + "sc-client-api", + "sp-core", +] + +[[package]] +name = "sc-sync-state-rpc" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "jsonrpsee", + "parity-scale-codec", + "sc-chain-spec", + "sc-client-api", + "sc-consensus-babe", + "sc-consensus-epochs", + "sc-finality-grandpa", + "serde", + "serde_json 1.0.103", + "sp-blockchain", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-sysinfo" +version = "6.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures", + "libc", + "log", + "rand 0.7.3", + "rand_pcg 0.2.1", + "regex", + "sc-telemetry", + "serde", + "serde_json 1.0.103", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "sc-telemetry" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "chrono", + "futures", + "libp2p", + "log", + "parking_lot 0.12.1", + "pin-project", + "rand 0.7.3", + "serde", + "serde_json 1.0.103", + "thiserror", + "wasm-timer", +] + +[[package]] +name = "sc-tracing" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "ansi_term 0.12.1", + "atty", + "chrono", + "lazy_static", + "libc", + "log", + "once_cell", + "parking_lot 0.12.1", + "regex", + "rustc-hash", + "sc-client-api", + "sc-rpc-server", + "sc-tracing-proc-macro", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-tracing", + "thiserror", + "tracing", + "tracing-log", + "tracing-subscriber", +] + +[[package]] +name = "sc-tracing-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sc-transaction-pool" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures", + "futures-timer", + "linked-hash-map", + "log", + "parity-scale-codec", + "parity-util-mem", + "parking_lot 0.12.1", + "sc-client-api", + "sc-transaction-pool-api", + "sc-utils", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-runtime", + "sp-tracing", + "sp-transaction-pool", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-transaction-pool-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures", + "log", + "serde", + "sp-blockchain", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-utils" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures", + "futures-timer", + "lazy_static", + "log", + "parking_lot 0.12.1", + "prometheus", +] + +[[package]] +name = "scale-info" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" +dependencies = [ + "bitvec", + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", + "serde", +] + +[[package]] +name = "scale-info-derive" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "schnorrkel" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "curve25519-dalek 2.1.3", + "getrandom 0.1.16", + "merlin", + "rand 0.7.3", + "rand_core 0.5.1", + "sha2 0.8.2", + "subtle", + "zeroize", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sec1" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1" +dependencies = [ + "der", + "generic-array 0.14.7", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" +dependencies = [ + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" +dependencies = [ + "cc", +] + +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "serde_json" +version = "1.0.44" +source = "git+https://github.com/Cerebellum-Network/json?branch=no-std-cere#17b8b39421fb94ffb1ddb8fe65630542b0679ada" +dependencies = [ + "alt_serde", + "itoa 0.4.8", + "ryu", +] + +[[package]] +name = "serde_json" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" +dependencies = [ + "itoa 1.0.9", + "ryu", + "serde", +] + +[[package]] +name = "serde_nanos" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae801b7733ca8d6a2b580debe99f67f36826a0f5b8a36055dc6bc40f8d6bc71" +dependencies = [ + "serde", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" + +[[package]] +name = "signal-hook" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b824b6e687aff278cdbf3b36f07aa52d4bd4099699324d5da86a2ebce3aa00b3" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02658e48d89f2bec991f9a78e69cfa4c316f8d6a6c4ec12fae1aeb263d486788" +dependencies = [ + "digest 0.9.0", + "rand_core 0.6.4", +] + +[[package]] +name = "simba" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e82063457853d00243beda9952e910b82593e4b07ae9f721b9278a99a0d3d5c" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", +] + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "smallvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" + +[[package]] +name = "snap" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e9f0ab6ef7eb7353d9119c170a436d1bf248eea575ac42d19d12f4e34130831" + +[[package]] +name = "snow" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ccba027ba85743e09d15c03296797cad56395089b832b48b5a5217880f57733" +dependencies = [ + "aes-gcm", + "blake2", + "chacha20poly1305", + "curve25519-dalek 4.0.0-rc.1", + "rand_core 0.6.4", + "ring", + "rustc_version 0.4.0", + "sha2 0.10.7", + "subtle", +] + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64 0.13.1", + "bytes", + "flate2", + "futures", + "httparse", + "log", + "rand 0.8.5", + "sha-1", +] + +[[package]] +name = "sp-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "hash-db", + "log", + "parity-scale-codec", + "sp-api-proc-macro", + "sp-core", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "sp-version", + "thiserror", +] + +[[package]] +name = "sp-api-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "blake2", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp-application-crypto" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "sp-arithmetic" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "integer-sqrt", + "num-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sp-debug-derive", + "sp-std", + "static_assertions", +] + +[[package]] +name = "sp-authority-discovery" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-authorship" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "parity-scale-codec", + "sp-inherents", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-block-builder" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "sp-api", + "sp-inherents", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-blockchain" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures", + "log", + "lru", + "parity-scale-codec", + "parking_lot 0.12.1", + "sp-api", + "sp-consensus", + "sp-database", + "sp-runtime", + "sp-state-machine", + "thiserror", +] + +[[package]] +name = "sp-consensus" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "log", + "parity-scale-codec", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-version", + "thiserror", +] + +[[package]] +name = "sp-consensus-babe" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "merlin", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-consensus", + "sp-consensus-slots", + "sp-consensus-vrf", + "sp-core", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-std", + "sp-timestamp", +] + +[[package]] +name = "sp-consensus-slots" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-runtime", + "sp-std", + "sp-timestamp", +] + +[[package]] +name = "sp-consensus-vrf" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "scale-info", + "schnorrkel", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-core" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "array-bytes 4.2.0", + "base58", + "bitflags 1.3.2", + "blake2", + "byteorder", + "dyn-clonable", + "ed25519-zebra", + "futures", + "hash-db", + "hash256-std-hasher", + "impl-serde", + "lazy_static", + "libsecp256k1", + "log", + "merlin", + "num-traits", + "parity-scale-codec", + "parity-util-mem", + "parking_lot 0.12.1", + "primitive-types", + "rand 0.7.3", + "regex", + "scale-info", + "schnorrkel", + "secp256k1", + "secrecy", + "serde", + "sp-core-hashing", + "sp-debug-derive", + "sp-externalities", + "sp-runtime-interface", + "sp-std", + "sp-storage", + "ss58-registry", + "substrate-bip39", + "thiserror", + "tiny-bip39", + "wasmi", + "zeroize", +] + +[[package]] +name = "sp-core-hashing" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "blake2", + "byteorder", + "digest 0.10.7", + "sha2 0.10.7", + "sha3", + "sp-std", + "twox-hash", +] + +[[package]] +name = "sp-core-hashing-proc-macro" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "proc-macro2", + "quote", + "sp-core-hashing", + "syn 1.0.109", +] + +[[package]] +name = "sp-database" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "kvdb", + "parking_lot 0.12.1", +] + +[[package]] +name = "sp-debug-derive" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp-externalities" +version = "0.12.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std", + "sp-storage", +] + +[[package]] +name = "sp-finality-grandpa" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "finality-grandpa", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-inherents" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "impl-trait-for-tuples", + "parity-scale-codec", + "sp-core", + "sp-runtime", + "sp-std", + "thiserror", +] + +[[package]] +name = "sp-io" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "bytes", + "futures", + "hash-db", + "libsecp256k1", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "secp256k1", + "sp-core", + "sp-externalities", + "sp-keystore", + "sp-runtime-interface", + "sp-state-machine", + "sp-std", + "sp-tracing", + "sp-trie", + "sp-wasm-interface", + "tracing", + "tracing-core", +] + +[[package]] +name = "sp-keyring" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "lazy_static", + "sp-core", + "sp-runtime", + "strum", +] + +[[package]] +name = "sp-keystore" +version = "0.12.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "futures", + "merlin", + "parity-scale-codec", + "parking_lot 0.12.1", + "schnorrkel", + "serde", + "sp-core", + "sp-externalities", + "thiserror", +] + +[[package]] +name = "sp-maybe-compressed-blob" +version = "4.1.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "thiserror", + "zstd", +] + +[[package]] +name = "sp-npos-elections" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-offchain" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "sp-api", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "sp-panic-handler" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "backtrace", + "lazy_static", + "regex", +] + +[[package]] +name = "sp-rpc" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "rustc-hash", + "serde", + "sp-core", +] + +[[package]] +name = "sp-runtime" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "either", + "hash256-std-hasher", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "parity-util-mem", + "paste", + "rand 0.7.3", + "scale-info", + "serde", + "sp-application-crypto", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-std", + "sp-weights", +] + +[[package]] +name = "sp-runtime-interface" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec", + "primitive-types", + "sp-externalities", + "sp-runtime-interface-proc-macro", + "sp-std", + "sp-storage", + "sp-tracing", + "sp-wasm-interface", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "Inflector", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp-sandbox" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "log", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-std", + "sp-wasm-interface", + "wasmi", +] + +[[package]] +name = "sp-session" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-core", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] +name = "sp-staking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-state-machine" +version = "0.12.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "hash-db", + "log", + "num-traits", + "parity-scale-codec", + "parking_lot 0.12.1", + "rand 0.7.3", + "smallvec", + "sp-core", + "sp-externalities", + "sp-panic-handler", + "sp-std", + "sp-trie", + "thiserror", + "tracing", + "trie-root", +] + +[[package]] +name = "sp-std" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" + +[[package]] +name = "sp-storage" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive", + "sp-std", +] + +[[package]] +name = "sp-tasks" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "log", + "sp-core", + "sp-externalities", + "sp-io", + "sp-runtime-interface", + "sp-std", +] + +[[package]] +name = "sp-timestamp" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "futures-timer", + "log", + "parity-scale-codec", + "sp-api", + "sp-inherents", + "sp-runtime", + "sp-std", + "thiserror", +] + +[[package]] +name = "sp-tracing" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "sp-std", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "sp-transaction-pool" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "sp-api", + "sp-runtime", +] + +[[package]] +name = "sp-transaction-storage-proof" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "async-trait", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-std", + "sp-trie", +] + +[[package]] +name = "sp-trie" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "ahash", + "hash-db", + "hashbrown", + "lazy_static", + "lru", + "memory-db", + "nohash-hasher", + "parity-scale-codec", + "parking_lot 0.12.1", + "scale-info", + "sp-core", + "sp-std", + "thiserror", + "tracing", + "trie-db", + "trie-root", +] + +[[package]] +name = "sp-version" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "parity-wasm 0.45.0", + "scale-info", + "serde", + "sp-core-hashing-proc-macro", + "sp-runtime", + "sp-std", + "sp-version-proc-macro", + "thiserror", +] + +[[package]] +name = "sp-version-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "parity-scale-codec", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp-wasm-interface" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-std", + "wasmi", + "wasmtime", +] + +[[package]] +name = "sp-weights" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "serde", + "smallvec", + "sp-arithmetic", + "sp-core", + "sp-debug-derive", + "sp-std", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spki" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "ss58-registry" +version = "1.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfc443bad666016e012538782d9e3006213a7db43e9fb1dda91657dc06a6fa08" +dependencies = [ + "Inflector", + "num-format", + "proc-macro2", + "quote", + "serde", + "serde_json 1.0.103", + "unicode-xid", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "static_init" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a2a1c578e98c1c16fc3b8ec1328f7659a500737d7a0c6d625e73e830ff9c1f6" +dependencies = [ + "bitflags 1.3.2", + "cfg_aliases", + "libc", + "parking_lot 0.11.2", + "parking_lot_core 0.8.6", + "static_init_macro", + "winapi", +] + +[[package]] +name = "static_init_macro" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf" +dependencies = [ + "cfg_aliases", + "memchr", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "statrs" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05bdbb8e4e78216a85785a85d3ec3183144f98d0097b9281802c019bb07a6f05" +dependencies = [ + "approx", + "lazy_static", + "nalgebra", + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "substrate-bip39" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49eee6965196b32f882dd2ee85a92b1dbead41b04e53907f269de3b0dc04733c" +dependencies = [ + "hmac 0.11.0", + "pbkdf2 0.8.0", + "schnorrkel", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "substrate-build-script-utils" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "platforms 2.0.0", +] + +[[package]] +name = "substrate-frame-rpc-system" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-system-rpc-runtime-api", + "futures", + "jsonrpsee", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-rpc-api", + "sc-transaction-pool-api", + "serde_json 1.0.103", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "substrate-prometheus-endpoint" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures-util", + "hyper", + "log", + "prometheus", + "thiserror", + "tokio", +] + +[[package]] +name = "substrate-state-trie-migration-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "jsonrpsee", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-rpc-api", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "trie-db", +] + +[[package]] +name = "substrate-test-utils" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "futures", + "substrate-test-utils-derive", + "tokio", +] + +[[package]] +name = "substrate-test-utils-derive" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "substrate-wasm-builder" +version = "5.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "ansi_term 0.12.1", + "build-helper", + "cargo_metadata", + "filetime", + "sp-maybe-compressed-blob", + "strum", + "tempfile", + "toml", + "walkdir", + "wasm-gc-api", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8e77cb757a61f51b947ec4a7e3646efd825b73561db1c232a8ccb639e611a0" + +[[package]] +name = "tempfile" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +dependencies = [ + "autocfg", + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix 0.37.23", + "windows-sys 0.48.0", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" + +[[package]] +name = "thiserror" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "thousands" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "tikv-jemalloc-sys" +version = "0.4.3+5.2.1-patched.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1792ccb507d955b46af42c123ea8863668fae24d03721e40cad6a41773dbb49" +dependencies = [ + "cc", + "fs_extra", + "libc", +] + +[[package]] +name = "time" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "tiny-bip39" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" +dependencies = [ + "anyhow", + "hmac 0.8.1", + "once_cell", + "pbkdf2 0.4.0", + "rand 0.7.3", + "rustc-hash", + "sha2 0.9.9", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +dependencies = [ + "autocfg", + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot 0.12.1", + "pin-project-lite 0.2.10", + "signal-hook-registry", + "socket2 0.4.9", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "tokio-rustls" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls", + "tokio", + "webpki", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite 0.2.10", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite 0.2.10", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite 0.2.10", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "ansi_term 0.12.1", + "chrono", + "lazy_static", + "matchers", + "parking_lot 0.11.2", + "regex", + "serde", + "serde_json 1.0.103", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "trie-db" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "004e1e8f92535694b4cb1444dc5a8073ecf0815e3357f729638b9f8fc4062908" +dependencies = [ + "hash-db", + "hashbrown", + "log", + "rustc-hex", + "smallvec", +] + +[[package]] +name = "trie-root" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a36c5ca3911ed3c9a5416ee6c679042064b93fc637ded67e25f92e68d783891" +dependencies = [ + "hash-db", +] + +[[package]] +name = "trust-dns-proto" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.2.3", + "ipnet", + "lazy_static", + "log", + "rand 0.8.5", + "smallvec", + "thiserror", + "tinyvec", + "url", +] + +[[package]] +name = "trust-dns-resolver" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" +dependencies = [ + "cfg-if", + "futures-util", + "ipconfig", + "lazy_static", + "log", + "lru-cache", + "parking_lot 0.12.1", + "resolv-conf", + "smallvec", + "thiserror", + "trust-dns-proto", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "try-runtime-cli" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "clap", + "frame-try-runtime", + "jsonrpsee", + "log", + "parity-scale-codec", + "remote-externalities", + "sc-chain-spec", + "sc-cli", + "sc-executor", + "sc-service", + "serde", + "sp-core", + "sp-externalities", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-state-machine", + "sp-version", + "zstd", +] + +[[package]] +name = "tt-call" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f195fd851901624eee5a58c4bb2b4f06399148fcd0ed336e6f1cb60a9881df" + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "digest 0.10.7", + "rand 0.8.5", + "static_assertions", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array 0.14.7", + "subtle", +] + +[[package]] +name = "unsigned-varint" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" +dependencies = [ + "asynchronous-codec", + "bytes", + "futures-io", + "futures-util", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "url" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +dependencies = [ + "form_urlencoded", + "idna 0.4.0", + "percent-encoding", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "value-bag" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92ccd67fb88503048c01b59152a04effd0782d035a83a6d256ce6085f08f4a3" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.26", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "wasm-gc-api" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0c32691b6c7e6c14e7f8fd55361a9088b507aa49620fcd06c09b3a1082186b9" +dependencies = [ + "log", + "parity-wasm 0.32.0", + "rustc-demangle", +] + +[[package]] +name = "wasm-instrument" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa1dafb3e60065305741e83db35c6c2584bb3725b692b5b66148a38d72ace6cd" +dependencies = [ + "parity-wasm 0.45.0", +] + +[[package]] +name = "wasm-timer" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.11.2", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmi" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c326c93fbf86419608361a2c925a31754cf109da1b8b55737070b4d6669422" +dependencies = [ + "parity-wasm 0.45.0", + "wasmi-validation", + "wasmi_core", +] + +[[package]] +name = "wasmi-validation" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ff416ad1ff0c42e5a926ed5d5fab74c0f098749aa0ad8b2a34b982ce0e867b" +dependencies = [ + "parity-wasm 0.45.0", +] + +[[package]] +name = "wasmi_core" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d20cb3c59b788653d99541c646c561c9dd26506f25c0cebfe810659c54c6d7" +dependencies = [ + "downcast-rs", + "libm 0.2.7", + "memory_units", + "num-rational 0.4.1", + "num-traits", +] + +[[package]] +name = "wasmparser" +version = "0.89.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5d3e08b13876f96dd55608d03cd4883a0545884932d5adf11925876c96daef" +dependencies = [ + "indexmap", +] + +[[package]] +name = "wasmtime" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ad5af6ba38311282f2a21670d96e78266e8c8e2f38cbcd52c254df6ccbc7731" +dependencies = [ + "anyhow", + "bincode", + "cfg-if", + "indexmap", + "libc", + "log", + "object 0.29.0", + "once_cell", + "paste", + "psm", + "rayon", + "serde", + "target-lexicon", + "wasmparser", + "wasmtime-cache", + "wasmtime-cranelift", + "wasmtime-environ", + "wasmtime-jit", + "wasmtime-runtime", + "windows-sys 0.36.1", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45de63ddfc8b9223d1adc8f7b2ee5f35d1f6d112833934ad7ea66e4f4339e597" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-cache" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcd849399d17d2270141cfe47fa0d91ee52d5f8ea9b98cf7ddde0d53e5f79882" +dependencies = [ + "anyhow", + "base64 0.13.1", + "bincode", + "directories-next", + "file-per-thread-logger", + "log", + "rustix 0.35.14", + "serde", + "sha2 0.9.9", + "toml", + "windows-sys 0.36.1", + "zstd", +] + +[[package]] +name = "wasmtime-cranelift" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd91339b742ff20bfed4532a27b73c86b5bcbfedd6bea2dcdf2d64471e1b5c6" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli 0.26.2", + "log", + "object 0.29.0", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-environ" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebb881c61f4f627b5d45c54e629724974f8a8890d455bcbe634330cc27309644" +dependencies = [ + "anyhow", + "cranelift-entity", + "gimli 0.26.2", + "indexmap", + "log", + "object 0.29.0", + "serde", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "wasmtime-jit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1985c628011fe26adf5e23a5301bdc79b245e0e338f14bb58b39e4e25e4d8681" +dependencies = [ + "addr2line 0.17.0", + "anyhow", + "bincode", + "cfg-if", + "cpp_demangle", + "gimli 0.26.2", + "log", + "object 0.29.0", + "rustc-demangle", + "rustix 0.35.14", + "serde", + "target-lexicon", + "thiserror", + "wasmtime-environ", + "wasmtime-jit-debug", + "wasmtime-runtime", + "windows-sys 0.36.1", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f671b588486f5ccec8c5a3dba6b4c07eac2e66ab8c60e6f4e53717c77f709731" +dependencies = [ + "object 0.29.0", + "once_cell", + "rustix 0.35.14", +] + +[[package]] +name = "wasmtime-runtime" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8f92ad4b61736339c29361da85769ebc200f184361959d1792832e592a1afd" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "indexmap", + "libc", + "log", + "mach", + "memfd", + "memoffset 0.6.5", + "paste", + "rand 0.8.5", + "rustix 0.35.14", + "thiserror", + "wasmtime-asm-macros", + "wasmtime-environ", + "wasmtime-jit-debug", + "windows-sys 0.36.1", +] + +[[package]] +name = "wasmtime-types" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23d61cb4c46e837b431196dd06abb11731541021916d03476a178b54dc07aeb" +dependencies = [ + "cranelift-entity", + "serde", + "thiserror", + "wasmparser", +] + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki", +] + +[[package]] +name = "which" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +dependencies = [ + "either", + "libc", + "once_cell", +] + +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +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-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" +dependencies = [ + "windows_aarch64_msvc 0.34.0", + "windows_i686_gnu 0.34.0", + "windows_i686_msvc 0.34.0", + "windows_x86_64_gnu 0.34.0", + "windows_x86_64_msvc 0.34.0", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x25519-dalek" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" +dependencies = [ + "curve25519-dalek 3.2.0", + "rand_core 0.5.1", + "zeroize", +] + +[[package]] +name = "yamux" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d9ba232399af1783a58d8eb26f6b5006fbefe2dc9ef36bd283324792d03ea5" +dependencies = [ + "futures", + "log", + "nohash-hasher", + "parking_lot 0.12.1", + "rand 0.8.5", + "static_assertions", +] + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.8+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +dependencies = [ + "cc", + "libc", + "pkg-config", +] diff --git a/pallets/ddc-accounts/Cargo.toml b/pallets/ddc-accounts/Cargo.toml index 4d5b3aa30..869e758e6 100644 --- a/pallets/ddc-accounts/Cargo.toml +++ b/pallets/ddc-accounts/Cargo.toml @@ -5,17 +5,17 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } log = { version = "0.4.17", default-features = false } [dev-dependencies] -substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/pallets/ddc-validator/Cargo.toml b/pallets/ddc-validator/Cargo.toml index 7672fbfbd..886e6cfa6 100644 --- a/pallets/ddc-validator/Cargo.toml +++ b/pallets/ddc-validator/Cargo.toml @@ -8,31 +8,31 @@ alt_serde = { version = "1", default-features = false, features = ["derive"] } array-bytes = "6.0.0" base64 = { version = "0.21.0", default-features = false } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } lite-json = { version = "0.2.0", default-features = false } log = { version = "0.4.17", default-features = false } -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-ddc-accounts = { version = "0.1.0", default-features = false, path = "../ddc-accounts" } pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } -pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false } -pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [dev-dependencies] -pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-staking-reward-curve = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-staking-reward-curve = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] From e628dd8c69d9b1ddd471beaec1f42092d89c4ad6 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 17 Jul 2023 16:49:45 +0600 Subject: [PATCH 210/583] Fix `RuntimeCall` and `RuntimeEvent` types --- pallets/ddc-accounts/src/lib.rs | 2 +- pallets/ddc-validator/src/lib.rs | 4 ++-- runtime/cere-dev/src/lib.rs | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index 1b5e4156a..1d8984986 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -163,7 +163,7 @@ pub mod pallet { #[pallet::constant] type PalletId: Get; type Currency: LockableCurrency; - type Event: From> + IsType<::Event>; + type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// Number of eras that staked funds must remain bonded for. #[pallet::constant] type BondingDuration: Get; diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 37c6aaa94..bf2097933 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -177,14 +177,14 @@ pub mod pallet { as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, { /// The overarching event type. - type Event: From> + IsType<::Event>; + type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// Something that provides randomness in the runtime. Required by the tasks assignment /// procedure. type Randomness: Randomness; /// A dispatchable call. - type Call: From>; + type RuntimeCall: From>; type AuthorityId: AppCrypto; type TimeProvider: UnixTime; diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 9e9b1b85b..25b80213d 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1344,8 +1344,8 @@ parameter_types! { impl pallet_ddc_accounts::Config for Runtime { type BondingDuration = BondingDuration; type Currency = Balances; - type Event = Event; type PalletId = Ddc_Accounts_Pallet_Id; + type RuntimeEvent = RuntimeEvent; type TimeProvider = pallet_timestamp::Pallet; } @@ -1357,9 +1357,9 @@ parameter_types! { impl pallet_ddc_validator::Config for Runtime { type DdcValidatorsQuorumSize = DdcValidatorsQuorumSize; - type Event = Event; type Randomness = RandomnessCollectiveFlip; - type Call = Call; + type RuntimeCall = RuntimeCall; + type RuntimeEvent = RuntimeEvent; type AuthorityId = pallet_ddc_validator::crypto::TestAuthId; type TimeProvider = pallet_timestamp::Pallet; type ValidationThreshold = ValidationThreshold; From d7e5659b4c6b0d17b08438ae45258335121d1240 Mon Sep 17 00:00:00 2001 From: shamilkhan Date: Mon, 17 Jul 2023 16:59:53 +0400 Subject: [PATCH 211/583] Add MaximumMultiplier to TargetedFeeAdjustment --- runtime/cere-dev/src/impls.rs | 5 +++-- runtime/cere/src/impls.rs | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/runtime/cere-dev/src/impls.rs b/runtime/cere-dev/src/impls.rs index dd38a6a1d..c6e54537c 100644 --- a/runtime/cere-dev/src/impls.rs +++ b/runtime/cere-dev/src/impls.rs @@ -32,8 +32,8 @@ impl OnUnbalanced for Author { #[cfg(test)] mod multiplier_tests { use crate::{ - AdjustmentVariable, MinimumMultiplier, Runtime, RuntimeBlockWeights as BlockWeights, - System, TargetBlockFullness, TransactionPayment, + AdjustmentVariable, MaximumMultiplier, MinimumMultiplier, Runtime, + RuntimeBlockWeights as BlockWeights, System, TargetBlockFullness, TransactionPayment, }; use cere_dev_runtime_constants::{currency::*, time::*}; use frame_support::weights::{DispatchClass, Weight, WeightToFee as WeightToFeeT}; @@ -66,6 +66,7 @@ mod multiplier_tests { TargetBlockFullness, AdjustmentVariable, MinimumMultiplier, + MaximumMultiplier, >::convert(fm) } diff --git a/runtime/cere/src/impls.rs b/runtime/cere/src/impls.rs index 9597162dc..7ea4f4238 100644 --- a/runtime/cere/src/impls.rs +++ b/runtime/cere/src/impls.rs @@ -32,8 +32,8 @@ impl OnUnbalanced for Author { #[cfg(test)] mod multiplier_tests { use crate::{ - AdjustmentVariable, MinimumMultiplier, Runtime, RuntimeBlockWeights as BlockWeights, - System, TargetBlockFullness, TransactionPayment, + AdjustmentVariable, MaximumMultiplier, MinimumMultiplier, Runtime, + RuntimeBlockWeights as BlockWeights, System, TargetBlockFullness, TransactionPayment, }; use cere_runtime_constants::{currency::*, time::*}; use frame_support::weights::{DispatchClass, Weight, WeightToFee as WeightToFeeT}; @@ -66,6 +66,7 @@ mod multiplier_tests { TargetBlockFullness, AdjustmentVariable, MinimumMultiplier, + MaximumMultiplier, >::convert(fm) } From a84a424207bf9155010be9edb626f43f1e1086cb Mon Sep 17 00:00:00 2001 From: shamilkhan Date: Mon, 17 Jul 2023 17:01:03 +0400 Subject: [PATCH 212/583] Remove ContractAccessWeight from test_runtime --- pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs b/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs index 10cee8408..85a324a14 100644 --- a/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs +++ b/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs @@ -155,7 +155,6 @@ impl contracts::Config for Test { type DepositPerByte = DepositPerByte; type DepositPerItem = DepositPerItem; type AddressGenerator = pallet_contracts::DefaultAddressGenerator; - type ContractAccessWeight = (); type MaxCodeLen = ConstU32<{ 128 * 1024 }>; type MaxStorageKeyLen = ConstU32<128>; } From c49d4ec8f7db46b8765fb752319ddda265021ce3 Mon Sep 17 00:00:00 2001 From: shamilkhan Date: Mon, 17 Jul 2023 17:01:26 +0400 Subject: [PATCH 213/583] Remove use pallet_contracts_rpc --- rpc/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs index 3925387af..345bee27a 100644 --- a/rpc/src/lib.rs +++ b/rpc/src/lib.rs @@ -92,7 +92,6 @@ where B: sc_client_api::Backend + Send + Sync + 'static, B::State: sc_client_api::backend::StateBackend>, { - use pallet_contracts_rpc::{Contracts, ContractsApiServer}; use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; use sc_consensus_babe_rpc::{Babe, BabeApiServer}; use sc_finality_grandpa_rpc::GrandpaApiServer; From 82fc53c429314ed7340315494e7fce771fe3028b Mon Sep 17 00:00:00 2001 From: shamilkhan Date: Mon, 17 Jul 2023 17:01:59 +0400 Subject: [PATCH 214/583] Update Cargo.lock --- Cargo.lock | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 248478cc6..ab817a287 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -519,13 +519,12 @@ dependencies = [ "lazy_static", "lazycell", "peeking_take_while", - "prettyplease 0.2.10", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "syn 2.0.25", + "syn 1.0.109", ] [[package]] @@ -1237,7 +1236,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.25", ] [[package]] @@ -5719,16 +5718,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "prettyplease" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92139198957b410250d43fad93e630d956499a625c527eda65175c8680f83387" -dependencies = [ - "proc-macro2", - "syn 2.0.25", -] - [[package]] name = "primitive-types" version = "0.12.1" @@ -5807,7 +5796,7 @@ checksum = "83cd1b99916654a69008fd66b4f9397fbe08e6e51dfe23d4417acf5d3b8cb87c" dependencies = [ "dtoa", "itoa 1.0.8", - "owning_ref", + "parking_lot 0.12.1", "prometheus-client-derive-text-encode", ] From 47c77a570f498476039ba0dee19c806bfc0b0bf2 Mon Sep 17 00:00:00 2001 From: shamilkhan Date: Mon, 17 Jul 2023 17:02:13 +0400 Subject: [PATCH 215/583] Apply formatting --- pallets/ddc-staking/src/lib.rs | 4 ++-- rpc/Cargo.toml | 2 +- runtime/cere-dev/src/lib.rs | 4 ++-- runtime/cere/src/lib.rs | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 37b890bd3..d8844e7c3 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -28,6 +28,7 @@ pub mod weights; use crate::weights::WeightInfo; use codec::{Decode, Encode, HasCompact}; +use core::fmt::Debug; use frame_support::{ assert_ok, pallet_prelude::*, @@ -38,6 +39,7 @@ use frame_support::{ BoundedVec, }; use frame_system::pallet_prelude::*; +pub use pallet::*; use scale_info::TypeInfo; use sp_runtime::{ traits::{AtLeast32BitUnsigned, Saturating, StaticLookup, Zero}, @@ -45,8 +47,6 @@ use sp_runtime::{ }; use sp_staking::EraIndex; use sp_std::prelude::*; -use core::fmt::Debug; -pub use pallet::*; /// Two minutes. /// diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 5cb94085e..1f37eba16 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -26,4 +26,4 @@ pallet-transaction-payment-rpc = { version = "4.0.0-dev", git = "https://github. sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } substrate-state-trie-migration-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } \ No newline at end of file diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 54edc94be..24a25f658 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -71,8 +71,8 @@ use sp_runtime::{ curve::PiecewiseLinear, generic, impl_opaque_keys, traits::{ - self, BlakeTwo256, Block as BlockT, ConvertInto, NumberFor, OpaqueKeys, - SaturatedConversion, StaticLookup, Bounded, + self, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, NumberFor, OpaqueKeys, + SaturatedConversion, StaticLookup, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedPointNumber, FixedU128, Perbill, Percent, Permill, Perquintill, diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index f085fb5e7..2d92279ad 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -34,7 +34,7 @@ use frame_support::{ traits::{ ConstU128, ConstU16, ConstU32, Currency, EitherOfDiverse, EqualPrivilegeOnly, Everything, Imbalance, InstanceFilter, KeyOwnerProofSystem, LockIdentifier, Nothing, OnUnbalanced, - U128CurrencyToVote, WithdrawReasons + U128CurrencyToVote, WithdrawReasons, }, weights::{ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, @@ -70,8 +70,8 @@ use sp_runtime::{ curve::PiecewiseLinear, generic, impl_opaque_keys, traits::{ - self, BlakeTwo256, Block as BlockT, ConvertInto, NumberFor, OpaqueKeys, - SaturatedConversion, StaticLookup, Bounded, + self, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, NumberFor, OpaqueKeys, + SaturatedConversion, StaticLookup, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedPointNumber, FixedU128, Perbill, Percent, Permill, Perquintill, From 9bda4077c3531be1f8a4a8bf7eec5929591ff70a Mon Sep 17 00:00:00 2001 From: shamilkhan Date: Tue, 18 Jul 2023 15:10:37 +0400 Subject: [PATCH 216/583] Set set_proof_size to u64::MAX for failed tests --- pallets/ddc-metrics-offchain-worker/src/tests/mod.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs b/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs index 6c0dbbe09..79489a14b 100644 --- a/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs +++ b/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs @@ -289,7 +289,7 @@ fn should_run_contract() { RuntimeOrigin::signed(alice.clone()), contract_id.clone(), 0, - Weight::from_ref_time(100_000_000_000), + Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), None, call_data.clone(), ) @@ -299,7 +299,7 @@ fn should_run_contract() { alice.clone(), contract_id, 0, - Weight::from_ref_time(100_000_000_000), + Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), None, call_data, false, @@ -337,7 +337,8 @@ fn deploy_contract() -> AccountId { // Deploy the contract. //let endowment = contracts::Config::::subsistence_threshold_uncached(); - const GAS_LIMIT: frame_support::weights::Weight = Weight::from_ref_time(100_000_000_000); + const GAS_LIMIT: frame_support::weights::Weight = + Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX); const ENDOWMENT: Balance = 100_000_000_000; Contracts::instantiate_with_code( RuntimeOrigin::signed(alice.clone()), @@ -372,7 +373,7 @@ fn deploy_contract() -> AccountId { RuntimeOrigin::signed(alice.clone()), contract_id.clone(), 0, - Weight::from_ref_time(1_000_000_000_000), + Weight::from_ref_time(1_000_000_000_000).set_proof_size(u64::MAX), None, call_data, ); From 59776ad730d1d12d7e1f481315925b34c348b295 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 18 Jul 2023 16:18:58 +0200 Subject: [PATCH 217/583] Fix contracts dissapearing --- runtime/cere-dev/src/lib.rs | 1 + runtime/cere/src/lib.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 1084c42f3..7970537d3 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1444,6 +1444,7 @@ pub type Executive = frame_executive::Executive< StakingMigrationV11OldPallet, >, pallet_staking::migrations::v12::MigrateToV12, + pallet_contracts::Migration, ), >; diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 04847ab88..1ab8d87fd 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -1423,6 +1423,7 @@ pub type Executive = frame_executive::Executive< StakingMigrationV11OldPallet, >, pallet_staking::migrations::v12::MigrateToV12, + pallet_contracts::Migration, ), >; From e6068eb7904f363d9ec5eb339b1c4529bc058de5 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 18 Jul 2023 16:34:47 +0200 Subject: [PATCH 218/583] Fix tests --- pallets/ddc-metrics-offchain-worker/src/lib.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pallets/ddc-metrics-offchain-worker/src/lib.rs b/pallets/ddc-metrics-offchain-worker/src/lib.rs index 5c6c07892..eb315d933 100644 --- a/pallets/ddc-metrics-offchain-worker/src/lib.rs +++ b/pallets/ddc-metrics-offchain-worker/src/lib.rs @@ -349,7 +349,7 @@ where nobody.unwrap(), contract_id, 0u32.into(), - Weight::from_ref_time(100_000_000_000), + Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), None, call_data, false, @@ -385,7 +385,7 @@ where let results = signer.send_signed_transaction(|_account| pallet_contracts::Call::call { dest: contract_id_unl.clone(), value: 0u32.into(), - gas_limit: Weight::from_ref_time(100_000_000_000), + gas_limit: Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), storage_deposit_limit: None, data: call_data.clone(), }); @@ -442,7 +442,7 @@ where pallet_contracts::Call::call { dest: contract_id_unl, value: 0u32.into(), - gas_limit: Weight::from_ref_time(100_000_000_000), + gas_limit: Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), storage_deposit_limit: None, data: call_data, } @@ -492,7 +492,7 @@ where pallet_contracts::Call::call { dest: contract_id_unl, value: 0u32.into(), - gas_limit: Weight::from_ref_time(100_000_000_000), + gas_limit: Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), storage_deposit_limit: None, data: call_data, } @@ -530,7 +530,7 @@ where pallet_contracts::Call::call { dest: contract_id_unl, value: 0u32.into(), - gas_limit: Weight::from_ref_time(100_000_000_000), + gas_limit: Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), storage_deposit_limit: None, data: call_data, } @@ -585,7 +585,7 @@ where nobody.unwrap(), contract_id, 0u32.into(), - Weight::from_ref_time(100_000_000_000), + Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), None, call_data, false, From 5b8e670c970c2688f0765563631fbbed65b46db2 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 19 Jul 2023 10:18:12 +0200 Subject: [PATCH 219/583] set OCW keys as assignees for validators & fix the bug which let to empty reward points being submitted --- pallets/ddc-validator/src/lib.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 8d55c983e..2f314cc76 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -531,7 +531,8 @@ pub mod pallet { } fn assign(quorum_size: usize, era: EraIndex) { - let validators: Vec = >::iter_keys().collect(); + let validators: Vec = OffchainWorkerKeys::::iter_values().collect(); + log::info!("current validators: {:?}", validators); let edges: Vec = >::iter_keys().collect(); @@ -776,10 +777,12 @@ pub mod pallet { let signer = Self::get_signer().unwrap(); // ToDo: replace local call by a call from `ddc-staking` pallet - let _tx_res = signer.send_signed_transaction(|_account| Call::set_era_reward_points { - era: current_era - 1, - stakers_points: cdn_nodes_reward_points.clone(), - }); + if cdn_nodes_reward_points.len() > 0 { + let _tx_res = signer.send_signed_transaction(|_account| Call::set_era_reward_points { + era: current_era - 1, + stakers_points: cdn_nodes_reward_points.clone(), + }); + } } } } From 45380af8784a2c4403ad40ac48b577954c07ff39 Mon Sep 17 00:00:00 2001 From: Alexander Dobrodey <8377544+ADobrodey@users.noreply.github.com> Date: Wed, 19 Jul 2023 21:03:25 +0200 Subject: [PATCH 220/583] Caching support within docker cargo build and upload to the new accounts (#66) * Cache cargo builds * Correct accounts --------- Co-authored-by: Oleg Yankovich <33641729+krolol@users.noreply.github.com> --- .dockerignore | 4 ++ .github/workflows/dev.yml | 80 +++++++++++++++++++++++++++++++----- .github/workflows/prod.yml | 79 ++++++++++++++++++++++++++++++++++++ .github/workflows/stage.yml | 81 +++++++++++++++++++++++++++++++++++++ Dockerfile | 44 ++++++++++++++++---- 5 files changed, 271 insertions(+), 17 deletions(-) create mode 100644 .github/workflows/prod.yml create mode 100644 .github/workflows/stage.yml diff --git a/.dockerignore b/.dockerignore index 9830e0db3..b73ef56af 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,3 +2,7 @@ **target* doc Dockerfile* + +!target/release/cere/ +!target/release/wbuild/cere-runtime/ +!target/release/wbuild/cere-dev-runtime/ diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index 440d32269..08aae3432 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -2,18 +2,78 @@ name: Release to dev on: push: branches: - - dev + - 'dev' workflow_dispatch: -permissions: - id-token: write - contents: read +env: + PROFILE: release jobs: build: - uses: Cerebellum-Network/reusable-workflows/.github/workflows/deploy-to-ecr.yaml@master - with: - environment: dev - aws_account_id: ${{ vars.DEV_NETWORK_AWS_ACCOUNT_ID }} - repository: pos-network-node - secrets: inherit + runs-on: ubuntu-latest + concurrency: dev + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@v3 + + - name: Cache cargo registry + uses: actions/cache@v3 + continue-on-error: false + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: arn:aws:iam::${{ vars.DEV_NETWORK_AWS_ACCOUNT_ID }}:role/github + role-session-name: ${{ github.event.repository.name }} + aws-region: us-west-2 + + - name: Get short SHA + run: | + echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> $GITHUB_ENV + echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> $GITHUB_ENV + echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> $GITHUB_ENV + echo "AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" >> $GITHUB_ENV + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Build and push docker image to ECR + uses: docker/build-push-action@v4 + with: + context: . + push: true + build-args: | + "AWS_ACCESS_KEY_ID=${{ env.AWS_ACCESS_KEY_ID }}" + "AWS_SECRET_ACCESS_KEY=${{ env.AWS_SECRET_ACCESS_KEY }}" + "AWS_SESSION_TOKEN=${{ env.AWS_SESSION_TOKEN }}" + "SCCACHE_REGION=us-west-2" + "SCCACHE_BUCKET=cere-blockchain-sccache" + + tags: | + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ github.sha }} + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest + +# - name: Upload cere-runtime wasm artifact +# uses: actions/upload-artifact@v3 +# with: +# name: cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm +# path: target/${{ vars.PROFILE }}/wbuild/cere-runtime/cere_runtime.compact.compressed.wasm +# +# - name: Upload cere-dev-runtime wasm artifact +# uses: actions/upload-artifact@v3 +# with: +# name: cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm +# path: target/${{ vars.PROFILE }}/wbuild/cere-dev-runtime/cere_dev_runtime.compact.compressed.wasm diff --git a/.github/workflows/prod.yml b/.github/workflows/prod.yml new file mode 100644 index 000000000..f502cfe06 --- /dev/null +++ b/.github/workflows/prod.yml @@ -0,0 +1,79 @@ +name: Release to production +on: + push: + branches: + - 'master' + workflow_dispatch: + +env: + PROFILE: release + +jobs: + build: + runs-on: ubuntu-latest + concurrency: prod + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@v3 + + - name: Cache cargo registry + uses: actions/cache@v3 + continue-on-error: false + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: arn:aws:iam::${{ vars.DEV_NETWORK_AWS_ACCOUNT_ID }}:role/github + role-session-name: ${{ github.event.repository.name }} + aws-region: us-west-2 + + - name: Get short SHA + run: | + echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> $GITHUB_ENV + echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> $GITHUB_ENV + echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> $GITHUB_ENV + echo "AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" >> $GITHUB_ENV + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Build and push docker image to ECR + uses: docker/build-push-action@v4 + with: + context: . + push: true + build-args: | + "AWS_ACCESS_KEY_ID=${{ env.AWS_ACCESS_KEY_ID }}" + "AWS_SECRET_ACCESS_KEY=${{ env.AWS_SECRET_ACCESS_KEY }}" + "AWS_SESSION_TOKEN=${{ env.AWS_SESSION_TOKEN }}" + "SCCACHE_REGION=us-west-2" + "SCCACHE_BUCKET=cere-blockchain-sccache" + + tags: | + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ github.sha }} + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:prod-latest + +# - name: Upload cere-runtime wasm artifact +# uses: actions/upload-artifact@v3 +# with: +# name: cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm +# path: target/${{ vars.PROFILE }}/wbuild/cere-runtime/cere_runtime.compact.compressed.wasm +# +# - name: Upload cere-dev-runtime wasm artifact +# uses: actions/upload-artifact@v3 +# with: +# name: cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm +# path: target/${{ vars.PROFILE }}/wbuild/cere-dev-runtime/cere_dev_runtime.compact.compressed.wasm diff --git a/.github/workflows/stage.yml b/.github/workflows/stage.yml new file mode 100644 index 000000000..7a5995ff9 --- /dev/null +++ b/.github/workflows/stage.yml @@ -0,0 +1,81 @@ +name: Release to stage +on: + push: + branches: + - 'feature/**' + - 'release/**' + - 'hotfix/**' + workflow_dispatch: + +env: + PROFILE: release + +jobs: + build: + runs-on: ubuntu-latest + concurrency: stage + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@v3 + + - name: Cache cargo registry + uses: actions/cache@v3 + continue-on-error: false + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: arn:aws:iam::${{ vars.DEV_NETWORK_AWS_ACCOUNT_ID }}:role/github + role-session-name: ${{ github.event.repository.name }} + aws-region: us-west-2 + + - name: Get short SHA + run: | + echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> $GITHUB_ENV + echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> $GITHUB_ENV + echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> $GITHUB_ENV + echo "AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" >> $GITHUB_ENV + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Build and push docker image to ECR + uses: docker/build-push-action@v4 + with: + context: . + push: true + build-args: | + "AWS_ACCESS_KEY_ID=${{ env.AWS_ACCESS_KEY_ID }}" + "AWS_SECRET_ACCESS_KEY=${{ env.AWS_SECRET_ACCESS_KEY }}" + "AWS_SESSION_TOKEN=${{ env.AWS_SESSION_TOKEN }}" + "SCCACHE_REGION=us-west-2" + "SCCACHE_BUCKET=cere-blockchain-sccache" + + tags: | + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ github.sha }} + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:stage-latest + +# - name: Upload cere-runtime wasm artifact +# uses: actions/upload-artifact@v3 +# with: +# name: cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm +# path: target/${{ vars.PROFILE }}/wbuild/cere-runtime/cere_runtime.compact.compressed.wasm +# +# - name: Upload cere-dev-runtime wasm artifact +# uses: actions/upload-artifact@v3 +# with: +# name: cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm +# path: target/${{ vars.PROFILE }}/wbuild/cere-dev-runtime/cere_dev_runtime.compact.compressed.wasm diff --git a/Dockerfile b/Dockerfile index 55ede5447..e977f7457 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,53 @@ -FROM phusion/baseimage:0.11 as builder +FROM phusion/baseimage:jammy-1.0.1 as builder LABEL maintainer="team@cere.network" LABEL description="This is the build stage to create the binary." ARG PROFILE=release WORKDIR /cerenetwork COPY . /cerenetwork -RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y cmake pkg-config libssl-dev git clang unzip +RUN apt-get -qq update && \ + apt-get -qq install -y \ + clang \ + cmake \ + git \ + libpq-dev \ + libssl-dev \ + pkg-config \ + unzip \ + wget + +# Configure sccache +ENV SCCACHE_VERSION=0.5.4 +RUN wget -q https://github.com/mozilla/sccache/releases/download/v${SCCACHE_VERSION}/sccache-v${SCCACHE_VERSION}-x86_64-unknown-linux-musl.tar.gz \ + -O - | tar -xz \ + && mv sccache-v${SCCACHE_VERSION}-x86_64-unknown-linux-musl/sccache /usr/local/bin/sccache \ + && chmod +x /usr/local/bin/sccache \ + && rm -rf sccache-v${SCCACHE_VERSION}-x86_64-unknown-linux-musl +ENV RUSTC_WRAPPER=/usr/local/bin/sccache # Installation script is taken from https://grpc.io/docs/protoc-installation/ ENV PROTOC_VERSION=3.15.8 RUN PB_REL="https://github.com/protocolbuffers/protobuf/releases" && \ - curl -LO $PB_REL/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-x86_64.zip && \ + curl -sLO $PB_REL/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-x86_64.zip && \ mkdir -p /usr/local/protoc && \ unzip protoc-${PROTOC_VERSION}-linux-x86_64.zip -d /usr/local/protoc && \ chmod +x /usr/local/protoc/bin/protoc && \ ln -s /usr/local/protoc/bin/protoc /usr/local/bin +ARG AWS_ACCESS_KEY_ID +ARG AWS_SECRET_ACCESS_KEY +ARG AWS_SESSION_TOKEN +ARG SCCACHE_REGION=us-west-2 +ARG SCCACHE_BUCKET=cere-blockchain-sccache +ENV \ + AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ + AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ + AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \ + AWS_REGION=$SCCACHE_REGION \ + SCCACHE_REGION=$SCCACHE_REGION \ + SCCACHE_BUCKET=$SCCACHE_BUCKET \ + SCCACHE_S3_USE_SSL=true + RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ export PATH=$PATH:$HOME/.cargo/bin && \ scripts/init.sh && \ @@ -29,8 +59,8 @@ LABEL maintainer="team@cere.network" LABEL description="This is the optimization to create a small image." ARG PROFILE=release COPY --from=builder /cerenetwork/target/$PROFILE/cere /usr/local/bin -COPY --from=builder /cerenetwork/target/release/wbuild/cere-runtime /home/cere/cere-runtime-artifacts -COPY --from=builder /cerenetwork/target/release/wbuild/cere-dev-runtime /home/cere/cere-dev-runtime-artifacts +COPY --from=builder /cerenetwork/target/$PROFILE/wbuild/cere-runtime /home/cere/cere-runtime-artifacts +COPY --from=builder /cerenetwork/target/$PROFILE/wbuild/cere-dev-runtime /home/cere/cere-dev-runtime-artifacts RUN mv /usr/share/ca* /tmp && \ rm -rf /usr/share/* && \ From e3e38502aed51be76de9bcdaa6e72f2342643ec8 Mon Sep 17 00:00:00 2001 From: Alexander Dobrodey <8377544+ADobrodey@users.noreply.github.com> Date: Wed, 19 Jul 2023 21:04:44 +0200 Subject: [PATCH 221/583] cleanup old ECR deployment --- .../workflows/build-and-push-docker-image.yml | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 .github/workflows/build-and-push-docker-image.yml diff --git a/.github/workflows/build-and-push-docker-image.yml b/.github/workflows/build-and-push-docker-image.yml deleted file mode 100644 index c904d266a..000000000 --- a/.github/workflows/build-and-push-docker-image.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Build and push image to ECR -on: - push: - branches: - - dev - - master - - 'feature/**' - - 'release/**' - - 'hotfix/**' -env: - ECR_REPOSITORY: pos-network-node -jobs: - build-and-push: - runs-on: [self-hosted, cere-network-xlarge-workers] - steps: - - name: Checkout repository - uses: actions/checkout@v1 - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.ORG_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.ORG_AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - - name: Build and push image - env: - ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} - run: | - image_id=$(docker build . -q -t $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA) - echo IMAGE_ID=$image_id >> $GITHUB_ENV - echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA" - docker image tag $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA $ECR_REGISTRY/$ECR_REPOSITORY:latest - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA - docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest - - name: Copy wasm artifacts from the image - run: | - container_id=$(docker create ${{ env.IMAGE_ID }}) - cere_runtime_artifact_name=cere_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm - echo CERE_RUNTIME_ARTIFACT_NAME=$cere_runtime_artifact_name >> $GITHUB_ENV - docker cp $container_id:/home/cere/cere-runtime-artifacts/cere_runtime.compact.compressed.wasm ./$cere_runtime_artifact_name - cere_dev_runtime_artifact_name=cere_dev_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm - echo CERE_DEV_RUNTIME_ARTIFACT_NAME=$cere_dev_runtime_artifact_name >> $GITHUB_ENV - docker cp $container_id:/home/cere/cere-dev-runtime-artifacts/cere_dev_runtime.compact.compressed.wasm ./$cere_dev_runtime_artifact_name - - name: Upload cere-runtime wasm artifact - uses: actions/upload-artifact@v3 - with: - name: ${{ env.CERE_RUNTIME_ARTIFACT_NAME }} - path: ./${{ env.CERE_RUNTIME_ARTIFACT_NAME }} - - name: Upload cere-dev-runtime wasm artifact - uses: actions/upload-artifact@v3 - with: - name: ${{ env.CERE_DEV_RUNTIME_ARTIFACT_NAME }} - path: ./${{ env.CERE_DEV_RUNTIME_ARTIFACT_NAME }} From 3c08fbbabe5f1a2447ff0546841e1771ffdee828 Mon Sep 17 00:00:00 2001 From: Alexander Dobrodey <8377544+ADobrodey@users.noreply.github.com> Date: Thu, 20 Jul 2023 13:48:36 +0200 Subject: [PATCH 222/583] Re-organize workflows --- .github/workflows/check.yml | 4 +-- .github/workflows/{prod.yml => ci.yml} | 45 ++++++++++++++++---------- .github/workflows/dev.yml | 2 +- .github/workflows/run-tests.yml | 37 --------------------- .github/workflows/stage.yml | 3 +- 5 files changed, 32 insertions(+), 59 deletions(-) rename .github/workflows/{prod.yml => ci.yml} (71%) delete mode 100644 .github/workflows/run-tests.yml diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 4c8a60cc6..1e6a57960 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -4,9 +4,9 @@ name: Check Set-Up & Build on: # Triggers the workflow on push or pull request events but only for the master branch push: - branches: [ main ] + branches: [ master ] pull_request: - branches: [ main ] + branches: [ master ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/.github/workflows/prod.yml b/.github/workflows/ci.yml similarity index 71% rename from .github/workflows/prod.yml rename to .github/workflows/ci.yml index f502cfe06..291568c36 100644 --- a/.github/workflows/prod.yml +++ b/.github/workflows/ci.yml @@ -1,9 +1,17 @@ -name: Release to production +name: CI + on: - push: + pull_request: branches: - - 'master' - workflow_dispatch: + - dev + - master + - 'feature/**' + - 'release/**' + - 'hotfix/**' + types: + - opened + - synchronize + - edited env: PROFILE: release @@ -11,7 +19,7 @@ env: jobs: build: runs-on: ubuntu-latest - concurrency: prod + concurrency: dev permissions: contents: read id-token: write @@ -50,6 +58,19 @@ jobs: id: login-ecr uses: aws-actions/amazon-ecr-login@v1 + - name: Build and push docker image to ECR + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile.tests + push: false + build-args: | + "AWS_ACCESS_KEY_ID=${{ env.AWS_ACCESS_KEY_ID }}" + "AWS_SECRET_ACCESS_KEY=${{ env.AWS_SECRET_ACCESS_KEY }}" + "AWS_SESSION_TOKEN=${{ env.AWS_SESSION_TOKEN }}" + "SCCACHE_REGION=us-west-2" + "SCCACHE_BUCKET=cere-blockchain-sccache" + - name: Build and push docker image to ECR uses: docker/build-push-action@v4 with: @@ -64,16 +85,6 @@ jobs: tags: | ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ github.sha }} - ${{ steps.login-ecr.outputs.registry }}/pos-network-node:prod-latest -# - name: Upload cere-runtime wasm artifact -# uses: actions/upload-artifact@v3 -# with: -# name: cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm -# path: target/${{ vars.PROFILE }}/wbuild/cere-runtime/cere_runtime.compact.compressed.wasm -# -# - name: Upload cere-dev-runtime wasm artifact -# uses: actions/upload-artifact@v3 -# with: -# name: cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm -# path: target/${{ vars.PROFILE }}/wbuild/cere-dev-runtime/cere_dev_runtime.compact.compressed.wasm + + # TODO: paveltabalko to add e2e-tests simulations diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index 08aae3432..2700be48b 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -64,7 +64,7 @@ jobs: tags: | ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ github.sha }} - ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-${{ github.sha }} # - name: Upload cere-runtime wasm artifact # uses: actions/upload-artifact@v3 diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml deleted file mode 100644 index 98c7a6f3c..000000000 --- a/.github/workflows/run-tests.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Run tests -on: - pull_request: - branches: - - dev - - master - - 'feature/**' - - 'release/**' - - 'hotfix/**' - types: - - opened - - synchronize - - edited - -jobs: - run-tests: - runs-on: [self-hosted, cere-network-xlarge-workers] - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Free space - run: df -h - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.ORG_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.ORG_AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - - name: Run tests - env: - ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} - run: docker build --build-arg ECR_REGISTRY=$ECR_REGISTRY -f Dockerfile.tests -t pos-network-node:test . - - name: Free space - run: df -h diff --git a/.github/workflows/stage.yml b/.github/workflows/stage.yml index 7a5995ff9..ef13e7d12 100644 --- a/.github/workflows/stage.yml +++ b/.github/workflows/stage.yml @@ -2,9 +2,9 @@ name: Release to stage on: push: branches: - - 'feature/**' - 'release/**' - 'hotfix/**' + - 'master' workflow_dispatch: env: @@ -66,7 +66,6 @@ jobs: tags: | ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ github.sha }} - ${{ steps.login-ecr.outputs.registry }}/pos-network-node:stage-latest # - name: Upload cere-runtime wasm artifact # uses: actions/upload-artifact@v3 From 9be61f037b0d04f9fe732150e5e11f45d42d7fd6 Mon Sep 17 00:00:00 2001 From: shamilkhan Date: Thu, 20 Jul 2023 16:03:13 +0400 Subject: [PATCH 223/583] Fix CHANGELOG --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd6fdb9fc..9f850e88b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -# Legend -[C] Changes is `Cere` Runtime
-[D] Changes is `Cere Dev` Runtime +## Legend +- [C] Changes is `Cere` Runtime +- [D] Changes is `Cere Dev` Runtime ## [vNext + 1] From fdd971f053c804b19e219971d12a8fab32b64a32 Mon Sep 17 00:00:00 2001 From: Alexander Dobrodey <8377544+ADobrodey@users.noreply.github.com> Date: Thu, 20 Jul 2023 16:29:17 +0200 Subject: [PATCH 224/583] Deploy to dev --- .github/workflows/dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index 2700be48b..c76149855 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -65,6 +65,7 @@ jobs: tags: | ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ github.sha }} ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-${{ github.sha }} + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest # - name: Upload cere-runtime wasm artifact # uses: actions/upload-artifact@v3 From 72b0367ca05b6243593eaedded3a3642ba4c6586 Mon Sep 17 00:00:00 2001 From: Pavel Date: Thu, 20 Jul 2023 19:00:55 +0300 Subject: [PATCH 225/583] - add ci for triggering tests (#63) * - adjust file name yml to yaml * - add steps to trigger e2e tests --- .github/workflows/{check.yml => check.yaml} | 0 .github/workflows/ci.yaml | 58 ++++++++++++ .github/workflows/ci.yml | 90 ------------------- .github/workflows/{dev.yml => dev.yaml} | 49 +++++++--- ...=> publish-docker-image-to-dockerhub.yaml} | 0 .github/workflows/{stage.yml => stage.yaml} | 2 +- 6 files changed, 95 insertions(+), 104 deletions(-) rename .github/workflows/{check.yml => check.yaml} (100%) create mode 100644 .github/workflows/ci.yaml delete mode 100644 .github/workflows/ci.yml rename .github/workflows/{dev.yml => dev.yaml} (58%) rename .github/workflows/{publish-docker-image-to-dockerhub.yml => publish-docker-image-to-dockerhub.yaml} (100%) rename .github/workflows/{stage.yml => stage.yaml} (98%) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yaml similarity index 100% rename from .github/workflows/check.yml rename to .github/workflows/check.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 000000000..969c0f124 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,58 @@ +name: CI + +on: + pull_request: + branches: + - dev + - master + - 'feature/**' + - 'release/**' + - 'hotfix/**' + types: + - opened + - synchronize + - edited + +env: + PROFILE: release + +jobs: + build: + runs-on: ubuntu-latest + concurrency: dev + steps: + - uses: actions/checkout@v3 + + - name: Cache cargo registry + uses: actions/cache@v3 + continue-on-error: false + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Configure AWS credentials ORG + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.ORG_AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.ORG_AWS_SECRET_ACCESS_KEY }} + aws-region: us-west-2 + + - name: Login to Amazon ECR ORG + id: login-ecr-org + uses: aws-actions/amazon-ecr-login@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Build and push docker image to ECR Docker + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile.tests + push: false + build-args: | + "ECR_REGISTRY=${{ steps.login-ecr-org.outputs.registry }}" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 291568c36..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,90 +0,0 @@ -name: CI - -on: - pull_request: - branches: - - dev - - master - - 'feature/**' - - 'release/**' - - 'hotfix/**' - types: - - opened - - synchronize - - edited - -env: - PROFILE: release - -jobs: - build: - runs-on: ubuntu-latest - concurrency: dev - permissions: - contents: read - id-token: write - steps: - - uses: actions/checkout@v3 - - - name: Cache cargo registry - uses: actions/cache@v3 - continue-on-error: false - with: - path: | - ~/.cargo/registry - ~/.cargo/git - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - restore-keys: | - ${{ runner.os }}-cargo- - - - name: configure aws credentials - uses: aws-actions/configure-aws-credentials@v2 - with: - role-to-assume: arn:aws:iam::${{ vars.DEV_NETWORK_AWS_ACCOUNT_ID }}:role/github - role-session-name: ${{ github.event.repository.name }} - aws-region: us-west-2 - - - name: Get short SHA - run: | - echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> $GITHUB_ENV - echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> $GITHUB_ENV - echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> $GITHUB_ENV - echo "AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" >> $GITHUB_ENV - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - - - name: Build and push docker image to ECR - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile.tests - push: false - build-args: | - "AWS_ACCESS_KEY_ID=${{ env.AWS_ACCESS_KEY_ID }}" - "AWS_SECRET_ACCESS_KEY=${{ env.AWS_SECRET_ACCESS_KEY }}" - "AWS_SESSION_TOKEN=${{ env.AWS_SESSION_TOKEN }}" - "SCCACHE_REGION=us-west-2" - "SCCACHE_BUCKET=cere-blockchain-sccache" - - - name: Build and push docker image to ECR - uses: docker/build-push-action@v4 - with: - context: . - push: true - build-args: | - "AWS_ACCESS_KEY_ID=${{ env.AWS_ACCESS_KEY_ID }}" - "AWS_SECRET_ACCESS_KEY=${{ env.AWS_SECRET_ACCESS_KEY }}" - "AWS_SESSION_TOKEN=${{ env.AWS_SESSION_TOKEN }}" - "SCCACHE_REGION=us-west-2" - "SCCACHE_BUCKET=cere-blockchain-sccache" - - tags: | - ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ github.sha }} - - - # TODO: paveltabalko to add e2e-tests simulations diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yaml similarity index 58% rename from .github/workflows/dev.yml rename to .github/workflows/dev.yaml index c76149855..311ccb13c 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yaml @@ -63,18 +63,41 @@ jobs: "SCCACHE_BUCKET=cere-blockchain-sccache" tags: | - ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ github.sha }} - ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-${{ github.sha }} + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest -# - name: Upload cere-runtime wasm artifact -# uses: actions/upload-artifact@v3 -# with: -# name: cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm -# path: target/${{ vars.PROFILE }}/wbuild/cere-runtime/cere_runtime.compact.compressed.wasm -# -# - name: Upload cere-dev-runtime wasm artifact -# uses: actions/upload-artifact@v3 -# with: -# name: cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm -# path: target/${{ vars.PROFILE }}/wbuild/cere-dev-runtime/cere_dev_runtime.compact.compressed.wasm + # - name: Upload cere-runtime wasm artifact + # uses: actions/upload-artifact@v3 + # with: + # name: cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm + # path: target/${{ vars.PROFILE }}/wbuild/cere-runtime/cere_runtime.compact.compressed.wasm + # + # - name: Upload cere-dev-runtime wasm artifact + # uses: actions/upload-artifact@v3 + # with: + # name: cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm + # path: target/${{ vars.PROFILE }}/wbuild/cere-dev-runtime/cere_dev_runtime.compact.compressed.wasm + + trigger-e2e-tests: + runs-on: ubuntu-latest + needs: build + steps: + - name: 'Trigger e2e DDC tests' + uses: convictional/trigger-workflow-and-wait@v1.6.5 + with: + owner: Cerebellum-Network + repo: ddc-api-e2e-simulations + github_token: ${{ secrets.GH_E2E_TOKEN }} + comment_github_token: ${{ secrets.GH_E2E_TOKEN }} + github_user: devops-cere + workflow_file_name: run-basic-ddc-tests.yml + client_payload: |- + { + "POS_NODE_VERSION": "${{ env.GITHUB_SHA }}" + } + ref: master + wait_interval: 30 + propagate_failure: true + trigger_workflow: true + wait_workflow: true + comment_downstream_url: ${{ github.event.pull_request.comments_url }} diff --git a/.github/workflows/publish-docker-image-to-dockerhub.yml b/.github/workflows/publish-docker-image-to-dockerhub.yaml similarity index 100% rename from .github/workflows/publish-docker-image-to-dockerhub.yml rename to .github/workflows/publish-docker-image-to-dockerhub.yaml diff --git a/.github/workflows/stage.yml b/.github/workflows/stage.yaml similarity index 98% rename from .github/workflows/stage.yml rename to .github/workflows/stage.yaml index ef13e7d12..ca7338fcd 100644 --- a/.github/workflows/stage.yml +++ b/.github/workflows/stage.yaml @@ -65,7 +65,7 @@ jobs: "SCCACHE_BUCKET=cere-blockchain-sccache" tags: | - ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ github.sha }} + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} # - name: Upload cere-runtime wasm artifact # uses: actions/upload-artifact@v3 From 48858b91457c4bbc6de64bf0d7f804d5c4829896 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 20 Jul 2023 18:34:36 +0200 Subject: [PATCH 226/583] update github workflows --- .../workflows/build-and-push-docker-image.yml | 55 ------------------- .github/workflows/check.yml | 11 +++- .github/workflows/run-tests.yml | 37 ------------- Dockerfile | 54 +++++++++++++++--- Dockerfile.tests | 12 +++- 5 files changed, 66 insertions(+), 103 deletions(-) delete mode 100644 .github/workflows/build-and-push-docker-image.yml delete mode 100644 .github/workflows/run-tests.yml diff --git a/.github/workflows/build-and-push-docker-image.yml b/.github/workflows/build-and-push-docker-image.yml deleted file mode 100644 index c904d266a..000000000 --- a/.github/workflows/build-and-push-docker-image.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Build and push image to ECR -on: - push: - branches: - - dev - - master - - 'feature/**' - - 'release/**' - - 'hotfix/**' -env: - ECR_REPOSITORY: pos-network-node -jobs: - build-and-push: - runs-on: [self-hosted, cere-network-xlarge-workers] - steps: - - name: Checkout repository - uses: actions/checkout@v1 - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.ORG_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.ORG_AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - - name: Build and push image - env: - ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} - run: | - image_id=$(docker build . -q -t $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA) - echo IMAGE_ID=$image_id >> $GITHUB_ENV - echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA" - docker image tag $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA $ECR_REGISTRY/$ECR_REPOSITORY:latest - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA - docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest - - name: Copy wasm artifacts from the image - run: | - container_id=$(docker create ${{ env.IMAGE_ID }}) - cere_runtime_artifact_name=cere_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm - echo CERE_RUNTIME_ARTIFACT_NAME=$cere_runtime_artifact_name >> $GITHUB_ENV - docker cp $container_id:/home/cere/cere-runtime-artifacts/cere_runtime.compact.compressed.wasm ./$cere_runtime_artifact_name - cere_dev_runtime_artifact_name=cere_dev_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm - echo CERE_DEV_RUNTIME_ARTIFACT_NAME=$cere_dev_runtime_artifact_name >> $GITHUB_ENV - docker cp $container_id:/home/cere/cere-dev-runtime-artifacts/cere_dev_runtime.compact.compressed.wasm ./$cere_dev_runtime_artifact_name - - name: Upload cere-runtime wasm artifact - uses: actions/upload-artifact@v3 - with: - name: ${{ env.CERE_RUNTIME_ARTIFACT_NAME }} - path: ./${{ env.CERE_RUNTIME_ARTIFACT_NAME }} - - name: Upload cere-dev-runtime wasm artifact - uses: actions/upload-artifact@v3 - with: - name: ${{ env.CERE_DEV_RUNTIME_ARTIFACT_NAME }} - path: ./${{ env.CERE_DEV_RUNTIME_ARTIFACT_NAME }} diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index d441cd3f0..103b2152c 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -4,9 +4,9 @@ name: Check Set-Up & Build on: # Triggers the workflow on push or pull request events but only for the master branch push: - branches: [ main ] + branches: [ master ] pull_request: - branches: [ main ] + branches: [ master ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -32,6 +32,11 @@ jobs: rustup default stable rustup update nightly rustup update stable + rustup component add rustfmt --toolchain nightly + + - name: Check Format + run: | + cargo +nightly fmt -- --check - name: Check Build run: | @@ -40,4 +45,4 @@ jobs: - name: Check Build for Benchmarking run: > pushd node && - cargo check --features=runtime-benchmarks --release + cargo check --features=runtime-benchmarks --release \ No newline at end of file diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml deleted file mode 100644 index 98c7a6f3c..000000000 --- a/.github/workflows/run-tests.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Run tests -on: - pull_request: - branches: - - dev - - master - - 'feature/**' - - 'release/**' - - 'hotfix/**' - types: - - opened - - synchronize - - edited - -jobs: - run-tests: - runs-on: [self-hosted, cere-network-xlarge-workers] - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Free space - run: df -h - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.ORG_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.ORG_AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - - name: Run tests - env: - ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} - run: docker build --build-arg ECR_REGISTRY=$ECR_REGISTRY -f Dockerfile.tests -t pos-network-node:test . - - name: Free space - run: df -h diff --git a/Dockerfile b/Dockerfile index 5168b649c..ef43ae342 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,53 @@ -FROM phusion/baseimage:0.11 as builder +FROM phusion/baseimage:jammy-1.0.1 as builder LABEL maintainer="team@cere.network" LABEL description="This is the build stage to create the binary." ARG PROFILE=release WORKDIR /cerenetwork COPY . /cerenetwork -RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y cmake pkg-config libssl-dev git clang +RUN apt-get -qq update && \ + apt-get -qq install -y \ + clang \ + cmake \ + git \ + libpq-dev \ + libssl-dev \ + pkg-config \ + unzip \ + wget + +# Configure sccache +ENV SCCACHE_VERSION=0.5.4 +RUN wget -q https://github.com/mozilla/sccache/releases/download/v${SCCACHE_VERSION}/sccache-v${SCCACHE_VERSION}-x86_64-unknown-linux-musl.tar.gz \ + -O - | tar -xz \ + && mv sccache-v${SCCACHE_VERSION}-x86_64-unknown-linux-musl/sccache /usr/local/bin/sccache \ + && chmod +x /usr/local/bin/sccache \ + && rm -rf sccache-v${SCCACHE_VERSION}-x86_64-unknown-linux-musl +ENV RUSTC_WRAPPER=/usr/local/bin/sccache + +# Installation script is taken from https://grpc.io/docs/protoc-installation/ +ENV PROTOC_VERSION=3.15.8 +RUN PB_REL="https://github.com/protocolbuffers/protobuf/releases" && \ + curl -sLO $PB_REL/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-x86_64.zip && \ + mkdir -p /usr/local/protoc && \ + unzip protoc-${PROTOC_VERSION}-linux-x86_64.zip -d /usr/local/protoc && \ + chmod +x /usr/local/protoc/bin/protoc && \ + ln -s /usr/local/protoc/bin/protoc /usr/local/bin + +ARG AWS_ACCESS_KEY_ID +ARG AWS_SECRET_ACCESS_KEY +ARG AWS_SESSION_TOKEN +ARG SCCACHE_REGION=us-west-2 +ARG SCCACHE_BUCKET=cere-blockchain-sccache +ENV \ + AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ + AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ + AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \ + AWS_REGION=$SCCACHE_REGION \ + SCCACHE_REGION=$SCCACHE_REGION \ + SCCACHE_BUCKET=$SCCACHE_BUCKET \ + SCCACHE_S3_USE_SSL=true + RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ export PATH=$PATH:$HOME/.cargo/bin && \ scripts/init.sh && \ @@ -19,8 +59,8 @@ LABEL maintainer="team@cere.network" LABEL description="This is the optimization to create a small image." ARG PROFILE=release COPY --from=builder /cerenetwork/target/$PROFILE/cere /usr/local/bin -COPY --from=builder /cerenetwork/target/release/wbuild/cere-runtime /home/cere/cere-runtime-artifacts -COPY --from=builder /cerenetwork/target/release/wbuild/cere-dev-runtime /home/cere/cere-dev-runtime-artifacts +COPY --from=builder /cerenetwork/target/$PROFILE/wbuild/cere-runtime /home/cere/cere-runtime-artifacts +COPY --from=builder /cerenetwork/target/$PROFILE/wbuild/cere-dev-runtime /home/cere/cere-dev-runtime-artifacts RUN mv /usr/share/ca* /tmp && \ rm -rf /usr/share/* && \ @@ -37,4 +77,4 @@ USER cerenetwork EXPOSE 30333 9933 9944 9615 VOLUME ["/data"] -CMD ["/usr/local/bin/cere"] +CMD ["/usr/local/bin/cere"] \ No newline at end of file diff --git a/Dockerfile.tests b/Dockerfile.tests index 56bba2fed..23c25292b 100644 --- a/Dockerfile.tests +++ b/Dockerfile.tests @@ -17,7 +17,17 @@ COPY --from=ddc-smart-contract /ddc-smart-contract/artifacts/metadata.json /cere RUN apt-get update && \ apt-get upgrade -y && \ - apt-get install -y cmake pkg-config libssl-dev git clang + apt-get install -y cmake pkg-config libssl-dev git clang unzip + +# Installation script is taken from https://grpc.io/docs/protoc-installation/ +ENV PROTOC_VERSION=3.15.8 +RUN PB_REL="https://github.com/protocolbuffers/protobuf/releases" && \ + curl -LO $PB_REL/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-x86_64.zip && \ + mkdir -p /usr/local/protoc && \ + unzip protoc-${PROTOC_VERSION}-linux-x86_64.zip -d /usr/local/protoc && \ + chmod +x /usr/local/protoc/bin/protoc && \ + ln -s /usr/local/protoc/bin/protoc /usr/local/bin + RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ export PATH=$PATH:$HOME/.cargo/bin && \ scripts/init.sh && \ From 836ef496968c5260af982b60610ae9598ac67080 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 20 Jul 2023 18:35:04 +0200 Subject: [PATCH 227/583] new workflows --- .github/workflows/ci.yml | 58 ++++++++++++++++++++ .github/workflows/dev.yml | 103 ++++++++++++++++++++++++++++++++++++ .github/workflows/stage.yml | 80 ++++++++++++++++++++++++++++ 3 files changed, 241 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/dev.yml create mode 100644 .github/workflows/stage.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..dc23ea450 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,58 @@ +name: CI + +on: + pull_request: + branches: + - dev + - master + - 'feature/**' + - 'release/**' + - 'hotfix/**' + types: + - opened + - synchronize + - edited + +env: + PROFILE: release + +jobs: + build: + runs-on: ubuntu-latest + concurrency: dev + steps: + - uses: actions/checkout@v3 + + - name: Cache cargo registry + uses: actions/cache@v3 + continue-on-error: false + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Configure AWS credentials ORG + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.ORG_AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.ORG_AWS_SECRET_ACCESS_KEY }} + aws-region: us-west-2 + + - name: Login to Amazon ECR ORG + id: login-ecr-org + uses: aws-actions/amazon-ecr-login@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Build and push docker image to ECR Docker + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile.tests + push: false + build-args: | + "ECR_REGISTRY=${{ steps.login-ecr-org.outputs.registry }}" \ No newline at end of file diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml new file mode 100644 index 000000000..c9ad21887 --- /dev/null +++ b/.github/workflows/dev.yml @@ -0,0 +1,103 @@ +name: Release to dev +on: + push: + branches: + - 'dev' + workflow_dispatch: + +env: + PROFILE: release + +jobs: + build: + runs-on: ubuntu-latest + concurrency: dev + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@v3 + + - name: Cache cargo registry + uses: actions/cache@v3 + continue-on-error: false + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: arn:aws:iam::${{ vars.DEV_NETWORK_AWS_ACCOUNT_ID }}:role/github + role-session-name: ${{ github.event.repository.name }} + aws-region: us-west-2 + + - name: Get short SHA + run: | + echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> $GITHUB_ENV + echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> $GITHUB_ENV + echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> $GITHUB_ENV + echo "AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" >> $GITHUB_ENV + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Build and push docker image to ECR + uses: docker/build-push-action@v4 + with: + context: . + push: true + build-args: | + "AWS_ACCESS_KEY_ID=${{ env.AWS_ACCESS_KEY_ID }}" + "AWS_SECRET_ACCESS_KEY=${{ env.AWS_SECRET_ACCESS_KEY }}" + "AWS_SESSION_TOKEN=${{ env.AWS_SESSION_TOKEN }}" + "SCCACHE_REGION=us-west-2" + "SCCACHE_BUCKET=cere-blockchain-sccache" + + tags: | + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest + + # - name: Upload cere-runtime wasm artifact + # uses: actions/upload-artifact@v3 + # with: + # name: cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm + # path: target/${{ vars.PROFILE }}/wbuild/cere-runtime/cere_runtime.compact.compressed.wasm + # + # - name: Upload cere-dev-runtime wasm artifact + # uses: actions/upload-artifact@v3 + # with: + # name: cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm + # path: target/${{ vars.PROFILE }}/wbuild/cere-dev-runtime/cere_dev_runtime.compact.compressed.wasm + + trigger-e2e-tests: + runs-on: ubuntu-latest + needs: build + steps: + - name: 'Trigger e2e DDC tests' + uses: convictional/trigger-workflow-and-wait@v1.6.5 + with: + owner: Cerebellum-Network + repo: ddc-api-e2e-simulations + github_token: ${{ secrets.GH_E2E_TOKEN }} + comment_github_token: ${{ secrets.GH_E2E_TOKEN }} + github_user: devops-cere + workflow_file_name: run-basic-ddc-tests.yml + client_payload: |- + { + "POS_NODE_VERSION": "${{ env.GITHUB_SHA }}" + } + ref: master + wait_interval: 30 + propagate_failure: true + trigger_workflow: true + wait_workflow: true + comment_downstream_url: ${{ github.event.pull_request.comments_url }} \ No newline at end of file diff --git a/.github/workflows/stage.yml b/.github/workflows/stage.yml new file mode 100644 index 000000000..ca7338fcd --- /dev/null +++ b/.github/workflows/stage.yml @@ -0,0 +1,80 @@ +name: Release to stage +on: + push: + branches: + - 'release/**' + - 'hotfix/**' + - 'master' + workflow_dispatch: + +env: + PROFILE: release + +jobs: + build: + runs-on: ubuntu-latest + concurrency: stage + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@v3 + + - name: Cache cargo registry + uses: actions/cache@v3 + continue-on-error: false + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: arn:aws:iam::${{ vars.DEV_NETWORK_AWS_ACCOUNT_ID }}:role/github + role-session-name: ${{ github.event.repository.name }} + aws-region: us-west-2 + + - name: Get short SHA + run: | + echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> $GITHUB_ENV + echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> $GITHUB_ENV + echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> $GITHUB_ENV + echo "AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" >> $GITHUB_ENV + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Build and push docker image to ECR + uses: docker/build-push-action@v4 + with: + context: . + push: true + build-args: | + "AWS_ACCESS_KEY_ID=${{ env.AWS_ACCESS_KEY_ID }}" + "AWS_SECRET_ACCESS_KEY=${{ env.AWS_SECRET_ACCESS_KEY }}" + "AWS_SESSION_TOKEN=${{ env.AWS_SESSION_TOKEN }}" + "SCCACHE_REGION=us-west-2" + "SCCACHE_BUCKET=cere-blockchain-sccache" + + tags: | + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} + +# - name: Upload cere-runtime wasm artifact +# uses: actions/upload-artifact@v3 +# with: +# name: cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm +# path: target/${{ vars.PROFILE }}/wbuild/cere-runtime/cere_runtime.compact.compressed.wasm +# +# - name: Upload cere-dev-runtime wasm artifact +# uses: actions/upload-artifact@v3 +# with: +# name: cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm +# path: target/${{ vars.PROFILE }}/wbuild/cere-dev-runtime/cere_dev_runtime.compact.compressed.wasm From e31ca7ac36d0679781a4b348bd894ad3087b18e1 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Wed, 12 Jul 2023 02:07:52 +0200 Subject: [PATCH 228/583] test(ddc-validator): mock dac requests for tests are prepared --- pallets/ddc-staking/src/mock.rs | 2 + pallets/ddc-validator/src/lib.rs | 5 +- pallets/ddc-validator/src/mock.rs | 83 +++++++++++++++- .../mock_data/aggregation:nodes:era:edge.json | 1 + ...:6e86ac08-4af9-4353-9fec-0f3e563661d6.json | 1 + ...:7af575b7-9a83-40b6-88a7-19549b9bbc38.json | 1 + ...:80a62530-fd76-40b5-bc53-dd82365e89ce.json | 1 + ...:84640a53-fc1f-4ac5-921c-6695056840bc.json | 1 + ...:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7.json | 1 + .../src/mock_data/fcall:save:validation.json | 1 + .../src/mock_data/shared:nodes:era.json | 1 + pallets/ddc-validator/src/tests.rs | 98 ++++++++++++++++++- 12 files changed, 192 insertions(+), 4 deletions(-) create mode 100644 pallets/ddc-validator/src/mock_data/aggregation:nodes:era:edge.json create mode 100644 pallets/ddc-validator/src/mock_data/data:file:6e86ac08-4af9-4353-9fec-0f3e563661d6.json create mode 100644 pallets/ddc-validator/src/mock_data/data:file:7af575b7-9a83-40b6-88a7-19549b9bbc38.json create mode 100644 pallets/ddc-validator/src/mock_data/data:file:80a62530-fd76-40b5-bc53-dd82365e89ce.json create mode 100644 pallets/ddc-validator/src/mock_data/data:file:84640a53-fc1f-4ac5-921c-6695056840bc.json create mode 100644 pallets/ddc-validator/src/mock_data/data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7.json create mode 100644 pallets/ddc-validator/src/mock_data/fcall:save:validation.json create mode 100644 pallets/ddc-validator/src/mock_data/shared:nodes:era.json diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index dea8eb524..c82675b73 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -95,6 +95,7 @@ parameter_types! { pub const DefaultEdgeChillDelay: EraIndex = 1; pub const DefaultStorageBondSize: Balance = 100; pub const DefaultStorageChillDelay: EraIndex = 1; + pub const DdcAccountsPalletId: PalletId = PalletId(*b"accounts"); } impl crate::pallet::Config for Test { @@ -107,6 +108,7 @@ impl crate::pallet::Config for Test { type RuntimeEvent = RuntimeEvent; type UnixTime = Timestamp; type WeightInfo = (); + type StakersPayoutSource = DdcAccountsPalletId; } pub(crate) type DdcStakingCall = crate::Call; diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index bf2097933..4e992c9a2 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -261,7 +261,6 @@ pub mod pallet { let era = Self::get_current_era(); log::info!("current era: {:?}", era); - // Produce an assignment for the next era if it's not produced yet. match Self::last_managed_era() { Some(last_managed_era) if era < last_managed_era => (), @@ -495,6 +494,10 @@ pub mod pallet { } fn is_valid(bytes_sent: u64, bytes_received: u64) -> bool { + if bytes_sent == bytes_received { + return true; + } + let percentage_difference = 1f32 - (bytes_received as f32 / bytes_sent as f32); return if percentage_difference > 0.0 && diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index 58f2cc4bf..83cef7e8b 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -10,6 +10,7 @@ use frame_system::{offchain::SendTransactionTypes, EnsureRoot}; use pallet_contracts as contracts; use pallet_session::ShouldEndSession; use sp_core::H256; +use sp_io::TestExternalities; use sp_runtime::{ curve, curve::PiecewiseLinear, @@ -317,7 +318,87 @@ impl pallet_balances::Config for Test { // Build genesis storage according to the mock runtime. pub fn new_test_ext() -> sp_io::TestExternalities { - frame_system::GenesisConfig::default().build_storage::().unwrap().into() + let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); + + let _ = pallet_balances::GenesisConfig:: { + balances: vec![ + // edge controllers + (AccountId::from([0x2; 32]), 1000), + // storage controllers + (AccountId::from([0x4; 32]), 1000), + // edge stashes + (AccountId::from([0x1; 32]), 1000), + // storage stashes + (AccountId::from([0x3; 32]), 1000), + + // validators + // (AccountId::from([0x5; 32]), 10000), + (AccountId::from([0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, 0xdf, 0x67]), 10000), + (AccountId::from([0x55; 32]), 10000), + + + (AccountId::from([0x6; 32]), 10000), + (AccountId::from([0x66; 32]), 10000), + + (AccountId::from([0x7; 32]), 10000), + (AccountId::from([0x77; 32]), 10000), + ], + } + .assimilate_storage(&mut storage); + + + let stakers = vec![ + ( + // AccountId::from([0x5; 32]), + AccountId::from([0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, 0xdf, 0x67]), + AccountId::from([0x55; 32]), + 1000, + pallet_staking::StakerStatus::Validator + ), + + ( + AccountId::from([0x6; 32]), + AccountId::from([0x66; 32]), + 1000, + pallet_staking::StakerStatus::Validator + ), + + ( + AccountId::from([0x7; 32]), + AccountId::from([0x77; 32]), + 1000, + pallet_staking::StakerStatus::Validator + ) + ]; + + + let _ = pallet_staking::GenesisConfig:: { stakers, ..Default::default() } + .assimilate_storage(&mut storage); + + + let edges = vec![ + ( + AccountId::from([0x1; 32]), + AccountId::from([0x2; 32]), + 100, + 1 + ) + ]; + + let storages = vec![ + ( + AccountId::from([0x3; 32]), + AccountId::from([0x4; 32]), + 100, + 1, + ) + ]; + + let _ = pallet_ddc_staking::GenesisConfig:: { edges, storages, ..Default::default() } + .assimilate_storage(&mut storage); + + TestExternalities::new(storage) + } pub type Extrinsic = TestXt; diff --git a/pallets/ddc-validator/src/mock_data/aggregation:nodes:era:edge.json b/pallets/ddc-validator/src/mock_data/aggregation:nodes:era:edge.json new file mode 100644 index 000000000..7e497108f --- /dev/null +++ b/pallets/ddc-validator/src/mock_data/aggregation:nodes:era:edge.json @@ -0,0 +1 @@ +{"JSON.GET":"[{\"totalBytesSent\":4800,\"totalQueries\":0,\"totalReads\":30,\"totalReadsAcked\":30,\"totalQueriesAcked\":0,\"averageResponseTimeMs\":1.8852459016393444,\"totalBytesReceived\":4800,\"requestIds\":[\"84640a53-fc1f-4ac5-921c-6695056840bc\",\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7\",\"80a62530-fd76-40b5-bc53-dd82365e89ce\",\"6e86ac08-4af9-4353-9fec-0f3e563661d6\",\"7af575b7-9a83-40b6-88a7-19549b9bbc38\"],\"totalWritesAcked\":30,\"averageResponseTimeMsSamples\":61,\"totalWrites\":30}]"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/data:file:6e86ac08-4af9-4353-9fec-0f3e563661d6.json b/pallets/ddc-validator/src/mock_data/data:file:6e86ac08-4af9-4353-9fec-0f3e563661d6.json new file mode 100644 index 000000000..ea2cc9127 --- /dev/null +++ b/pallets/ddc-validator/src/mock_data/data:file:6e86ac08-4af9-4353-9fec-0f3e563661d6.json @@ -0,0 +1 @@ +{"JSON.GET":"{\"fileRequestId\":\"6e86ac08-4af9-4353-9fec-0f3e563661d6\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"requestedChunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"]},\"bucketId\":5,\"timestamp\":1688473910055,\"chunks\":{\"6e86ac08-4af9-4353-9fec-0f3e563661d6:bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\":{\"log\":{\"type\":2,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":132855,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49760\",\"bytesSent\":160,\"timestamp\":1688473910055,\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\",\"ack\":{\"userTimestamp\":1688473910058,\"nonce\":\"6VQF3U6m8lHhJVT/Wr+tpn7OrorcqpQg9hZS8vRoBoA=\",\"signature\":\"GilWqbctk1WvySNd5+EzWU/Df9B2RM2z9/3Jzfpian7PyH9ndvvxJDtKo1/cJdrj7r5gsSEqlwPxcKjj5RJNhg==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":160,\"requestedChunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/data:file:7af575b7-9a83-40b6-88a7-19549b9bbc38.json b/pallets/ddc-validator/src/mock_data/data:file:7af575b7-9a83-40b6-88a7-19549b9bbc38.json new file mode 100644 index 000000000..aa68e8423 --- /dev/null +++ b/pallets/ddc-validator/src/mock_data/data:file:7af575b7-9a83-40b6-88a7-19549b9bbc38.json @@ -0,0 +1 @@ +{"JSON.GET":"{\"fileRequestId\":\"7af575b7-9a83-40b6-88a7-19549b9bbc38\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"requestedChunkCids\":[\"bafk2bzacedfeu3vcqi2kr4pl4odjbzvpt5nr3md2m4cxrxkydnd23gbaoc4ro\"]},\"bucketId\":5,\"timestamp\":1688473910371,\"chunks\":{\"7af575b7-9a83-40b6-88a7-19549b9bbc38:bafk2bzacedfeu3vcqi2kr4pl4odjbzvpt5nr3md2m4cxrxkydnd23gbaoc4ro\":{\"log\":{\"type\":1,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":132855,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49770\",\"bytesSent\":160,\"timestamp\":1688473910371,\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzacedfeu3vcqi2kr4pl4odjbzvpt5nr3md2m4cxrxkydnd23gbaoc4ro\",\"ack\":{\"userTimestamp\":1688473910373,\"nonce\":\"TwKKd2NsDkjaV9yDPqqVPh1rcSlrkmdXSQXl+zojH8M=\",\"signature\":\"EvDRqBr8zoIzxykz6NrzrIsgjDlf/++RmH/9OdQqtBb0dO1y4o/snH4OoMlJMnXTDZX9R+umQPH90PH0WvVAig==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":160,\"requestedChunkCids\":[\"bafk2bzacedfeu3vcqi2kr4pl4odjbzvpt5nr3md2m4cxrxkydnd23gbaoc4ro\"],\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/data:file:80a62530-fd76-40b5-bc53-dd82365e89ce.json b/pallets/ddc-validator/src/mock_data/data:file:80a62530-fd76-40b5-bc53-dd82365e89ce.json new file mode 100644 index 000000000..09e491b32 --- /dev/null +++ b/pallets/ddc-validator/src/mock_data/data:file:80a62530-fd76-40b5-bc53-dd82365e89ce.json @@ -0,0 +1 @@ +{"JSON.GET":"{\"fileRequestId\":\"80a62530-fd76-40b5-bc53-dd82365e89ce\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"requestedChunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"]},\"bucketId\":5,\"timestamp\":1688473910041,\"chunks\":{\"80a62530-fd76-40b5-bc53-dd82365e89ce:bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\":{\"log\":{\"type\":1,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":132855,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49736\",\"bytesSent\":160,\"timestamp\":1688473910041,\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\",\"ack\":{\"userTimestamp\":1688473910043,\"nonce\":\"VU1XCPjQxA4y6TnrOAy44QabS7nmmxAU8vyduqoLt9U=\",\"signature\":\"Us7//t0+y00oHhthPSjqphHJYwE1qgPQtBSdy5hZxUInKdQXTBX58VLQekoKMHtptQQggR1gPf9Pyy1enmXziQ==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":160,\"requestedChunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/data:file:84640a53-fc1f-4ac5-921c-6695056840bc.json b/pallets/ddc-validator/src/mock_data/data:file:84640a53-fc1f-4ac5-921c-6695056840bc.json new file mode 100644 index 000000000..9fc7d5ef8 --- /dev/null +++ b/pallets/ddc-validator/src/mock_data/data:file:84640a53-fc1f-4ac5-921c-6695056840bc.json @@ -0,0 +1 @@ +{"JSON.GET":"{\"fileRequestId\":\"84640a53-fc1f-4ac5-921c-6695056840bc\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"],\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"]},\"bucketId\":5,\"timestamp\":1688473909701,\"chunks\":{\"84640a53-fc1f-4ac5-921c-6695056840bc:bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\":{\"log\":{\"type\":1,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":132855,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49690\",\"bytesSent\":160,\"timestamp\":1688473909701,\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\",\"ack\":{\"userTimestamp\":1688473909709,\"nonce\":\"Gt7AFrznCPzgI/5q+tynLy2BKUooSGAkUCaGsF6AOMs=\",\"signature\":\"Gll6xIftbtP4JPB6miy3DLKMBDrKz05QSIBNJ3RqYi0Fg1wNJRFoSIqhOJDXDUB4NlrLQdl+HWrYRL20Hsx6iA==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":160,\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"],\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7.json b/pallets/ddc-validator/src/mock_data/data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7.json new file mode 100644 index 000000000..4519ed651 --- /dev/null +++ b/pallets/ddc-validator/src/mock_data/data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7.json @@ -0,0 +1 @@ +{"JSON.GET":"{\"fileRequestId\":\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"],\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"]},\"bucketId\":5,\"timestamp\":1688473909723,\"chunks\":{\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7:bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\":{\"log\":{\"type\":2,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":132855,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49714\",\"bytesSent\":160,\"timestamp\":1688473909723,\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\",\"ack\":{\"userTimestamp\":1688473909726,\"nonce\":\"2mdA3QVq02ME77vnqGjBNQqTRhM5gHjVAWcroNd5IZA=\",\"signature\":\"6PIWJXyEyHfWZrX6HKFNj3fRm5LbBsBX54zmVZpo+nMqqTV26xaQbEsRTfuhm4k+XGxci3VSuofPWFEpRuOmhg==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":160,\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"],\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/fcall:save:validation.json b/pallets/ddc-validator/src/mock_data/fcall:save:validation.json new file mode 100644 index 000000000..5fa9734a3 --- /dev/null +++ b/pallets/ddc-validator/src/mock_data/fcall:save:validation.json @@ -0,0 +1 @@ +{"JSON.GET":null} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/shared:nodes:era.json b/pallets/ddc-validator/src/mock_data/shared:nodes:era.json new file mode 100644 index 000000000..b077de96f --- /dev/null +++ b/pallets/ddc-validator/src/mock_data/shared:nodes:era.json @@ -0,0 +1 @@ +{"JSON.GET":"{\"0101010101010101010101010101010101010101010101010101010101010101\":{\"d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67\":{\"result\": true, \"data\": \"%7B%22data%22%3A%22eyJlZGdlIjoiMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMSIsInJlc3VsdCI6dHJ1ZSwicGF5bG9hZCI6WzE5OCwxMTIsMzAsNywxNzksMTE2LDExNiwxODIsMjE2LDE4OCw3NSwxNDgsMTcsMTYwLDI1MSwxNTcsMTQzLDE3NiwxOTEsMTQyLDE4OCwxNTcsOTYsMjIsMTU0LDE2OCwxMTYsMTE1LDM3LDIyMiw0OSw2NV0sInRvdGFscyI6eyJyZWNlaXZlZCI6ODAwLCJzZW50Ijo4MDAsImZhaWxlZF9ieV9jbGllbnQiOjAsImZhaWx1cmVfcmF0ZSI6MH19%22%2C%22result%22%3Atrue%7D\" }}}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index 33c9b1071..b09b77d1f 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -1,7 +1,13 @@ use crate::mock::*; -use frame_support::assert_ok; -use sp_core::crypto::AccountId32; +use frame_support::{assert_ok, traits::{OffchainWorker, OnInitialize}}; use sp_runtime::DispatchResult; +use crate::mock::Timestamp; +use sp_core::{ + offchain::{testing, OffchainWorkerExt, OffchainDbExt}, + crypto::{KeyTypeId} +}; +use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; +use std::sync::Arc; #[test] fn save_validated_data_works() { @@ -9,3 +15,91 @@ fn save_validated_data_works() { assert_ok!(DispatchResult::Ok(())); }); } + +const PHRASE: &str = +"news slush supreme milk chapter athlete soap sausage put clutch what kitten"; +pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); + +#[test] +fn it_triggers_offchain_worker() { + + let mut t = new_test_ext(); + + let (offchain, offchain_state) = testing::TestOffchainExt::new(); + t.register_extension(OffchainDbExt::new(offchain.clone())); + t.register_extension(OffchainWorkerExt::new(offchain)); + let keystore = KeyStore::new(); + keystore + .sr25519_generate_new(KEY_TYPE, Some(PHRASE)) + .unwrap(); + t.register_extension(KeystoreExt(Arc::new(keystore))); + + { + let mut state = offchain_state.write(); + + let mut expect_request = |url: &str, response: &[u8]| { + state.expect_request(testing::PendingRequest { + method: "GET".into(), + uri: url.to_string(), + response: Some(response.to_vec()), + sent: true, + ..Default::default() + }); + }; + + expect_request( + "http://redis:6379/JSON.GET/ddc:dac:aggregation:nodes:132855/$.0101010101010101010101010101010101010101010101010101010101010101", + include_bytes!("./mock_data/aggregation:nodes:era:edge.json") + ); + + expect_request( + "http://redis:6379/JSON.GET/ddc:dac:data:file:84640a53-fc1f-4ac5-921c-6695056840bc", + include_bytes!("./mock_data/data:file:84640a53-fc1f-4ac5-921c-6695056840bc.json") + ); + + expect_request( + "http://redis:6379/JSON.GET/ddc:dac:data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7", + include_bytes!("./mock_data/data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7.json") + ); + + expect_request( + "http://redis:6379/JSON.GET/ddc:dac:data:file:80a62530-fd76-40b5-bc53-dd82365e89ce", + include_bytes!("./mock_data/data:file:80a62530-fd76-40b5-bc53-dd82365e89ce.json") + ); + + expect_request( + "http://redis:6379/JSON.GET/ddc:dac:data:file:6e86ac08-4af9-4353-9fec-0f3e563661d6", + include_bytes!("./mock_data/data:file:6e86ac08-4af9-4353-9fec-0f3e563661d6.json") + ); + + expect_request( + "http://redis:6379/JSON.GET/ddc:dac:data:file:7af575b7-9a83-40b6-88a7-19549b9bbc38", + include_bytes!("./mock_data/data:file:7af575b7-9a83-40b6-88a7-19549b9bbc38.json") + ); + + expect_request( + "http://redis:6379/FCALL/save_validation_result_by_node/1/d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67:0101010101010101010101010101010101010101010101010101010101010101:3/%7B%22data%22%3A%22eyJlZGdlIjoiMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMSIsInJlc3VsdCI6dHJ1ZSwicGF5bG9hZCI6WzE5OCwxMTIsMzAsNywxNzksMTE2LDExNiwxODIsMjE2LDE4OCw3NSwxNDgsMTcsMTYwLDI1MSwxNTcsMTQzLDE3NiwxOTEsMTQyLDE4OCwxNTcsOTYsMjIsMTU0LDE2OCwxMTYsMTE1LDM3LDIyMiw0OSw2NV0sInRvdGFscyI6eyJyZWNlaXZlZCI6ODAwLCJzZW50Ijo4MDAsImZhaWxlZF9ieV9jbGllbnQiOjAsImZhaWx1cmVfcmF0ZSI6MH19%22%2C%22result%22%3Atrue%7D", + include_bytes!("./mock_data/fcall:save:validation.json") + ); + + expect_request( + "http://redis:6379/JSON.GET/ddc:dac:shared:nodes:3", + include_bytes!("./mock_data/shared:nodes:era.json") + ); + + } + + t.execute_with(|| { + + System::set_block_number(1); // required for randomness + + Timestamp::set_timestamp(1_672_531_200_000 + 120_000 * 2); + DdcValidator::on_initialize(2); + + Timestamp::set_timestamp(1_672_531_200_000 + 120_000 * 4); + DdcValidator::offchain_worker(3); + + }) +} + + From 0865b821f60cace57820ee2f670b42216fea5b9e Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Wed, 12 Jul 2023 17:14:06 +0200 Subject: [PATCH 229/583] test(ddc-validator): mock request for shared decisions and tx pool extension --- .../src/mock_data/aggregation:nodes:era:edge.json | 2 +- pallets/ddc-validator/src/mock_data/shared:nodes:era.json | 2 +- pallets/ddc-validator/src/tests.rs | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-validator/src/mock_data/aggregation:nodes:era:edge.json b/pallets/ddc-validator/src/mock_data/aggregation:nodes:era:edge.json index 7e497108f..a9f63c83d 100644 --- a/pallets/ddc-validator/src/mock_data/aggregation:nodes:era:edge.json +++ b/pallets/ddc-validator/src/mock_data/aggregation:nodes:era:edge.json @@ -1 +1 @@ -{"JSON.GET":"[{\"totalBytesSent\":4800,\"totalQueries\":0,\"totalReads\":30,\"totalReadsAcked\":30,\"totalQueriesAcked\":0,\"averageResponseTimeMs\":1.8852459016393444,\"totalBytesReceived\":4800,\"requestIds\":[\"84640a53-fc1f-4ac5-921c-6695056840bc\",\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7\",\"80a62530-fd76-40b5-bc53-dd82365e89ce\",\"6e86ac08-4af9-4353-9fec-0f3e563661d6\",\"7af575b7-9a83-40b6-88a7-19549b9bbc38\"],\"totalWritesAcked\":30,\"averageResponseTimeMsSamples\":61,\"totalWrites\":30}]"} \ No newline at end of file +{"JSON.GET":"[{\"totalBytesSent\":800,\"totalQueries\":0,\"totalReads\":30,\"totalReadsAcked\":30,\"totalQueriesAcked\":0,\"averageResponseTimeMs\":1.8852459016393444,\"totalBytesReceived\":800,\"requestIds\":[\"84640a53-fc1f-4ac5-921c-6695056840bc\",\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7\",\"80a62530-fd76-40b5-bc53-dd82365e89ce\",\"6e86ac08-4af9-4353-9fec-0f3e563661d6\",\"7af575b7-9a83-40b6-88a7-19549b9bbc38\"],\"totalWritesAcked\":30,\"averageResponseTimeMsSamples\":61,\"totalWrites\":30}]"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/shared:nodes:era.json b/pallets/ddc-validator/src/mock_data/shared:nodes:era.json index b077de96f..287bcd5bf 100644 --- a/pallets/ddc-validator/src/mock_data/shared:nodes:era.json +++ b/pallets/ddc-validator/src/mock_data/shared:nodes:era.json @@ -1 +1 @@ -{"JSON.GET":"{\"0101010101010101010101010101010101010101010101010101010101010101\":{\"d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67\":{\"result\": true, \"data\": \"%7B%22data%22%3A%22eyJlZGdlIjoiMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMSIsInJlc3VsdCI6dHJ1ZSwicGF5bG9hZCI6WzE5OCwxMTIsMzAsNywxNzksMTE2LDExNiwxODIsMjE2LDE4OCw3NSwxNDgsMTcsMTYwLDI1MSwxNTcsMTQzLDE3NiwxOTEsMTQyLDE4OCwxNTcsOTYsMjIsMTU0LDE2OCwxMTYsMTE1LDM3LDIyMiw0OSw2NV0sInRvdGFscyI6eyJyZWNlaXZlZCI6ODAwLCJzZW50Ijo4MDAsImZhaWxlZF9ieV9jbGllbnQiOjAsImZhaWx1cmVfcmF0ZSI6MH19%22%2C%22result%22%3Atrue%7D\" }}}"} \ No newline at end of file +{"JSON.GET":"{\"0101010101010101010101010101010101010101010101010101010101010101\":{\"d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67\":{\"result\":true,\"data\":\"eyJlZGdlIjoiMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMSIsInJlc3VsdCI6dHJ1ZSwicGF5bG9hZCI6WzEwNCwyMzgsNzMsNzMsMjA0LDE3MiwyNTQsMTgxLDc3LDExNiwxMzYsMTg5LDI0Niw5MCwxNjQsMTU0LDE2NywzLDE1NSwyNTMsODAsMzMsMjUxLDE0LDc4LDIzNiwxNjcsMTM0LDE2MSw2NCwyMjIsMTgxXSwidG90YWxzIjp7InJlY2VpdmVkIjo4MDAsInNlbnQiOjgwMCwiZmFpbGVkX2J5X2NsaWVudCI6MCwiZmFpbHVyZV9yYXRlIjowfX0=\"}},\"1c4a1b081af8dd09096ebb6e7ad61dd549ac2931cdb2b1216589094ad71ca90b\":{\"d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67\":{\"result\":false,\"data\":\"eyJlZGdlIjoiMWM0YTFiMDgxYWY4ZGQwOTA5NmViYjZlN2FkNjFkZDU0OWFjMjkzMWNkYjJiMTIxNjU4OTA5NGFkNzFjYTkwYiIsInJlc3VsdCI6ZmFsc2UsInBheWxvYWQiOlsxMDQsMjM4LDczLDczLDIwNCwxNzIsMjU0LDE4MSw3NywxMTYsMTM2LDE4OSwyNDYsOTAsMTY0LDE1NCwxNjcsMywxNTUsMjUzLDgwLDMzLDI1MSwxNCw3OCwyMzYsMTY3LDEzNCwxNjEsNjQsMjIyLDE4MV0sInRvdGFscyI6eyJyZWNlaXZlZCI6OTAwLCJzZW50Ijo1NDQsImZhaWxlZF9ieV9jbGllbnQiOjAsImZhaWx1cmVfcmF0ZSI6MH19\"}}}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index b09b77d1f..48b7a3e76 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -3,7 +3,7 @@ use frame_support::{assert_ok, traits::{OffchainWorker, OnInitialize}}; use sp_runtime::DispatchResult; use crate::mock::Timestamp; use sp_core::{ - offchain::{testing, OffchainWorkerExt, OffchainDbExt}, + offchain::{testing, OffchainWorkerExt, OffchainDbExt, TransactionPoolExt}, crypto::{KeyTypeId} }; use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; @@ -28,12 +28,16 @@ fn it_triggers_offchain_worker() { let (offchain, offchain_state) = testing::TestOffchainExt::new(); t.register_extension(OffchainDbExt::new(offchain.clone())); t.register_extension(OffchainWorkerExt::new(offchain)); + let keystore = KeyStore::new(); keystore .sr25519_generate_new(KEY_TYPE, Some(PHRASE)) .unwrap(); t.register_extension(KeystoreExt(Arc::new(keystore))); + let (pool, pool_state) = testing::TestTransactionPoolExt::new(); + t.register_extension(TransactionPoolExt::new(pool)); + { let mut state = offchain_state.write(); From f384269046bd596b9aab1890c5f7e0fbb22538aa Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Wed, 12 Jul 2023 21:15:26 +0200 Subject: [PATCH 230/583] test(ddc-validator): mock transaction assertion in tests --- pallets/ddc-validator/src/tests.rs | 60 ++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index 48b7a3e76..605653b82 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -1,13 +1,16 @@ use crate::mock::*; +use crate::mock::Timestamp; +use crate::{ValidationDecision, DacTotalAggregates}; +use pallet_ddc_accounts::BucketsDetails; use frame_support::{assert_ok, traits::{OffchainWorker, OnInitialize}}; use sp_runtime::DispatchResult; -use crate::mock::Timestamp; use sp_core::{ offchain::{testing, OffchainWorkerExt, OffchainDbExt, TransactionPoolExt}, crypto::{KeyTypeId} }; use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; use std::sync::Arc; +use codec::Decode; #[test] fn save_validated_data_works() { @@ -90,8 +93,7 @@ fn it_triggers_offchain_worker() { "http://redis:6379/JSON.GET/ddc:dac:shared:nodes:3", include_bytes!("./mock_data/shared:nodes:era.json") ); - - } + } t.execute_with(|| { @@ -103,6 +105,58 @@ fn it_triggers_offchain_worker() { Timestamp::set_timestamp(1_672_531_200_000 + 120_000 * 4); DdcValidator::offchain_worker(3); + // Get the transaction from the worker. + let mut transactions = pool_state.read().transactions.clone(); + transactions.reverse(); + assert_eq!(transactions.len(), 3); + + let tx = transactions.pop().unwrap(); + let tx = Extrinsic::decode(&mut &*tx).unwrap(); + assert!(tx.signature.is_some()); + + let bucket_info = BucketsDetails { bucket_id: 5, amount: 160u128 }; + assert_eq!(tx.call, crate::mock::Call::DdcValidator( + crate::Call::charge_payments_content_owners { + paying_accounts: vec![ + bucket_info.clone(), + bucket_info.clone(), + bucket_info.clone(), + bucket_info.clone(), + bucket_info + ] + } + )); + + let tx = transactions.pop().unwrap(); + let tx = Extrinsic::decode(&mut &*tx).unwrap(); + assert!(tx.signature.is_some()); + assert_eq!(tx.call, crate::mock::Call::DdcValidator( + crate::Call::payout_cdn_owners { + era: 4 + } + )); + + let tx = transactions.pop().unwrap(); + let tx = Extrinsic::decode(&mut &*tx).unwrap(); + assert!(tx.signature.is_some()); + assert_eq!(tx.call, crate::mock::Call::DdcValidator( + crate::Call::set_validation_decision { + era: 4, + cdn_node: AccountId::from([0x1; 32]), + validation_decision: ValidationDecision { + edge: String::from("0101010101010101010101010101010101010101010101010101010101010101"), + result: true, + payload: [71, 216, 226, 58, 45, 227, 238, 47, 52, 96, 11, 175, 0, 1, 56, 247, 215, 155, 5, 94, 8, 2, 18, 213, 180, 35, 96, 124, 149, 71, 185, 25], + totals: DacTotalAggregates { + received: 800, + sent: 800, + failed_by_client: 0, + failure_rate: 0 + } + } + } + )); + }) } From 4b96e6161f4b848ae1899913dc4ac6b06ca24ad1 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Thu, 13 Jul 2023 02:08:53 +0200 Subject: [PATCH 231/583] test(ddc-validator): simple test scenario for setting validation decision is added --- pallets/ddc-validator/src/lib.rs | 5 +- .../set-1/aggregated-node-data-for-era.json | 1 + .../src/mock-data/set-1/file-request1.json | 1 + .../src/mock-data/set-1/file-request2.json | 1 + .../src/mock-data/set-1/file-request3.json | 1 + .../save-validation-decision-result.json} | 0 .../shared-validation-decisions-for-era.json | 1 + .../mock-data/set-1/validation-decision.json | 1 + pallets/ddc-validator/src/mock.rs | 80 +++++------ .../mock_data/aggregation:nodes:era:edge.json | 1 - ...:6e86ac08-4af9-4353-9fec-0f3e563661d6.json | 1 - ...:7af575b7-9a83-40b6-88a7-19549b9bbc38.json | 1 - ...:80a62530-fd76-40b5-bc53-dd82365e89ce.json | 1 - ...:84640a53-fc1f-4ac5-921c-6695056840bc.json | 1 - ...:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7.json | 1 - .../src/mock_data/shared:nodes:era.json | 1 - pallets/ddc-validator/src/tests.rs | 127 ++++++++++-------- 17 files changed, 110 insertions(+), 115 deletions(-) create mode 100644 pallets/ddc-validator/src/mock-data/set-1/aggregated-node-data-for-era.json create mode 100644 pallets/ddc-validator/src/mock-data/set-1/file-request1.json create mode 100644 pallets/ddc-validator/src/mock-data/set-1/file-request2.json create mode 100644 pallets/ddc-validator/src/mock-data/set-1/file-request3.json rename pallets/ddc-validator/src/{mock_data/fcall:save:validation.json => mock-data/set-1/save-validation-decision-result.json} (100%) create mode 100644 pallets/ddc-validator/src/mock-data/set-1/shared-validation-decisions-for-era.json create mode 100644 pallets/ddc-validator/src/mock-data/set-1/validation-decision.json delete mode 100644 pallets/ddc-validator/src/mock_data/aggregation:nodes:era:edge.json delete mode 100644 pallets/ddc-validator/src/mock_data/data:file:6e86ac08-4af9-4353-9fec-0f3e563661d6.json delete mode 100644 pallets/ddc-validator/src/mock_data/data:file:7af575b7-9a83-40b6-88a7-19549b9bbc38.json delete mode 100644 pallets/ddc-validator/src/mock_data/data:file:80a62530-fd76-40b5-bc53-dd82365e89ce.json delete mode 100644 pallets/ddc-validator/src/mock_data/data:file:84640a53-fc1f-4ac5-921c-6695056840bc.json delete mode 100644 pallets/ddc-validator/src/mock_data/data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7.json delete mode 100644 pallets/ddc-validator/src/mock_data/shared:nodes:era.json diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 4e992c9a2..9c2c7b4fb 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -664,9 +664,10 @@ pub mod pallet { // form url for each node let edge_url = format!( - "{}{}{}", + "{}{}{}/$.{}", mock_data_url, - "ddc:dac:aggregation:nodes:132855/$.", + "ddc:dac:aggregation:nodes:", + current_era - 1, utils::account_to_string::(assigned_edge.clone()) ); info!("edge url: {:?}", edge_url); diff --git a/pallets/ddc-validator/src/mock-data/set-1/aggregated-node-data-for-era.json b/pallets/ddc-validator/src/mock-data/set-1/aggregated-node-data-for-era.json new file mode 100644 index 000000000..37b3242fe --- /dev/null +++ b/pallets/ddc-validator/src/mock-data/set-1/aggregated-node-data-for-era.json @@ -0,0 +1 @@ +{"JSON.GET":"[{\"totalBytesSent\":600,\"totalQueries\":0,\"totalReads\":3,\"totalReadsAcked\":3,\"totalQueriesAcked\":0,\"averageResponseTimeMs\":1.8852459016393444,\"totalBytesReceived\":600,\"requestIds\":[\"84640a53-fc1f-4ac5-921c-6695056840bc\",\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7\",\"80a62530-fd76-40b5-bc53-dd82365e89ce\"],\"totalWritesAcked\":3,\"averageResponseTimeMsSamples\":61,\"totalWrites\":3}]"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock-data/set-1/file-request1.json b/pallets/ddc-validator/src/mock-data/set-1/file-request1.json new file mode 100644 index 000000000..5a29a982b --- /dev/null +++ b/pallets/ddc-validator/src/mock-data/set-1/file-request1.json @@ -0,0 +1 @@ +{"JSON.GET":"{\"fileRequestId\":\"84640a53-fc1f-4ac5-921c-6695056840bc\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"],\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"]},\"bucketId\":5,\"timestamp\":1688473909701,\"chunks\":{\"84640a53-fc1f-4ac5-921c-6695056840bc:bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\":{\"log\":{\"type\":1,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":3,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49690\",\"bytesSent\":100,\"timestamp\":1688473909701,\"nodePublicKey\":\"0101010101010101010101010101010101010101010101010101010101010101\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\",\"ack\":{\"userTimestamp\":1688473909709,\"nonce\":\"Gt7AFrznCPzgI/5q+tynLy2BKUooSGAkUCaGsF6AOMs=\",\"signature\":\"Gll6xIftbtP4JPB6miy3DLKMBDrKz05QSIBNJ3RqYi0Fg1wNJRFoSIqhOJDXDUB4NlrLQdl+HWrYRL20Hsx6iA==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":100,\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"],\"nodePublicKey\":\"0101010101010101010101010101010101010101010101010101010101010101\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock-data/set-1/file-request2.json b/pallets/ddc-validator/src/mock-data/set-1/file-request2.json new file mode 100644 index 000000000..b0e3fdc19 --- /dev/null +++ b/pallets/ddc-validator/src/mock-data/set-1/file-request2.json @@ -0,0 +1 @@ +{"JSON.GET":"{\"fileRequestId\":\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcd2\"],\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcd2\"]},\"bucketId\":5,\"timestamp\":1688473909723,\"chunks\":{\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7:bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcd2\":{\"log\":{\"type\":2,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":3,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49714\",\"bytesSent\":200,\"timestamp\":1688473909723,\"nodePublicKey\":\"0101010101010101010101010101010101010101010101010101010101010101\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcd2\",\"ack\":{\"userTimestamp\":1688473909726,\"nonce\":\"2mdA3QVq02ME77vnqGjBNQqTRhM5gHjVAWcroNd5IZA=\",\"signature\":\"6PIWJXyEyHfWZrX6HKFNj3fRm5LbBsBX54zmVZpo+nMqqTV26xaQbEsRTfuhm4k+XGxci3VSuofPWFEpRuOmhg==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":200,\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcd2\"],\"nodePublicKey\":\"0101010101010101010101010101010101010101010101010101010101010101\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock-data/set-1/file-request3.json b/pallets/ddc-validator/src/mock-data/set-1/file-request3.json new file mode 100644 index 000000000..047c057e6 --- /dev/null +++ b/pallets/ddc-validator/src/mock-data/set-1/file-request3.json @@ -0,0 +1 @@ +{"JSON.GET":"{\"fileRequestId\":\"80a62530-fd76-40b5-bc53-dd82365e89ce\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"requestedChunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"]},\"bucketId\":5,\"timestamp\":1688473910041,\"chunks\":{\"80a62530-fd76-40b5-bc53-dd82365e89ce:bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\":{\"log\":{\"type\":1,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":3,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49736\",\"bytesSent\":300,\"timestamp\":1688473910041,\"nodePublicKey\":\"0101010101010101010101010101010101010101010101010101010101010101\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\",\"ack\":{\"userTimestamp\":1688473910043,\"nonce\":\"VU1XCPjQxA4y6TnrOAy44QabS7nmmxAU8vyduqoLt9U=\",\"signature\":\"Us7//t0+y00oHhthPSjqphHJYwE1qgPQtBSdy5hZxUInKdQXTBX58VLQekoKMHtptQQggR1gPf9Pyy1enmXziQ==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":300,\"requestedChunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"nodePublicKey\":\"0101010101010101010101010101010101010101010101010101010101010101\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/fcall:save:validation.json b/pallets/ddc-validator/src/mock-data/set-1/save-validation-decision-result.json similarity index 100% rename from pallets/ddc-validator/src/mock_data/fcall:save:validation.json rename to pallets/ddc-validator/src/mock-data/set-1/save-validation-decision-result.json diff --git a/pallets/ddc-validator/src/mock-data/set-1/shared-validation-decisions-for-era.json b/pallets/ddc-validator/src/mock-data/set-1/shared-validation-decisions-for-era.json new file mode 100644 index 000000000..da4aa921a --- /dev/null +++ b/pallets/ddc-validator/src/mock-data/set-1/shared-validation-decisions-for-era.json @@ -0,0 +1 @@ +{"JSON.GET":"{\"0101010101010101010101010101010101010101010101010101010101010101\":{\"d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67\":{\"result\":true,\"data\":\"eyJlZGdlIjoiMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMSIsInJlc3VsdCI6dHJ1ZSwicGF5bG9hZCI6WzI0MiwgMjIxLCA1MSwgMzQsIDI5LCAyNDIsIDE1MCwgMTE5LCA2LCAxMzEsIDQxLCAxNSwgMTYxLCAxNzMsIDEyMSwgNDMsIDIyMSwgMjIsIDE1MCwgMTczLCAxODAsIDIyNCwgMTc5LCA1OCwgNzIsIDQsIDk2LCAxODgsIDE3LCAxNjQsIDE3NywgMTA5XSwidG90YWxzIjp7InJlY2VpdmVkIjo2MDAsInNlbnQiOjYwMCwiZmFpbGVkX2J5X2NsaWVudCI6MCwiZmFpbHVyZV9yYXRlIjowfX0=\"}},\"1c4a1b081af8dd09096ebb6e7ad61dd549ac2931cdb2b1216589094ad71ca90b\":{\"d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67\":{\"result\":false,\"data\":\"eyJlZGdlIjoiMWM0YTFiMDgxYWY4ZGQwOTA5NmViYjZlN2FkNjFkZDU0OWFjMjkzMWNkYjJiMTIxNjU4OTA5NGFkNzFjYTkwYiIsInJlc3VsdCI6ZmFsc2UsInBheWxvYWQiOlsxMDQsMjM4LDczLDczLDIwNCwxNzIsMjU0LDE4MSw3NywxMTYsMTM2LDE4OSwyNDYsOTAsMTY0LDE1NCwxNjcsMywxNTUsMjUzLDgwLDMzLDI1MSwxNCw3OCwyMzYsMTY3LDEzNCwxNjEsNjQsMjIyLDE4MV0sInRvdGFscyI6eyJyZWNlaXZlZCI6OTAwLCJzZW50Ijo1NDQsImZhaWxlZF9ieV9jbGllbnQiOjAsImZhaWx1cmVfcmF0ZSI6MH19\"}}}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json b/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json new file mode 100644 index 000000000..1fd502e51 --- /dev/null +++ b/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json @@ -0,0 +1 @@ +{"edge":"0101010101010101010101010101010101010101010101010101010101010101","result":true,"payload":[242, 221, 51, 34, 29, 242, 150, 119, 6, 131, 41, 15, 161, 173, 121, 43, 221, 22, 150, 173, 180, 224, 179, 58, 72, 4, 96, 188, 17, 164, 177, 109],"totals":{"received":600,"sent":600,"failed_by_client":0,"failure_rate":0}} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index 83cef7e8b..0180d8333 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -6,7 +6,7 @@ use frame_support::{ weights::Weight, PalletId, }; -use frame_system::{offchain::SendTransactionTypes, EnsureRoot}; +use frame_system::{offchain::SendTransactionTypes}; use pallet_contracts as contracts; use pallet_session::ShouldEndSession; use sp_core::H256; @@ -320,80 +320,64 @@ impl pallet_balances::Config for Test { pub fn new_test_ext() -> sp_io::TestExternalities { let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); - let _ = pallet_balances::GenesisConfig:: { - balances: vec![ - // edge controllers - (AccountId::from([0x2; 32]), 1000), - // storage controllers - (AccountId::from([0x4; 32]), 1000), - // edge stashes - (AccountId::from([0x1; 32]), 1000), - // storage stashes - (AccountId::from([0x3; 32]), 1000), - - // validators - // (AccountId::from([0x5; 32]), 10000), - (AccountId::from([0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, 0xdf, 0x67]), 10000), - (AccountId::from([0x55; 32]), 10000), - - - (AccountId::from([0x6; 32]), 10000), - (AccountId::from([0x66; 32]), 10000), - - (AccountId::from([0x7; 32]), 10000), - (AccountId::from([0x77; 32]), 10000), - ], - } - .assimilate_storage(&mut storage); - + let balances = vec![ + // edge stash + (AccountId::from([0x1; 32]), 1000), + // edge controller + (AccountId::from([0x11; 32]), 1000), + + // validator1 stash; has to be equal to the OCW key in the current implementation + (AccountId::from([0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, 0xdf, 0x67]), 10000), + // validator1 controller + (AccountId::from([0xaa; 32]), 10000), + + // validator2 stash + (AccountId::from([0xb; 32]), 10000), + // validator2 controller + (AccountId::from([0xbb; 32]), 10000), + + // validator3 stash + (AccountId::from([0xc; 32]), 10000), + // validator3 controller + (AccountId::from([0xcc; 32]), 10000), + ]; + let _ = pallet_balances::GenesisConfig:: { balances } + .assimilate_storage(&mut storage); - let stakers = vec![ + let stakers = vec![ ( - // AccountId::from([0x5; 32]), AccountId::from([0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, 0xdf, 0x67]), - AccountId::from([0x55; 32]), + AccountId::from([0xaa; 32]), 1000, pallet_staking::StakerStatus::Validator ), ( - AccountId::from([0x6; 32]), - AccountId::from([0x66; 32]), + AccountId::from([0xb; 32]), + AccountId::from([0xbb; 32]), 1000, pallet_staking::StakerStatus::Validator ), ( - AccountId::from([0x7; 32]), - AccountId::from([0x77; 32]), + AccountId::from([0xc; 32]), + AccountId::from([0xcc; 32]), 1000, pallet_staking::StakerStatus::Validator ) ]; - - let _ = pallet_staking::GenesisConfig:: { stakers, ..Default::default() } .assimilate_storage(&mut storage); - let edges = vec![ ( AccountId::from([0x1; 32]), - AccountId::from([0x2; 32]), + AccountId::from([0x11; 32]), 100, 1 ) ]; - - let storages = vec![ - ( - AccountId::from([0x3; 32]), - AccountId::from([0x4; 32]), - 100, - 1, - ) - ]; - + let storages = vec![]; let _ = pallet_ddc_staking::GenesisConfig:: { edges, storages, ..Default::default() } .assimilate_storage(&mut storage); diff --git a/pallets/ddc-validator/src/mock_data/aggregation:nodes:era:edge.json b/pallets/ddc-validator/src/mock_data/aggregation:nodes:era:edge.json deleted file mode 100644 index a9f63c83d..000000000 --- a/pallets/ddc-validator/src/mock_data/aggregation:nodes:era:edge.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":"[{\"totalBytesSent\":800,\"totalQueries\":0,\"totalReads\":30,\"totalReadsAcked\":30,\"totalQueriesAcked\":0,\"averageResponseTimeMs\":1.8852459016393444,\"totalBytesReceived\":800,\"requestIds\":[\"84640a53-fc1f-4ac5-921c-6695056840bc\",\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7\",\"80a62530-fd76-40b5-bc53-dd82365e89ce\",\"6e86ac08-4af9-4353-9fec-0f3e563661d6\",\"7af575b7-9a83-40b6-88a7-19549b9bbc38\"],\"totalWritesAcked\":30,\"averageResponseTimeMsSamples\":61,\"totalWrites\":30}]"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/data:file:6e86ac08-4af9-4353-9fec-0f3e563661d6.json b/pallets/ddc-validator/src/mock_data/data:file:6e86ac08-4af9-4353-9fec-0f3e563661d6.json deleted file mode 100644 index ea2cc9127..000000000 --- a/pallets/ddc-validator/src/mock_data/data:file:6e86ac08-4af9-4353-9fec-0f3e563661d6.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":"{\"fileRequestId\":\"6e86ac08-4af9-4353-9fec-0f3e563661d6\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"requestedChunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"]},\"bucketId\":5,\"timestamp\":1688473910055,\"chunks\":{\"6e86ac08-4af9-4353-9fec-0f3e563661d6:bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\":{\"log\":{\"type\":2,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":132855,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49760\",\"bytesSent\":160,\"timestamp\":1688473910055,\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\",\"ack\":{\"userTimestamp\":1688473910058,\"nonce\":\"6VQF3U6m8lHhJVT/Wr+tpn7OrorcqpQg9hZS8vRoBoA=\",\"signature\":\"GilWqbctk1WvySNd5+EzWU/Df9B2RM2z9/3Jzfpian7PyH9ndvvxJDtKo1/cJdrj7r5gsSEqlwPxcKjj5RJNhg==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":160,\"requestedChunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/data:file:7af575b7-9a83-40b6-88a7-19549b9bbc38.json b/pallets/ddc-validator/src/mock_data/data:file:7af575b7-9a83-40b6-88a7-19549b9bbc38.json deleted file mode 100644 index aa68e8423..000000000 --- a/pallets/ddc-validator/src/mock_data/data:file:7af575b7-9a83-40b6-88a7-19549b9bbc38.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":"{\"fileRequestId\":\"7af575b7-9a83-40b6-88a7-19549b9bbc38\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"requestedChunkCids\":[\"bafk2bzacedfeu3vcqi2kr4pl4odjbzvpt5nr3md2m4cxrxkydnd23gbaoc4ro\"]},\"bucketId\":5,\"timestamp\":1688473910371,\"chunks\":{\"7af575b7-9a83-40b6-88a7-19549b9bbc38:bafk2bzacedfeu3vcqi2kr4pl4odjbzvpt5nr3md2m4cxrxkydnd23gbaoc4ro\":{\"log\":{\"type\":1,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":132855,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49770\",\"bytesSent\":160,\"timestamp\":1688473910371,\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzacedfeu3vcqi2kr4pl4odjbzvpt5nr3md2m4cxrxkydnd23gbaoc4ro\",\"ack\":{\"userTimestamp\":1688473910373,\"nonce\":\"TwKKd2NsDkjaV9yDPqqVPh1rcSlrkmdXSQXl+zojH8M=\",\"signature\":\"EvDRqBr8zoIzxykz6NrzrIsgjDlf/++RmH/9OdQqtBb0dO1y4o/snH4OoMlJMnXTDZX9R+umQPH90PH0WvVAig==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":160,\"requestedChunkCids\":[\"bafk2bzacedfeu3vcqi2kr4pl4odjbzvpt5nr3md2m4cxrxkydnd23gbaoc4ro\"],\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/data:file:80a62530-fd76-40b5-bc53-dd82365e89ce.json b/pallets/ddc-validator/src/mock_data/data:file:80a62530-fd76-40b5-bc53-dd82365e89ce.json deleted file mode 100644 index 09e491b32..000000000 --- a/pallets/ddc-validator/src/mock_data/data:file:80a62530-fd76-40b5-bc53-dd82365e89ce.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":"{\"fileRequestId\":\"80a62530-fd76-40b5-bc53-dd82365e89ce\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"requestedChunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"]},\"bucketId\":5,\"timestamp\":1688473910041,\"chunks\":{\"80a62530-fd76-40b5-bc53-dd82365e89ce:bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\":{\"log\":{\"type\":1,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":132855,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49736\",\"bytesSent\":160,\"timestamp\":1688473910041,\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\",\"ack\":{\"userTimestamp\":1688473910043,\"nonce\":\"VU1XCPjQxA4y6TnrOAy44QabS7nmmxAU8vyduqoLt9U=\",\"signature\":\"Us7//t0+y00oHhthPSjqphHJYwE1qgPQtBSdy5hZxUInKdQXTBX58VLQekoKMHtptQQggR1gPf9Pyy1enmXziQ==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":160,\"requestedChunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/data:file:84640a53-fc1f-4ac5-921c-6695056840bc.json b/pallets/ddc-validator/src/mock_data/data:file:84640a53-fc1f-4ac5-921c-6695056840bc.json deleted file mode 100644 index 9fc7d5ef8..000000000 --- a/pallets/ddc-validator/src/mock_data/data:file:84640a53-fc1f-4ac5-921c-6695056840bc.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":"{\"fileRequestId\":\"84640a53-fc1f-4ac5-921c-6695056840bc\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"],\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"]},\"bucketId\":5,\"timestamp\":1688473909701,\"chunks\":{\"84640a53-fc1f-4ac5-921c-6695056840bc:bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\":{\"log\":{\"type\":1,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":132855,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49690\",\"bytesSent\":160,\"timestamp\":1688473909701,\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\",\"ack\":{\"userTimestamp\":1688473909709,\"nonce\":\"Gt7AFrznCPzgI/5q+tynLy2BKUooSGAkUCaGsF6AOMs=\",\"signature\":\"Gll6xIftbtP4JPB6miy3DLKMBDrKz05QSIBNJ3RqYi0Fg1wNJRFoSIqhOJDXDUB4NlrLQdl+HWrYRL20Hsx6iA==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":160,\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"],\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7.json b/pallets/ddc-validator/src/mock_data/data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7.json deleted file mode 100644 index 4519ed651..000000000 --- a/pallets/ddc-validator/src/mock_data/data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":"{\"fileRequestId\":\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"],\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"]},\"bucketId\":5,\"timestamp\":1688473909723,\"chunks\":{\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7:bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\":{\"log\":{\"type\":2,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":132855,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49714\",\"bytesSent\":160,\"timestamp\":1688473909723,\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\",\"ack\":{\"userTimestamp\":1688473909726,\"nonce\":\"2mdA3QVq02ME77vnqGjBNQqTRhM5gHjVAWcroNd5IZA=\",\"signature\":\"6PIWJXyEyHfWZrX6HKFNj3fRm5LbBsBX54zmVZpo+nMqqTV26xaQbEsRTfuhm4k+XGxci3VSuofPWFEpRuOmhg==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":160,\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"],\"nodePublicKey\":\"98d6387b0c5965493dcaff83aeb43c7303d87c6c750569d8dd2ef298baa12b13\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock_data/shared:nodes:era.json b/pallets/ddc-validator/src/mock_data/shared:nodes:era.json deleted file mode 100644 index 287bcd5bf..000000000 --- a/pallets/ddc-validator/src/mock_data/shared:nodes:era.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":"{\"0101010101010101010101010101010101010101010101010101010101010101\":{\"d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67\":{\"result\":true,\"data\":\"eyJlZGdlIjoiMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMSIsInJlc3VsdCI6dHJ1ZSwicGF5bG9hZCI6WzEwNCwyMzgsNzMsNzMsMjA0LDE3MiwyNTQsMTgxLDc3LDExNiwxMzYsMTg5LDI0Niw5MCwxNjQsMTU0LDE2NywzLDE1NSwyNTMsODAsMzMsMjUxLDE0LDc4LDIzNiwxNjcsMTM0LDE2MSw2NCwyMjIsMTgxXSwidG90YWxzIjp7InJlY2VpdmVkIjo4MDAsInNlbnQiOjgwMCwiZmFpbGVkX2J5X2NsaWVudCI6MCwiZmFpbHVyZV9yYXRlIjowfX0=\"}},\"1c4a1b081af8dd09096ebb6e7ad61dd549ac2931cdb2b1216589094ad71ca90b\":{\"d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67\":{\"result\":false,\"data\":\"eyJlZGdlIjoiMWM0YTFiMDgxYWY4ZGQwOTA5NmViYjZlN2FkNjFkZDU0OWFjMjkzMWNkYjJiMTIxNjU4OTA5NGFkNzFjYTkwYiIsInJlc3VsdCI6ZmFsc2UsInBheWxvYWQiOlsxMDQsMjM4LDczLDczLDIwNCwxNzIsMjU0LDE4MSw3NywxMTYsMTM2LDE4OSwyNDYsOTAsMTY0LDE1NCwxNjcsMywxNTUsMjUzLDgwLDMzLDI1MSwxNCw3OCwyMzYsMTY3LDEzNCwxNjEsNjQsMjIyLDE4MV0sInRvdGFscyI6eyJyZWNlaXZlZCI6OTAwLCJzZW50Ijo1NDQsImZhaWxlZF9ieV9jbGllbnQiOjAsImZhaWx1cmVfcmF0ZSI6MH19\"}}}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index 605653b82..e9f3c0e4d 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -1,30 +1,24 @@ use crate::mock::*; use crate::mock::Timestamp; -use crate::{ValidationDecision, DacTotalAggregates}; +use crate::shm; +use crate::utils; +use crate::{EraIndex, ValidationDecision, DacTotalAggregates, KEY_TYPE, DEFAULT_DATA_PROVIDER_URL, TIME_START_MS, ERA_DURATION_MS, ERA_IN_BLOCKS}; use pallet_ddc_accounts::BucketsDetails; use frame_support::{assert_ok, traits::{OffchainWorker, OnInitialize}}; -use sp_runtime::DispatchResult; use sp_core::{ offchain::{testing, OffchainWorkerExt, OffchainDbExt, TransactionPoolExt}, - crypto::{KeyTypeId} }; use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; use std::sync::Arc; use codec::Decode; -#[test] -fn save_validated_data_works() { - new_test_ext().execute_with(|| { - assert_ok!(DispatchResult::Ok(())); - }); -} -const PHRASE: &str = -"news slush supreme milk chapter athlete soap sausage put clutch what kitten"; -pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); +const OCW_PUB_KEY_STR: &str = "d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67"; +const OCW_SEED: &str = "news slush supreme milk chapter athlete soap sausage put clutch what kitten"; + #[test] -fn it_triggers_offchain_worker() { +fn it_sets_validation_decision_with_one_validator_in_quorum() { let mut t = new_test_ext(); @@ -33,14 +27,16 @@ fn it_triggers_offchain_worker() { t.register_extension(OffchainWorkerExt::new(offchain)); let keystore = KeyStore::new(); - keystore - .sr25519_generate_new(KEY_TYPE, Some(PHRASE)) - .unwrap(); + keystore.sr25519_generate_new(KEY_TYPE, Some(OCW_SEED)).unwrap(); t.register_extension(KeystoreExt(Arc::new(keystore))); let (pool, pool_state) = testing::TestTransactionPoolExt::new(); t.register_extension(TransactionPoolExt::new(pool)); + let era_to_validate: EraIndex = 3; + let cdn_node_to_validate = AccountId::from([0x1; 32]); + let cdn_node_to_validate_str = utils::account_to_string::(cdn_node_to_validate.clone()); + { let mut state = offchain_state.write(); @@ -55,57 +51,66 @@ fn it_triggers_offchain_worker() { }; expect_request( - "http://redis:6379/JSON.GET/ddc:dac:aggregation:nodes:132855/$.0101010101010101010101010101010101010101010101010101010101010101", - include_bytes!("./mock_data/aggregation:nodes:era:edge.json") + &format!("{}/JSON.GET/ddc:dac:aggregation:nodes:{}/$.{}", DEFAULT_DATA_PROVIDER_URL, era_to_validate, cdn_node_to_validate_str), + include_bytes!("./mock-data/set-1/aggregated-node-data-for-era.json") ); expect_request( - "http://redis:6379/JSON.GET/ddc:dac:data:file:84640a53-fc1f-4ac5-921c-6695056840bc", - include_bytes!("./mock_data/data:file:84640a53-fc1f-4ac5-921c-6695056840bc.json") + &format!("{}/JSON.GET/ddc:dac:data:file:84640a53-fc1f-4ac5-921c-6695056840bc", DEFAULT_DATA_PROVIDER_URL), + include_bytes!("./mock-data/set-1/file-request1.json") ); expect_request( - "http://redis:6379/JSON.GET/ddc:dac:data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7", - include_bytes!("./mock_data/data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7.json") + &format!("{}/JSON.GET/ddc:dac:data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7", DEFAULT_DATA_PROVIDER_URL), + include_bytes!("./mock-data/set-1/file-request2.json") ); expect_request( - "http://redis:6379/JSON.GET/ddc:dac:data:file:80a62530-fd76-40b5-bc53-dd82365e89ce", - include_bytes!("./mock_data/data:file:80a62530-fd76-40b5-bc53-dd82365e89ce.json") + &format!("{}/JSON.GET/ddc:dac:data:file:80a62530-fd76-40b5-bc53-dd82365e89ce", DEFAULT_DATA_PROVIDER_URL), + include_bytes!("./mock-data/set-1/file-request3.json") ); - expect_request( - "http://redis:6379/JSON.GET/ddc:dac:data:file:6e86ac08-4af9-4353-9fec-0f3e563661d6", - include_bytes!("./mock_data/data:file:6e86ac08-4af9-4353-9fec-0f3e563661d6.json") - ); + let decision: ValidationDecision = serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")).unwrap(); + let serialized_decision = serde_json::to_string(&decision).unwrap(); + let encoded_decision_vec = shm::base64_encode(&serialized_decision.as_bytes().to_vec()).unwrap(); + let encoded_decision_str = encoded_decision_vec.iter().cloned().collect::(); + let result_json = serde_json::json!({ + "result": decision.result, + "data": encoded_decision_str, + }); + let result_json_str = serde_json::to_string(&result_json).unwrap(); + let unescaped_result_json = utils::unescape(&result_json_str); + let url_encoded_result_json = utils::url_encode(&unescaped_result_json); expect_request( - "http://redis:6379/JSON.GET/ddc:dac:data:file:7af575b7-9a83-40b6-88a7-19549b9bbc38", - include_bytes!("./mock_data/data:file:7af575b7-9a83-40b6-88a7-19549b9bbc38.json") + &format!("{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{}", + DEFAULT_DATA_PROVIDER_URL, + OCW_PUB_KEY_STR, + cdn_node_to_validate_str, + era_to_validate, + url_encoded_result_json, + ), + include_bytes!("./mock-data/set-1/save-validation-decision-result.json") ); expect_request( - "http://redis:6379/FCALL/save_validation_result_by_node/1/d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67:0101010101010101010101010101010101010101010101010101010101010101:3/%7B%22data%22%3A%22eyJlZGdlIjoiMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMSIsInJlc3VsdCI6dHJ1ZSwicGF5bG9hZCI6WzE5OCwxMTIsMzAsNywxNzksMTE2LDExNiwxODIsMjE2LDE4OCw3NSwxNDgsMTcsMTYwLDI1MSwxNTcsMTQzLDE3NiwxOTEsMTQyLDE4OCwxNTcsOTYsMjIsMTU0LDE2OCwxMTYsMTE1LDM3LDIyMiw0OSw2NV0sInRvdGFscyI6eyJyZWNlaXZlZCI6ODAwLCJzZW50Ijo4MDAsImZhaWxlZF9ieV9jbGllbnQiOjAsImZhaWx1cmVfcmF0ZSI6MH19%22%2C%22result%22%3Atrue%7D", - include_bytes!("./mock_data/fcall:save:validation.json") + &format!("{}/JSON.GET/ddc:dac:shared:nodes:{}", DEFAULT_DATA_PROVIDER_URL, era_to_validate), + include_bytes!("./mock-data/set-1/shared-validation-decisions-for-era.json") ); - expect_request( - "http://redis:6379/JSON.GET/ddc:dac:shared:nodes:3", - include_bytes!("./mock_data/shared:nodes:era.json") - ); } t.execute_with(|| { - System::set_block_number(1); // required for randomness + let era_block_number = ERA_IN_BLOCKS as u32 * era_to_validate; + System::set_block_number(era_block_number); // required for randomness - Timestamp::set_timestamp(1_672_531_200_000 + 120_000 * 2); - DdcValidator::on_initialize(2); + Timestamp::set_timestamp((TIME_START_MS + ERA_DURATION_MS * (era_to_validate as u128 - 1)) as u64); + DdcValidator::on_initialize(era_block_number - 1); // make assignments - Timestamp::set_timestamp(1_672_531_200_000 + 120_000 * 4); - DdcValidator::offchain_worker(3); + Timestamp::set_timestamp((TIME_START_MS + ERA_DURATION_MS * (era_to_validate as u128 + 1)) as u64); + DdcValidator::offchain_worker(era_block_number + 1); // execute assignments - // Get the transaction from the worker. let mut transactions = pool_state.read().transactions.clone(); transactions.reverse(); assert_eq!(transactions.len(), 3); @@ -114,15 +119,16 @@ fn it_triggers_offchain_worker() { let tx = Extrinsic::decode(&mut &*tx).unwrap(); assert!(tx.signature.is_some()); - let bucket_info = BucketsDetails { bucket_id: 5, amount: 160u128 }; + let bucket_info1 = BucketsDetails { bucket_id: 5, amount: 100u128 }; + let bucket_info2 = BucketsDetails { bucket_id: 5, amount: 200u128 }; + let bucket_info3 = BucketsDetails { bucket_id: 5, amount: 300u128 }; + assert_eq!(tx.call, crate::mock::Call::DdcValidator( crate::Call::charge_payments_content_owners { paying_accounts: vec![ - bucket_info.clone(), - bucket_info.clone(), - bucket_info.clone(), - bucket_info.clone(), - bucket_info + bucket_info3, + bucket_info1, + bucket_info2, ] } )); @@ -132,31 +138,36 @@ fn it_triggers_offchain_worker() { assert!(tx.signature.is_some()); assert_eq!(tx.call, crate::mock::Call::DdcValidator( crate::Call::payout_cdn_owners { - era: 4 + era: era_to_validate + 1 } )); let tx = transactions.pop().unwrap(); let tx = Extrinsic::decode(&mut &*tx).unwrap(); assert!(tx.signature.is_some()); + + let common_decision: ValidationDecision = serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")).unwrap(); + let common_decisions = vec![common_decision.clone()]; + let serialized_decisions = serde_json::to_string(&common_decisions).unwrap(); + assert_eq!(tx.call, crate::mock::Call::DdcValidator( crate::Call::set_validation_decision { - era: 4, - cdn_node: AccountId::from([0x1; 32]), + era: era_to_validate + 1, + cdn_node: cdn_node_to_validate, validation_decision: ValidationDecision { - edge: String::from("0101010101010101010101010101010101010101010101010101010101010101"), + edge: cdn_node_to_validate_str, result: true, - payload: [71, 216, 226, 58, 45, 227, 238, 47, 52, 96, 11, 175, 0, 1, 56, 247, 215, 155, 5, 94, 8, 2, 18, 213, 180, 35, 96, 124, 149, 71, 185, 25], + payload: utils::hash(&serialized_decisions), totals: DacTotalAggregates { - received: 800, - sent: 800, - failed_by_client: 0, - failure_rate: 0 + received: common_decision.totals.received, + sent: common_decision.totals.sent, + failed_by_client: common_decision.totals.failed_by_client, + failure_rate: common_decision.totals.failure_rate, } } } )); - + }) } From 5393abea31eb767f125a861c6b44a00239496987 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 21 Jul 2023 17:34:17 +0600 Subject: [PATCH 232/583] Autoformat `pallet-ddc-validator` code --- pallets/ddc-validator/src/lib.rs | 2 +- pallets/ddc-validator/src/mock.rs | 43 +++++---- pallets/ddc-validator/src/tests.rs | 138 ++++++++++++++++------------- 3 files changed, 99 insertions(+), 84 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 9c2c7b4fb..ceeecd7e2 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -495,7 +495,7 @@ pub mod pallet { fn is_valid(bytes_sent: u64, bytes_received: u64) -> bool { if bytes_sent == bytes_received { - return true; + return true } let percentage_difference = 1f32 - (bytes_received as f32 / bytes_sent as f32); diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index 0180d8333..20125eb69 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -6,7 +6,7 @@ use frame_support::{ weights::Weight, PalletId, }; -use frame_system::{offchain::SendTransactionTypes}; +use frame_system::offchain::SendTransactionTypes; use pallet_contracts as contracts; use pallet_session::ShouldEndSession; use sp_core::H256; @@ -325,64 +325,61 @@ pub fn new_test_ext() -> sp_io::TestExternalities { (AccountId::from([0x1; 32]), 1000), // edge controller (AccountId::from([0x11; 32]), 1000), - // validator1 stash; has to be equal to the OCW key in the current implementation - (AccountId::from([0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, 0xdf, 0x67]), 10000), + ( + AccountId::from([ + 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, + 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, + 0x55, 0xf4, 0xdf, 0x67, + ]), + 10000, + ), // validator1 controller (AccountId::from([0xaa; 32]), 10000), - // validator2 stash (AccountId::from([0xb; 32]), 10000), // validator2 controller (AccountId::from([0xbb; 32]), 10000), - // validator3 stash (AccountId::from([0xc; 32]), 10000), // validator3 controller (AccountId::from([0xcc; 32]), 10000), ]; - let _ = pallet_balances::GenesisConfig:: { balances } - .assimilate_storage(&mut storage); + let _ = pallet_balances::GenesisConfig:: { balances }.assimilate_storage(&mut storage); let stakers = vec![ ( - AccountId::from([0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, 0xdf, 0x67]), + AccountId::from([ + 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, + 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, + 0x55, 0xf4, 0xdf, 0x67, + ]), AccountId::from([0xaa; 32]), 1000, - pallet_staking::StakerStatus::Validator + pallet_staking::StakerStatus::Validator, ), - ( AccountId::from([0xb; 32]), AccountId::from([0xbb; 32]), 1000, - pallet_staking::StakerStatus::Validator + pallet_staking::StakerStatus::Validator, ), - ( AccountId::from([0xc; 32]), AccountId::from([0xcc; 32]), 1000, - pallet_staking::StakerStatus::Validator - ) + pallet_staking::StakerStatus::Validator, + ), ]; let _ = pallet_staking::GenesisConfig:: { stakers, ..Default::default() } .assimilate_storage(&mut storage); - let edges = vec![ - ( - AccountId::from([0x1; 32]), - AccountId::from([0x11; 32]), - 100, - 1 - ) - ]; + let edges = vec![(AccountId::from([0x1; 32]), AccountId::from([0x11; 32]), 100, 1)]; let storages = vec![]; let _ = pallet_ddc_staking::GenesisConfig:: { edges, storages, ..Default::default() } .assimilate_storage(&mut storage); TestExternalities::new(storage) - } pub type Extrinsic = TestXt; diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index e9f3c0e4d..a05f79997 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -1,37 +1,36 @@ -use crate::mock::*; -use crate::mock::Timestamp; -use crate::shm; -use crate::utils; -use crate::{EraIndex, ValidationDecision, DacTotalAggregates, KEY_TYPE, DEFAULT_DATA_PROVIDER_URL, TIME_START_MS, ERA_DURATION_MS, ERA_IN_BLOCKS}; -use pallet_ddc_accounts::BucketsDetails; -use frame_support::{assert_ok, traits::{OffchainWorker, OnInitialize}}; -use sp_core::{ - offchain::{testing, OffchainWorkerExt, OffchainDbExt, TransactionPoolExt}, +use crate::{ + mock::{Timestamp, *}, + shm, utils, DacTotalAggregates, EraIndex, ValidationDecision, DEFAULT_DATA_PROVIDER_URL, + ERA_DURATION_MS, ERA_IN_BLOCKS, KEY_TYPE, TIME_START_MS, +}; +use codec::Decode; +use frame_support::{ + assert_ok, + traits::{OffchainWorker, OnInitialize}, }; +use pallet_ddc_accounts::BucketsDetails; +use sp_core::offchain::{testing, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt}; use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; use std::sync::Arc; -use codec::Decode; - const OCW_PUB_KEY_STR: &str = "d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67"; -const OCW_SEED: &str = "news slush supreme milk chapter athlete soap sausage put clutch what kitten"; - +const OCW_SEED: &str = + "news slush supreme milk chapter athlete soap sausage put clutch what kitten"; #[test] fn it_sets_validation_decision_with_one_validator_in_quorum() { - let mut t = new_test_ext(); let (offchain, offchain_state) = testing::TestOffchainExt::new(); t.register_extension(OffchainDbExt::new(offchain.clone())); t.register_extension(OffchainWorkerExt::new(offchain)); - - let keystore = KeyStore::new(); - keystore.sr25519_generate_new(KEY_TYPE, Some(OCW_SEED)).unwrap(); - t.register_extension(KeystoreExt(Arc::new(keystore))); + + let keystore = KeyStore::new(); + keystore.sr25519_generate_new(KEY_TYPE, Some(OCW_SEED)).unwrap(); + t.register_extension(KeystoreExt(Arc::new(keystore))); let (pool, pool_state) = testing::TestTransactionPoolExt::new(); - t.register_extension(TransactionPoolExt::new(pool)); + t.register_extension(TransactionPoolExt::new(pool)); let era_to_validate: EraIndex = 3; let cdn_node_to_validate = AccountId::from([0x1; 32]); @@ -51,28 +50,43 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { }; expect_request( - &format!("{}/JSON.GET/ddc:dac:aggregation:nodes:{}/$.{}", DEFAULT_DATA_PROVIDER_URL, era_to_validate, cdn_node_to_validate_str), - include_bytes!("./mock-data/set-1/aggregated-node-data-for-era.json") + &format!( + "{}/JSON.GET/ddc:dac:aggregation:nodes:{}/$.{}", + DEFAULT_DATA_PROVIDER_URL, era_to_validate, cdn_node_to_validate_str + ), + include_bytes!("./mock-data/set-1/aggregated-node-data-for-era.json"), ); expect_request( - &format!("{}/JSON.GET/ddc:dac:data:file:84640a53-fc1f-4ac5-921c-6695056840bc", DEFAULT_DATA_PROVIDER_URL), - include_bytes!("./mock-data/set-1/file-request1.json") + &format!( + "{}/JSON.GET/ddc:dac:data:file:84640a53-fc1f-4ac5-921c-6695056840bc", + DEFAULT_DATA_PROVIDER_URL + ), + include_bytes!("./mock-data/set-1/file-request1.json"), ); expect_request( - &format!("{}/JSON.GET/ddc:dac:data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7", DEFAULT_DATA_PROVIDER_URL), - include_bytes!("./mock-data/set-1/file-request2.json") + &format!( + "{}/JSON.GET/ddc:dac:data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7", + DEFAULT_DATA_PROVIDER_URL + ), + include_bytes!("./mock-data/set-1/file-request2.json"), ); expect_request( - &format!("{}/JSON.GET/ddc:dac:data:file:80a62530-fd76-40b5-bc53-dd82365e89ce", DEFAULT_DATA_PROVIDER_URL), - include_bytes!("./mock-data/set-1/file-request3.json") + &format!( + "{}/JSON.GET/ddc:dac:data:file:80a62530-fd76-40b5-bc53-dd82365e89ce", + DEFAULT_DATA_PROVIDER_URL + ), + include_bytes!("./mock-data/set-1/file-request3.json"), ); - let decision: ValidationDecision = serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")).unwrap(); + let decision: ValidationDecision = + serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")) + .unwrap(); let serialized_decision = serde_json::to_string(&decision).unwrap(); - let encoded_decision_vec = shm::base64_encode(&serialized_decision.as_bytes().to_vec()).unwrap(); + let encoded_decision_vec = + shm::base64_encode(&serialized_decision.as_bytes().to_vec()).unwrap(); let encoded_decision_str = encoded_decision_vec.iter().cloned().collect::(); let result_json = serde_json::json!({ "result": decision.result, @@ -83,32 +97,38 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { let url_encoded_result_json = utils::url_encode(&unescaped_result_json); expect_request( - &format!("{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{}", + &format!( + "{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{}", DEFAULT_DATA_PROVIDER_URL, - OCW_PUB_KEY_STR, - cdn_node_to_validate_str, + OCW_PUB_KEY_STR, + cdn_node_to_validate_str, era_to_validate, url_encoded_result_json, ), - include_bytes!("./mock-data/set-1/save-validation-decision-result.json") + include_bytes!("./mock-data/set-1/save-validation-decision-result.json"), ); expect_request( - &format!("{}/JSON.GET/ddc:dac:shared:nodes:{}", DEFAULT_DATA_PROVIDER_URL, era_to_validate), - include_bytes!("./mock-data/set-1/shared-validation-decisions-for-era.json") + &format!( + "{}/JSON.GET/ddc:dac:shared:nodes:{}", + DEFAULT_DATA_PROVIDER_URL, era_to_validate + ), + include_bytes!("./mock-data/set-1/shared-validation-decisions-for-era.json"), ); - } t.execute_with(|| { - let era_block_number = ERA_IN_BLOCKS as u32 * era_to_validate; System::set_block_number(era_block_number); // required for randomness - Timestamp::set_timestamp((TIME_START_MS + ERA_DURATION_MS * (era_to_validate as u128 - 1)) as u64); + Timestamp::set_timestamp( + (TIME_START_MS + ERA_DURATION_MS * (era_to_validate as u128 - 1)) as u64, + ); DdcValidator::on_initialize(era_block_number - 1); // make assignments - Timestamp::set_timestamp((TIME_START_MS + ERA_DURATION_MS * (era_to_validate as u128 + 1)) as u64); + Timestamp::set_timestamp( + (TIME_START_MS + ERA_DURATION_MS * (era_to_validate as u128 + 1)) as u64, + ); DdcValidator::offchain_worker(era_block_number + 1); // execute assignments let mut transactions = pool_state.read().transactions.clone(); @@ -123,35 +143,36 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { let bucket_info2 = BucketsDetails { bucket_id: 5, amount: 200u128 }; let bucket_info3 = BucketsDetails { bucket_id: 5, amount: 300u128 }; - assert_eq!(tx.call, crate::mock::Call::DdcValidator( - crate::Call::charge_payments_content_owners { - paying_accounts: vec![ - bucket_info3, - bucket_info1, - bucket_info2, - ] - } - )); + assert_eq!( + tx.call, + crate::mock::Call::DdcValidator(crate::Call::charge_payments_content_owners { + paying_accounts: vec![bucket_info3, bucket_info1, bucket_info2,] + }) + ); let tx = transactions.pop().unwrap(); let tx = Extrinsic::decode(&mut &*tx).unwrap(); assert!(tx.signature.is_some()); - assert_eq!(tx.call, crate::mock::Call::DdcValidator( - crate::Call::payout_cdn_owners { + assert_eq!( + tx.call, + crate::mock::Call::DdcValidator(crate::Call::payout_cdn_owners { era: era_to_validate + 1 - } - )); + }) + ); let tx = transactions.pop().unwrap(); let tx = Extrinsic::decode(&mut &*tx).unwrap(); assert!(tx.signature.is_some()); - let common_decision: ValidationDecision = serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")).unwrap(); + let common_decision: ValidationDecision = + serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")) + .unwrap(); let common_decisions = vec![common_decision.clone()]; let serialized_decisions = serde_json::to_string(&common_decisions).unwrap(); - assert_eq!(tx.call, crate::mock::Call::DdcValidator( - crate::Call::set_validation_decision { + assert_eq!( + tx.call, + crate::mock::Call::DdcValidator(crate::Call::set_validation_decision { era: era_to_validate + 1, cdn_node: cdn_node_to_validate, validation_decision: ValidationDecision { @@ -165,10 +186,7 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { failure_rate: common_decision.totals.failure_rate, } } - } - )); - + }) + ); }) } - - From 14276a3547da0933db7a1485765e2a2f2942beac Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 21 Jul 2023 17:37:52 +0600 Subject: [PATCH 233/583] Add `Runtime` prefix to `Call`, `Event` and etc. --- pallets/ddc-validator/src/mock.rs | 36 +++++++++++++++--------------- pallets/ddc-validator/src/tests.rs | 6 ++--- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index 20125eb69..715e27965 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -60,17 +60,17 @@ impl frame_system::Config for Test { type BaseCallFilter = Everything; type BlockWeights = (); type BlockLength = (); - type Origin = Origin; + type RuntimeOrigin = RuntimeOrigin; type Index = u64; type BlockNumber = BlockNumber; type Hash = H256; - type Call = Call; + type RuntimeCall = RuntimeCall; type Hashing = BlakeTwo256; type AccountId = AccountId; // u64; // sp_core::sr25519::Public; type Lookup = IdentityLookup; type Header = generic::Header; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type BlockHashCount = BlockHashCount; type DbWeight = (); type Version = (); @@ -110,7 +110,7 @@ impl Convert for TestWeightToFee { impl contracts::Config for Test { type AddressGenerator = pallet_contracts::DefaultAddressGenerator; - type Call = Call; + type RuntimeCall = RuntimeCall; type CallFilter = Nothing; type CallStack = [pallet_contracts::Frame; 31]; type ChainExtension = (); @@ -120,7 +120,7 @@ impl contracts::Config for Test { type DeletionWeightLimit = (); type DepositPerByte = DepositPerByte; type DepositPerItem = DepositPerItem; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type MaxCodeLen = ConstU32<{ 128 * 1024 }>; type MaxStorageKeyLen = ConstU32<128>; type Randomness = RandomnessCollectiveFlip; @@ -170,7 +170,7 @@ impl From for MockSessionKeys { } impl pallet_session::Config for Test { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type ValidatorId = AccountId; type ValidatorIdOf = (); type ShouldEndSession = TestShouldEndSession; @@ -221,7 +221,7 @@ impl pallet_staking::Config for Test { type UnixTime = Timestamp; type CurrencyToVote = U128CurrencyToVote; type RewardRemainder = (); - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Slash = (); // send the slashed funds to the treasury. type Reward = (); // rewards are minted from the void type SessionsPerEra = SessionsPerEra; @@ -250,7 +250,7 @@ parameter_types! { impl pallet_ddc_accounts::Config for Test { type BondingDuration = BondingDuration; type Currency = Balances; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type PalletId = DdcAccountsPalletId; type TimeProvider = pallet_timestamp::Pallet; } @@ -269,7 +269,7 @@ impl pallet_ddc_staking::Config for Test { type DefaultEdgeChillDelay = DefaultEdgeChillDelay; type DefaultStorageBondSize = DefaultStorageBondSize; type DefaultStorageChillDelay = DefaultStorageChillDelay; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type StakersPayoutSource = DdcAccountsPalletId; type UnixTime = Timestamp; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; @@ -282,9 +282,9 @@ parameter_types! { impl pallet_ddc_validator::Config for Test { type DdcValidatorsQuorumSize = DdcValidatorsQuorumSize; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Randomness = RandomnessCollectiveFlip; - type Call = Call; + type RuntimeCall = RuntimeCall; type AuthorityId = pallet_ddc_validator::crypto::TestAuthId; type TimeProvider = pallet_timestamp::Pallet; type ValidationThreshold = ValidationThreshold; @@ -293,9 +293,9 @@ impl pallet_ddc_validator::Config for Test { impl SendTransactionTypes for Test where - Call: From, + RuntimeCall: From, { - type OverarchingCall = Call; + type OverarchingCall = RuntimeCall; type Extrinsic = Extrinsic; } @@ -307,7 +307,7 @@ parameter_types! { impl pallet_balances::Config for Test { type Balance = Balance; type DustRemoval = (); - type Event = Event; + type RuntimeEvent = RuntimeEvent; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; type WeightInfo = (); @@ -382,7 +382,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities { TestExternalities::new(storage) } -pub type Extrinsic = TestXt; +pub type Extrinsic = TestXt; impl SigningTypes for Test { type Public = ::Signer; @@ -391,14 +391,14 @@ impl SigningTypes for Test { impl CreateSignedTransaction for Test where - Call: From, + RuntimeCall: From, { fn create_transaction>( - call: Call, + call: RuntimeCall, _public: ::Signer, _account: AccountId, nonce: u64, - ) -> Option<(Call, ::SignaturePayload)> { + ) -> Option<(RuntimeCall, ::SignaturePayload)> { Some((call, (nonce, ()))) } } diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index a05f79997..400e96f64 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -145,7 +145,7 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { assert_eq!( tx.call, - crate::mock::Call::DdcValidator(crate::Call::charge_payments_content_owners { + crate::mock::RuntimeCall::DdcValidator(crate::Call::charge_payments_content_owners { paying_accounts: vec![bucket_info3, bucket_info1, bucket_info2,] }) ); @@ -155,7 +155,7 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { assert!(tx.signature.is_some()); assert_eq!( tx.call, - crate::mock::Call::DdcValidator(crate::Call::payout_cdn_owners { + crate::mock::RuntimeCall::DdcValidator(crate::Call::payout_cdn_owners { era: era_to_validate + 1 }) ); @@ -172,7 +172,7 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { assert_eq!( tx.call, - crate::mock::Call::DdcValidator(crate::Call::set_validation_decision { + crate::mock::RuntimeCall::DdcValidator(crate::Call::set_validation_decision { era: era_to_validate + 1, cdn_node: cdn_node_to_validate, validation_decision: ValidationDecision { From 417a42086dab753256d6c4dfd3a743b39beadc71 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 21 Jul 2023 17:42:08 +0600 Subject: [PATCH 234/583] Fix associated types in mock for validator tests --- pallets/ddc-validator/src/mock.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index 715e27965..c398c2ac8 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -124,7 +124,6 @@ impl contracts::Config for Test { type MaxCodeLen = ConstU32<{ 128 * 1024 }>; type MaxStorageKeyLen = ConstU32<128>; type Randomness = RandomnessCollectiveFlip; - type RelaxedMaxCodeLen = ConstU32<{ 256 * 1024 }>; type Schedule = Schedule; type Time = Timestamp; type WeightInfo = (); @@ -241,6 +240,8 @@ impl pallet_staking::Config for Test { type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type CurrencyBalance = Balance; type OnStakerSlash = (); + type HistoryDepth = ConstU32<84>; + type TargetList = pallet_staking::UseValidatorsMap; } parameter_types! { From 29cc5980b52319103f758b225d1fde2aa0955a2d Mon Sep 17 00:00:00 2001 From: Pavel Date: Fri, 21 Jul 2023 14:57:26 +0300 Subject: [PATCH 235/583] Update dev.yaml (#67) Small fix for github sha --- .github/workflows/dev.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/dev.yaml b/.github/workflows/dev.yaml index 311ccb13c..31aefb459 100644 --- a/.github/workflows/dev.yaml +++ b/.github/workflows/dev.yaml @@ -82,6 +82,10 @@ jobs: runs-on: ubuntu-latest needs: build steps: + - name: Get short SHA + run: | + echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> $GITHUB_ENV + - name: 'Trigger e2e DDC tests' uses: convictional/trigger-workflow-and-wait@v1.6.5 with: From b7d0d366e172a5aba131dbbf76d9222fdc5d978a Mon Sep 17 00:00:00 2001 From: Alexander Dobrodey <8377544+ADobrodey@users.noreply.github.com> Date: Tue, 25 Jul 2023 12:05:20 +0200 Subject: [PATCH 236/583] Upgrade OS version --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e977f7457..0cc717356 100644 --- a/Dockerfile +++ b/Dockerfile @@ -54,7 +54,7 @@ RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ cargo build --$PROFILE # ===== SECOND STAGE ====== -FROM phusion/baseimage:0.11 +FROM phusion/baseimage:jammy-1.0.1 LABEL maintainer="team@cere.network" LABEL description="This is the optimization to create a small image." ARG PROFILE=release From da0f31dac98bb3fc8931425b74845fdb2319c5cd Mon Sep 17 00:00:00 2001 From: Alexander Dobrodey <8377544+ADobrodey@users.noreply.github.com> Date: Tue, 25 Jul 2023 12:53:52 +0200 Subject: [PATCH 237/583] Fix bash entrypoint --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 0cc717356..b891d9262 100644 --- a/Dockerfile +++ b/Dockerfile @@ -71,6 +71,7 @@ RUN mv /usr/share/ca* /tmp && \ mkdir -p /cerenetwork/.local/share/cere && \ chown -R cerenetwork:cerenetwork /cerenetwork/.local && \ ln -s /cerenetwork/.local/share/cere /data && \ + mv -t /usr/local/bin /usr/bin/bash /usr/bin/sh && \ rm -rf /usr/bin /usr/sbin USER cerenetwork From a8d75bb6d91d6b77af5448ced3f40932a2f257da Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 27 Jul 2023 10:05:42 +0200 Subject: [PATCH 238/583] payments can only be charged by OCW registered keys --- pallets/ddc-validator/src/lib.rs | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 2f314cc76..36fbe640e 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -393,10 +393,12 @@ pub mod pallet { paying_accounts: Vec>>, ) -> DispatchResult { let controller = ensure_signed(origin)?; - // ensure!( - // OffchainWorkerKeys::::contains_key(&controller), - // Error::::OCWKeyNotRegistered - // ); + log::info!("Controller is {:?}", controller); + + ensure!( + OffchainWorkerKeys::::contains_key(&controller), + Error::::OCWKeyNotRegistered + ); >::charge_payments_new(paying_accounts); @@ -409,10 +411,10 @@ pub mod pallet { era: EraIndex, ) -> DispatchResult { let controller = ensure_signed(origin)?; - // ensure!( - // OffchainWorkerKeys::::contains_key(&controller), - // Error::::OCWKeyNotRegistered - // ); + ensure!( + OffchainWorkerKeys::::contains_key(&controller), + Error::::OCWKeyNotRegistered + ); >::do_payout_stakers(era); @@ -433,7 +435,7 @@ pub mod pallet { Error::::NotController ); - OffchainWorkerKeys::::insert(controller, ocw_pub); + OffchainWorkerKeys::::insert(ocw_pub, controller); Ok(()) } } @@ -531,7 +533,7 @@ pub mod pallet { } fn assign(quorum_size: usize, era: EraIndex) { - let validators: Vec = OffchainWorkerKeys::::iter_values().collect(); + let validators: Vec = OffchainWorkerKeys::::iter_keys().collect(); log::info!("current validators: {:?}", validators); @@ -560,7 +562,9 @@ pub mod pallet { let mut quorums_cycle = quorums.iter().cycle(); for edge in shuffled_edges { let Some(quorum_validators) = quorums_cycle.next() else { - defensive!("unexpectedly ran out of quorums"); + log::info!("unexpectedly ran out of quorums"); + + // defensive!("unexpectedly ran out of quorums"); return }; quorum_validators.iter().for_each(|validator| { From 128db372ed9b0692b7dc3fdf2f1488723144c3ea Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 27 Jul 2023 17:49:16 +0200 Subject: [PATCH 239/583] skipdeserializing on incorrect type --- pallets/ddc-validator/src/dac.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index 1c721a937..f1977384b 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -148,8 +148,8 @@ pub struct Log { #[serde(crate = "alt_serde")] #[serde(rename_all = "camelCase")] pub struct FileInfo { - #[serde(rename = "chunkCids")] - chunk_cids: Vec , + #[serde(rename = "chunkCids", skip_deserializing)] + chunk_cids: Option> , #[serde(rename = "requestedChunkCids")] requested_chunk_cids: Vec, From f40fc5f7b547c4a978726b921f6fd82c7aac6f61 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 28 Jul 2023 15:25:57 +0200 Subject: [PATCH 240/583] avoid double spend of content owner funds --- pallets/ddc-validator/src/lib.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 36fbe640e..cfeab2f9e 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -195,10 +195,17 @@ pub mod pallet { type ValidationThreshold: Get; } + // Map of assignments per validator per era #[pallet::storage] #[pallet::getter(fn assignments)] pub(super) type Assignments = StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, Vec>; + + // Map to check if validation decision was performed for the era + #[pallet::storage] + #[pallet::getter(fn contentOwnersCharged)] + pub(super) type EraContentOwnersCharged = + StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, bool, ValueQuery>; /// A signal to start a process on all the validators. #[pallet::storage] @@ -226,6 +233,7 @@ pub mod pallet { pub enum Error { NotController, OCWKeyNotRegistered, + ContentOwnersDoubleSpend } #[pallet::event] @@ -395,6 +403,13 @@ pub mod pallet { let controller = ensure_signed(origin)?; log::info!("Controller is {:?}", controller); + let era = Self::get_current_era(); + + ensure!( + Self::contentOwnersCharged(era, &controller), + Error::::ContentOwnersDoubleSpend + ); + ensure!( OffchainWorkerKeys::::contains_key(&controller), Error::::OCWKeyNotRegistered @@ -402,6 +417,8 @@ pub mod pallet { >::charge_payments_new(paying_accounts); + EraContentOwnersCharged::::insert(era, controller, true); + Ok(()) } From d9c1057e0ceb819729c1c1b89726a81b14132859 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 2 Aug 2023 14:13:44 +0600 Subject: [PATCH 241/583] Return an error on validators assignment failure --- pallets/ddc-validator/src/lib.rs | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index ceeecd7e2..62e4b5906 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -88,6 +88,13 @@ pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://redis:6379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; pub const QUORUM_SIZE: usize = 1; +#[derive(Debug)] +pub enum AssignmentError { + NoValidators, + NotEnoughValidators { requested_quorum: usize, available_validators: usize }, + DefensiveEmptyQuorumsCycle, +} + /// Aggregated values from DAC that describe CDN node's activity during a certain era. #[derive( PartialEq, @@ -544,15 +551,26 @@ pub mod pallet { /// /// Each CDN node is assigned to `quorum_size` validators randomly picked from the validator /// set. - fn assign(quorum_size: usize, era: EraIndex) { + fn assign(quorum_size: usize, era: EraIndex) -> Result<(), AssignmentError> { let validators: Vec = >::iter_keys().collect(); log::info!("current validators: {:?}", validators); + if validators.len() == 0 { + return Err(AssignmentError::NoValidators) + } + + if validators.len() < quorum_size { + return Err(AssignmentError::NotEnoughValidators { + requested_quorum: quorum_size, + available_validators: validators.len(), + }) + } + let edges: Vec = >::iter_keys().collect(); log::info!("current edges: {:?}", edges); if edges.len() == 0 { - return + return Ok(()) } let shuffled_validators = Self::shuffle(validators); @@ -573,8 +591,7 @@ pub mod pallet { let mut quorums_cycle = quorums.iter().cycle(); for edge in shuffled_edges { let Some(quorum_validators) = quorums_cycle.next() else { - defensive!("unexpectedly ran out of quorums"); - return + return Err(AssignmentError::DefensiveEmptyQuorumsCycle); }; quorum_validators.iter().for_each(|validator| { Assignments::::append( @@ -584,6 +601,8 @@ pub mod pallet { ); }); } + + return Ok(()) } /// Randomly choose a number in range `[0, total)`. From febb2a3c94074b75e2cb9f2c530e616fc25f6ce3 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 2 Aug 2023 14:45:04 +0600 Subject: [PATCH 242/583] Tasks assignment errors handling --- pallets/ddc-validator/src/lib.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 62e4b5906..71424702d 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -268,13 +268,19 @@ pub mod pallet { let era = Self::get_current_era(); log::info!("current era: {:?}", era); + // Produce an assignment for the next era if it's not produced yet. match Self::last_managed_era() { - Some(last_managed_era) if era < last_managed_era => (), - _ => { - Self::assign(3usize, era + 1); - >::put(era + 1); + Some(last_managed_era) if era < last_managed_era => return Weight::from_ref_time(0), + _ => (), + }; + + match Self::assign(3usize, era + 1) { + Ok(_) => >::put(era + 1), + Err(AssignmentError::DefensiveEmptyQuorumsCycle) => { + defensive!("unexpectedly empty quorums cycle"); }, + Err(e) => log::debug!("assignment error: {:?}", e), }; Weight::from_ref_time(0) From 306277917987e916325f23df7cc9dbffa825dd4e Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 4 Aug 2023 12:14:05 +0200 Subject: [PATCH 243/583] add workflow --- .../workflows/build-and-push-docker-image.yml | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 .github/workflows/build-and-push-docker-image.yml diff --git a/.github/workflows/build-and-push-docker-image.yml b/.github/workflows/build-and-push-docker-image.yml new file mode 100644 index 000000000..409db1db6 --- /dev/null +++ b/.github/workflows/build-and-push-docker-image.yml @@ -0,0 +1,55 @@ +name: Build and push image to ECR +on: + push: + branches: + - dev + - master + - 'feature/**' + - 'release/**' + - 'hotfix/**' +env: + ECR_REPOSITORY: pos-network-node +jobs: + build-and-push: + runs-on: [self-hosted, cere-network-xlarge-workers] + steps: + - name: Checkout repository + uses: actions/checkout@v1 + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.ORG_AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.ORG_AWS_SECRET_ACCESS_KEY }} + aws-region: us-west-2 + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + - name: Build and push image + env: + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} + run: | + image_id=$(docker build . -q -t $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA) + echo IMAGE_ID=$image_id >> $GITHUB_ENV + echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA" + docker image tag $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA $ECR_REGISTRY/$ECR_REPOSITORY:latest + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA + docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest + - name: Copy wasm artifacts from the image + run: | + container_id=$(docker create ${{ env.IMAGE_ID }}) + cere_runtime_artifact_name=cere_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm + echo CERE_RUNTIME_ARTIFACT_NAME=$cere_runtime_artifact_name >> $GITHUB_ENV + docker cp $container_id:/home/cere/cere-runtime-artifacts/cere_runtime.compact.compressed.wasm ./$cere_runtime_artifact_name + cere_dev_runtime_artifact_name=cere_dev_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm + echo CERE_DEV_RUNTIME_ARTIFACT_NAME=$cere_dev_runtime_artifact_name >> $GITHUB_ENV + docker cp $container_id:/home/cere/cere-dev-runtime-artifacts/cere_dev_runtime.compact.compressed.wasm ./$cere_dev_runtime_artifact_name + - name: Upload cere-runtime wasm artifact + uses: actions/upload-artifact@v3 + with: + name: ${{ env.CERE_RUNTIME_ARTIFACT_NAME }} + path: ./${{ env.CERE_RUNTIME_ARTIFACT_NAME }} + - name: Upload cere-dev-runtime wasm artifact + uses: actions/upload-artifact@v3 + with: + name: ${{ env.CERE_DEV_RUNTIME_ARTIFACT_NAME }} + path: ./${{ env.CERE_DEV_RUNTIME_ARTIFACT_NAME }} \ No newline at end of file From 152044def17b9143130c1d6292720fa992c7aefa Mon Sep 17 00:00:00 2001 From: Alexander Dobrodey <8377544+ADobrodey@users.noreply.github.com> Date: Fri, 4 Aug 2023 12:27:49 +0200 Subject: [PATCH 244/583] Execute build with locked Cargo.lock dependencies --- .github/workflows/dev.yaml | 2 +- Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dev.yaml b/.github/workflows/dev.yaml index 31aefb459..9180bd087 100644 --- a/.github/workflows/dev.yaml +++ b/.github/workflows/dev.yaml @@ -85,7 +85,7 @@ jobs: - name: Get short SHA run: | echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> $GITHUB_ENV - + - name: 'Trigger e2e DDC tests' uses: convictional/trigger-workflow-and-wait@v1.6.5 with: diff --git a/Dockerfile b/Dockerfile index b891d9262..543bc86f6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -51,7 +51,7 @@ ENV \ RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ export PATH=$PATH:$HOME/.cargo/bin && \ scripts/init.sh && \ - cargo build --$PROFILE + cargo build --locked --$PROFILE # ===== SECOND STAGE ====== FROM phusion/baseimage:jammy-1.0.1 From e0eab37a6c0a1cc41ef89e851db65c4515b82cf1 Mon Sep 17 00:00:00 2001 From: Alexander Dobrodey <8377544+ADobrodey@users.noreply.github.com> Date: Fri, 4 Aug 2023 12:49:44 +0200 Subject: [PATCH 245/583] Archive artifacts --- .github/workflows/dev.yaml | 45 ++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/.github/workflows/dev.yaml b/.github/workflows/dev.yaml index 9180bd087..e83f7209f 100644 --- a/.github/workflows/dev.yaml +++ b/.github/workflows/dev.yaml @@ -36,12 +36,16 @@ jobs: role-session-name: ${{ github.event.repository.name }} aws-region: us-west-2 - - name: Get short SHA + - name: Confiure environment variables run: | - echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> $GITHUB_ENV - echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> $GITHUB_ENV - echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> $GITHUB_ENV - echo "AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" >> $GITHUB_ENV + echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> ${GITHUB_ENV} + + echo "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" >> ${GITHUB_ENV} + echo "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" >> ${GITHUB_ENV} + echo "AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}" >> ${GITHUB_ENV} + + echo "CERE_RUNTIME=cere_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm" >> ${GITHUB_ENV} + echo "CERE_DEV_RUNTIME=cere_dev_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm" >> ${GITHUB_ENV} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 @@ -66,17 +70,24 @@ jobs: ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest - # - name: Upload cere-runtime wasm artifact - # uses: actions/upload-artifact@v3 - # with: - # name: cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm - # path: target/${{ vars.PROFILE }}/wbuild/cere-runtime/cere_runtime.compact.compressed.wasm - # - # - name: Upload cere-dev-runtime wasm artifact - # uses: actions/upload-artifact@v3 - # with: - # name: cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm - # path: target/${{ vars.PROFILE }}/wbuild/cere-dev-runtime/cere_dev_runtime.compact.compressed.wasm + - name: Copy wasm artifacts from the image + run: | + CONTAINER_ID=$(docker create ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }}) + + docker cp "${CONTAINER_ID}:/home/cere/cere-runtime-artifacts/cere_runtime.compact.compressed.wasm" "./${{ env.CERE_RUNTIME }}" + docker cp "${CONTAINER_ID}:/home/cere/cere-dev-runtime-artifacts/cere_dev_runtime.compact.compressed.wasm" "./${{ env.CERE_DEV_RUNTIME }}" + + - name: Upload cere-runtime wasm artifact + uses: actions/upload-artifact@v3 + with: + name: "cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm" + path: "./${{ env.CERE_RUNTIME }}" + + - name: Upload cere-dev-runtime wasm artifact + uses: actions/upload-artifact@v3 + with: + name: "cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm" + path: "./${{ env.CERE_DEV_RUNTIME }}" trigger-e2e-tests: runs-on: ubuntu-latest @@ -84,7 +95,7 @@ jobs: steps: - name: Get short SHA run: | - echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> $GITHUB_ENV + echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> ${GITHUB_ENV} - name: 'Trigger e2e DDC tests' uses: convictional/trigger-workflow-and-wait@v1.6.5 From 4a7a1ac1412f5f6c758bf66466403aabcdef098e Mon Sep 17 00:00:00 2001 From: Alexander Dobrodey <8377544+ADobrodey@users.noreply.github.com> Date: Fri, 4 Aug 2023 12:52:45 +0200 Subject: [PATCH 246/583] Stage environment --- .github/workflows/stage.yaml | 47 ++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/.github/workflows/stage.yaml b/.github/workflows/stage.yaml index ca7338fcd..02959cc64 100644 --- a/.github/workflows/stage.yaml +++ b/.github/workflows/stage.yaml @@ -5,7 +5,6 @@ on: - 'release/**' - 'hotfix/**' - 'master' - workflow_dispatch: env: PROFILE: release @@ -13,7 +12,7 @@ env: jobs: build: runs-on: ubuntu-latest - concurrency: stage + concurrency: dev permissions: contents: read id-token: write @@ -38,12 +37,16 @@ jobs: role-session-name: ${{ github.event.repository.name }} aws-region: us-west-2 - - name: Get short SHA + - name: Confiure environment variables run: | - echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> $GITHUB_ENV - echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> $GITHUB_ENV - echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> $GITHUB_ENV - echo "AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" >> $GITHUB_ENV + echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> ${GITHUB_ENV} + + echo "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" >> ${GITHUB_ENV} + echo "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" >> ${GITHUB_ENV} + echo "AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}" >> ${GITHUB_ENV} + + echo "CERE_RUNTIME=cere_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm" >> ${GITHUB_ENV} + echo "CERE_DEV_RUNTIME=cere_dev_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm" >> ${GITHUB_ENV} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 @@ -66,15 +69,23 @@ jobs: tags: | ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest + + - name: Copy wasm artifacts from the image + run: | + CONTAINER_ID=$(docker create ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }}) -# - name: Upload cere-runtime wasm artifact -# uses: actions/upload-artifact@v3 -# with: -# name: cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm -# path: target/${{ vars.PROFILE }}/wbuild/cere-runtime/cere_runtime.compact.compressed.wasm -# -# - name: Upload cere-dev-runtime wasm artifact -# uses: actions/upload-artifact@v3 -# with: -# name: cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm -# path: target/${{ vars.PROFILE }}/wbuild/cere-dev-runtime/cere_dev_runtime.compact.compressed.wasm + docker cp "${CONTAINER_ID}:/home/cere/cere-runtime-artifacts/cere_runtime.compact.compressed.wasm" "./${{ env.CERE_RUNTIME }}" + docker cp "${CONTAINER_ID}:/home/cere/cere-dev-runtime-artifacts/cere_dev_runtime.compact.compressed.wasm" "./${{ env.CERE_DEV_RUNTIME }}" + + - name: Upload cere-runtime wasm artifact + uses: actions/upload-artifact@v3 + with: + name: "cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm" + path: "./${{ env.CERE_RUNTIME }}" + + - name: Upload cere-dev-runtime wasm artifact + uses: actions/upload-artifact@v3 + with: + name: "cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm" + path: "./${{ env.CERE_DEV_RUNTIME }}" From 6559f5d7f4b2d46d9f0e19a6afdd55ff54a85744 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 4 Aug 2023 13:09:55 +0200 Subject: [PATCH 247/583] update workflows --- .github/workflows/dev.yml | 47 ++++++++++++++++++++++++++------------- Dockerfile | 9 ++++---- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index c9ad21887..fe851e83f 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -36,12 +36,16 @@ jobs: role-session-name: ${{ github.event.repository.name }} aws-region: us-west-2 - - name: Get short SHA + - name: Confiure environment variables run: | - echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> $GITHUB_ENV - echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> $GITHUB_ENV - echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> $GITHUB_ENV - echo "AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" >> $GITHUB_ENV + echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> ${GITHUB_ENV} + + echo "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" >> ${GITHUB_ENV} + echo "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" >> ${GITHUB_ENV} + echo "AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}" >> ${GITHUB_ENV} + + echo "CERE_RUNTIME=cere_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm" >> ${GITHUB_ENV} + echo "CERE_DEV_RUNTIME=cere_dev_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm" >> ${GITHUB_ENV} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 @@ -66,22 +70,33 @@ jobs: ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest - # - name: Upload cere-runtime wasm artifact - # uses: actions/upload-artifact@v3 - # with: - # name: cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm - # path: target/${{ vars.PROFILE }}/wbuild/cere-runtime/cere_runtime.compact.compressed.wasm - # - # - name: Upload cere-dev-runtime wasm artifact - # uses: actions/upload-artifact@v3 - # with: - # name: cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm - # path: target/${{ vars.PROFILE }}/wbuild/cere-dev-runtime/cere_dev_runtime.compact.compressed.wasm + - name: Copy wasm artifacts from the image + run: | + CONTAINER_ID=$(docker create ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }}) + + docker cp "${CONTAINER_ID}:/home/cere/cere-runtime-artifacts/cere_runtime.compact.compressed.wasm" "./${{ env.CERE_RUNTIME }}" + docker cp "${CONTAINER_ID}:/home/cere/cere-dev-runtime-artifacts/cere_dev_runtime.compact.compressed.wasm" "./${{ env.CERE_DEV_RUNTIME }}" + + - name: Upload cere-runtime wasm artifact + uses: actions/upload-artifact@v3 + with: + name: "cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm" + path: "./${{ env.CERE_RUNTIME }}" + + - name: Upload cere-dev-runtime wasm artifact + uses: actions/upload-artifact@v3 + with: + name: "cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm" + path: "./${{ env.CERE_DEV_RUNTIME }}" trigger-e2e-tests: runs-on: ubuntu-latest needs: build steps: + - name: Get short SHA + run: | + echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> ${GITHUB_ENV} + - name: 'Trigger e2e DDC tests' uses: convictional/trigger-workflow-and-wait@v1.6.5 with: diff --git a/Dockerfile b/Dockerfile index ef43ae342..7984c8af7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,8 +5,8 @@ ARG PROFILE=release WORKDIR /cerenetwork COPY . /cerenetwork -RUN apt-get -qq update && \ - apt-get -qq install -y \ +RUN apt-get update && \ + apt-get install -y \ clang \ cmake \ git \ @@ -51,10 +51,10 @@ ENV \ RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ export PATH=$PATH:$HOME/.cargo/bin && \ scripts/init.sh && \ - cargo build --$PROFILE + cargo build --locked --$PROFILE # ===== SECOND STAGE ====== -FROM phusion/baseimage:0.11 +FROM phusion/baseimage:jammy-1.0.1 LABEL maintainer="team@cere.network" LABEL description="This is the optimization to create a small image." ARG PROFILE=release @@ -71,6 +71,7 @@ RUN mv /usr/share/ca* /tmp && \ mkdir -p /cerenetwork/.local/share/cere && \ chown -R cerenetwork:cerenetwork /cerenetwork/.local && \ ln -s /cerenetwork/.local/share/cere /data && \ + mv -t /usr/local/bin /usr/bin/bash /usr/bin/sh && \ rm -rf /usr/bin /usr/sbin USER cerenetwork From 25a55061322617d7a0b60083e0959a637348f0ea Mon Sep 17 00:00:00 2001 From: Alexander Dobrodey <8377544+ADobrodey@users.noreply.github.com> Date: Fri, 4 Aug 2023 13:15:01 +0200 Subject: [PATCH 248/583] Build on official github runners --- .github/workflows/build-and-push-docker-image.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-push-docker-image.yml b/.github/workflows/build-and-push-docker-image.yml index 409db1db6..420de9677 100644 --- a/.github/workflows/build-and-push-docker-image.yml +++ b/.github/workflows/build-and-push-docker-image.yml @@ -11,7 +11,7 @@ env: ECR_REPOSITORY: pos-network-node jobs: build-and-push: - runs-on: [self-hosted, cere-network-xlarge-workers] + runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v1 @@ -52,4 +52,4 @@ jobs: uses: actions/upload-artifact@v3 with: name: ${{ env.CERE_DEV_RUNTIME_ARTIFACT_NAME }} - path: ./${{ env.CERE_DEV_RUNTIME_ARTIFACT_NAME }} \ No newline at end of file + path: ./${{ env.CERE_DEV_RUNTIME_ARTIFACT_NAME }} From 6ab593e14e7ef97efeb207bc1a273d60e41a76ec Mon Sep 17 00:00:00 2001 From: Alexander Dobrodey <8377544+ADobrodey@users.noreply.github.com> Date: Fri, 4 Aug 2023 13:18:35 +0200 Subject: [PATCH 249/583] Actualize build --- .../workflows/build-and-push-docker-image.yml | 99 +++++++++++++------ 1 file changed, 67 insertions(+), 32 deletions(-) diff --git a/.github/workflows/build-and-push-docker-image.yml b/.github/workflows/build-and-push-docker-image.yml index 420de9677..9113a9e72 100644 --- a/.github/workflows/build-and-push-docker-image.yml +++ b/.github/workflows/build-and-push-docker-image.yml @@ -2,54 +2,89 @@ name: Build and push image to ECR on: push: branches: - - dev - - master - 'feature/**' - - 'release/**' - - 'hotfix/**' + env: + PROFILE: release ECR_REPOSITORY: pos-network-node + jobs: - build-and-push: + build: runs-on: ubuntu-latest + concurrency: dev + permissions: + contents: read + id-token: write steps: - - name: Checkout repository - uses: actions/checkout@v1 - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 + - uses: actions/checkout@v3 + + - name: Cache cargo registry + uses: actions/cache@v3 + continue-on-error: false with: - aws-access-key-id: ${{ secrets.ORG_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.ORG_AWS_SECRET_ACCESS_KEY }} + path: | + ~/.cargo/registry + ~/.cargo/git + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: arn:aws:iam::${{ vars.DEV_NETWORK_AWS_ACCOUNT_ID }}:role/github + role-session-name: ${{ github.event.repository.name }} aws-region: us-west-2 + + - name: Confiure environment variables + run: | + echo "GITHUB_SHA=${GITHUB_SHA:0:7}" >> ${GITHUB_ENV} + + echo "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" >> ${GITHUB_ENV} + echo "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" >> ${GITHUB_ENV} + echo "AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}" >> ${GITHUB_ENV} + + echo "CERE_RUNTIME=cere_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm" >> ${GITHUB_ENV} + echo "CERE_DEV_RUNTIME=cere_dev_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm" >> ${GITHUB_ENV} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v1 - - name: Build and push image - env: - ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} - run: | - image_id=$(docker build . -q -t $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA) - echo IMAGE_ID=$image_id >> $GITHUB_ENV - echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA" - docker image tag $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA $ECR_REGISTRY/$ECR_REPOSITORY:latest - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA - docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest + + - name: Build and push docker image to ECR + uses: docker/build-push-action@v4 + with: + context: . + push: true + build-args: | + "AWS_ACCESS_KEY_ID=${{ env.AWS_ACCESS_KEY_ID }}" + "AWS_SECRET_ACCESS_KEY=${{ env.AWS_SECRET_ACCESS_KEY }}" + "AWS_SESSION_TOKEN=${{ env.AWS_SESSION_TOKEN }}" + "SCCACHE_REGION=us-west-2" + "SCCACHE_BUCKET=cere-blockchain-sccache" + + tags: | + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest + - name: Copy wasm artifacts from the image run: | - container_id=$(docker create ${{ env.IMAGE_ID }}) - cere_runtime_artifact_name=cere_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm - echo CERE_RUNTIME_ARTIFACT_NAME=$cere_runtime_artifact_name >> $GITHUB_ENV - docker cp $container_id:/home/cere/cere-runtime-artifacts/cere_runtime.compact.compressed.wasm ./$cere_runtime_artifact_name - cere_dev_runtime_artifact_name=cere_dev_runtime.compact.compressed.${GITHUB_SHA:0:7}.wasm - echo CERE_DEV_RUNTIME_ARTIFACT_NAME=$cere_dev_runtime_artifact_name >> $GITHUB_ENV - docker cp $container_id:/home/cere/cere-dev-runtime-artifacts/cere_dev_runtime.compact.compressed.wasm ./$cere_dev_runtime_artifact_name + CONTAINER_ID=$(docker create ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }}) + + docker cp "${CONTAINER_ID}:/home/cere/cere-runtime-artifacts/cere_runtime.compact.compressed.wasm" "./${{ env.CERE_RUNTIME }}" + docker cp "${CONTAINER_ID}:/home/cere/cere-dev-runtime-artifacts/cere_dev_runtime.compact.compressed.wasm" "./${{ env.CERE_DEV_RUNTIME }}" + - name: Upload cere-runtime wasm artifact uses: actions/upload-artifact@v3 with: - name: ${{ env.CERE_RUNTIME_ARTIFACT_NAME }} - path: ./${{ env.CERE_RUNTIME_ARTIFACT_NAME }} + name: "cere_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm" + path: "./${{ env.CERE_RUNTIME }}" + - name: Upload cere-dev-runtime wasm artifact uses: actions/upload-artifact@v3 with: - name: ${{ env.CERE_DEV_RUNTIME_ARTIFACT_NAME }} - path: ./${{ env.CERE_DEV_RUNTIME_ARTIFACT_NAME }} + name: "cere_dev_runtime.compact.compressed.${{ env.GITHUB_SHA }}.wasm" + path: "./${{ env.CERE_DEV_RUNTIME }}" From ee87405d82f08f2b11922d66d228fafa7fa4a7bc Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 4 Aug 2023 16:07:49 +0200 Subject: [PATCH 250/583] comment out not tested functionality --- pallets/ddc-validator/src/lib.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index cfeab2f9e..016c7132b 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -405,10 +405,11 @@ pub mod pallet { let era = Self::get_current_era(); - ensure!( - Self::contentOwnersCharged(era, &controller), - Error::::ContentOwnersDoubleSpend - ); + // not tested + // ensure!( + // Self::contentOwnersCharged(era, &controller), + // Error::::ContentOwnersDoubleSpend + // ); ensure!( OffchainWorkerKeys::::contains_key(&controller), From eae5c1da7c7f8f72ccb59a0746d744772ea59e3d Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 11 Aug 2023 15:51:25 +0600 Subject: [PATCH 251/583] Return Result from validation func --- pallets/ddc-validator/src/lib.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 71424702d..98c7dcf45 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -667,7 +667,7 @@ pub mod pallet { } } - fn validate_edges() { + fn validate_edges() -> Result<(), &'static str> { let current_era = Self::get_current_era(); let mock_data_url = Self::get_mock_data_url(); let data_provider_url = Self::get_data_provider_url(); @@ -792,7 +792,7 @@ pub mod pallet { let signer: Signer = Signer::<_, _>::any_account(); if !signer.can_sign() { log::warn!("No local accounts available to charge payments for CDN. Consider adding one via `author_insertKey` RPC."); - return + return Err("signing key not set") } // ToDo: replace local call by a call from `ddc-staking` pallet let _tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = @@ -821,6 +821,8 @@ pub mod pallet { } } } + + Ok(()) } } } From 61e1ea35ef2cc85925de6e29d0d6193fddc77e7c Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Fri, 11 Aug 2023 17:44:38 +0200 Subject: [PATCH 252/583] Revert "Merge pull request #73 from Cerebellum-Network/hotfix/revert-4.8.0-dev" This reverts commit f4d81cfbc21b85a26e47dc560c30fbc32854bc15, reversing changes made to 4a7a1ac1412f5f6c758bf66466403aabcdef098e. --- .github/workflows/check.yaml | 5 + .maintain/frame-weight-template.hbs | 104 ++ .vscode/settings.json | 9 + CHANGELOG.md | 21 + Cargo.lock | 1402 ++++++++++------- Cargo.toml | 6 +- Dockerfile | 55 +- Dockerfile.tests | 12 +- cli/Cargo.toml | 12 +- cli/src/command.rs | 7 +- node/client/Cargo.toml | 56 +- node/service/Cargo.toml | 69 +- node/service/src/chain_spec.rs | 1 + node/service/src/lib.rs | 25 +- pallets/chainbridge/Cargo.toml | 20 +- pallets/chainbridge/src/lib.rs | 1064 ++++++------- pallets/chainbridge/src/mock.rs | 205 ++- pallets/chainbridge/src/tests.rs | 983 ++++++------ .../ddc-metrics-offchain-worker/Cargo.toml | 26 +- .../ddc-metrics-offchain-worker/src/lib.rs | 1324 ++++++++-------- .../src/tests/mod.rs | 648 ++++---- .../src/tests/test_runtime.rs | 240 +-- pallets/ddc-staking/Cargo.toml | 22 +- pallets/ddc-staking/README.md | 15 + pallets/ddc-staking/src/benchmarking.rs | 3 + pallets/ddc-staking/src/lib.rs | 115 +- pallets/ddc-staking/src/mock.rs | 244 +++ pallets/ddc-staking/src/tests.rs | 178 +++ pallets/ddc-staking/src/weights.rs | 144 +- pallets/ddc/Cargo.toml | 14 +- pallets/ddc/src/lib.rs | 13 +- pallets/ddc/src/mock.rs | 22 +- pallets/ddc/src/tests.rs | 6 +- pallets/erc20/Cargo.toml | 20 +- pallets/erc20/src/lib.rs | 219 ++- pallets/erc721/Cargo.toml | 18 +- pallets/erc721/src/lib.rs | 197 ++- pallets/erc721/src/mock.rs | 132 +- pallets/erc721/src/tests.rs | 132 +- rpc/Cargo.toml | 48 +- rpc/src/lib.rs | 16 +- runtime/cere-dev/Cargo.toml | 162 +- runtime/cere-dev/constants/Cargo.toml | 6 +- runtime/cere-dev/src/impls.rs | 15 +- runtime/cere-dev/src/lib.rs | 213 +-- runtime/cere/Cargo.toml | 160 +- runtime/cere/constants/Cargo.toml | 6 +- runtime/cere/src/impls.rs | 15 +- runtime/cere/src/lib.rs | 212 +-- runtime/common/Cargo.toml | 10 +- runtime/common/src/lib.rs | 16 +- scripts/init.sh | 2 + scripts/pre-commit.sh | 8 + 53 files changed, 4853 insertions(+), 3824 deletions(-) create mode 100644 .maintain/frame-weight-template.hbs create mode 100644 .vscode/settings.json create mode 100644 pallets/ddc-staking/src/mock.rs create mode 100644 pallets/ddc-staking/src/tests.rs mode change 100755 => 100644 pallets/ddc-staking/src/weights.rs create mode 100755 scripts/pre-commit.sh diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 7013c3543..1e6a57960 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -32,6 +32,11 @@ jobs: rustup default stable rustup update nightly rustup update stable + rustup component add rustfmt --toolchain nightly + + - name: Check Format + run: | + cargo +nightly fmt -- --check - name: Check Build run: | diff --git a/.maintain/frame-weight-template.hbs b/.maintain/frame-weight-template.hbs new file mode 100644 index 000000000..e2248b4e2 --- /dev/null +++ b/.maintain/frame-weight-template.hbs @@ -0,0 +1,104 @@ +//! Autogenerated weights for {{pallet}} +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION {{version}} +//! DATE: {{date}}, STEPS: `{{cmd.steps}}`, REPEAT: {{cmd.repeat}}, LOW RANGE: `{{cmd.lowest_range_values}}`, HIGH RANGE: `{{cmd.highest_range_values}}` +//! HOSTNAME: `{{hostname}}`, CPU: `{{cpuname}}` +//! EXECUTION: {{cmd.execution}}, WASM-EXECUTION: {{cmd.wasm_execution}}, CHAIN: {{cmd.chain}}, DB CACHE: {{cmd.db_cache}} + +// Executed Command: +{{#each args as |arg|}} +// {{arg}} +{{/each}} + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for {{pallet}}. +pub trait WeightInfo { + {{#each benchmarks as |benchmark|}} + fn {{benchmark.name~}} + ( + {{~#each benchmark.components as |c| ~}} + {{c.name}}: u32, {{/each~}} + ) -> Weight; + {{/each}} +} + +/// Weights for {{pallet}} using the Substrate node and recommended hardware. +pub struct SubstrateWeight(PhantomData); +{{#if (eq pallet "frame_system")}} +impl WeightInfo for SubstrateWeight { +{{else}} +impl WeightInfo for SubstrateWeight { +{{/if}} + {{#each benchmarks as |benchmark|}} + {{#each benchmark.comments as |comment|}} + // {{comment}} + {{/each}} + {{#each benchmark.component_ranges as |range|}} + /// The range of component `{{range.name}}` is `[{{range.min}}, {{range.max}}]`. + {{/each}} + fn {{benchmark.name~}} + ( + {{~#each benchmark.components as |c| ~}} + {{~#if (not c.is_used)}}_{{/if}}{{c.name}}: u32, {{/each~}} + ) -> Weight { + Weight::from_ref_time({{underscore benchmark.base_weight}} as u64) + {{#each benchmark.component_weight as |cw|}} + // Standard Error: {{underscore cw.error}} + .saturating_add(Weight::from_ref_time({{underscore cw.slope}} as u64).saturating_mul({{cw.name}} as u64)) + {{/each}} + {{#if (ne benchmark.base_reads "0")}} + .saturating_add(T::DbWeight::get().reads({{benchmark.base_reads}} as u64)) + {{/if}} + {{#each benchmark.component_reads as |cr|}} + .saturating_add(T::DbWeight::get().reads(({{cr.slope}} as u64).saturating_mul({{cr.name}} as u64))) + {{/each}} + {{#if (ne benchmark.base_writes "0")}} + .saturating_add(T::DbWeight::get().writes({{benchmark.base_writes}} as u64)) + {{/if}} + {{#each benchmark.component_writes as |cw|}} + .saturating_add(T::DbWeight::get().writes(({{cw.slope}} as u64).saturating_mul({{cw.name}} as u64))) + {{/each}} + } + {{/each}} +} + +// For backwards compatibility and tests +impl WeightInfo for () { + {{#each benchmarks as |benchmark|}} + {{#each benchmark.comments as |comment|}} + // {{comment}} + {{/each}} + {{#each benchmark.component_ranges as |range|}} + /// The range of component `{{range.name}}` is `[{{range.min}}, {{range.max}}]`. + {{/each}} + fn {{benchmark.name~}} + ( + {{~#each benchmark.components as |c| ~}} + {{~#if (not c.is_used)}}_{{/if}}{{c.name}}: u32, {{/each~}} + ) -> Weight { + Weight::from_ref_time({{underscore benchmark.base_weight}} as u64) + {{#each benchmark.component_weight as |cw|}} + // Standard Error: {{underscore cw.error}} + .saturating_add(Weight::from_ref_time({{underscore cw.slope}} as u64).saturating_mul({{cw.name}} as u64)) + {{/each}} + {{#if (ne benchmark.base_reads "0")}} + .saturating_add(RocksDbWeight::get().reads({{benchmark.base_reads}} as u64)) + {{/if}} + {{#each benchmark.component_reads as |cr|}} + .saturating_add(RocksDbWeight::get().reads(({{cr.slope}} as u64).saturating_mul({{cr.name}} as u64))) + {{/each}} + {{#if (ne benchmark.base_writes "0")}} + .saturating_add(RocksDbWeight::get().writes({{benchmark.base_writes}} as u64)) + {{/if}} + {{#each benchmark.component_writes as |cw|}} + .saturating_add(RocksDbWeight::get().writes(({{cw.slope}} as u64).saturating_mul({{cw.name}} as u64))) + {{/each}} + } + {{/each}} +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..003fc3624 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "[rust]": { + "editor.defaultFormatter": "rust-lang.rust-analyzer", + "editor.formatOnSave": true + }, + "rust-analyzer.rustfmt.extraArgs": [ + "+nightly" + ] +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b0e24e03..9122f8269 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,33 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Legend + +[C] Cere Runtime +[D] Cere Dev Runtime + ## [vNext] +### Added + +- ... + ### Changed - ... +## [4.8.0] + +### Added + +- [D] Handlebars template to generate weights file +- [D] Genesis config for `pallet-ddc-staking` to set genesis DDC participants (empty by default) and staking settings +- [D] Unit tests in `pallet-ddc-staking` for basic staking scenario + +### Changed + +- [C,D] Updated Substrate to polkadot-v0.9.30 + ## [4.7.0] ### Changed diff --git a/Cargo.lock b/Cargo.lock index 3d4c9b4ca..8b70b378c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,9 +23,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" dependencies = [ "gimli 0.27.3", ] @@ -168,6 +168,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "array-bytes" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" + [[package]] name = "arrayref" version = "0.3.7" @@ -203,9 +209,9 @@ checksum = "155a5a185e42c6b77ac7b88a15143d930a9e9727a5b7b77eed417404ab15c247" [[package]] name = "async-channel" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", "event-listener", @@ -255,7 +261,7 @@ dependencies = [ "log", "parking", "polling", - "rustix 0.37.20", + "rustix 0.37.23", "slab", "socket2 0.4.9", "waker-fn", @@ -283,7 +289,7 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix 0.37.20", + "rustix 0.37.23", "signal-hook", "windows-sys 0.48.0", ] @@ -309,7 +315,7 @@ dependencies = [ "log", "memchr", "once_cell", - "pin-project-lite 0.2.9", + "pin-project-lite 0.2.10", "pin-utils", "slab", "wasm-bindgen-futures", @@ -338,13 +344,13 @@ checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", ] [[package]] @@ -357,7 +363,7 @@ dependencies = [ "futures-sink", "futures-util", "memchr", - "pin-project-lite 0.2.9", + "pin-project-lite 0.2.10", ] [[package]] @@ -385,16 +391,16 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.67" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" dependencies = [ - "addr2line 0.19.0", + "addr2line 0.20.0", "cc", "cfg-if", "libc", - "miniz_oxide 0.6.2", - "object 0.30.4", + "miniz_oxide", + "object 0.31.1", "rustc-demangle", ] @@ -428,6 +434,12 @@ version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "beef" version = "0.5.2" @@ -458,19 +470,19 @@ version = "0.65.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cexpr", "clang-sys", "lazy_static", "lazycell", "peeking_take_while", - "prettyplease", + "prettyplease 0.2.10", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "syn 2.0.22", + "syn 2.0.25", ] [[package]] @@ -479,6 +491,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "bitvec" version = "1.0.1" @@ -534,15 +552,15 @@ dependencies = [ [[package]] name = "blake3" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729b71f35bd3fa1a4c86b85d32c8b9069ea7fe14f7a53cfabb65f62d4265b888" +checksum = "199c42ab6972d92c9f8995f086273d25c42fc0f7b2a1fcefba465c1352d25ba5" dependencies = [ "arrayref", "arrayvec 0.7.4", "cc", "cfg-if", - "constant_time_eq 0.2.6", + "constant_time_eq 0.3.0", ] [[package]] @@ -607,9 +625,9 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bstr" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" dependencies = [ "memchr", "serde", @@ -693,7 +711,7 @@ dependencies = [ "cargo-platform", "semver 1.0.17", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", ] [[package]] @@ -707,7 +725,7 @@ dependencies = [ [[package]] name = "cere" -version = "4.7.0" +version = "4.8.0" dependencies = [ "cere-cli", "sc-cli", @@ -717,7 +735,7 @@ dependencies = [ [[package]] name = "cere-cli" -version = "4.7.0" +version = "4.8.0" dependencies = [ "cere-client", "cere-service", @@ -731,7 +749,7 @@ dependencies = [ [[package]] name = "cere-client" -version = "4.7.0" +version = "4.8.0" dependencies = [ "cere-dev-runtime", "cere-runtime", @@ -766,7 +784,7 @@ dependencies = [ [[package]] name = "cere-dev-runtime" -version = "4.7.0" +version = "4.8.0" dependencies = [ "cere-dev-runtime-constants", "cere-runtime-common", @@ -802,6 +820,7 @@ dependencies = [ "pallet-elections-phragmen", "pallet-erc20", "pallet-erc721", + "pallet-fast-unstake", "pallet-grandpa", "pallet-identity", "pallet-im-online", @@ -853,7 +872,7 @@ dependencies = [ [[package]] name = "cere-dev-runtime-constants" -version = "4.7.0" +version = "4.8.0" dependencies = [ "node-primitives", "sp-runtime", @@ -861,7 +880,7 @@ dependencies = [ [[package]] name = "cere-rpc" -version = "4.7.0" +version = "4.8.0" dependencies = [ "jsonrpsee", "node-primitives", @@ -891,7 +910,7 @@ dependencies = [ [[package]] name = "cere-runtime" -version = "4.7.0" +version = "4.8.0" dependencies = [ "cere-runtime-common", "cere-runtime-constants", @@ -926,6 +945,7 @@ dependencies = [ "pallet-elections-phragmen", "pallet-erc20", "pallet-erc721", + "pallet-fast-unstake", "pallet-grandpa", "pallet-identity", "pallet-im-online", @@ -977,7 +997,7 @@ dependencies = [ [[package]] name = "cere-runtime-common" -version = "4.7.0" +version = "4.8.0" dependencies = [ "frame-support", "node-primitives", @@ -987,7 +1007,7 @@ dependencies = [ [[package]] name = "cere-runtime-constants" -version = "4.7.0" +version = "4.8.0" dependencies = [ "node-primitives", "sp-runtime", @@ -995,7 +1015,7 @@ dependencies = [ [[package]] name = "cere-service" -version = "4.7.0" +version = "4.8.0" dependencies = [ "cere-client", "cere-dev-runtime", @@ -1067,6 +1087,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "chacha20" version = "0.8.2" @@ -1157,7 +1183,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", "indexmap", @@ -1236,6 +1262,12 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + [[package]] name = "core-foundation" version = "0.9.3" @@ -1272,28 +1304,30 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] [[package]] name = "cranelift-bforest" -version = "0.85.3" +version = "0.88.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "749d0d6022c9038dccf480bdde2a38d435937335bf2bb0f14e815d94517cdce8" +checksum = "52056f6d0584484b57fa6c1a65c1fcb15f3780d8b6a758426d9e3084169b2ddd" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.85.3" +version = "0.88.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94370cc7b37bf652ccd8bb8f09bd900997f7ccf97520edfc75554bb5c4abbea" +checksum = "18fed94c8770dc25d01154c3ffa64ed0b3ba9d583736f305fed7beebe5d9cf74" dependencies = [ + "arrayvec 0.7.4", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", @@ -1308,33 +1342,33 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.85.3" +version = "0.88.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a3cea8fdab90e44018c5b9a1dfd460d8ee265ac354337150222a354628bdb6" +checksum = "1c451b81faf237d11c7e4f3165eeb6bac61112762c5cfe7b4c0fb7241474358f" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.85.3" +version = "0.88.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac72f76f2698598951ab26d8c96eaa854810e693e7dd52523958b5909fde6b2" +checksum = "e7c940133198426d26128f08be2b40b0bd117b84771fd36798969c4d712d81fc" [[package]] name = "cranelift-entity" -version = "0.85.3" +version = "0.88.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09eaeacfcd2356fe0e66b295e8f9d59fdd1ac3ace53ba50de14d628ec902f72d" +checksum = "87a0f1b2fdc18776956370cf8d9b009ded3f855350c480c1c52142510961f352" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.85.3" +version = "0.88.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba69c9980d5ffd62c18a2bde927855fcd7c8dc92f29feaf8636052662cbd99c" +checksum = "34897538b36b216cc8dd324e73263596d51b8cf610da6498322838b2546baf8a" dependencies = [ "cranelift-codegen", "log", @@ -1344,15 +1378,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.85.3" +version = "0.88.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2920dc1e05cac40304456ed3301fde2c09bd6a9b0210bcfa2f101398d628d5b" +checksum = "1b2629a569fae540f16a76b70afcc87ad7decb38dc28fa6c648ac73b51e78470" [[package]] name = "cranelift-native" -version = "0.85.3" +version = "0.88.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04dfa45f9b2a6f587c564d6b63388e00cd6589d2df6ea2758cf79e1a13285e6" +checksum = "20937dab4e14d3e225c5adfc9c7106bafd4ac669bdb43027b911ff794c6fb318" dependencies = [ "cranelift-codegen", "libc", @@ -1361,9 +1395,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.85.3" +version = "0.88.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31a46513ae6f26f3f267d8d75b5373d555fbbd1e68681f348d99df43f747ec54" +checksum = "80fc2288957a94fd342a015811479de1837850924166d1f1856d8406e6f3609b" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1685,9 +1719,9 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "dtoa" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65d09067bfacaa79114679b279d7f5885b53295b1e2cfb4e79c8e4bd3d633169" +checksum = "519b83cd10f5f6e969625a409f735182bea5558cd8b64c655806ceaae36f1999" [[package]] name = "dyn-clonable" @@ -1758,7 +1792,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ "curve25519-dalek 3.2.0", - "hashbrown 0.12.3", + "hashbrown", "hex", "rand_core 0.6.4", "sha2 0.9.9", @@ -1818,7 +1852,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", ] [[package]] @@ -2010,7 +2044,7 @@ checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", "libz-sys", - "miniz_oxide 0.7.1", + "miniz_oxide", ] [[package]] @@ -2022,7 +2056,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", ] @@ -2039,7 +2073,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2062,9 +2096,10 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", + "array-bytes", "chrono", "clap", "comfy-table", @@ -2074,7 +2109,6 @@ dependencies = [ "gethostname", "handlebars", "hash-db", - "hex", "itertools", "kvdb", "lazy_static", @@ -2092,7 +2126,7 @@ dependencies = [ "sc-service", "sc-sysinfo", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "serde_nanos", "sp-api", "sp-blockchain", @@ -2113,7 +2147,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2124,7 +2158,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2140,7 +2174,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2169,9 +2203,9 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "frame-metadata", "frame-support-procedural", "impl-trait-for-tuples", @@ -2194,13 +2228,14 @@ dependencies = [ "sp-state-machine", "sp-std", "sp-tracing", + "sp-weights", "tt-call", ] [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "cfg-expr", @@ -2214,7 +2249,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2226,7 +2261,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -2236,7 +2271,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "log", @@ -2248,12 +2283,13 @@ dependencies = [ "sp-runtime", "sp-std", "sp-version", + "sp-weights", ] [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -2268,7 +2304,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -2277,7 +2313,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "parity-scale-codec", @@ -2380,7 +2416,7 @@ dependencies = [ "futures-io", "memchr", "parking", - "pin-project-lite 0.2.9", + "pin-project-lite 0.2.10", "waker-fn", ] @@ -2392,7 +2428,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", ] [[package]] @@ -2437,7 +2473,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.9", + "pin-project-lite 0.2.10", "pin-utils", "slab", ] @@ -2602,7 +2638,7 @@ dependencies = [ "pest", "pest_derive", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "thiserror", ] @@ -2621,15 +2657,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -2656,18 +2683,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hex" @@ -2737,7 +2755,7 @@ checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", - "itoa 1.0.6", + "itoa 1.0.8", ] [[package]] @@ -2748,7 +2766,7 @@ checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", "http", - "pin-project-lite 0.2.9", + "pin-project-lite 0.2.10", ] [[package]] @@ -2784,8 +2802,8 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.6", - "pin-project-lite 0.2.9", + "itoa 1.0.8", + "pin-project-lite 0.2.10", "socket2 0.4.9", "tokio", "tower-service", @@ -2916,7 +2934,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.12.3", + "hashbrown", "serde", ] @@ -2947,12 +2965,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "io-lifetimes" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec58677acfea8a15352d42fc87d11d63596ade9239e0a7c9352914417515dbe6" - [[package]] name = "io-lifetimes" version = "0.7.5" @@ -2965,7 +2977,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi 0.3.2", "libc", "windows-sys 0.48.0", ] @@ -2996,13 +3008,12 @@ checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "is-terminal" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes 1.0.11", - "rustix 0.37.20", + "hermit-abi 0.3.2", + "rustix 0.38.3", "windows-sys 0.48.0", ] @@ -3023,9 +3034,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" [[package]] name = "jobserver" @@ -3104,7 +3115,7 @@ dependencies = [ "rand 0.8.5", "rustc-hash", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "soketto", "thiserror", "tokio", @@ -3125,7 +3136,7 @@ dependencies = [ "jsonrpsee-core", "jsonrpsee-types", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "tokio", "tracing", "tracing-futures", @@ -3152,7 +3163,7 @@ dependencies = [ "anyhow", "beef", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "thiserror", "tracing", ] @@ -3180,7 +3191,7 @@ dependencies = [ "http", "jsonrpsee-core", "jsonrpsee-types", - "serde_json 1.0.99", + "serde_json 1.0.100", "soketto", "tokio", "tokio-stream", @@ -3366,8 +3377,8 @@ dependencies = [ "libp2p-request-response", "libp2p-swarm", "log", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "rand 0.8.5", ] @@ -3393,8 +3404,8 @@ dependencies = [ "multistream-select", "parking_lot 0.12.1", "pin-project", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "rand 0.8.5", "ring", "rw-stream-sink", @@ -3444,8 +3455,8 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "rand 0.7.3", "smallvec", ] @@ -3468,8 +3479,8 @@ dependencies = [ "libp2p-swarm", "log", "prometheus-client", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "rand 0.7.3", "regex", "sha2 0.10.7", @@ -3491,8 +3502,8 @@ dependencies = [ "libp2p-swarm", "log", "lru", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "prost-codec", "smallvec", "thiserror", @@ -3516,8 +3527,8 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "rand 0.7.3", "sha2 0.10.7", "smallvec", @@ -3594,8 +3605,8 @@ dependencies = [ "lazy_static", "libp2p-core", "log", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "rand 0.8.5", "sha2 0.10.7", "snow", @@ -3631,8 +3642,8 @@ dependencies = [ "futures", "libp2p-core", "log", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "unsigned-varint", "void", ] @@ -3667,8 +3678,8 @@ dependencies = [ "libp2p-swarm", "log", "pin-project", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "prost-codec", "rand 0.8.5", "smallvec", @@ -3691,8 +3702,8 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "rand 0.8.5", "sha2 0.10.7", "thiserror", @@ -3922,12 +3933,6 @@ dependencies = [ "statrs", ] -[[package]] -name = "linux-raw-sys" -version = "0.0.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7" - [[package]] name = "linux-raw-sys" version = "0.0.46" @@ -3940,6 +3945,12 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +[[package]] +name = "linux-raw-sys" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" + [[package]] name = "lite-json" version = "0.2.0" @@ -3983,7 +3994,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" dependencies = [ - "hashbrown 0.12.3", + "hashbrown", ] [[package]] @@ -4036,7 +4047,7 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -4063,11 +4074,11 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memfd" -version = "0.4.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6627dc657574b49d6ad27105ed671822be56e0d2547d413bfbf3e8d8fa92e7a" +checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e" dependencies = [ - "libc", + "rustix 0.37.23", ] [[package]] @@ -4104,15 +4115,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6566c70c1016f525ced45d7b7f97730a2bafb037c788211d0c186ef5b2189f0a" dependencies = [ "hash-db", - "hashbrown 0.12.3", + "hashbrown", "parity-util-mem", ] [[package]] name = "memory_units" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" +checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" [[package]] name = "merlin" @@ -4132,15 +4143,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "miniz_oxide" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" -dependencies = [ - "adler", -] - [[package]] name = "miniz_oxide" version = "0.7.1" @@ -4161,12 +4163,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "more-asserts" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" - [[package]] name = "multiaddr" version = "0.14.0" @@ -4304,7 +4300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" dependencies = [ "anyhow", - "bitflags", + "bitflags 1.3.2", "byteorder", "libc", "netlink-packet-core", @@ -4357,7 +4353,7 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", ] @@ -4365,7 +4361,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system", "parity-scale-codec", @@ -4408,6 +4404,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-complex" version = "0.4.3" @@ -4424,7 +4431,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" dependencies = [ "arrayvec 0.7.4", - "itoa 1.0.6", + "itoa 1.0.8", ] [[package]] @@ -4444,7 +4451,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" dependencies = [ "autocfg", - "num-bigint", + "num-bigint 0.2.6", "num-integer", "num-traits", ] @@ -4456,6 +4463,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", + "num-bigint 0.4.3", "num-integer", "num-traits", ] @@ -4472,31 +4480,31 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.2", "libc", ] [[package]] name = "object" -version = "0.28.4" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" dependencies = [ "crc32fast", - "hashbrown 0.11.2", + "hashbrown", "indexmap", "memchr", ] [[package]] name = "object" -version = "0.30.4" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" dependencies = [ "memchr", ] @@ -4562,7 +4570,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4578,7 +4586,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4593,7 +4601,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4617,7 +4625,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4637,7 +4645,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4652,7 +4660,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4669,7 +4677,7 @@ dependencies = [ [[package]] name = "pallet-cere-ddc" -version = "4.7.0" +version = "4.8.0" dependencies = [ "frame-support", "frame-system", @@ -4684,7 +4692,7 @@ dependencies = [ [[package]] name = "pallet-chainbridge" -version = "4.7.0" +version = "4.8.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -4703,7 +4711,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4722,7 +4730,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4739,9 +4747,9 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "frame-benchmarking", "frame-support", "frame-system", @@ -4767,9 +4775,9 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "parity-scale-codec", "scale-info", "serde", @@ -4782,7 +4790,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -4792,7 +4800,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-contracts-primitives", @@ -4809,7 +4817,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -4821,7 +4829,7 @@ dependencies = [ [[package]] name = "pallet-ddc-metrics-offchain-worker" -version = "4.7.0" +version = "4.8.0" dependencies = [ "alt_serde", "frame-support", @@ -4847,24 +4855,28 @@ dependencies = [ [[package]] name = "pallet-ddc-staking" -version = "4.7.0" +version = "4.8.0" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "pallet-balances", + "pallet-timestamp", "parity-scale-codec", "scale-info", + "sp-core", "sp-io", "sp-runtime", "sp-staking", "sp-std", + "sp-tracing", "substrate-test-utils", ] [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4880,13 +4892,14 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", "frame-support", "frame-system", "log", + "pallet-election-provider-support-benchmarking", "parity-scale-codec", "rand 0.7.3", "scale-info", @@ -4903,7 +4916,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4916,7 +4929,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4933,7 +4946,7 @@ dependencies = [ [[package]] name = "pallet-erc20" -version = "4.7.0" +version = "4.8.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -4953,7 +4966,7 @@ dependencies = [ [[package]] name = "pallet-erc721" -version = "4.7.0" +version = "4.8.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -4969,10 +4982,31 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-fast-unstake" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "pallet-staking", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", +] + [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4995,7 +5029,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5011,7 +5045,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5031,7 +5065,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5048,7 +5082,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5065,7 +5099,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5080,7 +5114,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5097,7 +5131,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5109,6 +5143,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-runtime", + "sp-runtime-interface", "sp-staking", "sp-std", ] @@ -5116,7 +5151,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -5126,7 +5161,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5143,7 +5178,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5166,7 +5201,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5181,7 +5216,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5195,7 +5230,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5210,7 +5245,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5226,7 +5261,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5247,7 +5282,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5263,7 +5298,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5277,7 +5312,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5300,7 +5335,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5311,7 +5346,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5325,7 +5360,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5343,7 +5378,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5362,7 +5397,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5378,7 +5413,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5393,7 +5428,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5404,7 +5439,7 @@ dependencies = [ [[package]] name = "pallet-transaction-storage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5422,7 +5457,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5439,7 +5474,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5455,7 +5490,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5488,9 +5523,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.1" +version = "3.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2287753623c76f953acd29d15d8100bcab84d29db78fb6f352adb3c53e83b967" +checksum = "756d439303e94fae44f288ba881ad29670c65b0c4b0e05674ca81061bb65f2c5" dependencies = [ "arrayvec 0.7.4", "bitvec", @@ -5503,9 +5538,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.1" +version = "3.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b6937b5e67bfba3351b87b040d48352a2fcb6ad72f81855412ce97b45c8f110" +checksum = "9d884d78fcf214d70b1e239fcd1c6e5e95aa3be1881918da2e488cc946c7a476" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5526,7 +5561,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c32561d248d352148124f036cac253a644685a21dc9fea383eb4907d7bd35a8f" dependencies = [ "cfg-if", - "hashbrown 0.12.3", + "hashbrown", "impl-trait-for-tuples", "parity-util-mem-derive", "parking_lot 0.12.1", @@ -5557,9 +5592,9 @@ dependencies = [ [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "parking" @@ -5617,9 +5652,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35" [[package]] name = "pbkdf2" @@ -5681,7 +5716,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", ] [[package]] @@ -5707,22 +5742,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" +checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" +checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", ] [[package]] @@ -5733,9 +5768,9 @@ checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -5743,6 +5778,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" +dependencies = [ + "der", + "spki", + "zeroize", +] + [[package]] name = "pkg-config" version = "0.3.27" @@ -5768,12 +5814,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" dependencies = [ "autocfg", - "bitflags", + "bitflags 1.3.2", "cfg-if", "concurrent-queue", "libc", "log", - "pin-project-lite 0.2.9", + "pin-project-lite 0.2.10", "windows-sys 0.48.0", ] @@ -5820,12 +5866,22 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.9" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9825a04601d60621feed79c4e6b56d65db77cdca55cef43b46b0de1096d1c282" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" dependencies = [ "proc-macro2", - "syn 2.0.22", + "syn 1.0.109", +] + +[[package]] +name = "prettyplease" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92139198957b410250d43fad93e630d956499a625c527eda65175c8680f83387" +dependencies = [ + "proc-macro2", + "syn 2.0.25", ] [[package]] @@ -5877,9 +5933,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" dependencies = [ "unicode-ident", ] @@ -5905,7 +5961,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac1abe0255c04d15f571427a2d1e00099016506cf3297b53853acd2b7eb87825" dependencies = [ "dtoa", - "itoa 1.0.6", + "itoa 1.0.8", "owning_ref", "prometheus-client-derive-text-encode", ] @@ -5928,7 +5984,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.10.1", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive 0.11.9", ] [[package]] @@ -5946,13 +6012,35 @@ dependencies = [ "log", "multimap", "petgraph", - "prost", - "prost-types", + "prost 0.10.4", + "prost-types 0.10.1", "regex", "tempfile", "which", ] +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease 0.1.25", + "prost 0.11.9", + "prost-types 0.11.9", + "regex", + "syn 1.0.109", + "tempfile", + "which", +] + [[package]] name = "prost-codec" version = "0.1.0" @@ -5961,7 +6049,7 @@ checksum = "00af1e92c33b4813cc79fda3f2dbf56af5169709be0202df730e9ebc3e4cd007" dependencies = [ "asynchronous-codec", "bytes", - "prost", + "prost 0.10.4", "thiserror", "unsigned-varint", ] @@ -5979,6 +6067,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "prost-types" version = "0.10.1" @@ -5986,7 +6087,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d0a014229361011dc8e69c8a1ec6c2e8d0f2af7c91e3ea3f5b2170298461e68" dependencies = [ "bytes", - "prost", + "prost 0.10.4", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost 0.11.9", ] [[package]] @@ -6017,9 +6127,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" dependencies = [ "proc-macro2", ] @@ -6164,7 +6274,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -6173,7 +6283,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -6189,29 +6299,29 @@ dependencies = [ [[package]] name = "ref-cast" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43faa91b1c8b36841ee70e97188a869d37ae21759da6846d4be66de5bf7b12c" +checksum = "1641819477c319ef452a075ac34a4be92eb9ba09f6841f62d594d50fdcf0bf6b" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d2275aab483050ab2a7364c1a46604865ee7d6906684e08db0f090acf74f9e7" +checksum = "68bf53dad9b6086826722cdc99140793afd9f62faa14a1ad07eb4f955e7a7216" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", ] [[package]] name = "regalloc2" -version = "0.2.3" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a8d23b35d7177df3b9d31ed8a9ab4bf625c668be77a319d4f5efd4a5257701c" +checksum = "d43a209257d978ef079f3d446331d0f1794f5e0fc19b306a199983857833a779" dependencies = [ "fxhash", "log", @@ -6221,13 +6331,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.4" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ "aho-corasick 1.0.2", "memchr", - "regex-syntax 0.7.2", + "regex-automata 0.3.2", + "regex-syntax 0.7.3", ] [[package]] @@ -6240,40 +6351,39 @@ dependencies = [ ] [[package]] -name = "regex-syntax" -version = "0.6.29" +name = "regex-automata" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "83d3daa6976cffb758ec878f108ba0e062a45b2d6ca3a2cca965338855476caf" +dependencies = [ + "aho-corasick 1.0.2", + "memchr", + "regex-syntax 0.7.3", +] [[package]] name = "regex-syntax" -version = "0.7.2" +version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] -name = "region" -version = "2.2.0" +name = "regex-syntax" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877e54ea2adcd70d80e9179344c97f93ef0dffd6b03e1f4529e6e83ab2fa9ae0" -dependencies = [ - "bitflags", - "libc", - "mach", - "winapi", -] +checksum = "2ab07dc67230e4a4718e70fd5c20055a4334b121f1f9db8fe63ef39ce9b8c846" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "env_logger 0.9.3", "jsonrpsee", "log", "parity-scale-codec", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-core", "sp-io", "sp-runtime", @@ -6400,43 +6510,42 @@ dependencies = [ [[package]] name = "rustix" -version = "0.33.7" +version = "0.35.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938a344304321a9da4973b9ff4f9f8db9caf4597dfd9dda6a60b523340a0fff0" +checksum = "6380889b07a03b5ecf1d44dc9ede6fd2145d84b502a2a9ca0b03c48e0cc3220f" dependencies = [ - "bitflags", + "bitflags 1.3.2", "errno 0.2.8", - "io-lifetimes 0.5.3", + "io-lifetimes 0.7.5", "libc", - "linux-raw-sys 0.0.42", - "winapi", + "linux-raw-sys 0.0.46", + "windows-sys 0.42.0", ] [[package]] name = "rustix" -version = "0.35.13" +version = "0.37.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727a1a6d65f786ec22df8a81ca3121107f235970dc1705ed681d3e6e8b9cd5f9" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" dependencies = [ - "bitflags", - "errno 0.2.8", - "io-lifetimes 0.7.5", + "bitflags 1.3.2", + "errno 0.3.1", + "io-lifetimes 1.0.11", "libc", - "linux-raw-sys 0.0.46", - "windows-sys 0.42.0", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", ] [[package]] name = "rustix" -version = "0.37.20" +version = "0.38.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" +checksum = "ac5ffa1efe7548069688cd7028f32591853cd7b5b756d41bcffd2353e4fc75b4" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno 0.3.1", - "io-lifetimes 1.0.11", "libc", - "linux-raw-sys 0.3.8", + "linux-raw-sys 0.4.3", "windows-sys 0.48.0", ] @@ -6475,9 +6584,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" [[package]] name = "rw-stream-sink" @@ -6492,9 +6601,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" [[package]] name = "safe-mix" @@ -6526,7 +6635,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -6537,7 +6646,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6546,8 +6655,8 @@ dependencies = [ "libp2p", "log", "parity-scale-codec", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "rand 0.7.3", "sc-client-api", "sc-network-common", @@ -6564,7 +6673,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -6587,7 +6696,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6603,7 +6712,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6612,7 +6721,7 @@ dependencies = [ "sc-network-common", "sc-telemetry", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-core", "sp-runtime", ] @@ -6620,7 +6729,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6631,13 +6740,13 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ + "array-bytes", "chrono", "clap", "fdlimit", "futures", - "hex", "libp2p", "log", "names", @@ -6649,12 +6758,13 @@ dependencies = [ "sc-client-db", "sc-keystore", "sc-network", + "sc-network-common", "sc-service", "sc-telemetry", "sc-tracing", "sc-utils", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-blockchain", "sp-core", "sp-keyring", @@ -6670,7 +6780,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fnv", "futures", @@ -6698,7 +6808,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "kvdb", @@ -6723,7 +6833,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6747,14 +6857,14 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "fork-tree", "futures", "log", "merlin", - "num-bigint", + "num-bigint 0.2.6", "num-rational 0.2.4", "num-traits", "parity-scale-codec", @@ -6789,7 +6899,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -6811,7 +6921,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6824,7 +6934,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6842,14 +6952,13 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-state-machine", - "sp-timestamp", "thiserror", ] [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sc-client-api", "sp-authorship", @@ -6860,7 +6969,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "lru", @@ -6887,7 +6996,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -6903,7 +7012,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -6918,16 +7027,15 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cfg-if", "libc", "log", "once_cell", "parity-scale-codec", - "parity-wasm 0.42.2", - "rustix 0.33.7", - "rustix 0.35.13", + "parity-wasm 0.45.0", + "rustix 0.35.14", "sc-allocator", "sc-executor-common", "sp-runtime-interface", @@ -6939,16 +7047,16 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", + "array-bytes", "async-trait", "dyn-clone", "finality-grandpa", "fork-tree", "futures", "futures-timer", - "hex", "log", "parity-scale-codec", "parking_lot 0.12.1", @@ -6963,7 +7071,7 @@ dependencies = [ "sc-network-gossip", "sc-telemetry", "sc-utils", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-api", "sp-application-crypto", "sp-arithmetic", @@ -6980,7 +7088,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "futures", @@ -6991,7 +7099,7 @@ dependencies = [ "sc-finality-grandpa", "sc-rpc", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-blockchain", "sp-core", "sp-runtime", @@ -7001,7 +7109,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7018,12 +7126,12 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ + "array-bytes", "async-trait", - "hex", "parking_lot 0.12.1", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-application-crypto", "sp-core", "sp-keystore", @@ -7033,11 +7141,12 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ + "array-bytes", "async-trait", "asynchronous-codec", - "bitflags", + "bitflags 1.3.2", "bytes", "cid", "either", @@ -7045,7 +7154,6 @@ dependencies = [ "fork-tree", "futures", "futures-timer", - "hex", "ip_network", "libp2p", "linked-hash-map", @@ -7055,8 +7163,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.12.1", "pin-project", - "prost", - "prost-build", + "prost 0.10.4", "rand 0.7.3", "sc-block-builder", "sc-client-api", @@ -7065,7 +7172,7 @@ dependencies = [ "sc-peerset", "sc-utils", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "smallvec", "sp-arithmetic", "sp-blockchain", @@ -7075,22 +7182,43 @@ dependencies = [ "substrate-prometheus-endpoint", "thiserror", "unsigned-varint", - "void", "zeroize", ] +[[package]] +name = "sc-network-bitswap" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "cid", + "futures", + "libp2p", + "log", + "prost 0.11.9", + "prost-build 0.11.9", + "sc-client-api", + "sc-network-common", + "sp-blockchain", + "sp-runtime", + "thiserror", + "unsigned-varint", + "void", +] + [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", - "bitflags", + "bitflags 1.3.2", "bytes", "futures", + "futures-timer", "libp2p", + "linked_hash_set", "parity-scale-codec", - "prost-build", + "prost-build 0.10.4", "sc-consensus", "sc-peerset", "serde", @@ -7099,13 +7227,14 @@ dependencies = [ "sp-consensus", "sp-finality-grandpa", "sp-runtime", + "substrate-prometheus-endpoint", "thiserror", ] [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "futures", @@ -7123,15 +7252,15 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ + "array-bytes", "futures", - "hex", "libp2p", "log", "parity-scale-codec", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "sc-client-api", "sc-network-common", "sc-peerset", @@ -7144,17 +7273,17 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ + "array-bytes", "fork-tree", "futures", - "hex", "libp2p", "log", "lru", "parity-scale-codec", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "sc-client-api", "sc-consensus", "sc-network-common", @@ -7169,16 +7298,35 @@ dependencies = [ "thiserror", ] +[[package]] +name = "sc-network-transactions" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "array-bytes", + "futures", + "hex", + "libp2p", + "log", + "parity-scale-codec", + "pin-project", + "sc-network-common", + "sc-peerset", + "sp-consensus", + "sp-runtime", + "substrate-prometheus-endpoint", +] + [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ + "array-bytes", "bytes", "fnv", "futures", "futures-timer", - "hex", "hyper", "hyper-rustls", "libp2p", @@ -7202,20 +7350,20 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libp2p", "log", "sc-utils", - "serde_json 1.0.99", + "serde_json 1.0.100", "wasm-timer", ] [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7224,7 +7372,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "hash-db", @@ -7239,7 +7387,7 @@ dependencies = [ "sc-tracing", "sc-transaction-pool-api", "sc-utils", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-api", "sp-blockchain", "sp-core", @@ -7254,7 +7402,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7265,7 +7413,7 @@ dependencies = [ "sc-transaction-pool-api", "scale-info", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-core", "sp-rpc", "sp-runtime", @@ -7277,12 +7425,12 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", "log", - "serde_json 1.0.99", + "serde_json 1.0.100", "substrate-prometheus-endpoint", "tokio", ] @@ -7290,7 +7438,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "directories", @@ -7314,9 +7462,11 @@ dependencies = [ "sc-informant", "sc-keystore", "sc-network", + "sc-network-bitswap", "sc-network-common", "sc-network-light", "sc-network-sync", + "sc-network-transactions", "sc-offchain", "sc-rpc", "sc-rpc-server", @@ -7327,7 +7477,7 @@ dependencies = [ "sc-transaction-pool-api", "sc-utils", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-api", "sp-application-crypto", "sp-block-builder", @@ -7346,6 +7496,7 @@ dependencies = [ "sp-transaction-storage-proof", "sp-trie", "sp-version", + "static_init", "substrate-prometheus-endpoint", "tempfile", "thiserror", @@ -7357,7 +7508,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7371,7 +7522,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7381,7 +7532,7 @@ dependencies = [ "sc-consensus-epochs", "sc-finality-grandpa", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-blockchain", "sp-runtime", "thiserror", @@ -7390,7 +7541,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libc", @@ -7400,7 +7551,7 @@ dependencies = [ "regex", "sc-telemetry", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-core", "sp-io", "sp-std", @@ -7409,7 +7560,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "chrono", "futures", @@ -7419,7 +7570,7 @@ dependencies = [ "pin-project", "rand 0.7.3", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "thiserror", "wasm-timer", ] @@ -7427,7 +7578,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7458,7 +7609,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7469,7 +7620,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -7495,7 +7646,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -7508,7 +7659,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -7520,9 +7671,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad560913365790f17cbf12479491169f01b9d46d29cfc7422bf8c64bdc61b731" +checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" dependencies = [ "bitvec", "cfg-if", @@ -7534,9 +7685,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19df9bd9ace6cc2fe19387c96ce677e823e07d017ceed253e7bb3d1d1bd9c73b" +checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7546,11 +7697,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys 0.48.0", ] [[package]] @@ -7595,6 +7746,7 @@ checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1" dependencies = [ "der", "generic-array 0.14.7", + "pkcs8", "subtle", "zeroize", ] @@ -7632,7 +7784,7 @@ version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -7684,22 +7836,22 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.164" +version = "1.0.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.164" +version = "1.0.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", ] [[package]] @@ -7714,11 +7866,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" +checksum = "0f1e14e89be7aa4c4b78bdbdc9eb5bf8517829a600ae8eaa39a6e1d960b5185c" dependencies = [ - "itoa 1.0.6", + "itoa 1.0.8", "ryu", "serde", ] @@ -7864,9 +8016,9 @@ checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "snap" @@ -7930,7 +8082,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -7948,7 +8100,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "proc-macro-crate", @@ -7960,7 +8112,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -7973,7 +8125,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "integer-sqrt", "num-traits", @@ -7988,7 +8140,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8001,7 +8153,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "parity-scale-codec", @@ -8013,7 +8165,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -8025,7 +8177,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -8043,7 +8195,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8062,7 +8214,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "merlin", @@ -8085,7 +8237,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8099,7 +8251,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8112,18 +8264,18 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ + "array-bytes", "base58", - "bitflags", - "blake2-rfc", + "bitflags 1.3.2", + "blake2", "byteorder", "dyn-clonable", "ed25519-zebra", "futures", "hash-db", "hash256-std-hasher", - "hex", "impl-serde", "lazy_static", "libsecp256k1", @@ -8158,7 +8310,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "byteorder", @@ -8172,7 +8324,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8183,7 +8335,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8192,7 +8344,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8202,7 +8354,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -8213,7 +8365,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "log", @@ -8231,7 +8383,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8245,7 +8397,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "futures", @@ -8271,7 +8423,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "sp-core", @@ -8282,7 +8434,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8299,7 +8451,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "thiserror", "zstd", @@ -8308,7 +8460,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8322,7 +8474,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-core", @@ -8332,7 +8484,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "backtrace", "lazy_static", @@ -8342,7 +8494,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "rustc-hash", "serde", @@ -8352,7 +8504,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "either", "hash256-std-hasher", @@ -8369,12 +8521,13 @@ dependencies = [ "sp-core", "sp-io", "sp-std", + "sp-weights", ] [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8392,7 +8545,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "proc-macro-crate", @@ -8404,7 +8557,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -8418,7 +8571,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8432,7 +8585,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8443,7 +8596,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8465,12 +8618,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8483,7 +8636,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -8496,7 +8649,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures-timer", @@ -8512,7 +8665,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-std", @@ -8524,7 +8677,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-runtime", @@ -8533,7 +8686,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "log", @@ -8549,11 +8702,11 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "hash-db", - "hashbrown 0.12.3", + "hashbrown", "lazy_static", "lru", "memory-db", @@ -8572,11 +8725,11 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", - "parity-wasm 0.42.2", + "parity-wasm 0.45.0", "scale-info", "serde", "sp-core-hashing-proc-macro", @@ -8589,7 +8742,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8600,7 +8753,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "log", @@ -8610,24 +8763,50 @@ dependencies = [ "wasmtime", ] +[[package]] +name = "sp-weights" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +dependencies = [ + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "serde", + "smallvec", + "sp-arithmetic", + "sp-core", + "sp-debug-derive", + "sp-std", +] + [[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spki" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "ss58-registry" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47a8ad42e5fc72d5b1eb104a5546937eaf39843499948bb666d6e93c62423b" +checksum = "bfc443bad666016e012538782d9e3006213a7db43e9fb1dda91657dc06a6fa08" dependencies = [ "Inflector", "num-format", "proc-macro2", "quote", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "unicode-xid", ] @@ -8643,6 +8822,34 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "static_init" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a2a1c578e98c1c16fc3b8ec1328f7659a500737d7a0c6d625e73e830ff9c1f6" +dependencies = [ + "bitflags 1.3.2", + "cfg_aliases", + "libc", + "parking_lot 0.11.2", + "parking_lot_core 0.8.6", + "static_init_macro", + "winapi", +] + +[[package]] +name = "static_init_macro" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf" +dependencies = [ + "cfg_aliases", + "memchr", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "statrs" version = "0.15.0" @@ -8700,7 +8907,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "platforms 2.0.0", ] @@ -8708,7 +8915,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -8718,7 +8925,7 @@ dependencies = [ "sc-client-api", "sc-rpc-api", "sc-transaction-pool-api", - "serde_json 1.0.99", + "serde_json 1.0.100", "sp-api", "sp-block-builder", "sp-blockchain", @@ -8729,7 +8936,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures-util", "hyper", @@ -8742,7 +8949,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "log", @@ -8763,7 +8970,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "substrate-test-utils-derive", @@ -8773,7 +8980,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8784,7 +8991,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -8817,9 +9024,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.22" +version = "2.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616" +checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2" dependencies = [ "proc-macro2", "quote", @@ -8844,7 +9051,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "system-configuration-sys", ] @@ -8881,7 +9088,7 @@ dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.20", + "rustix 0.37.23", "windows-sys 0.48.0", ] @@ -8902,22 +9109,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", ] [[package]] @@ -9003,9 +9210,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.29.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374442f06ee49c3a28a8fc9f01a2596fed7559c6b99b31279c3261778e77d84f" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", "backtrace", @@ -9014,7 +9221,7 @@ dependencies = [ "mio", "num_cpus", "parking_lot 0.12.1", - "pin-project-lite 0.2.9", + "pin-project-lite 0.2.10", "signal-hook-registry", "socket2 0.4.9", "tokio-macros", @@ -9029,7 +9236,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", ] [[package]] @@ -9050,7 +9257,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" dependencies = [ "futures-core", - "pin-project-lite 0.2.9", + "pin-project-lite 0.2.10", "tokio", ] @@ -9064,7 +9271,7 @@ dependencies = [ "futures-core", "futures-io", "futures-sink", - "pin-project-lite 0.2.9", + "pin-project-lite 0.2.10", "tokio", "tracing", ] @@ -9091,7 +9298,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", - "pin-project-lite 0.2.9", + "pin-project-lite 0.2.10", "tracing-attributes", "tracing-core", ] @@ -9104,7 +9311,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", ] [[package]] @@ -9161,7 +9368,7 @@ dependencies = [ "parking_lot 0.11.2", "regex", "serde", - "serde_json 1.0.99", + "serde_json 1.0.100", "sharded-slab", "smallvec", "thread_local", @@ -9178,7 +9385,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "004e1e8f92535694b4cb1444dc5a8073ecf0815e3357f729638b9f8fc4062908" dependencies = [ "hash-db", - "hashbrown 0.12.3", + "hashbrown", "log", "rustc-hex", "smallvec", @@ -9245,7 +9452,7 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.29#cc370aa61e15c18d23a2f686b812fd576a630afe" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "clap", "frame-try-runtime", @@ -9294,9 +9501,9 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "ucd-trie" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "uint" @@ -9327,9 +9534,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" [[package]] name = "unicode-normalization" @@ -9485,7 +9692,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", "wasm-bindgen-shared", ] @@ -9519,7 +9726,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -9543,11 +9750,11 @@ dependencies = [ [[package]] name = "wasm-instrument" -version = "0.1.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "962e5b0401bbb6c887f54e69b8c496ea36f704df65db73e81fd5ff8dc3e63a9f" +checksum = "aa1dafb3e60065305741e83db35c6c2584bb3725b692b5b66148a38d72ace6cd" dependencies = [ - "parity-wasm 0.42.2", + "parity-wasm 0.45.0", ] [[package]] @@ -9567,58 +9774,63 @@ dependencies = [ [[package]] name = "wasmi" -version = "0.9.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca00c5147c319a8ec91ec1a0edbec31e566ce2c9cc93b3f9bb86a9efd0eb795d" +checksum = "06c326c93fbf86419608361a2c925a31754cf109da1b8b55737070b4d6669422" dependencies = [ - "downcast-rs", - "libc", - "libm 0.2.7", - "memory_units", - "num-rational 0.2.4", - "num-traits", - "parity-wasm 0.42.2", + "parity-wasm 0.45.0", "wasmi-validation", + "wasmi_core", ] [[package]] name = "wasmi-validation" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165343ecd6c018fc09ebcae280752702c9a2ef3e6f8d02f1cfcbdb53ef6d7937" +checksum = "91ff416ad1ff0c42e5a926ed5d5fab74c0f098749aa0ad8b2a34b982ce0e867b" dependencies = [ - "parity-wasm 0.42.2", + "parity-wasm 0.45.0", +] + +[[package]] +name = "wasmi_core" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d20cb3c59b788653d99541c646c561c9dd26506f25c0cebfe810659c54c6d7" +dependencies = [ + "downcast-rs", + "libm 0.2.7", + "memory_units", + "num-rational 0.4.1", + "num-traits", ] [[package]] name = "wasmparser" -version = "0.85.0" +version = "0.89.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570460c58b21e9150d2df0eaaedbb7816c34bcec009ae0dcc976e40ba81463e7" +checksum = "ab5d3e08b13876f96dd55608d03cd4883a0545884932d5adf11925876c96daef" dependencies = [ "indexmap", ] [[package]] name = "wasmtime" -version = "0.38.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f50eadf868ab6a04b7b511460233377d0bfbb92e417b2f6a98b98fef2e098f5" +checksum = "4ad5af6ba38311282f2a21670d96e78266e8c8e2f38cbcd52c254df6ccbc7731" dependencies = [ "anyhow", - "backtrace", "bincode", "cfg-if", "indexmap", - "lazy_static", "libc", "log", - "object 0.28.4", + "object 0.29.0", "once_cell", "paste", "psm", "rayon", - "region", "serde", "target-lexicon", "wasmparser", @@ -9627,14 +9839,23 @@ dependencies = [ "wasmtime-environ", "wasmtime-jit", "wasmtime-runtime", - "winapi", + "windows-sys 0.36.1", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45de63ddfc8b9223d1adc8f7b2ee5f35d1f6d112833934ad7ea66e4f4339e597" +dependencies = [ + "cfg-if", ] [[package]] name = "wasmtime-cache" -version = "0.38.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1df23c642e1376892f3b72f311596976979cbf8b85469680cdd3a8a063d12a2" +checksum = "bcd849399d17d2270141cfe47fa0d91ee52d5f8ea9b98cf7ddde0d53e5f79882" dependencies = [ "anyhow", "base64 0.13.1", @@ -9642,19 +9863,19 @@ dependencies = [ "directories-next", "file-per-thread-logger", "log", - "rustix 0.33.7", + "rustix 0.35.14", "serde", "sha2 0.9.9", "toml", - "winapi", + "windows-sys 0.36.1", "zstd", ] [[package]] name = "wasmtime-cranelift" -version = "0.38.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f264ff6b4df247d15584f2f53d009fbc90032cfdc2605b52b961bffc71b6eccd" +checksum = "4bd91339b742ff20bfed4532a27b73c86b5bcbfedd6bea2dcdf2d64471e1b5c6" dependencies = [ "anyhow", "cranelift-codegen", @@ -9664,8 +9885,7 @@ dependencies = [ "cranelift-wasm", "gimli 0.26.2", "log", - "more-asserts", - "object 0.28.4", + "object 0.29.0", "target-lexicon", "thiserror", "wasmparser", @@ -9674,17 +9894,16 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "0.38.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "839d2820e4b830f4b9e7aa08d4c0acabf4a5036105d639f6dfa1c6891c73bdc6" +checksum = "ebb881c61f4f627b5d45c54e629724974f8a8890d455bcbe634330cc27309644" dependencies = [ "anyhow", "cranelift-entity", "gimli 0.26.2", "indexmap", "log", - "more-asserts", - "object 0.28.4", + "object 0.29.0", "serde", "target-lexicon", "thiserror", @@ -9694,9 +9913,9 @@ dependencies = [ [[package]] name = "wasmtime-jit" -version = "0.38.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef0a0bcbfa18b946d890078ba0e1bc76bcc53eccfb40806c0020ec29dcd1bd49" +checksum = "1985c628011fe26adf5e23a5301bdc79b245e0e338f14bb58b39e4e25e4d8681" dependencies = [ "addr2line 0.17.0", "anyhow", @@ -9705,38 +9924,36 @@ dependencies = [ "cpp_demangle", "gimli 0.26.2", "log", - "object 0.28.4", - "region", + "object 0.29.0", "rustc-demangle", - "rustix 0.33.7", + "rustix 0.35.14", "serde", "target-lexicon", "thiserror", "wasmtime-environ", "wasmtime-jit-debug", "wasmtime-runtime", - "winapi", + "windows-sys 0.36.1", ] [[package]] name = "wasmtime-jit-debug" -version = "0.38.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4779d976206c458edd643d1ac622b6c37e4a0800a8b1d25dfbf245ac2f2cac" +checksum = "f671b588486f5ccec8c5a3dba6b4c07eac2e66ab8c60e6f4e53717c77f709731" dependencies = [ - "lazy_static", - "object 0.28.4", - "rustix 0.33.7", + "object 0.29.0", + "once_cell", + "rustix 0.35.14", ] [[package]] name = "wasmtime-runtime" -version = "0.38.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7eb6ffa169eb5dcd18ac9473c817358cd57bc62c244622210566d473397954a" +checksum = "ee8f92ad4b61736339c29361da85769ebc200f184361959d1792832e592a1afd" dependencies = [ "anyhow", - "backtrace", "cc", "cfg-if", "indexmap", @@ -9745,21 +9962,21 @@ dependencies = [ "mach", "memfd", "memoffset 0.6.5", - "more-asserts", + "paste", "rand 0.8.5", - "region", - "rustix 0.33.7", + "rustix 0.35.14", "thiserror", + "wasmtime-asm-macros", "wasmtime-environ", "wasmtime-jit-debug", - "winapi", + "windows-sys 0.36.1", ] [[package]] name = "wasmtime-types" -version = "0.38.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d932b0ac5336f7308d869703dd225610a6a3aeaa8e968c52b43eed96cefb1c2" +checksum = "d23d61cb4c46e837b431196dd06abb11731541021916d03476a178b54dc07aeb" dependencies = [ "cranelift-entity", "serde", @@ -9866,6 +10083,19 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + [[package]] name = "windows-sys" version = "0.42.0" @@ -9892,9 +10122,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm 0.48.0", "windows_aarch64_msvc 0.48.0", @@ -9923,6 +10153,12 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -9941,6 +10177,12 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -9959,6 +10201,12 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -9977,6 +10225,12 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -10007,6 +10261,12 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -10080,7 +10340,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.25", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index ae62d4a9f..7be78ede0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,17 +5,17 @@ path = "src/main.rs" [package] name = "cere" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" -version = "4.7.0" +version = "4.8.0" edition = "2021" build = "build.rs" [dependencies] cere-cli = { path = "cli", features = [ "cere-dev-native" ] } -sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } +sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } ss58-registry = { version = "1.38.0", default-features = false } [build-dependencies] -substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [workspace] members = [ diff --git a/Dockerfile b/Dockerfile index 6e3fd1bb8..543bc86f6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,26 +1,66 @@ -FROM phusion/baseimage:0.11 as builder +FROM phusion/baseimage:jammy-1.0.1 as builder LABEL maintainer="team@cere.network" LABEL description="This is the build stage to create the binary." ARG PROFILE=release WORKDIR /cerenetwork COPY . /cerenetwork -RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y cmake pkg-config libssl-dev git clang +RUN apt-get -qq update && \ + apt-get -qq install -y \ + clang \ + cmake \ + git \ + libpq-dev \ + libssl-dev \ + pkg-config \ + unzip \ + wget + +# Configure sccache +ENV SCCACHE_VERSION=0.5.4 +RUN wget -q https://github.com/mozilla/sccache/releases/download/v${SCCACHE_VERSION}/sccache-v${SCCACHE_VERSION}-x86_64-unknown-linux-musl.tar.gz \ + -O - | tar -xz \ + && mv sccache-v${SCCACHE_VERSION}-x86_64-unknown-linux-musl/sccache /usr/local/bin/sccache \ + && chmod +x /usr/local/bin/sccache \ + && rm -rf sccache-v${SCCACHE_VERSION}-x86_64-unknown-linux-musl +ENV RUSTC_WRAPPER=/usr/local/bin/sccache + +# Installation script is taken from https://grpc.io/docs/protoc-installation/ +ENV PROTOC_VERSION=3.15.8 +RUN PB_REL="https://github.com/protocolbuffers/protobuf/releases" && \ + curl -sLO $PB_REL/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-x86_64.zip && \ + mkdir -p /usr/local/protoc && \ + unzip protoc-${PROTOC_VERSION}-linux-x86_64.zip -d /usr/local/protoc && \ + chmod +x /usr/local/protoc/bin/protoc && \ + ln -s /usr/local/protoc/bin/protoc /usr/local/bin + +ARG AWS_ACCESS_KEY_ID +ARG AWS_SECRET_ACCESS_KEY +ARG AWS_SESSION_TOKEN +ARG SCCACHE_REGION=us-west-2 +ARG SCCACHE_BUCKET=cere-blockchain-sccache +ENV \ + AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ + AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ + AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \ + AWS_REGION=$SCCACHE_REGION \ + SCCACHE_REGION=$SCCACHE_REGION \ + SCCACHE_BUCKET=$SCCACHE_BUCKET \ + SCCACHE_S3_USE_SSL=true + RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ export PATH=$PATH:$HOME/.cargo/bin && \ scripts/init.sh && \ cargo build --locked --$PROFILE # ===== SECOND STAGE ====== -FROM phusion/baseimage:0.11 +FROM phusion/baseimage:jammy-1.0.1 LABEL maintainer="team@cere.network" LABEL description="This is the optimization to create a small image." ARG PROFILE=release COPY --from=builder /cerenetwork/target/$PROFILE/cere /usr/local/bin -COPY --from=builder /cerenetwork/target/release/wbuild/cere-runtime /home/cere/cere-runtime-artifacts -COPY --from=builder /cerenetwork/target/release/wbuild/cere-dev-runtime /home/cere/cere-dev-runtime-artifacts +COPY --from=builder /cerenetwork/target/$PROFILE/wbuild/cere-runtime /home/cere/cere-runtime-artifacts +COPY --from=builder /cerenetwork/target/$PROFILE/wbuild/cere-dev-runtime /home/cere/cere-dev-runtime-artifacts RUN mv /usr/share/ca* /tmp && \ rm -rf /usr/share/* && \ @@ -31,6 +71,7 @@ RUN mv /usr/share/ca* /tmp && \ mkdir -p /cerenetwork/.local/share/cere && \ chown -R cerenetwork:cerenetwork /cerenetwork/.local && \ ln -s /cerenetwork/.local/share/cere /data && \ + mv -t /usr/local/bin /usr/bin/bash /usr/bin/sh && \ rm -rf /usr/bin /usr/sbin USER cerenetwork diff --git a/Dockerfile.tests b/Dockerfile.tests index 56bba2fed..23c25292b 100644 --- a/Dockerfile.tests +++ b/Dockerfile.tests @@ -17,7 +17,17 @@ COPY --from=ddc-smart-contract /ddc-smart-contract/artifacts/metadata.json /cere RUN apt-get update && \ apt-get upgrade -y && \ - apt-get install -y cmake pkg-config libssl-dev git clang + apt-get install -y cmake pkg-config libssl-dev git clang unzip + +# Installation script is taken from https://grpc.io/docs/protoc-installation/ +ENV PROTOC_VERSION=3.15.8 +RUN PB_REL="https://github.com/protocolbuffers/protobuf/releases" && \ + curl -LO $PB_REL/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-x86_64.zip && \ + mkdir -p /usr/local/protoc && \ + unzip protoc-${PROTOC_VERSION}-linux-x86_64.zip -d /usr/local/protoc && \ + chmod +x /usr/local/protoc/bin/protoc && \ + ln -s /usr/local/protoc/bin/protoc /usr/local/bin + RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ export PATH=$PATH:$HOME/.cargo/bin && \ scripts/init.sh && \ diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 87bb9c571..4d1fe40d0 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-cli" -version = "4.7.0" +version = "4.8.0" edition = "2021" [package.metadata.wasm-pack.profile.release] @@ -13,17 +13,17 @@ crate-type = ["cdylib", "rlib"] [dependencies] clap = { version = "3.1", features = ["derive"], optional = true } -sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.29" } -sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.29" } -frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.29" } -try-runtime-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true , branch = "polkadot-v0.9.29" } +sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } +sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } +frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } +try-runtime-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true , branch = "polkadot-v0.9.30" } # Local cere-service = { path = "../node/service", default-features = false, optional = true } cere-client = { path = "../node/client", optional = true } [build-dependencies] -substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } +substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } [features] default = ["cli", "cere-native"] diff --git a/cli/src/command.rs b/cli/src/command.rs index b2e88f2f9..5884387bc 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -40,7 +40,7 @@ impl SubstrateCli for Cli { #[cfg(feature = "cere-dev-native")] "dev" => Box::new(cere_service::chain_spec::cere_dev_development_config()?), #[cfg(feature = "cere-dev-native")] - "local" => Box::new(cere_service::chain_spec::cere_dev_local_testnet_config()?), + "local" => Box::new(cere_service::chain_spec::cere_dev_local_testnet_config()?), path => { let path = std::path::PathBuf::from(path); @@ -181,6 +181,11 @@ pub fn run() -> sc_cli::Result<()> { let (client, _, _, _) = cere_service::new_chain_ops(&config)?; unwrap_client!(client, cmd.run(client.clone())) }), + #[cfg(not(feature = "runtime-benchmarks"))] + BenchmarkCmd::Storage(_) => + Err("Storage benchmarking can be enabled with `--features runtime-benchmarks`." + .into()), + #[cfg(feature = "runtime-benchmarks")] BenchmarkCmd::Storage(cmd) => runner.sync_run(|config| { let (client, backend, _, _) = cere_service::new_chain_ops(&config)?; let db = backend.expose_db(); diff --git a/node/client/Cargo.toml b/node/client/Cargo.toml index 9538f143e..eb4f2be13 100644 --- a/node/client/Cargo.toml +++ b/node/client/Cargo.toml @@ -1,36 +1,36 @@ [package] name = "cere-client" -version = "4.7.0" +version = "4.8.0" edition = "2021" [dependencies] -sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.29" } -sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -frame-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-offchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-storage = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sp-inherents = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-keyring = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } +sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } +sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-offchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-storage = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-inherents = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-keyring = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } # Local cere-runtime = { path = "../../runtime/cere", optional = true } diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index 276ece98a..65c79d982 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-service" -version = "4.7.0" +version = "4.8.0" edition = "2021" [dependencies] @@ -10,39 +10,39 @@ rand = "0.8" futures = "0.3.21" jsonrpsee = { version = "0.15.1", features = ["server"] } -sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", features = ["wasmtime"] } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", features = ["wasmtime"] } -sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", features = ["wasmtime"] } -sc-telemetry = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-sysinfo = { version = "6.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-consensus-slots = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-consensus-uncles = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-authority-discovery = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-network = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-network-common = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sp-transaction-storage-proof = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-authorship = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-basic-authorship = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-trie = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } +sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } +sc-telemetry = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-sysinfo = { version = "6.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus-slots = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus-uncles = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-authority-discovery = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-network = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-network-common = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-transaction-storage-proof = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-authorship = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-basic-authorship = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-trie = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } # Local cere-client = { path = "../client", default-features = false, optional = true } @@ -63,6 +63,7 @@ cere-dev-native = [ "cere-dev-runtime", "cere-dev-runtime-constants", "cere-clie runtime-benchmarks = [ "cere-runtime/runtime-benchmarks", "cere-dev-runtime/runtime-benchmarks", + "sc-service/runtime-benchmarks", ] try-runtime = [ diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index ebcbd8a37..fbfc8bc6a 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -193,6 +193,7 @@ pub fn cere_dev_genesis( stakers, ..Default::default() }, + ddc_staking: cere_dev::DdcStakingConfig::default(), democracy: cere_dev::DemocracyConfig::default(), elections: cere_dev::ElectionsConfig { members: endowed_accounts diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index d8b3c7407..8a84ed755 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -6,7 +6,7 @@ pub use cere_dev_runtime; pub use cere_runtime; use futures::prelude::*; -use sc_client_api::{BlockBackend, ExecutorProvider}; +use sc_client_api::BlockBackend; use sc_consensus_babe::{self, SlotProportion}; use sc_network::Event; use sc_service::{ @@ -26,9 +26,9 @@ pub use cere_client::{ pub use chain_spec::{CereChainSpec, CereDevChainSpec}; pub use node_primitives::{Block, BlockNumber}; pub use sc_executor::NativeElseWasmExecutor; +use sc_network_common::service::NetworkEventStream; pub use sc_service::ChainSpec; pub use sp_api::ConstructRuntimeApi; -use sc_network_common::{service::NetworkEventStream}; type FullSelectChain = sc_consensus::LongestChain; type FullGrandpaBlockImport = sc_finality_grandpa::GrandpaBlockImport< @@ -195,11 +195,10 @@ where let uncles = sp_authorship::InherentDataProvider::<::Header>::check_inherents(); - Ok((timestamp, slot, uncles)) + Ok((slot, timestamp, uncles)) }, &task_manager.spawn_essential_handle(), config.prometheus_registry(), - sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()), telemetry.as_ref().map(|x| x.handle()), )?; @@ -376,7 +375,7 @@ where Vec::default(), )); - let (network, system_rpc_tx, network_starter) = + let (network, system_rpc_tx, tx_handler_controller, network_starter) = sc_service::build_network(sc_service::BuildNetworkParams { config: &config, client: client.clone(), @@ -414,6 +413,7 @@ where transaction_pool: transaction_pool.clone(), task_manager: &mut task_manager, system_rpc_tx, + tx_handler_controller, telemetry: telemetry.as_mut(), })?; @@ -443,9 +443,6 @@ where telemetry.as_ref().map(|x| x.handle()), ); - let can_author_with = - sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()); - let client_clone = client.clone(); let slot_duration = babe_link.config().slot_duration(); let babe_config = sc_consensus_babe::BabeParams { @@ -478,13 +475,12 @@ where &parent, )?; - Ok((timestamp, slot, uncles, storage_proof)) + Ok((slot, timestamp, uncles, storage_proof)) } }, force_authoring, backoff_authoring_blocks, babe_link, - can_author_with, block_proposal_slot_portion: SlotProportion::new(0.5), max_block_proposal_slot_portion: None, telemetry: telemetry.as_ref().map(|x| x.handle()), @@ -645,12 +641,15 @@ pub trait IdentifyVariant { impl IdentifyVariant for Box { fn is_cere(&self) -> bool { - self.id().starts_with("cere_mainnet") || self.id().starts_with("cere_qanet") || self.id().starts_with("cere_testnet") + self.id().starts_with("cere_mainnet") || + self.id().starts_with("cere_qanet") || + self.id().starts_with("cere_testnet") } fn is_cere_dev(&self) -> bool { // Works for "cere-devnet" and "dev" arms in the load_spec(...) call. - // If you are specifying a customSpecRaw.json for "path" arm along with the "--force-cere-dev" flag, - // make sure your spec has a compatible "id" field to satisfy this condition + // If you are specifying a customSpecRaw.json for "path" arm along with the + // "--force-cere-dev" flag, make sure your spec has a compatible "id" field to satisfy this + // condition self.id().starts_with("cere_dev") } } diff --git a/pallets/chainbridge/Cargo.toml b/pallets/chainbridge/Cargo.toml index 9528fb3bc..b1f2b953a 100644 --- a/pallets/chainbridge/Cargo.toml +++ b/pallets/chainbridge/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-chainbridge" -version = "4.7.0" +version = "4.8.0" authors = ["Parity Technologies "] edition = "2021" license = "Unlicense" @@ -14,18 +14,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } lite-json = { version = "0.2.0", default-features = false } -sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } [features] default = ["std"] diff --git a/pallets/chainbridge/src/lib.rs b/pallets/chainbridge/src/lib.rs index 6a7d57c68..512c0a9c2 100644 --- a/pallets/chainbridge/src/lib.rs +++ b/pallets/chainbridge/src/lib.rs @@ -1,27 +1,30 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::marker::PhantomData; +use codec::{Decode, Encode, EncodeLike}; use frame_support::{ - dispatch::{DispatchResult}, decl_module, decl_storage, decl_event, decl_error, - weights::{DispatchClass, ClassifyDispatch, WeighData, Weight, PaysFee, Pays, GetDispatchInfo}, + decl_error, decl_event, decl_module, decl_storage, + dispatch::{ + ClassifyDispatch, DispatchClass, DispatchResult, GetDispatchInfo, Pays, PaysFee, WeighData, + Weight, + }, ensure, traits::{EnsureOrigin, Get}, - Parameter, PalletId + PalletId, Parameter, }; -use sp_std::prelude::*; -use frame_system::{self as system, ensure_signed, ensure_root}; +use frame_system::{self as system, ensure_root, ensure_signed}; use sp_core::U256; -use codec::{Encode, Decode, EncodeLike}; use sp_runtime::{ traits::{ - SignedExtension, Bounded, SaturatedConversion, DispatchInfoOf, AccountIdConversion, Dispatchable, + AccountIdConversion, Bounded, DispatchInfoOf, Dispatchable, SaturatedConversion, + SignedExtension, }, transaction_validity::{ - ValidTransaction, TransactionValidityError, InvalidTransaction, TransactionValidity, + InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction, }, - RuntimeDebug, + RuntimeDebug, }; +use sp_std::{marker::PhantomData, prelude::*}; mod mock; mod tests; @@ -36,118 +39,121 @@ pub type ResourceId = [u8; 32]; /// Helper function to concatenate a chain ID and some bytes to produce a resource ID. /// The common format is (31 bytes unique ID + 1 byte chain ID). pub fn derive_resource_id(chain: u8, id: &[u8]) -> ResourceId { - let mut r_id: ResourceId = [0; 32]; - r_id[31] = chain; // last byte is chain id - let range = if id.len() > 31 { 31 } else { id.len() }; // Use at most 31 bytes - for i in 0..range { - r_id[30 - i] = id[range - 1 - i]; // Ensure left padding for eth compatibility - } - return r_id; + let mut r_id: ResourceId = [0; 32]; + r_id[31] = chain; // last byte is chain id + let range = if id.len() > 31 { 31 } else { id.len() }; // Use at most 31 bytes + for i in 0..range { + r_id[30 - i] = id[range - 1 - i]; // Ensure left padding for eth compatibility + } + return r_id } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, scale_info::TypeInfo)] pub enum ProposalStatus { - Initiated, - Approved, - Rejected, + Initiated, + Approved, + Rejected, } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, scale_info::TypeInfo)] pub struct ProposalVotes { - pub votes_for: Vec, - pub votes_against: Vec, - pub status: ProposalStatus, - pub expiry: BlockNumber, + pub votes_for: Vec, + pub votes_against: Vec, + pub status: ProposalStatus, + pub expiry: BlockNumber, } impl ProposalVotes { - /// Attempts to mark the proposal as approve or rejected. - /// Returns true if the status changes from active. - fn try_to_complete(&mut self, threshold: u32, total: u32) -> ProposalStatus { - if self.votes_for.len() >= threshold as usize { - self.status = ProposalStatus::Approved; - ProposalStatus::Approved - } else if total >= threshold && self.votes_against.len() as u32 + threshold > total { - self.status = ProposalStatus::Rejected; - ProposalStatus::Rejected - } else { - ProposalStatus::Initiated - } - } - - /// Returns true if the proposal has been rejected or approved, otherwise false. - fn is_complete(&self) -> bool { - self.status != ProposalStatus::Initiated - } - - /// Returns true if `who` has voted for or against the proposal - fn has_voted(&self, who: &A) -> bool { - self.votes_for.contains(&who) || self.votes_against.contains(&who) - } - - /// Return true if the expiry time has been reached - fn is_expired(&self, now: B) -> bool { - self.expiry <= now - } + /// Attempts to mark the proposal as approve or rejected. + /// Returns true if the status changes from active. + fn try_to_complete(&mut self, threshold: u32, total: u32) -> ProposalStatus { + if self.votes_for.len() >= threshold as usize { + self.status = ProposalStatus::Approved; + ProposalStatus::Approved + } else if total >= threshold && self.votes_against.len() as u32 + threshold > total { + self.status = ProposalStatus::Rejected; + ProposalStatus::Rejected + } else { + ProposalStatus::Initiated + } + } + + /// Returns true if the proposal has been rejected or approved, otherwise false. + fn is_complete(&self) -> bool { + self.status != ProposalStatus::Initiated + } + + /// Returns true if `who` has voted for or against the proposal + fn has_voted(&self, who: &A) -> bool { + self.votes_for.contains(&who) || self.votes_against.contains(&who) + } + + /// Return true if the expiry time has been reached + fn is_expired(&self, now: B) -> bool { + self.expiry <= now + } } impl Default for ProposalVotes { - fn default() -> Self { - Self { - votes_for: vec![], - votes_against: vec![], - status: ProposalStatus::Initiated, - expiry: BlockNumber::default(), - } - } + fn default() -> Self { + Self { + votes_for: vec![], + votes_against: vec![], + status: ProposalStatus::Initiated, + expiry: BlockNumber::default(), + } + } } pub trait Config: system::Config { - type Event: From> + Into<::Event>; - /// Origin used to administer the pallet - type AdminOrigin: EnsureOrigin; - /// Proposed dispatchable call - type Proposal: Parameter + Dispatchable + EncodeLike + GetDispatchInfo; - /// The identifier for this chain. - /// This must be unique and must not collide with existing IDs within a set of bridged chains. - type ChainId: Get; - - type ProposalLifetime: Get; + type RuntimeEvent: From> + Into<::RuntimeEvent>; + /// Origin used to administer the pallet + type AdminOrigin: EnsureOrigin; + /// Proposed dispatchable call + type Proposal: Parameter + + Dispatchable + + EncodeLike + + GetDispatchInfo; + /// The identifier for this chain. + /// This must be unique and must not collide with existing IDs within a set of bridged chains. + type ChainId: Get; + + type ProposalLifetime: Get; } decl_error! { - pub enum Error for Module { - /// Relayer threshold not set - ThresholdNotSet, - /// Provided chain Id is not valid - InvalidChainId, - /// Relayer threshold cannot be 0 - InvalidThreshold, - /// Interactions with this chain is not permitted - ChainNotWhitelisted, - /// Chain has already been enabled - ChainAlreadyWhitelisted, - /// Resource ID provided isn't mapped to anything - ResourceDoesNotExist, - /// Relayer already in set - RelayerAlreadyExists, - /// Provided accountId is not a relayer - RelayerInvalid, - /// Protected operation, must be performed by relayer - MustBeRelayer, - /// Relayer has already submitted some vote for this proposal - RelayerAlreadyVoted, - /// A proposal with these parameters has already been submitted - ProposalAlreadyExists, - /// No proposal with the ID was found - ProposalDoesNotExist, - /// Cannot complete proposal, needs more votes - ProposalNotComplete, - /// Proposal has either failed or succeeded - ProposalAlreadyComplete, - /// Lifetime of proposal has been exceeded - ProposalExpired, - } + pub enum Error for Module { + /// Relayer threshold not set + ThresholdNotSet, + /// Provided chain Id is not valid + InvalidChainId, + /// Relayer threshold cannot be 0 + InvalidThreshold, + /// Interactions with this chain is not permitted + ChainNotWhitelisted, + /// Chain has already been enabled + ChainAlreadyWhitelisted, + /// Resource ID provided isn't mapped to anything + ResourceDoesNotExist, + /// Relayer already in set + RelayerAlreadyExists, + /// Provided accountId is not a relayer + RelayerInvalid, + /// Protected operation, must be performed by relayer + MustBeRelayer, + /// Relayer has already submitted some vote for this proposal + RelayerAlreadyVoted, + /// A proposal with these parameters has already been submitted + ProposalAlreadyExists, + /// No proposal with the ID was found + ProposalDoesNotExist, + /// Cannot complete proposal, needs more votes + ProposalNotComplete, + /// Proposal has either failed or succeeded + ProposalAlreadyComplete, + /// Lifetime of proposal has been exceeded + ProposalExpired, + } } decl_storage! { @@ -178,461 +184,427 @@ decl_storage! { decl_event!( pub enum Event where ::AccountId { - /// Vote threshold has changed (new_threshold) - RelayerThresholdChanged(u32), - /// Chain now available for transfers (chain_id) - ChainWhitelisted(ChainId), - /// Relayer added to set - RelayerAdded(AccountId), - /// Relayer removed from set - RelayerRemoved(AccountId), - /// FunglibleTransfer is for relaying fungibles (dest_id, nonce, resource_id, amount, recipient, metadata) - FungibleTransfer(ChainId, DepositNonce, ResourceId, U256, Vec), - /// NonFungibleTransfer is for relaying NFTS (dest_id, nonce, resource_id, token_id, recipient, metadata) - NonFungibleTransfer(ChainId, DepositNonce, ResourceId, Vec, Vec, Vec), - /// GenericTransfer is for a generic data payload (dest_id, nonce, resource_id, metadata) - GenericTransfer(ChainId, DepositNonce, ResourceId, Vec), - /// Vote submitted in favour of proposal - VoteFor(ChainId, DepositNonce, AccountId), - /// Vot submitted against proposal - VoteAgainst(ChainId, DepositNonce, AccountId), - /// Voting successful for a proposal - ProposalApproved(ChainId, DepositNonce), - /// Voting rejected a proposal - ProposalRejected(ChainId, DepositNonce), - /// Execution of call succeeded - ProposalSucceeded(ChainId, DepositNonce), - /// Execution of call failed - ProposalFailed(ChainId, DepositNonce), - } + /// Vote threshold has changed (new_threshold) + RelayerThresholdChanged(u32), + /// Chain now available for transfers (chain_id) + ChainWhitelisted(ChainId), + /// Relayer added to set + RelayerAdded(AccountId), + /// Relayer removed from set + RelayerRemoved(AccountId), + /// FunglibleTransfer is for relaying fungibles (dest_id, nonce, resource_id, amount, recipient, metadata) + FungibleTransfer(ChainId, DepositNonce, ResourceId, U256, Vec), + /// NonFungibleTransfer is for relaying NFTS (dest_id, nonce, resource_id, token_id, recipient, metadata) + NonFungibleTransfer(ChainId, DepositNonce, ResourceId, Vec, Vec, Vec), + /// GenericTransfer is for a generic data payload (dest_id, nonce, resource_id, metadata) + GenericTransfer(ChainId, DepositNonce, ResourceId, Vec), + /// Vote submitted in favour of proposal + VoteFor(ChainId, DepositNonce, AccountId), + /// Vot submitted against proposal + VoteAgainst(ChainId, DepositNonce, AccountId), + /// Voting successful for a proposal + ProposalApproved(ChainId, DepositNonce), + /// Voting rejected a proposal + ProposalRejected(ChainId, DepositNonce), + /// Execution of call succeeded + ProposalSucceeded(ChainId, DepositNonce), + /// Execution of call failed + ProposalFailed(ChainId, DepositNonce), + } ); decl_module! { - pub struct Module for enum Call where origin: T::Origin { - type Error = Error; - - const ChainIdentity: ChainId = T::ChainId::get(); - const ProposalLifetime: T::BlockNumber = T::ProposalLifetime::get(); - const BridgeAccountId: T::AccountId = AccountIdConversion::::into_account_truncating(&MODULE_ID); - - fn deposit_event() = default; - - /// Sets the vote threshold for proposals. - /// - /// This threshold is used to determine how many votes are required - /// before a proposal is executed. - /// - /// # - /// - O(1) lookup and insert - /// # - #[weight = 195_000_000] - pub fn set_threshold(origin, threshold: u32) -> DispatchResult { - Self::ensure_admin(origin)?; - Self::set_relayer_threshold(threshold) - } - - /// Stores a method name on chain under an associated resource ID. - /// - /// # - /// - O(1) write - /// # - #[weight = 195_000_000] - pub fn set_resource(origin, id: ResourceId, method: Vec) -> DispatchResult { - Self::ensure_admin(origin)?; - Self::register_resource(id, method) - } - - /// Removes a resource ID from the resource mapping. - /// - /// After this call, bridge transfers with the associated resource ID will - /// be rejected. - /// - /// # - /// - O(1) removal - /// # - #[weight = 195_000_000] - pub fn remove_resource(origin, id: ResourceId) -> DispatchResult { - Self::ensure_admin(origin)?; - Self::unregister_resource(id) - } - - /// Enables a chain ID as a source or destination for a bridge transfer. - /// - /// # - /// - O(1) lookup and insert - /// # - #[weight = 195_000_000] - pub fn whitelist_chain(origin, id: ChainId) -> DispatchResult { - Self::ensure_admin(origin)?; - Self::whitelist(id) - } - - /// Adds a new relayer to the relayer set. - /// - /// # - /// - O(1) lookup and insert - /// # - #[weight = 195_000_000] - pub fn add_relayer(origin, v: T::AccountId) -> DispatchResult { - Self::ensure_admin(origin)?; - Self::register_relayer(v) - } - - /// Removes an existing relayer from the set. - /// - /// # - /// - O(1) lookup and removal - /// # - #[weight = 195_000_000] - pub fn remove_relayer(origin, v: T::AccountId) -> DispatchResult { - Self::ensure_admin(origin)?; - Self::unregister_relayer(v) - } - - /// Commits a vote in favour of the provided proposal. - /// - /// If a proposal with the given nonce and source chain ID does not already exist, it will - /// be created with an initial vote in favour from the caller. - /// - /// # - /// - weight of proposed call, regardless of whether execution is performed - /// # - #[weight = (call.get_dispatch_info().weight + Weight::from_ref_time(195_000_000 as u64), call.get_dispatch_info().class, Pays::Yes)] - pub fn acknowledge_proposal(origin, nonce: DepositNonce, src_id: ChainId, r_id: ResourceId, call: Box<::Proposal>) -> DispatchResult { - let who = ensure_signed(origin)?; - ensure!(Self::is_relayer(&who), Error::::MustBeRelayer); - ensure!(Self::chain_whitelisted(src_id), Error::::ChainNotWhitelisted); - ensure!(Self::resource_exists(r_id), Error::::ResourceDoesNotExist); - - Self::vote_for(who, nonce, src_id, call) - } - - /// Commits a vote against a provided proposal. - /// - /// # - /// - Fixed, since execution of proposal should not be included - /// # - #[weight = 195_000_000] - pub fn reject_proposal(origin, nonce: DepositNonce, src_id: ChainId, r_id: ResourceId, call: Box<::Proposal>) -> DispatchResult { - let who = ensure_signed(origin)?; - ensure!(Self::is_relayer(&who), Error::::MustBeRelayer); - ensure!(Self::chain_whitelisted(src_id), Error::::ChainNotWhitelisted); - ensure!(Self::resource_exists(r_id), Error::::ResourceDoesNotExist); - - Self::vote_against(who, nonce, src_id, call) - } - - /// Evaluate the state of a proposal given the current vote threshold. - /// - /// A proposal with enough votes will be either executed or cancelled, and the status - /// will be updated accordingly. - /// - /// # - /// - weight of proposed call, regardless of whether execution is performed - /// # - #[weight = (prop.get_dispatch_info().weight + Weight::from_ref_time(195_000_000 as u64), prop.get_dispatch_info().class, Pays::Yes)] - pub fn eval_vote_state(origin, nonce: DepositNonce, src_id: ChainId, prop: Box<::Proposal>) -> DispatchResult { - ensure_signed(origin)?; - - Self::try_resolve_proposal(nonce, src_id, prop) - } - } + pub struct Module for enum Call where origin: T::RuntimeOrigin { + type Error = Error; + + const ChainIdentity: ChainId = T::ChainId::get(); + const ProposalLifetime: T::BlockNumber = T::ProposalLifetime::get(); + const BridgeAccountId: T::AccountId = AccountIdConversion::::into_account_truncating(&MODULE_ID); + + fn deposit_event() = default; + + /// Sets the vote threshold for proposals. + /// + /// This threshold is used to determine how many votes are required + /// before a proposal is executed. + /// + /// # + /// - O(1) lookup and insert + /// # + #[weight = 195_000_000] + pub fn set_threshold(origin, threshold: u32) -> DispatchResult { + Self::ensure_admin(origin)?; + Self::set_relayer_threshold(threshold) + } + + /// Stores a method name on chain under an associated resource ID. + /// + /// # + /// - O(1) write + /// # + #[weight = 195_000_000] + pub fn set_resource(origin, id: ResourceId, method: Vec) -> DispatchResult { + Self::ensure_admin(origin)?; + Self::register_resource(id, method) + } + + /// Removes a resource ID from the resource mapping. + /// + /// After this call, bridge transfers with the associated resource ID will + /// be rejected. + /// + /// # + /// - O(1) removal + /// # + #[weight = 195_000_000] + pub fn remove_resource(origin, id: ResourceId) -> DispatchResult { + Self::ensure_admin(origin)?; + Self::unregister_resource(id) + } + + /// Enables a chain ID as a source or destination for a bridge transfer. + /// + /// # + /// - O(1) lookup and insert + /// # + #[weight = 195_000_000] + pub fn whitelist_chain(origin, id: ChainId) -> DispatchResult { + Self::ensure_admin(origin)?; + Self::whitelist(id) + } + + /// Adds a new relayer to the relayer set. + /// + /// # + /// - O(1) lookup and insert + /// # + #[weight = 195_000_000] + pub fn add_relayer(origin, v: T::AccountId) -> DispatchResult { + Self::ensure_admin(origin)?; + Self::register_relayer(v) + } + + /// Removes an existing relayer from the set. + /// + /// # + /// - O(1) lookup and removal + /// # + #[weight = 195_000_000] + pub fn remove_relayer(origin, v: T::AccountId) -> DispatchResult { + Self::ensure_admin(origin)?; + Self::unregister_relayer(v) + } + + /// Commits a vote in favour of the provided proposal. + /// + /// If a proposal with the given nonce and source chain ID does not already exist, it will + /// be created with an initial vote in favour from the caller. + /// + /// # + /// - weight of proposed call, regardless of whether execution is performed + /// # + #[weight = (call.get_dispatch_info().weight + Weight::from_ref_time(195_000_000 as u64), call.get_dispatch_info().class, Pays::Yes)] + pub fn acknowledge_proposal(origin, nonce: DepositNonce, src_id: ChainId, r_id: ResourceId, call: Box<::Proposal>) -> DispatchResult { + let who = ensure_signed(origin)?; + ensure!(Self::is_relayer(&who), Error::::MustBeRelayer); + ensure!(Self::chain_whitelisted(src_id), Error::::ChainNotWhitelisted); + ensure!(Self::resource_exists(r_id), Error::::ResourceDoesNotExist); + + Self::vote_for(who, nonce, src_id, call) + } + + /// Commits a vote against a provided proposal. + /// + /// # + /// - Fixed, since execution of proposal should not be included + /// # + #[weight = 195_000_000] + pub fn reject_proposal(origin, nonce: DepositNonce, src_id: ChainId, r_id: ResourceId, call: Box<::Proposal>) -> DispatchResult { + let who = ensure_signed(origin)?; + ensure!(Self::is_relayer(&who), Error::::MustBeRelayer); + ensure!(Self::chain_whitelisted(src_id), Error::::ChainNotWhitelisted); + ensure!(Self::resource_exists(r_id), Error::::ResourceDoesNotExist); + + Self::vote_against(who, nonce, src_id, call) + } + + /// Evaluate the state of a proposal given the current vote threshold. + /// + /// A proposal with enough votes will be either executed or cancelled, and the status + /// will be updated accordingly. + /// + /// # + /// - weight of proposed call, regardless of whether execution is performed + /// # + #[weight = (prop.get_dispatch_info().weight + Weight::from_ref_time(195_000_000 as u64), prop.get_dispatch_info().class, Pays::Yes)] + pub fn eval_vote_state(origin, nonce: DepositNonce, src_id: ChainId, prop: Box<::Proposal>) -> DispatchResult { + ensure_signed(origin)?; + + Self::try_resolve_proposal(nonce, src_id, prop) + } + } } impl Module { - // *** Utility methods *** - - pub fn ensure_admin(o: T::Origin) -> DispatchResult { - T::AdminOrigin::try_origin(o) - .map(|_| ()) - .or_else(ensure_root)?; - Ok(()) - } - - /// Checks if who is a relayer - pub fn is_relayer(who: &T::AccountId) -> bool { - Self::relayers(who) - } - - /// Provides an AccountId for the pallet. - /// This is used both as an origin check and deposit/withdrawal account. - pub fn account_id() -> T::AccountId { - AccountIdConversion::::into_account_truncating(&MODULE_ID) - } - - /// Asserts if a resource is registered - pub fn resource_exists(id: ResourceId) -> bool { - return Self::resources(id) != None; - } - - /// Checks if a chain exists as a whitelisted destination - pub fn chain_whitelisted(id: ChainId) -> bool { - return Self::chains(id) != None; - } - - /// Increments the deposit nonce for the specified chain ID - fn bump_nonce(id: ChainId) -> DepositNonce { - let nonce = Self::chains(id).unwrap_or_default() + 1; - ::insert(id, nonce); - nonce - } - - // *** Admin methods *** - - /// Set a new voting threshold - pub fn set_relayer_threshold(threshold: u32) -> DispatchResult { - ensure!(threshold > 0, Error::::InvalidThreshold); - ::put(threshold); - Self::deposit_event(RawEvent::RelayerThresholdChanged(threshold)); - Ok(()) - } - - /// Register a method for a resource Id, enabling associated transfers - pub fn register_resource(id: ResourceId, method: Vec) -> DispatchResult { - ::insert(id, method); - Ok(()) - } - - /// Removes a resource ID, disabling associated transfer - pub fn unregister_resource(id: ResourceId) -> DispatchResult { - ::remove(id); - Ok(()) - } - - /// Whitelist a chain ID for transfer - pub fn whitelist(id: ChainId) -> DispatchResult { - // Cannot whitelist this chain - ensure!(id != T::ChainId::get(), Error::::InvalidChainId); - // Cannot whitelist with an existing entry - ensure!( - !Self::chain_whitelisted(id), - Error::::ChainAlreadyWhitelisted - ); - ::insert(&id, 0); - Self::deposit_event(RawEvent::ChainWhitelisted(id)); - Ok(()) - } - - /// Adds a new relayer to the set - pub fn register_relayer(relayer: T::AccountId) -> DispatchResult { - ensure!( - !Self::is_relayer(&relayer), - Error::::RelayerAlreadyExists - ); - >::insert(&relayer, true); - ::mutate(|i| *i += 1); - - Self::deposit_event(RawEvent::RelayerAdded(relayer)); - Ok(()) - } - - /// Removes a relayer from the set - pub fn unregister_relayer(relayer: T::AccountId) -> DispatchResult { - ensure!(Self::is_relayer(&relayer), Error::::RelayerInvalid); - >::remove(&relayer); - ::mutate(|i| *i -= 1); - Self::deposit_event(RawEvent::RelayerRemoved(relayer)); - Ok(()) - } - - // *** Proposal voting and execution methods *** - - /// Commits a vote for a proposal. If the proposal doesn't exist it will be created. - fn commit_vote( - who: T::AccountId, - nonce: DepositNonce, - src_id: ChainId, - prop: Box, - in_favour: bool, - ) -> DispatchResult { - let now = >::block_number(); - let mut votes = match >::get(src_id, (nonce, prop.clone())) { - Some(v) => v, - None => { - let mut v = ProposalVotes::default(); - v.expiry = now + T::ProposalLifetime::get(); - v - } - }; - - // Ensure the proposal isn't complete and relayer hasn't already voted - ensure!(!votes.is_complete(), Error::::ProposalAlreadyComplete); - ensure!(!votes.is_expired(now), Error::::ProposalExpired); - ensure!(!votes.has_voted(&who), Error::::RelayerAlreadyVoted); - - if in_favour { - votes.votes_for.push(who.clone()); - Self::deposit_event(RawEvent::VoteFor(src_id, nonce, who.clone())); - } else { - votes.votes_against.push(who.clone()); - Self::deposit_event(RawEvent::VoteAgainst(src_id, nonce, who.clone())); - } - - >::insert(src_id, (nonce, prop.clone()), votes.clone()); - - Ok(()) - } - - /// Attempts to finalize or cancel the proposal if the vote count allows. - fn try_resolve_proposal( - nonce: DepositNonce, - src_id: ChainId, - prop: Box, - ) -> DispatchResult { - if let Some(mut votes) = >::get(src_id, (nonce, prop.clone())) { - let now = >::block_number(); - ensure!(!votes.is_complete(), Error::::ProposalAlreadyComplete); - ensure!(!votes.is_expired(now), Error::::ProposalExpired); - - let status = votes.try_to_complete(::get(), ::get()); - >::insert(src_id, (nonce, prop.clone()), votes.clone()); - - match status { - ProposalStatus::Approved => Self::finalize_execution(src_id, nonce, prop), - ProposalStatus::Rejected => Self::cancel_execution(src_id, nonce), - _ => Ok(()), - } - } else { - Err(Error::::ProposalDoesNotExist)? - } - } - - /// Commits a vote in favour of the proposal and executes it if the vote threshold is met. - fn vote_for( - who: T::AccountId, - nonce: DepositNonce, - src_id: ChainId, - prop: Box, - ) -> DispatchResult { - Self::commit_vote(who, nonce, src_id, prop.clone(), true)?; - Self::try_resolve_proposal(nonce, src_id, prop) - } - - /// Commits a vote against the proposal and cancels it if more than (relayers.len() - threshold) - /// votes against exist. - fn vote_against( - who: T::AccountId, - nonce: DepositNonce, - src_id: ChainId, - prop: Box, - ) -> DispatchResult { - Self::commit_vote(who, nonce, src_id, prop.clone(), false)?; - Self::try_resolve_proposal(nonce, src_id, prop) - } - - /// Execute the proposal and signals the result as an event - fn finalize_execution( - src_id: ChainId, - nonce: DepositNonce, - call: Box, - ) -> DispatchResult { - Self::deposit_event(RawEvent::ProposalApproved(src_id, nonce)); - call.dispatch(frame_system::RawOrigin::Signed(Self::account_id()).into()) - .map(|_| ()) - .map_err(|e| e.error)?; - Self::deposit_event(RawEvent::ProposalSucceeded(src_id, nonce)); - Ok(()) - } - - /// Cancels a proposal. - fn cancel_execution(src_id: ChainId, nonce: DepositNonce) -> DispatchResult { - Self::deposit_event(RawEvent::ProposalRejected(src_id, nonce)); - Ok(()) - } - - /// Initiates a transfer of a fungible asset out of the chain. This should be called by another pallet. - pub fn transfer_fungible( - dest_id: ChainId, - resource_id: ResourceId, - to: Vec, - amount: U256, - ) -> DispatchResult { - ensure!( - Self::chain_whitelisted(dest_id), - Error::::ChainNotWhitelisted - ); - ensure!( - Self::resource_exists(resource_id), - Error::::ResourceDoesNotExist - ); - let nonce = Self::bump_nonce(dest_id); - Self::deposit_event(RawEvent::FungibleTransfer( - dest_id, - nonce, - resource_id, - amount, - to, - )); - Ok(()) - } - - /// Initiates a transfer of a nonfungible asset out of the chain. This should be called by another pallet. - pub fn transfer_nonfungible( - dest_id: ChainId, - resource_id: ResourceId, - token_id: Vec, - to: Vec, - metadata: Vec, - ) -> DispatchResult { - ensure!( - Self::chain_whitelisted(dest_id), - Error::::ChainNotWhitelisted - ); - ensure!( - Self::resource_exists(resource_id), - Error::::ResourceDoesNotExist - ); - let nonce = Self::bump_nonce(dest_id); - Self::deposit_event(RawEvent::NonFungibleTransfer( - dest_id, - nonce, - resource_id, - token_id, - to, - metadata, - )); - Ok(()) - } - - /// Initiates a transfer of generic data out of the chain. This should be called by another pallet. - pub fn transfer_generic( - dest_id: ChainId, - resource_id: ResourceId, - metadata: Vec, - ) -> DispatchResult { - ensure!( - Self::chain_whitelisted(dest_id), - Error::::ChainNotWhitelisted - ); - ensure!( - Self::resource_exists(resource_id), - Error::::ResourceDoesNotExist - ); - let nonce = Self::bump_nonce(dest_id); - Self::deposit_event(RawEvent::GenericTransfer( - dest_id, - nonce, - resource_id, - metadata, - )); - Ok(()) - } + // *** Utility methods *** + + pub fn ensure_admin(o: T::RuntimeOrigin) -> DispatchResult { + T::AdminOrigin::try_origin(o).map(|_| ()).or_else(ensure_root)?; + Ok(()) + } + + /// Checks if who is a relayer + pub fn is_relayer(who: &T::AccountId) -> bool { + Self::relayers(who) + } + + /// Provides an AccountId for the pallet. + /// This is used both as an origin check and deposit/withdrawal account. + pub fn account_id() -> T::AccountId { + AccountIdConversion::::into_account_truncating(&MODULE_ID) + } + + /// Asserts if a resource is registered + pub fn resource_exists(id: ResourceId) -> bool { + return Self::resources(id) != None + } + + /// Checks if a chain exists as a whitelisted destination + pub fn chain_whitelisted(id: ChainId) -> bool { + return Self::chains(id) != None + } + + /// Increments the deposit nonce for the specified chain ID + fn bump_nonce(id: ChainId) -> DepositNonce { + let nonce = Self::chains(id).unwrap_or_default() + 1; + ::insert(id, nonce); + nonce + } + + // *** Admin methods *** + + /// Set a new voting threshold + pub fn set_relayer_threshold(threshold: u32) -> DispatchResult { + ensure!(threshold > 0, Error::::InvalidThreshold); + ::put(threshold); + Self::deposit_event(RawEvent::RelayerThresholdChanged(threshold)); + Ok(()) + } + + /// Register a method for a resource Id, enabling associated transfers + pub fn register_resource(id: ResourceId, method: Vec) -> DispatchResult { + ::insert(id, method); + Ok(()) + } + + /// Removes a resource ID, disabling associated transfer + pub fn unregister_resource(id: ResourceId) -> DispatchResult { + ::remove(id); + Ok(()) + } + + /// Whitelist a chain ID for transfer + pub fn whitelist(id: ChainId) -> DispatchResult { + // Cannot whitelist this chain + ensure!(id != T::ChainId::get(), Error::::InvalidChainId); + // Cannot whitelist with an existing entry + ensure!(!Self::chain_whitelisted(id), Error::::ChainAlreadyWhitelisted); + ::insert(&id, 0); + Self::deposit_event(RawEvent::ChainWhitelisted(id)); + Ok(()) + } + + /// Adds a new relayer to the set + pub fn register_relayer(relayer: T::AccountId) -> DispatchResult { + ensure!(!Self::is_relayer(&relayer), Error::::RelayerAlreadyExists); + >::insert(&relayer, true); + ::mutate(|i| *i += 1); + + Self::deposit_event(RawEvent::RelayerAdded(relayer)); + Ok(()) + } + + /// Removes a relayer from the set + pub fn unregister_relayer(relayer: T::AccountId) -> DispatchResult { + ensure!(Self::is_relayer(&relayer), Error::::RelayerInvalid); + >::remove(&relayer); + ::mutate(|i| *i -= 1); + Self::deposit_event(RawEvent::RelayerRemoved(relayer)); + Ok(()) + } + + // *** Proposal voting and execution methods *** + + /// Commits a vote for a proposal. If the proposal doesn't exist it will be created. + fn commit_vote( + who: T::AccountId, + nonce: DepositNonce, + src_id: ChainId, + prop: Box, + in_favour: bool, + ) -> DispatchResult { + let now = >::block_number(); + let mut votes = match >::get(src_id, (nonce, prop.clone())) { + Some(v) => v, + None => { + let mut v = ProposalVotes::default(); + v.expiry = now + T::ProposalLifetime::get(); + v + }, + }; + + // Ensure the proposal isn't complete and relayer hasn't already voted + ensure!(!votes.is_complete(), Error::::ProposalAlreadyComplete); + ensure!(!votes.is_expired(now), Error::::ProposalExpired); + ensure!(!votes.has_voted(&who), Error::::RelayerAlreadyVoted); + + if in_favour { + votes.votes_for.push(who.clone()); + Self::deposit_event(RawEvent::VoteFor(src_id, nonce, who.clone())); + } else { + votes.votes_against.push(who.clone()); + Self::deposit_event(RawEvent::VoteAgainst(src_id, nonce, who.clone())); + } + + >::insert(src_id, (nonce, prop.clone()), votes.clone()); + + Ok(()) + } + + /// Attempts to finalize or cancel the proposal if the vote count allows. + fn try_resolve_proposal( + nonce: DepositNonce, + src_id: ChainId, + prop: Box, + ) -> DispatchResult { + if let Some(mut votes) = >::get(src_id, (nonce, prop.clone())) { + let now = >::block_number(); + ensure!(!votes.is_complete(), Error::::ProposalAlreadyComplete); + ensure!(!votes.is_expired(now), Error::::ProposalExpired); + + let status = votes.try_to_complete(::get(), ::get()); + >::insert(src_id, (nonce, prop.clone()), votes.clone()); + + match status { + ProposalStatus::Approved => Self::finalize_execution(src_id, nonce, prop), + ProposalStatus::Rejected => Self::cancel_execution(src_id, nonce), + _ => Ok(()), + } + } else { + Err(Error::::ProposalDoesNotExist)? + } + } + + /// Commits a vote in favour of the proposal and executes it if the vote threshold is met. + fn vote_for( + who: T::AccountId, + nonce: DepositNonce, + src_id: ChainId, + prop: Box, + ) -> DispatchResult { + Self::commit_vote(who, nonce, src_id, prop.clone(), true)?; + Self::try_resolve_proposal(nonce, src_id, prop) + } + + /// Commits a vote against the proposal and cancels it if more than (relayers.len() - threshold) + /// votes against exist. + fn vote_against( + who: T::AccountId, + nonce: DepositNonce, + src_id: ChainId, + prop: Box, + ) -> DispatchResult { + Self::commit_vote(who, nonce, src_id, prop.clone(), false)?; + Self::try_resolve_proposal(nonce, src_id, prop) + } + + /// Execute the proposal and signals the result as an event + fn finalize_execution( + src_id: ChainId, + nonce: DepositNonce, + call: Box, + ) -> DispatchResult { + Self::deposit_event(RawEvent::ProposalApproved(src_id, nonce)); + call.dispatch(frame_system::RawOrigin::Signed(Self::account_id()).into()) + .map(|_| ()) + .map_err(|e| e.error)?; + Self::deposit_event(RawEvent::ProposalSucceeded(src_id, nonce)); + Ok(()) + } + + /// Cancels a proposal. + fn cancel_execution(src_id: ChainId, nonce: DepositNonce) -> DispatchResult { + Self::deposit_event(RawEvent::ProposalRejected(src_id, nonce)); + Ok(()) + } + + /// Initiates a transfer of a fungible asset out of the chain. This should be called by another + /// pallet. + pub fn transfer_fungible( + dest_id: ChainId, + resource_id: ResourceId, + to: Vec, + amount: U256, + ) -> DispatchResult { + ensure!(Self::chain_whitelisted(dest_id), Error::::ChainNotWhitelisted); + ensure!(Self::resource_exists(resource_id), Error::::ResourceDoesNotExist); + let nonce = Self::bump_nonce(dest_id); + Self::deposit_event(RawEvent::FungibleTransfer(dest_id, nonce, resource_id, amount, to)); + Ok(()) + } + + /// Initiates a transfer of a nonfungible asset out of the chain. This should be called by + /// another pallet. + pub fn transfer_nonfungible( + dest_id: ChainId, + resource_id: ResourceId, + token_id: Vec, + to: Vec, + metadata: Vec, + ) -> DispatchResult { + ensure!(Self::chain_whitelisted(dest_id), Error::::ChainNotWhitelisted); + ensure!(Self::resource_exists(resource_id), Error::::ResourceDoesNotExist); + let nonce = Self::bump_nonce(dest_id); + Self::deposit_event(RawEvent::NonFungibleTransfer( + dest_id, + nonce, + resource_id, + token_id, + to, + metadata, + )); + Ok(()) + } + + /// Initiates a transfer of generic data out of the chain. This should be called by another + /// pallet. + pub fn transfer_generic( + dest_id: ChainId, + resource_id: ResourceId, + metadata: Vec, + ) -> DispatchResult { + ensure!(Self::chain_whitelisted(dest_id), Error::::ChainNotWhitelisted); + ensure!(Self::resource_exists(resource_id), Error::::ResourceDoesNotExist); + let nonce = Self::bump_nonce(dest_id); + Self::deposit_event(RawEvent::GenericTransfer(dest_id, nonce, resource_id, metadata)); + Ok(()) + } } /// Simple ensure origin for the bridge account pub struct EnsureBridge(sp_std::marker::PhantomData); -impl EnsureOrigin for EnsureBridge { - type Success = T::AccountId; - fn try_origin(o: T::Origin) -> Result { - let bridge_id = AccountIdConversion::::into_account_truncating(&MODULE_ID); - o.into().and_then(|o| match o { - system::RawOrigin::Signed(who) if who == bridge_id => Ok(bridge_id), - r => Err(T::Origin::from(r)), - }) - } +impl EnsureOrigin for EnsureBridge { + type Success = T::AccountId; + fn try_origin(o: T::RuntimeOrigin) -> Result { + let bridge_id = AccountIdConversion::::into_account_truncating(&MODULE_ID); + o.into().and_then(|o| match o { + system::RawOrigin::Signed(who) if who == bridge_id => Ok(bridge_id), + r => Err(T::RuntimeOrigin::from(r)), + }) + } #[cfg(feature = "runtime-benchmarks")] - fn successful_origin() -> T::Origin { - T::Origin::from(system::RawOrigin::Signed(>::account_id())) + fn successful_origin() -> T::RuntimeOrigin { + T::RuntimeOrigin::from(system::RawOrigin::Signed(>::account_id())) } } diff --git a/pallets/chainbridge/src/mock.rs b/pallets/chainbridge/src/mock.rs index bf49533e8..15a6a235b 100644 --- a/pallets/chainbridge/src/mock.rs +++ b/pallets/chainbridge/src/mock.rs @@ -3,103 +3,102 @@ use super::*; use frame_support::{ - assert_ok, ord_parameter_types, parameter_types, weights::Weight, PalletId, - traits::{Everything} + assert_ok, ord_parameter_types, parameter_types, traits::Everything, weights::Weight, PalletId, }; use frame_system::{self as system}; use sp_core::H256; use sp_runtime::{ - testing::Header, - traits::{AccountIdConversion, BlakeTwo256, Block as BlockT, IdentityLookup}, - Perbill, + testing::Header, + traits::{AccountIdConversion, BlakeTwo256, Block as BlockT, IdentityLookup}, + Perbill, }; use crate::{self as bridge, Config}; pub use pallet_balances as balances; parameter_types! { - pub const BlockHashCount: u64 = 250; - pub const MaximumBlockWeight: Weight = Weight::from_ref_time(1024); - pub const MaximumBlockLength: u32 = 2 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::one(); - pub const MaxLocks: u32 = 50; + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: Weight = Weight::from_ref_time(1024); + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); + pub const MaxLocks: u32 = 50; } impl frame_system::Config for Test { - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - 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 = Event; - type BlockHashCount = BlockHashCount; - type DbWeight = (); - type Version = (); - // type ModuleToIndex = (); - type PalletInfo = PalletInfo; - // type MaxLocks = MaxLocks; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type DbWeight = (); + type Version = (); + // type ModuleToIndex = (); + type PalletInfo = PalletInfo; + // type MaxLocks = MaxLocks; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; } parameter_types! { - pub const ExistentialDeposit: u64 = 1; + pub const ExistentialDeposit: u64 = 1; } ord_parameter_types! { - pub const One: u64 = 1; + pub const One: u64 = 1; } impl pallet_balances::Config for Test { - type Balance = u64; - type DustRemoval = (); - type Event = Event; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = (); + type Balance = u64; + type DustRemoval = (); + type RuntimeEvent = RuntimeEvent; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxLocks = (); + type MaxReserves = (); + type ReserveIdentifier = (); } parameter_types! { - pub const TestChainId: u8 = 5; - pub const ProposalLifetime: u64 = 50; + pub const TestChainId: u8 = 5; + pub const ProposalLifetime: u64 = 50; } impl Config for Test { - type Event = Event; - type AdminOrigin = frame_system::EnsureRoot; - type Proposal = Call; - type ChainId = TestChainId; - type ProposalLifetime = ProposalLifetime; + type RuntimeEvent = RuntimeEvent; + type AdminOrigin = frame_system::EnsureRoot; + type Proposal = RuntimeCall; + type ChainId = TestChainId; + type ProposalLifetime = ProposalLifetime; } type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; frame_support::construct_runtime!( - pub enum Test where - Block = Block, - NodeBlock = Block, - UncheckedExtrinsic = UncheckedExtrinsic - { - System: system::{Pallet, Call, Event}, - Balances: balances::{Pallet, Call, Storage, Config, Event}, - Bridge: bridge::{Pallet, Call, Storage, Event}, - } + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic + { + System: system::{Pallet, Call, Event}, + Balances: balances::{Pallet, Call, Storage, Config, Event}, + Bridge: bridge::{Pallet, Call, Storage, Event}, + } ); // pub const BRIDGE_ID: u64 = @@ -110,55 +109,49 @@ pub const ENDOWED_BALANCE: u64 = 100_000_000; pub const TEST_THRESHOLD: u32 = 2; pub fn new_test_ext() -> sp_io::TestExternalities { - let bridge_id = AccountIdConversion::into_account_truncating(&MODULE_ID); - let mut t = frame_system::GenesisConfig::default() - .build_storage::() - .unwrap(); - pallet_balances::GenesisConfig:: { - balances: vec![(bridge_id, ENDOWED_BALANCE)], - } - .assimilate_storage(&mut t) - .unwrap(); - let mut ext = sp_io::TestExternalities::new(t); - ext.execute_with(|| System::set_block_number(1)); - ext + let bridge_id = AccountIdConversion::into_account_truncating(&MODULE_ID); + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + pallet_balances::GenesisConfig:: { balances: vec![(bridge_id, ENDOWED_BALANCE)] } + .assimilate_storage(&mut t) + .unwrap(); + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| System::set_block_number(1)); + ext } pub fn new_test_ext_initialized( - src_id: ChainId, - r_id: ResourceId, - resource: Vec, + src_id: ChainId, + r_id: ResourceId, + resource: Vec, ) -> sp_io::TestExternalities { - let mut t = new_test_ext(); - t.execute_with(|| { - // Set and check threshold - assert_ok!(Bridge::set_threshold(Origin::root(), TEST_THRESHOLD)); - assert_eq!(Bridge::relayer_threshold(), TEST_THRESHOLD); - // Add relayers - assert_ok!(Bridge::add_relayer(Origin::root(), RELAYER_A)); - assert_ok!(Bridge::add_relayer(Origin::root(), RELAYER_B)); - assert_ok!(Bridge::add_relayer(Origin::root(), RELAYER_C)); - // Whitelist chain - assert_ok!(Bridge::whitelist_chain(Origin::root(), src_id)); - // Set and check resource ID mapped to some junk data - assert_ok!(Bridge::set_resource(Origin::root(), r_id, resource)); - assert_eq!(Bridge::resource_exists(r_id), true); - }); - t + let mut t = new_test_ext(); + t.execute_with(|| { + // Set and check threshold + assert_ok!(Bridge::set_threshold(RuntimeOrigin::root(), TEST_THRESHOLD)); + assert_eq!(Bridge::relayer_threshold(), TEST_THRESHOLD); + // Add relayers + assert_ok!(Bridge::add_relayer(RuntimeOrigin::root(), RELAYER_A)); + assert_ok!(Bridge::add_relayer(RuntimeOrigin::root(), RELAYER_B)); + assert_ok!(Bridge::add_relayer(RuntimeOrigin::root(), RELAYER_C)); + // Whitelist chain + assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), src_id)); + // Set and check resource ID mapped to some junk data + assert_ok!(Bridge::set_resource(RuntimeOrigin::root(), r_id, resource)); + assert_eq!(Bridge::resource_exists(r_id), true); + }); + t } // Checks events against the latest. A contiguous set of events must be provided. They must // include the most recent event, but do not have to include every past event. -pub fn assert_events(mut expected: Vec) { - let mut actual: Vec = system::Module::::events() - .iter() - .map(|e| e.event.clone()) - .collect(); - - expected.reverse(); - - for evt in expected { - let next = actual.pop().expect("event expected"); - assert_eq!(next, evt.into(), "Events don't match (actual,expected)"); - } +pub fn assert_events(mut expected: Vec) { + let mut actual: Vec = + system::Module::::events().iter().map(|e| e.event.clone()).collect(); + + expected.reverse(); + + for evt in expected { + let next = actual.pop().expect("event expected"); + assert_eq!(next, evt.into(), "Events don't match (actual,expected)"); + } } diff --git a/pallets/chainbridge/src/tests.rs b/pallets/chainbridge/src/tests.rs index 7ceb70f69..c7b3b18a2 100644 --- a/pallets/chainbridge/src/tests.rs +++ b/pallets/chainbridge/src/tests.rs @@ -1,564 +1,569 @@ #![cfg(test)] -use super::mock::{ - assert_events, new_test_ext, Balances, Bridge, Call, Event, Origin, ProposalLifetime, System, - Test, TestChainId, ENDOWED_BALANCE, RELAYER_A, RELAYER_B, RELAYER_C, TEST_THRESHOLD, +use super::{ + mock::{ + assert_events, new_test_ext, Balances, Bridge, ProposalLifetime, RuntimeCall, RuntimeEvent, + RuntimeOrigin, System, Test, TestChainId, ENDOWED_BALANCE, RELAYER_A, RELAYER_B, RELAYER_C, + TEST_THRESHOLD, + }, + *, }; -use super::*; use crate::mock::new_test_ext_initialized; use frame_support::{assert_noop, assert_ok}; +use frame_system::Origin; #[test] fn derive_ids() { - let chain = 1; - let id = [ - 0x21, 0x60, 0x5f, 0x71, 0x84, 0x5f, 0x37, 0x2a, 0x9e, 0xd8, 0x42, 0x53, 0xd2, 0xd0, 0x24, - 0xb7, 0xb1, 0x09, 0x99, 0xf4, - ]; - let r_id = derive_resource_id(chain, &id); - let expected = [ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x60, 0x5f, 0x71, 0x84, 0x5f, - 0x37, 0x2a, 0x9e, 0xd8, 0x42, 0x53, 0xd2, 0xd0, 0x24, 0xb7, 0xb1, 0x09, 0x99, 0xf4, chain, - ]; - assert_eq!(r_id, expected); + let chain = 1; + let id = [ + 0x21, 0x60, 0x5f, 0x71, 0x84, 0x5f, 0x37, 0x2a, 0x9e, 0xd8, 0x42, 0x53, 0xd2, 0xd0, 0x24, + 0xb7, 0xb1, 0x09, 0x99, 0xf4, + ]; + let r_id = derive_resource_id(chain, &id); + let expected = [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x60, 0x5f, 0x71, 0x84, 0x5f, + 0x37, 0x2a, 0x9e, 0xd8, 0x42, 0x53, 0xd2, 0xd0, 0x24, 0xb7, 0xb1, 0x09, 0x99, 0xf4, chain, + ]; + assert_eq!(r_id, expected); } #[test] fn complete_proposal_approved() { - let mut prop = ProposalVotes { - votes_for: vec![1, 2], - votes_against: vec![3], - status: ProposalStatus::Initiated, - expiry: ProposalLifetime::get(), - }; - - prop.try_to_complete(2, 3); - assert_eq!(prop.status, ProposalStatus::Approved); + let mut prop = ProposalVotes { + votes_for: vec![1, 2], + votes_against: vec![3], + status: ProposalStatus::Initiated, + expiry: ProposalLifetime::get(), + }; + + prop.try_to_complete(2, 3); + assert_eq!(prop.status, ProposalStatus::Approved); } #[test] fn complete_proposal_rejected() { - let mut prop = ProposalVotes { - votes_for: vec![1], - votes_against: vec![2, 3], - status: ProposalStatus::Initiated, - expiry: ProposalLifetime::get(), - }; - - prop.try_to_complete(2, 3); - assert_eq!(prop.status, ProposalStatus::Rejected); + let mut prop = ProposalVotes { + votes_for: vec![1], + votes_against: vec![2, 3], + status: ProposalStatus::Initiated, + expiry: ProposalLifetime::get(), + }; + + prop.try_to_complete(2, 3); + assert_eq!(prop.status, ProposalStatus::Rejected); } #[test] fn complete_proposal_bad_threshold() { - let mut prop = ProposalVotes { - votes_for: vec![1, 2], - votes_against: vec![], - status: ProposalStatus::Initiated, - expiry: ProposalLifetime::get(), - }; - - prop.try_to_complete(3, 2); - assert_eq!(prop.status, ProposalStatus::Initiated); - - let mut prop = ProposalVotes { - votes_for: vec![], - votes_against: vec![1, 2], - status: ProposalStatus::Initiated, - expiry: ProposalLifetime::get(), - }; - - prop.try_to_complete(3, 2); - assert_eq!(prop.status, ProposalStatus::Initiated); + let mut prop = ProposalVotes { + votes_for: vec![1, 2], + votes_against: vec![], + status: ProposalStatus::Initiated, + expiry: ProposalLifetime::get(), + }; + + prop.try_to_complete(3, 2); + assert_eq!(prop.status, ProposalStatus::Initiated); + + let mut prop = ProposalVotes { + votes_for: vec![], + votes_against: vec![1, 2], + status: ProposalStatus::Initiated, + expiry: ProposalLifetime::get(), + }; + + prop.try_to_complete(3, 2); + assert_eq!(prop.status, ProposalStatus::Initiated); } #[test] fn setup_resources() { - new_test_ext().execute_with(|| { - let id: ResourceId = [1; 32]; - let method = "Pallet.do_something".as_bytes().to_vec(); - let method2 = "Pallet.do_somethingElse".as_bytes().to_vec(); + new_test_ext().execute_with(|| { + let id: ResourceId = [1; 32]; + let method = "Pallet.do_something".as_bytes().to_vec(); + let method2 = "Pallet.do_somethingElse".as_bytes().to_vec(); - assert_ok!(Bridge::set_resource(Origin::root(), id, method.clone())); - assert_eq!(Bridge::resources(id), Some(method)); + assert_ok!(Bridge::set_resource(RuntimeOrigin::root(), id, method.clone())); + assert_eq!(Bridge::resources(id), Some(method)); - assert_ok!(Bridge::set_resource(Origin::root(), id, method2.clone())); - assert_eq!(Bridge::resources(id), Some(method2)); + assert_ok!(Bridge::set_resource(RuntimeOrigin::root(), id, method2.clone())); + assert_eq!(Bridge::resources(id), Some(method2)); - assert_ok!(Bridge::remove_resource(Origin::root(), id)); - assert_eq!(Bridge::resources(id), None); - }) + assert_ok!(Bridge::remove_resource(RuntimeOrigin::root(), id)); + assert_eq!(Bridge::resources(id), None); + }) } #[test] fn whitelist_chain() { - new_test_ext().execute_with(|| { - assert!(!Bridge::chain_whitelisted(0)); + new_test_ext().execute_with(|| { + assert!(!Bridge::chain_whitelisted(0)); - assert_ok!(Bridge::whitelist_chain(Origin::root(), 0)); - assert_noop!( - Bridge::whitelist_chain(Origin::root(), TestChainId::get()), - Error::::InvalidChainId - ); + assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), 0)); + assert_noop!( + Bridge::whitelist_chain(RuntimeOrigin::root(), TestChainId::get()), + Error::::InvalidChainId + ); - assert_events(vec![Event::Bridge(RawEvent::ChainWhitelisted(0))]); - }) + assert_events(vec![RuntimeEvent::Bridge(RawEvent::ChainWhitelisted(0))]); + }) } #[test] fn set_get_threshold() { - new_test_ext().execute_with(|| { - assert_eq!(::get(), 1); + new_test_ext().execute_with(|| { + assert_eq!(::get(), 1); - assert_ok!(Bridge::set_threshold(Origin::root(), TEST_THRESHOLD)); - assert_eq!(::get(), TEST_THRESHOLD); + assert_ok!(Bridge::set_threshold(RuntimeOrigin::root(), TEST_THRESHOLD)); + assert_eq!(::get(), TEST_THRESHOLD); - assert_ok!(Bridge::set_threshold(Origin::root(), 5)); - assert_eq!(::get(), 5); + assert_ok!(Bridge::set_threshold(RuntimeOrigin::root(), 5)); + assert_eq!(::get(), 5); - assert_events(vec![ - Event::Bridge(RawEvent::RelayerThresholdChanged(TEST_THRESHOLD)), - Event::Bridge(RawEvent::RelayerThresholdChanged(5)), - ]); - }) + assert_events(vec![ + RuntimeEvent::Bridge(RawEvent::RelayerThresholdChanged(TEST_THRESHOLD)), + RuntimeEvent::Bridge(RawEvent::RelayerThresholdChanged(5)), + ]); + }) } #[test] fn asset_transfer_success() { - new_test_ext().execute_with(|| { - let dest_id = 2; - let to = vec![2]; - let resource_id = [1; 32]; - let metadata = vec![]; - let amount = 100; - let token_id = vec![1, 2, 3, 4]; - let method = "Erc20.transfer".as_bytes().to_vec(); - - assert_ok!(Bridge::set_resource(Origin::root(), resource_id, method.clone())); - assert_ok!(Bridge::set_threshold(Origin::root(), TEST_THRESHOLD,)); - - assert_ok!(Bridge::whitelist_chain(Origin::root(), dest_id.clone())); - assert_ok!(Bridge::transfer_fungible( - dest_id.clone(), - resource_id.clone(), - to.clone(), - amount.into() - )); - assert_events(vec![ - Event::Bridge(RawEvent::ChainWhitelisted(dest_id.clone())), - Event::Bridge(RawEvent::FungibleTransfer( - dest_id.clone(), - 1, - resource_id.clone(), - amount.into(), - to.clone(), - )), - ]); - - assert_ok!(Bridge::transfer_nonfungible( - dest_id.clone(), - resource_id.clone(), - token_id.clone(), - to.clone(), - metadata.clone() - )); - assert_events(vec![Event::Bridge(RawEvent::NonFungibleTransfer( - dest_id.clone(), - 2, - resource_id.clone(), - token_id, - to.clone(), - metadata.clone(), - ))]); - - assert_ok!(Bridge::transfer_generic( - dest_id.clone(), - resource_id.clone(), - metadata.clone() - )); - assert_events(vec![Event::Bridge(RawEvent::GenericTransfer( - dest_id.clone(), - 3, - resource_id, - metadata, - ))]); - }) + new_test_ext().execute_with(|| { + let dest_id = 2; + let to = vec![2]; + let resource_id = [1; 32]; + let metadata = vec![]; + let amount = 100; + let token_id = vec![1, 2, 3, 4]; + let method = "Erc20.transfer".as_bytes().to_vec(); + + assert_ok!(Bridge::set_resource(RuntimeOrigin::root(), resource_id, method.clone())); + assert_ok!(Bridge::set_threshold(RuntimeOrigin::root(), TEST_THRESHOLD,)); + + assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), dest_id.clone())); + assert_ok!(Bridge::transfer_fungible( + dest_id.clone(), + resource_id.clone(), + to.clone(), + amount.into() + )); + assert_events(vec![ + RuntimeEvent::Bridge(RawEvent::ChainWhitelisted(dest_id.clone())), + RuntimeEvent::Bridge(RawEvent::FungibleTransfer( + dest_id.clone(), + 1, + resource_id.clone(), + amount.into(), + to.clone(), + )), + ]); + + assert_ok!(Bridge::transfer_nonfungible( + dest_id.clone(), + resource_id.clone(), + token_id.clone(), + to.clone(), + metadata.clone() + )); + assert_events(vec![RuntimeEvent::Bridge(RawEvent::NonFungibleTransfer( + dest_id.clone(), + 2, + resource_id.clone(), + token_id, + to.clone(), + metadata.clone(), + ))]); + + assert_ok!(Bridge::transfer_generic( + dest_id.clone(), + resource_id.clone(), + metadata.clone() + )); + assert_events(vec![RuntimeEvent::Bridge(RawEvent::GenericTransfer( + dest_id.clone(), + 3, + resource_id, + metadata, + ))]); + }) } #[test] fn asset_transfer_invalid_resource_id() { - new_test_ext().execute_with(|| { - let dest_id = 2; - let to = vec![2]; - let resource_id = [1; 32]; - let amount = 100; - - assert_ok!(Bridge::set_threshold(Origin::root(), TEST_THRESHOLD,)); - assert_ok!(Bridge::whitelist_chain(Origin::root(), dest_id.clone())); - - assert_noop!( - Bridge::transfer_fungible(dest_id.clone(), resource_id.clone(), to.clone(), amount.into()), - Error::::ResourceDoesNotExist - ); - - assert_noop!( - Bridge::transfer_nonfungible(dest_id.clone(), resource_id.clone(), vec![], vec![], vec![]), - Error::::ResourceDoesNotExist - ); - - assert_noop!( - Bridge::transfer_generic(dest_id.clone(), resource_id.clone(), vec![]), - Error::::ResourceDoesNotExist - ); - }) + new_test_ext().execute_with(|| { + let dest_id = 2; + let to = vec![2]; + let resource_id = [1; 32]; + let amount = 100; + + assert_ok!(Bridge::set_threshold(RuntimeOrigin::root(), TEST_THRESHOLD,)); + assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), dest_id.clone())); + + assert_noop!( + Bridge::transfer_fungible( + dest_id.clone(), + resource_id.clone(), + to.clone(), + amount.into() + ), + Error::::ResourceDoesNotExist + ); + + assert_noop!( + Bridge::transfer_nonfungible( + dest_id.clone(), + resource_id.clone(), + vec![], + vec![], + vec![] + ), + Error::::ResourceDoesNotExist + ); + + assert_noop!( + Bridge::transfer_generic(dest_id.clone(), resource_id.clone(), vec![]), + Error::::ResourceDoesNotExist + ); + }) } #[test] fn asset_transfer_invalid_chain() { - new_test_ext().execute_with(|| { - let chain_id = 2; - let bad_dest_id = 3; - let resource_id = [4; 32]; - - assert_ok!(Bridge::whitelist_chain(Origin::root(), chain_id.clone())); - assert_events(vec![Event::Bridge(RawEvent::ChainWhitelisted( - chain_id.clone(), - ))]); - - assert_noop!( - Bridge::transfer_fungible(bad_dest_id, resource_id.clone(), vec![], U256::zero()), - Error::::ChainNotWhitelisted - ); - - assert_noop!( - Bridge::transfer_nonfungible(bad_dest_id, resource_id.clone(), vec![], vec![], vec![]), - Error::::ChainNotWhitelisted - ); - - assert_noop!( - Bridge::transfer_generic(bad_dest_id, resource_id.clone(), vec![]), - Error::::ChainNotWhitelisted - ); - }) + new_test_ext().execute_with(|| { + let chain_id = 2; + let bad_dest_id = 3; + let resource_id = [4; 32]; + + assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), chain_id.clone())); + assert_events(vec![RuntimeEvent::Bridge(RawEvent::ChainWhitelisted(chain_id.clone()))]); + + assert_noop!( + Bridge::transfer_fungible(bad_dest_id, resource_id.clone(), vec![], U256::zero()), + Error::::ChainNotWhitelisted + ); + + assert_noop!( + Bridge::transfer_nonfungible(bad_dest_id, resource_id.clone(), vec![], vec![], vec![]), + Error::::ChainNotWhitelisted + ); + + assert_noop!( + Bridge::transfer_generic(bad_dest_id, resource_id.clone(), vec![]), + Error::::ChainNotWhitelisted + ); + }) } #[test] fn add_remove_relayer() { - new_test_ext().execute_with(|| { - assert_ok!(Bridge::set_threshold(Origin::root(), TEST_THRESHOLD,)); - assert_eq!(Bridge::relayer_count(), 0); - - assert_ok!(Bridge::add_relayer(Origin::root(), RELAYER_A)); - assert_ok!(Bridge::add_relayer(Origin::root(), RELAYER_B)); - assert_ok!(Bridge::add_relayer(Origin::root(), RELAYER_C)); - assert_eq!(Bridge::relayer_count(), 3); - - // Already exists - assert_noop!( - Bridge::add_relayer(Origin::root(), RELAYER_A), - Error::::RelayerAlreadyExists - ); - - // Confirm removal - assert_ok!(Bridge::remove_relayer(Origin::root(), RELAYER_B)); - assert_eq!(Bridge::relayer_count(), 2); - assert_noop!( - Bridge::remove_relayer(Origin::root(), RELAYER_B), - Error::::RelayerInvalid - ); - assert_eq!(Bridge::relayer_count(), 2); - - assert_events(vec![ - Event::Bridge(RawEvent::RelayerAdded(RELAYER_A)), - Event::Bridge(RawEvent::RelayerAdded(RELAYER_B)), - Event::Bridge(RawEvent::RelayerAdded(RELAYER_C)), - Event::Bridge(RawEvent::RelayerRemoved(RELAYER_B)), - ]); - }) + new_test_ext().execute_with(|| { + assert_ok!(Bridge::set_threshold(RuntimeOrigin::root(), TEST_THRESHOLD,)); + assert_eq!(Bridge::relayer_count(), 0); + + assert_ok!(Bridge::add_relayer(RuntimeOrigin::root(), RELAYER_A)); + assert_ok!(Bridge::add_relayer(RuntimeOrigin::root(), RELAYER_B)); + assert_ok!(Bridge::add_relayer(RuntimeOrigin::root(), RELAYER_C)); + assert_eq!(Bridge::relayer_count(), 3); + + // Already exists + assert_noop!( + Bridge::add_relayer(RuntimeOrigin::root(), RELAYER_A), + Error::::RelayerAlreadyExists + ); + + // Confirm removal + assert_ok!(Bridge::remove_relayer(RuntimeOrigin::root(), RELAYER_B)); + assert_eq!(Bridge::relayer_count(), 2); + assert_noop!( + Bridge::remove_relayer(RuntimeOrigin::root(), RELAYER_B), + Error::::RelayerInvalid + ); + assert_eq!(Bridge::relayer_count(), 2); + + assert_events(vec![ + RuntimeEvent::Bridge(RawEvent::RelayerAdded(RELAYER_A)), + RuntimeEvent::Bridge(RawEvent::RelayerAdded(RELAYER_B)), + RuntimeEvent::Bridge(RawEvent::RelayerAdded(RELAYER_C)), + RuntimeEvent::Bridge(RawEvent::RelayerRemoved(RELAYER_B)), + ]); + }) } -fn make_proposal(r: Vec) -> mock::Call { - Call::System(system::Call::remark{ remark: r }) +fn make_proposal(r: Vec) -> mock::RuntimeCall { + RuntimeCall::System(system::Call::remark { remark: r }) } #[test] fn create_sucessful_proposal() { - let src_id = 1; - let r_id = derive_resource_id(src_id, b"remark"); - - new_test_ext_initialized(src_id, r_id, b"System.remark".to_vec()).execute_with(|| { - let prop_id = 1; - let proposal = make_proposal(vec![10]); - - // Create proposal (& vote) - assert_ok!(Bridge::acknowledge_proposal( - Origin::signed(RELAYER_A), - prop_id, - src_id, - r_id, - Box::new(proposal.clone()) - )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); - let expected = ProposalVotes { - votes_for: vec![RELAYER_A], - votes_against: vec![], - status: ProposalStatus::Initiated, - expiry: ProposalLifetime::get() + 1, - }; - assert_eq!(prop, expected); - - // Second relayer votes against - assert_ok!(Bridge::reject_proposal( - Origin::signed(RELAYER_B), - prop_id, - src_id, - r_id, - Box::new(proposal.clone()) - )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); - let expected = ProposalVotes { - votes_for: vec![RELAYER_A], - votes_against: vec![RELAYER_B], - status: ProposalStatus::Initiated, - expiry: ProposalLifetime::get() + 1, - }; - assert_eq!(prop, expected); - - // Third relayer votes in favour - assert_ok!(Bridge::acknowledge_proposal( - Origin::signed(RELAYER_C), - prop_id, - src_id, - r_id, - Box::new(proposal.clone()) - )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); - let expected = ProposalVotes { - votes_for: vec![RELAYER_A, RELAYER_C], - votes_against: vec![RELAYER_B], - status: ProposalStatus::Approved, - expiry: ProposalLifetime::get() + 1, - }; - assert_eq!(prop, expected); - - assert_events(vec![ - Event::Bridge(RawEvent::VoteFor(src_id, prop_id, RELAYER_A)), - Event::Bridge(RawEvent::VoteAgainst(src_id, prop_id, RELAYER_B)), - Event::Bridge(RawEvent::VoteFor(src_id, prop_id, RELAYER_C)), - Event::Bridge(RawEvent::ProposalApproved(src_id, prop_id)), - Event::Bridge(RawEvent::ProposalSucceeded(src_id, prop_id)), - ]); - }) + let src_id = 1; + let r_id = derive_resource_id(src_id, b"remark"); + + new_test_ext_initialized(src_id, r_id, b"System.remark".to_vec()).execute_with(|| { + let prop_id = 1; + let proposal = make_proposal(vec![10]); + + // Create proposal (& vote) + assert_ok!(Bridge::acknowledge_proposal( + RuntimeOrigin::signed(RELAYER_A), + prop_id, + src_id, + r_id, + Box::new(proposal.clone()) + )); + let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let expected = ProposalVotes { + votes_for: vec![RELAYER_A], + votes_against: vec![], + status: ProposalStatus::Initiated, + expiry: ProposalLifetime::get() + 1, + }; + assert_eq!(prop, expected); + + // Second relayer votes against + assert_ok!(Bridge::reject_proposal( + RuntimeOrigin::signed(RELAYER_B), + prop_id, + src_id, + r_id, + Box::new(proposal.clone()) + )); + let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let expected = ProposalVotes { + votes_for: vec![RELAYER_A], + votes_against: vec![RELAYER_B], + status: ProposalStatus::Initiated, + expiry: ProposalLifetime::get() + 1, + }; + assert_eq!(prop, expected); + + // Third relayer votes in favour + assert_ok!(Bridge::acknowledge_proposal( + RuntimeOrigin::signed(RELAYER_C), + prop_id, + src_id, + r_id, + Box::new(proposal.clone()) + )); + let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let expected = ProposalVotes { + votes_for: vec![RELAYER_A, RELAYER_C], + votes_against: vec![RELAYER_B], + status: ProposalStatus::Approved, + expiry: ProposalLifetime::get() + 1, + }; + assert_eq!(prop, expected); + + assert_events(vec![ + RuntimeEvent::Bridge(RawEvent::VoteFor(src_id, prop_id, RELAYER_A)), + RuntimeEvent::Bridge(RawEvent::VoteAgainst(src_id, prop_id, RELAYER_B)), + RuntimeEvent::Bridge(RawEvent::VoteFor(src_id, prop_id, RELAYER_C)), + RuntimeEvent::Bridge(RawEvent::ProposalApproved(src_id, prop_id)), + RuntimeEvent::Bridge(RawEvent::ProposalSucceeded(src_id, prop_id)), + ]); + }) } #[test] fn create_unsucessful_proposal() { - let src_id = 1; - let r_id = derive_resource_id(src_id, b"transfer"); - - new_test_ext_initialized(src_id, r_id, b"System.remark".to_vec()).execute_with(|| { - let prop_id = 1; - let proposal = make_proposal(vec![11]); - - // Create proposal (& vote) - assert_ok!(Bridge::acknowledge_proposal( - Origin::signed(RELAYER_A), - prop_id, - src_id, - r_id, - Box::new(proposal.clone()) - )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); - let expected = ProposalVotes { - votes_for: vec![RELAYER_A], - votes_against: vec![], - status: ProposalStatus::Initiated, - expiry: ProposalLifetime::get() + 1, - }; - assert_eq!(prop, expected); - - // Second relayer votes against - assert_ok!(Bridge::reject_proposal( - Origin::signed(RELAYER_B), - prop_id, - src_id, - r_id, - Box::new(proposal.clone()) - )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); - let expected = ProposalVotes { - votes_for: vec![RELAYER_A], - votes_against: vec![RELAYER_B], - status: ProposalStatus::Initiated, - expiry: ProposalLifetime::get() + 1, - }; - assert_eq!(prop, expected); - - // Third relayer votes against - assert_ok!(Bridge::reject_proposal( - Origin::signed(RELAYER_C), - prop_id, - src_id, - r_id, - Box::new(proposal.clone()) - )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); - let expected = ProposalVotes { - votes_for: vec![RELAYER_A], - votes_against: vec![RELAYER_B, RELAYER_C], - status: ProposalStatus::Rejected, - expiry: ProposalLifetime::get() + 1, - }; - assert_eq!(prop, expected); - - assert_eq!(Balances::free_balance(RELAYER_B), 0); - assert_eq!( - Balances::free_balance(Bridge::account_id()), - ENDOWED_BALANCE - ); - - assert_events(vec![ - Event::Bridge(RawEvent::VoteFor(src_id, prop_id, RELAYER_A)), - Event::Bridge(RawEvent::VoteAgainst(src_id, prop_id, RELAYER_B)), - Event::Bridge(RawEvent::VoteAgainst(src_id, prop_id, RELAYER_C)), - Event::Bridge(RawEvent::ProposalRejected(src_id, prop_id)), - ]); - }) + let src_id = 1; + let r_id = derive_resource_id(src_id, b"transfer"); + + new_test_ext_initialized(src_id, r_id, b"System.remark".to_vec()).execute_with(|| { + let prop_id = 1; + let proposal = make_proposal(vec![11]); + + // Create proposal (& vote) + assert_ok!(Bridge::acknowledge_proposal( + RuntimeOrigin::signed(RELAYER_A), + prop_id, + src_id, + r_id, + Box::new(proposal.clone()) + )); + let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let expected = ProposalVotes { + votes_for: vec![RELAYER_A], + votes_against: vec![], + status: ProposalStatus::Initiated, + expiry: ProposalLifetime::get() + 1, + }; + assert_eq!(prop, expected); + + // Second relayer votes against + assert_ok!(Bridge::reject_proposal( + RuntimeOrigin::signed(RELAYER_B), + prop_id, + src_id, + r_id, + Box::new(proposal.clone()) + )); + let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let expected = ProposalVotes { + votes_for: vec![RELAYER_A], + votes_against: vec![RELAYER_B], + status: ProposalStatus::Initiated, + expiry: ProposalLifetime::get() + 1, + }; + assert_eq!(prop, expected); + + // Third relayer votes against + assert_ok!(Bridge::reject_proposal( + RuntimeOrigin::signed(RELAYER_C), + prop_id, + src_id, + r_id, + Box::new(proposal.clone()) + )); + let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let expected = ProposalVotes { + votes_for: vec![RELAYER_A], + votes_against: vec![RELAYER_B, RELAYER_C], + status: ProposalStatus::Rejected, + expiry: ProposalLifetime::get() + 1, + }; + assert_eq!(prop, expected); + + assert_eq!(Balances::free_balance(RELAYER_B), 0); + assert_eq!(Balances::free_balance(Bridge::account_id()), ENDOWED_BALANCE); + + assert_events(vec![ + RuntimeEvent::Bridge(RawEvent::VoteFor(src_id, prop_id, RELAYER_A)), + RuntimeEvent::Bridge(RawEvent::VoteAgainst(src_id, prop_id, RELAYER_B)), + RuntimeEvent::Bridge(RawEvent::VoteAgainst(src_id, prop_id, RELAYER_C)), + RuntimeEvent::Bridge(RawEvent::ProposalRejected(src_id, prop_id)), + ]); + }) } #[test] fn execute_after_threshold_change() { - let src_id = 1; - let r_id = derive_resource_id(src_id, b"transfer"); - - new_test_ext_initialized(src_id, r_id, b"System.remark".to_vec()).execute_with(|| { - let prop_id = 1; - let proposal = make_proposal(vec![11]); - - // Create proposal (& vote) - assert_ok!(Bridge::acknowledge_proposal( - Origin::signed(RELAYER_A), - prop_id, - src_id, - r_id, - Box::new(proposal.clone()) - )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); - let expected = ProposalVotes { - votes_for: vec![RELAYER_A], - votes_against: vec![], - status: ProposalStatus::Initiated, - expiry: ProposalLifetime::get() + 1, - }; - assert_eq!(prop, expected); - - // Change threshold - assert_ok!(Bridge::set_threshold(Origin::root(), 1)); - - // Attempt to execute - assert_ok!(Bridge::eval_vote_state( - Origin::signed(RELAYER_A), - prop_id, - src_id, - Box::new(proposal.clone()) - )); - - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); - let expected = ProposalVotes { - votes_for: vec![RELAYER_A], - votes_against: vec![], - status: ProposalStatus::Approved, - expiry: ProposalLifetime::get() + 1, - }; - assert_eq!(prop, expected); - - assert_eq!(Balances::free_balance(RELAYER_B), 0); - assert_eq!( - Balances::free_balance(Bridge::account_id()), - ENDOWED_BALANCE - ); - - assert_events(vec![ - Event::Bridge(RawEvent::VoteFor(src_id, prop_id, RELAYER_A)), - Event::Bridge(RawEvent::RelayerThresholdChanged(1)), - Event::Bridge(RawEvent::ProposalApproved(src_id, prop_id)), - Event::Bridge(RawEvent::ProposalSucceeded(src_id, prop_id)), - ]); - }) + let src_id = 1; + let r_id = derive_resource_id(src_id, b"transfer"); + + new_test_ext_initialized(src_id, r_id, b"System.remark".to_vec()).execute_with(|| { + let prop_id = 1; + let proposal = make_proposal(vec![11]); + + // Create proposal (& vote) + assert_ok!(Bridge::acknowledge_proposal( + RuntimeOrigin::signed(RELAYER_A), + prop_id, + src_id, + r_id, + Box::new(proposal.clone()) + )); + let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let expected = ProposalVotes { + votes_for: vec![RELAYER_A], + votes_against: vec![], + status: ProposalStatus::Initiated, + expiry: ProposalLifetime::get() + 1, + }; + assert_eq!(prop, expected); + + // Change threshold + assert_ok!(Bridge::set_threshold(RuntimeOrigin::root(), 1)); + + // Attempt to execute + assert_ok!(Bridge::eval_vote_state( + RuntimeOrigin::signed(RELAYER_A), + prop_id, + src_id, + Box::new(proposal.clone()) + )); + + let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let expected = ProposalVotes { + votes_for: vec![RELAYER_A], + votes_against: vec![], + status: ProposalStatus::Approved, + expiry: ProposalLifetime::get() + 1, + }; + assert_eq!(prop, expected); + + assert_eq!(Balances::free_balance(RELAYER_B), 0); + assert_eq!(Balances::free_balance(Bridge::account_id()), ENDOWED_BALANCE); + + assert_events(vec![ + RuntimeEvent::Bridge(RawEvent::VoteFor(src_id, prop_id, RELAYER_A)), + RuntimeEvent::Bridge(RawEvent::RelayerThresholdChanged(1)), + RuntimeEvent::Bridge(RawEvent::ProposalApproved(src_id, prop_id)), + RuntimeEvent::Bridge(RawEvent::ProposalSucceeded(src_id, prop_id)), + ]); + }) } #[test] fn proposal_expires() { - let src_id = 1; - let r_id = derive_resource_id(src_id, b"remark"); - - new_test_ext_initialized(src_id, r_id, b"System.remark".to_vec()).execute_with(|| { - let prop_id = 1; - let proposal = make_proposal(vec![10]); - - // Create proposal (& vote) - assert_ok!(Bridge::acknowledge_proposal( - Origin::signed(RELAYER_A), - prop_id, - src_id, - r_id, - Box::new(proposal.clone()) - )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); - let expected = ProposalVotes { - votes_for: vec![RELAYER_A], - votes_against: vec![], - status: ProposalStatus::Initiated, - expiry: ProposalLifetime::get() + 1, - }; - assert_eq!(prop, expected); - - // Increment enough blocks such that now == expiry - System::set_block_number(ProposalLifetime::get() + 1); - - // Attempt to submit a vote should fail - assert_noop!( - Bridge::reject_proposal( - Origin::signed(RELAYER_B), - prop_id, - src_id, - r_id, - Box::new(proposal.clone()) - ), - Error::::ProposalExpired - ); - - // Proposal state should remain unchanged - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); - let expected = ProposalVotes { - votes_for: vec![RELAYER_A], - votes_against: vec![], - status: ProposalStatus::Initiated, - expiry: ProposalLifetime::get() + 1, - }; - assert_eq!(prop, expected); - - // eval_vote_state should have no effect - assert_noop!( - Bridge::eval_vote_state( - Origin::signed(RELAYER_C), - prop_id, - src_id, - Box::new(proposal.clone()) - ), - Error::::ProposalExpired - ); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); - let expected = ProposalVotes { - votes_for: vec![RELAYER_A], - votes_against: vec![], - status: ProposalStatus::Initiated, - expiry: ProposalLifetime::get() + 1, - }; - assert_eq!(prop, expected); - - assert_events(vec![Event::Bridge(RawEvent::VoteFor( - src_id, prop_id, RELAYER_A, - ))]); - }) + let src_id = 1; + let r_id = derive_resource_id(src_id, b"remark"); + + new_test_ext_initialized(src_id, r_id, b"System.remark".to_vec()).execute_with(|| { + let prop_id = 1; + let proposal = make_proposal(vec![10]); + + // Create proposal (& vote) + assert_ok!(Bridge::acknowledge_proposal( + RuntimeOrigin::signed(RELAYER_A), + prop_id, + src_id, + r_id, + Box::new(proposal.clone()) + )); + let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let expected = ProposalVotes { + votes_for: vec![RELAYER_A], + votes_against: vec![], + status: ProposalStatus::Initiated, + expiry: ProposalLifetime::get() + 1, + }; + assert_eq!(prop, expected); + + // Increment enough blocks such that now == expiry + System::set_block_number(ProposalLifetime::get() + 1); + + // Attempt to submit a vote should fail + assert_noop!( + Bridge::reject_proposal( + RuntimeOrigin::signed(RELAYER_B), + prop_id, + src_id, + r_id, + Box::new(proposal.clone()) + ), + Error::::ProposalExpired + ); + + // Proposal state should remain unchanged + let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let expected = ProposalVotes { + votes_for: vec![RELAYER_A], + votes_against: vec![], + status: ProposalStatus::Initiated, + expiry: ProposalLifetime::get() + 1, + }; + assert_eq!(prop, expected); + + // eval_vote_state should have no effect + assert_noop!( + Bridge::eval_vote_state( + RuntimeOrigin::signed(RELAYER_C), + prop_id, + src_id, + Box::new(proposal.clone()) + ), + Error::::ProposalExpired + ); + let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let expected = ProposalVotes { + votes_for: vec![RELAYER_A], + votes_against: vec![], + status: ProposalStatus::Initiated, + expiry: ProposalLifetime::get() + 1, + }; + assert_eq!(prop, expected); + + assert_events(vec![RuntimeEvent::Bridge(RawEvent::VoteFor(src_id, prop_id, RELAYER_A))]); + }) } diff --git a/pallets/ddc-metrics-offchain-worker/Cargo.toml b/pallets/ddc-metrics-offchain-worker/Cargo.toml index cbc8209f2..e9de68b71 100644 --- a/pallets/ddc-metrics-offchain-worker/Cargo.toml +++ b/pallets/ddc-metrics-offchain-worker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-ddc-metrics-offchain-worker" -version = "4.7.0" +version = "4.8.0" authors = ["Parity Technologies "] edition = "2021" license = "Unlicense" @@ -14,19 +14,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["full"] } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } serde = { version = "1.0.136", optional = true } -sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-contracts = { version = '4.0.0-dev', default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts = { version = '4.0.0-dev', default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } lite-json = { version = "0.2.0", default-features = false } alt_serde = { version = "1", default-features = false, features = ["derive"] } serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } -# pallet-contracts-rpc-runtime-api = { version = "0.8.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +# pallet-contracts-rpc-runtime-api = { version = "0.8.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } hex-literal = "^0.3.1" hex = { version = "0.4", default-features = false } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } @@ -49,7 +49,7 @@ std = [ ] [dev-dependencies] -pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pretty_assertions = "0.6.1" diff --git a/pallets/ddc-metrics-offchain-worker/src/lib.rs b/pallets/ddc-metrics-offchain-worker/src/lib.rs index 34e8798d1..5c6c07892 100644 --- a/pallets/ddc-metrics-offchain-worker/src/lib.rs +++ b/pallets/ddc-metrics-offchain-worker/src/lib.rs @@ -9,22 +9,22 @@ mod tests; use alt_serde::{de::DeserializeOwned, Deserialize}; use codec::{Decode, Encode, HasCompact}; -use frame_support::traits::{Currency, Get}; use frame_support::{ - log::{error, info, warn}, - decl_event, decl_module, decl_storage, + decl_event, decl_module, decl_storage, + log::{error, info, warn}, + traits::{Currency, Get}, }; use frame_system::offchain::{ - AppCrypto, CreateSignedTransaction, SendSignedTransaction, Signer, SigningTypes, + AppCrypto, CreateSignedTransaction, SendSignedTransaction, Signer, SigningTypes, }; use hex_literal::hex; use pallet_contracts; use sp_core::crypto::{KeyTypeId, UncheckedFrom}; use sp_runtime::{ - offchain::{http, storage::StorageValueRef, Duration}, - traits::StaticLookup, - AccountId32, + offchain::{http, storage::StorageValueRef, Duration}, + traits::StaticLookup, + AccountId32, }; use sp_std::vec::Vec; @@ -47,39 +47,40 @@ pub const CURRENT_PERIOD_MS: [u8; 4] = hex!("ace4ecb3"); pub const GET_ALL_DDC_NODES_SELECTOR: [u8; 4] = hex!("e6c98b60"); pub const FINALIZE_METRIC_PERIOD: [u8; 4] = hex!("b269d557"); -type BalanceOf = -<::Currency as Currency<::AccountId>>::Balance; +type BalanceOf = <::Currency as Currency< + ::AccountId, +>>::Balance; #[derive(Encode, Decode)] pub struct DDCNode { - p2p_id: String, - p2p_addr: String, - url: String, - permissions: u64, + p2p_id: String, + p2p_addr: String, + url: String, + permissions: u64, } struct Metric { - app_id: String, - storage_bytes: u64, - wcu_used: u64, - rcu_used: u64, + app_id: String, + storage_bytes: u64, + wcu_used: u64, + rcu_used: u64, } struct MetricDDN { - p2p_id: String, - storage_bytes: u64, - wcu_used: u64, - rcu_used: u64, + p2p_id: String, + storage_bytes: u64, + wcu_used: u64, + rcu_used: u64, } #[derive(Deserialize)] #[serde(crate = "alt_serde")] #[allow(non_snake_case)] struct ApiMetric { - appPubKey: String, - storageBytes: u64, - wcuUsed: u64, - rcuUsed: u64, + appPubKey: String, + storageBytes: u64, + wcuUsed: u64, + rcuUsed: u64, } /// Defines application identifier for crypto keys of this module. @@ -102,30 +103,30 @@ pub const HTTP_TIMEOUT_MS: u64 = 30_000; // in milli-seconds /// We can use from supported crypto kinds (`sr25519`, `ed25519` and `ecdsa`) and augment /// the types with this pallet-specific identifier. pub mod crypto { - use super::KEY_TYPE; - use frame_system::offchain::AppCrypto; - use sp_core::sr25519::Signature as Sr25519Signature; - use sp_runtime::{ - app_crypto::{app_crypto, sr25519}, - traits::Verify, - }; - app_crypto!(sr25519, KEY_TYPE); - - use sp_runtime::{MultiSignature, MultiSigner}; - - pub struct TestAuthId; - - impl AppCrypto<::Signer, Sr25519Signature> for TestAuthId { - type RuntimeAppPublic = Public; - type GenericSignature = sp_core::sr25519::Signature; - type GenericPublic = sp_core::sr25519::Public; - } - - impl AppCrypto for TestAuthId { - type RuntimeAppPublic = Public; - type GenericSignature = sp_core::sr25519::Signature; - type GenericPublic = sp_core::sr25519::Public; - } + use super::KEY_TYPE; + use frame_system::offchain::AppCrypto; + use sp_core::sr25519::Signature as Sr25519Signature; + use sp_runtime::{ + app_crypto::{app_crypto, sr25519}, + traits::Verify, + }; + app_crypto!(sr25519, KEY_TYPE); + + use sp_runtime::{MultiSignature, MultiSigner}; + + pub struct TestAuthId; + + impl AppCrypto<::Signer, Sr25519Signature> for TestAuthId { + type RuntimeAppPublic = Public; + type GenericSignature = sp_core::sr25519::Signature; + type GenericPublic = sp_core::sr25519::Public; + } + + impl AppCrypto for TestAuthId { + type RuntimeAppPublic = Public; + type GenericSignature = sp_core::sr25519::Signature; + type GenericPublic = sp_core::sr25519::Public; + } } type ResultStr = Result; @@ -133,291 +134,288 @@ type ResultStr = Result; const MS_PER_DAY: u64 = 24 * 3600 * 1000; decl_module! { - /// A public part of the pallet. - pub struct Module for enum Call where - origin: T::Origin, - ::AccountId: AsRef<[u8]>, - ::AccountId: UncheckedFrom, - as HasCompact>::Type: Clone, - as HasCompact>::Type: Eq, - as HasCompact>::Type: PartialEq, - as HasCompact>::Type: Debug, - as HasCompact>::Type: TypeInfo, - as HasCompact>::Type: Encode { - //fn deposit_event() = default; - - /// Offchain Worker entry point. - /// - /// By implementing `fn offchain_worker` within `decl_module!` you declare a new offchain - /// worker. - /// This function will be called when the node is fully synced and a new best block is - /// succesfuly imported. - /// Note that it's not guaranteed for offchain workers to run on EVERY block, there might - /// be cases where some blocks are skipped, or for some the worker runs twice (re-orgs), - /// so the code should be able to handle that. - /// You can use `Local Storage` API to coordinate runs of the worker. - /// You can use `debug::native` namespace to not log in wasm mode. - fn offchain_worker(block_number: T::BlockNumber) { - let res = Self::offchain_worker_main(block_number); - match res { - Ok(()) => info!("[OCW] Offchain Worker complete."), - Err(err) => error!("[OCW] Error in Offchain Worker: {}", err), - }; - } - } + /// A public part of the pallet. + pub struct Module for enum Call where + origin: T::RuntimeOrigin, + ::AccountId: AsRef<[u8]>, + ::AccountId: UncheckedFrom, + as HasCompact>::Type: Clone, + as HasCompact>::Type: Eq, + as HasCompact>::Type: PartialEq, + as HasCompact>::Type: Debug, + as HasCompact>::Type: TypeInfo, + as HasCompact>::Type: Encode { + //fn deposit_event() = default; + + /// Offchain Worker entry point. + /// + /// By implementing `fn offchain_worker` within `decl_module!` you declare a new offchain + /// worker. + /// This function will be called when the node is fully synced and a new best block is + /// succesfuly imported. + /// Note that it's not guaranteed for offchain workers to run on EVERY block, there might + /// be cases where some blocks are skipped, or for some the worker runs twice (re-orgs), + /// so the code should be able to handle that. + /// You can use `Local Storage` API to coordinate runs of the worker. + /// You can use `debug::native` namespace to not log in wasm mode. + fn offchain_worker(block_number: T::BlockNumber) { + let res = Self::offchain_worker_main(block_number); + match res { + Ok(()) => info!("[OCW] Offchain Worker complete."), + Err(err) => error!("[OCW] Error in Offchain Worker: {}", err), + }; + } + } } decl_storage! { - trait Store for Module as DdcMetricsOffchainWorker - where ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode { - } + trait Store for Module as DdcMetricsOffchainWorker + where ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode { + } } impl Module - where ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode { - fn offchain_worker_main(block_number: T::BlockNumber) -> ResultStr<()> { - let signer = match Self::get_signer() { - Err(e) => { - warn!("{:?}", e); - return Ok(()); - } - Ok(signer) => signer, - }; - - let contract_address = match Self::get_contract_id() { - None => return Ok(()), - Some(contract_address) => contract_address, - }; - - let should_proceed = Self::check_if_should_proceed(block_number); - if should_proceed == false { - return Ok(()); - } - - let day_start_ms = - Self::sc_get_current_period_ms(contract_address.clone()).map_err(|err| { - error!("[OCW] Contract error occurred: {:?}", err); - "Could not call get_current_period_ms TX" - })?; - - let day_end_ms = day_start_ms + MS_PER_DAY; - - let (aggregated_metrics, ddn_aggregated_metrics, offline_nodes) = - Self::fetch_all_metrics(contract_address.clone(), day_start_ms).map_err(|err| { - error!("[OCW] HTTP error occurred: {:?}", err); - "could not fetch metrics" - })?; - - for offline_node in offline_nodes { - let p2p_id = offline_node.p2p_id; - let contract_id = contract_address.clone(); - Self::report_ddn_status_to_sc(contract_id, &signer, &p2p_id, false).map_err(|err| { - error!("[OCW] Contract error occurred: {:?}", err); - "could not submit report_ddn_status TX" - })?; - } - - Self::send_metrics_to_sc( - contract_address.clone(), - &signer, - day_start_ms, - aggregated_metrics, - ) - .map_err(|err| { - error!("[OCW] Contract error occurred: {:?}", err); - "could not submit report_metrics TX" - })?; - - Self::send_metrics_ddn_to_sc( - contract_address.clone(), - &signer, - day_start_ms, - ddn_aggregated_metrics, - ) - .map_err(|err| { - error!("[OCW] Contract error occurred: {:?}", err); - "could not submit report_metrics_ddn TX" - })?; - - let block_timestamp = sp_io::offchain::timestamp().unix_millis(); - - if day_end_ms < block_timestamp { - Self::finalize_metric_period(contract_address.clone(), &signer, day_start_ms).map_err( - |err| { - error!("[OCW] Contract error occurred: {:?}", err); - "could not call finalize_metric_period TX" - }, - )?; - } - - Ok(()) - } - - fn get_contract_id() -> Option<::AccountId> { - let value = StorageValueRef::persistent(b"ddc-metrics-offchain-worker::sc_address").get(); - - match value { - Ok(None) => { - warn!("[OCW] Smart Contract is not configured. Please configure it using offchain_localStorageSet with key=ddc-metrics-offchain-worker::sc_address"); - None - } - Ok(Some(contract_address)) => Some(contract_address), - Err(_) => { - error!("[OCW] Smart Contract is configured but the value could not be decoded to an account ID"); - None - } - } - } +where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, +{ + fn offchain_worker_main(block_number: T::BlockNumber) -> ResultStr<()> { + let signer = match Self::get_signer() { + Err(e) => { + warn!("{:?}", e); + return Ok(()) + }, + Ok(signer) => signer, + }; + + let contract_address = match Self::get_contract_id() { + None => return Ok(()), + Some(contract_address) => contract_address, + }; + + let should_proceed = Self::check_if_should_proceed(block_number); + if should_proceed == false { + return Ok(()) + } - fn get_block_interval() -> Option { - let value = StorageValueRef::persistent(b"ddc-metrics-offchain-worker::block_interval").get::(); + let day_start_ms = + Self::sc_get_current_period_ms(contract_address.clone()).map_err(|err| { + error!("[OCW] Contract error occurred: {:?}", err); + "Could not call get_current_period_ms TX" + })?; + + let day_end_ms = day_start_ms + MS_PER_DAY; + + let (aggregated_metrics, ddn_aggregated_metrics, offline_nodes) = + Self::fetch_all_metrics(contract_address.clone(), day_start_ms).map_err(|err| { + error!("[OCW] HTTP error occurred: {:?}", err); + "could not fetch metrics" + })?; + + for offline_node in offline_nodes { + let p2p_id = offline_node.p2p_id; + let contract_id = contract_address.clone(); + Self::report_ddn_status_to_sc(contract_id, &signer, &p2p_id, false).map_err(|err| { + error!("[OCW] Contract error occurred: {:?}", err); + "could not submit report_ddn_status TX" + })?; + } + + Self::send_metrics_to_sc( + contract_address.clone(), + &signer, + day_start_ms, + aggregated_metrics, + ) + .map_err(|err| { + error!("[OCW] Contract error occurred: {:?}", err); + "could not submit report_metrics TX" + })?; + + Self::send_metrics_ddn_to_sc( + contract_address.clone(), + &signer, + day_start_ms, + ddn_aggregated_metrics, + ) + .map_err(|err| { + error!("[OCW] Contract error occurred: {:?}", err); + "could not submit report_metrics_ddn TX" + })?; + + let block_timestamp = sp_io::offchain::timestamp().unix_millis(); + + if day_end_ms < block_timestamp { + Self::finalize_metric_period(contract_address.clone(), &signer, day_start_ms).map_err( + |err| { + error!("[OCW] Contract error occurred: {:?}", err); + "could not call finalize_metric_period TX" + }, + )?; + } + + Ok(()) + } + + fn get_contract_id() -> Option<::AccountId> { + let value = StorageValueRef::persistent(b"ddc-metrics-offchain-worker::sc_address").get(); match value { Ok(None) => { + warn!("[OCW] Smart Contract is not configured. Please configure it using offchain_localStorageSet with key=ddc-metrics-offchain-worker::sc_address"); None - } - Ok(Some(block_interval)) => Some(block_interval), - Err(_) => { - error!("[OCW] Block Interval could not be decoded"); - None - } + }, + Ok(Some(contract_address)) => Some(contract_address), + Err(_) => { + error!("[OCW] Smart Contract is configured but the value could not be decoded to an account ID"); + None + }, } } - fn check_if_should_proceed(block_number: T::BlockNumber) -> bool { - let s_next_at = StorageValueRef::persistent(b"ddc-metrics-offchain-worker::next-at"); + fn get_block_interval() -> Option { + let value = StorageValueRef::persistent(b"ddc-metrics-offchain-worker::block_interval") + .get::(); - match s_next_at.mutate(|current_next_at| { - let current_next_at = match current_next_at { - Ok(Some(val)) => Some(val), - _ => Some(T::BlockNumber::default()), - }; + match value { + Ok(None) => None, + Ok(Some(block_interval)) => Some(block_interval), + Err(_) => { + error!("[OCW] Block Interval could not be decoded"); + None + }, + } + } - if let Some(current_next_at) = current_next_at { - if current_next_at > block_number { - info!( - "[OCW] Too early to execute. Current: {:?}, next execution at: {:?}", - block_number, current_next_at - ); - Err("Skipping") - } else { + fn check_if_should_proceed(block_number: T::BlockNumber) -> bool { + let s_next_at = StorageValueRef::persistent(b"ddc-metrics-offchain-worker::next-at"); + + match s_next_at.mutate(|current_next_at| { + let current_next_at = match current_next_at { + Ok(Some(val)) => Some(val), + _ => Some(T::BlockNumber::default()), + }; + + if let Some(current_next_at) = current_next_at { + if current_next_at > block_number { + info!( + "[OCW] Too early to execute. Current: {:?}, next execution at: {:?}", + block_number, current_next_at + ); + Err("Skipping") + } else { let block_interval_configured = Self::get_block_interval(); let mut block_interval = T::BlockInterval::get(); if block_interval_configured.is_some() { - block_interval = ::BlockNumber::from(block_interval_configured.unwrap()); + block_interval = ::BlockNumber::from( + block_interval_configured.unwrap(), + ); } - // set new value - Ok(block_interval + block_number) - } - } else { - error!("[OCW] Something went wrong in `check_if_should_proceed`"); - Err("Unexpected error") - } - }) { - Ok(_val) => true, - Err(_e) => false, - } - } - - fn get_start_of_day_ms() -> u64 { - let now = sp_io::offchain::timestamp(); - let day_start_ms = (now.unix_millis() / MS_PER_DAY) * MS_PER_DAY; - day_start_ms - } - - fn get_signer() -> ResultStr> { - let signer = Signer::<_, _>::any_account(); - if !signer.can_sign() { - return Err("[OCW] No local accounts available. Consider adding one via `author_insertKey` RPC."); - } - Ok(signer) - } - - fn sc_get_current_period_ms( - contract_id: ::AccountId, - ) -> ResultStr { - let call_data = Self::encode_get_current_period_ms(); - let nobody = T::AccountId::decode(&mut sp_runtime::traits::TrailingZeroInput::zeroes()); - let contract_exec_result = pallet_contracts::Pallet::::bare_call( - nobody.unwrap(), - contract_id, - 0u32.into(), - Weight::from_ref_time(100_000_000_000), - None, - call_data, - false, - ); - - let mut data = match &contract_exec_result.result { - Ok(v) => &v.data[..], - Err(exec_error) => { - // Return default value in case of error - warn!("[OCW] Error in call get_current_period_ms of smart contract. Return default value for period. Details: {:?}", exec_error); - return Ok(Self::get_start_of_day_ms()); - } - }; - - let current_period_ms = u64::decode(&mut data) - .map_err(|_| "[OCW] error decoding get_current_period_ms result")?; - - info!( - "[OCW] sc_get_current_period_ms - data response from sc: {:?}", - current_period_ms - ); - - Ok(current_period_ms) - } - - fn finalize_metric_period( - contract_id: ::AccountId, - signer: &Signer, - in_day_start_ms: u64, - ) -> ResultStr<()> { - let contract_id_unl = - <::Lookup as StaticLookup>::unlookup(contract_id); - - let call_data = Self::encode_finalize_metric_period(in_day_start_ms); - - let results = signer.send_signed_transaction(|_account| { - pallet_contracts::Call::call { - dest: contract_id_unl.clone(), - value: 0u32.into(), - gas_limit: Weight::from_ref_time(100_000_000_000), - storage_deposit_limit: None, - data: call_data.clone(), - } - }); - - match &results { - None | Some((_, Err(()))) => { - return Err("Error while submitting finalize_metric_period TX to SC") - } - Some((_, Ok(()))) => {} - } - - Ok(()) - } - - fn send_metrics_to_sc( - contract_id: ::AccountId, - signer: &Signer, - day_start_ms: u64, - metrics: Vec, - ) -> ResultStr<()> { - info!("[OCW] Using Contract Address: {:?}", contract_id); - - for one_metric in metrics.iter() { - let app_id = Self::account_id_from_hex(&one_metric.app_id)?; - - if one_metric.storage_bytes == 0 && one_metric.wcu_used == 0 && one_metric.rcu_used == 0 - { - continue; - } - - let results = signer.send_signed_transaction(|account| { + // set new value + Ok(block_interval + block_number) + } + } else { + error!("[OCW] Something went wrong in `check_if_should_proceed`"); + Err("Unexpected error") + } + }) { + Ok(_val) => true, + Err(_e) => false, + } + } + + fn get_start_of_day_ms() -> u64 { + let now = sp_io::offchain::timestamp(); + let day_start_ms = (now.unix_millis() / MS_PER_DAY) * MS_PER_DAY; + day_start_ms + } + + fn get_signer() -> ResultStr> { + let signer = Signer::<_, _>::any_account(); + if !signer.can_sign() { + return Err("[OCW] No local accounts available. Consider adding one via `author_insertKey` RPC."); + } + Ok(signer) + } + + fn sc_get_current_period_ms( + contract_id: ::AccountId, + ) -> ResultStr { + let call_data = Self::encode_get_current_period_ms(); + let nobody = T::AccountId::decode(&mut sp_runtime::traits::TrailingZeroInput::zeroes()); + let contract_exec_result = pallet_contracts::Pallet::::bare_call( + nobody.unwrap(), + contract_id, + 0u32.into(), + Weight::from_ref_time(100_000_000_000), + None, + call_data, + false, + ); + + let mut data = match &contract_exec_result.result { + Ok(v) => &v.data[..], + Err(exec_error) => { + // Return default value in case of error + warn!("[OCW] Error in call get_current_period_ms of smart contract. Return default value for period. Details: {:?}", exec_error); + return Ok(Self::get_start_of_day_ms()) + }, + }; + + let current_period_ms = u64::decode(&mut data) + .map_err(|_| "[OCW] error decoding get_current_period_ms result")?; + + info!("[OCW] sc_get_current_period_ms - data response from sc: {:?}", current_period_ms); + + Ok(current_period_ms) + } + + fn finalize_metric_period( + contract_id: ::AccountId, + signer: &Signer, + in_day_start_ms: u64, + ) -> ResultStr<()> { + let contract_id_unl = + <::Lookup as StaticLookup>::unlookup(contract_id); + + let call_data = Self::encode_finalize_metric_period(in_day_start_ms); + + let results = signer.send_signed_transaction(|_account| pallet_contracts::Call::call { + dest: contract_id_unl.clone(), + value: 0u32.into(), + gas_limit: Weight::from_ref_time(100_000_000_000), + storage_deposit_limit: None, + data: call_data.clone(), + }); + + match &results { + None | Some((_, Err(()))) => + return Err("Error while submitting finalize_metric_period TX to SC"), + Some((_, Ok(()))) => {}, + } + + Ok(()) + } + + fn send_metrics_to_sc( + contract_id: ::AccountId, + signer: &Signer, + day_start_ms: u64, + metrics: Vec, + ) -> ResultStr<()> { + info!("[OCW] Using Contract Address: {:?}", contract_id); + + for one_metric in metrics.iter() { + let app_id = Self::account_id_from_hex(&one_metric.app_id)?; + + if one_metric.storage_bytes == 0 && one_metric.wcu_used == 0 && one_metric.rcu_used == 0 + { + continue + } + + let results = signer.send_signed_transaction(|account| { info!( "[OCW] Sending transactions from {:?}: report_metrics({:?}, {:?}, {:?}, {:?}, {:?})", account.id, @@ -450,25 +448,25 @@ impl Module } }); - match &results { - None | Some((_, Err(()))) => return Err("Error while submitting TX to SC"), - Some((_, Ok(()))) => {} - } - } - - Ok(()) - } - - fn send_metrics_ddn_to_sc( - contract_id: ::AccountId, - signer: &Signer, - day_start_ms: u64, - metrics: Vec, - ) -> ResultStr<()> { - info!("[OCW] Using Contract Address: {:?}", contract_id); - - for one_metric in metrics.iter() { - let results = signer.send_signed_transaction(|account| { + match &results { + None | Some((_, Err(()))) => return Err("Error while submitting TX to SC"), + Some((_, Ok(()))) => {}, + } + } + + Ok(()) + } + + fn send_metrics_ddn_to_sc( + contract_id: ::AccountId, + signer: &Signer, + day_start_ms: u64, + metrics: Vec, + ) -> ResultStr<()> { + info!("[OCW] Using Contract Address: {:?}", contract_id); + + for one_metric in metrics.iter() { + let results = signer.send_signed_transaction(|account| { info!( "[OCW] Sending transactions from {:?}: report_metrics_ddn({:?}, {:?}, {:?}, {:?}, {:?})", account.id, @@ -500,362 +498,346 @@ impl Module } }); - match &results { - None | Some((_, Err(()))) => return Err("Error while submitting TX to SC"), - Some((_, Ok(()))) => {} - } - } - - Ok(()) - } - - fn report_ddn_status_to_sc( - contract_id: ::AccountId, - signer: &Signer, - p2p_id: &String, - is_online: bool, - ) -> ResultStr<()> { - info!("[OCW] Using Contract Address: {:?}", contract_id); - - let results = signer.send_signed_transaction(|account| { - info!( - "[OCW] Sending transactions from {:?}: report_ddn_status({:?}, {:?})", - account.id, p2p_id, is_online, - ); - - let call_data = Self::encode_report_ddn_status(&p2p_id, is_online); - - let contract_id_unl = - <::Lookup as StaticLookup>::unlookup( - contract_id.clone(), - ); + match &results { + None | Some((_, Err(()))) => return Err("Error while submitting TX to SC"), + Some((_, Ok(()))) => {}, + } + } - pallet_contracts::Call::call { - dest: contract_id_unl, - value: 0u32.into(), - gas_limit: Weight::from_ref_time(100_000_000_000), - storage_deposit_limit: None, - data: call_data, - } - }); - - match &results { - None | Some((_, Err(()))) => return Err("Error while submitting TX to SC"), - Some((_, Ok(()))) => {} - } - - Ok(()) - } - - fn fetch_all_metrics( - contract_id: ::AccountId, - day_start_ms: u64, - ) -> ResultStr<(Vec, Vec, Vec)> { - let a_moment_ago_ms = sp_io::offchain::timestamp() - .sub(Duration::from_millis(END_TIME_DELAY_MS)) - .unix_millis(); - - let mut aggregated_metrics = MetricsAggregator::default(); - let mut ddn_aggregated_metrics = DDNMetricsAggregator::default(); - - let nodes = Self::fetch_nodes(contract_id)?; - let mut offline_nodes: Vec = Vec::new(); - - for node in nodes { - let metrics_of_node = - match Self::fetch_node_metrics(&node.url, day_start_ms, a_moment_ago_ms) { - Ok(value) => value, - Err(_) => { - offline_nodes.push(node); - continue; - } - }; - - ddn_aggregated_metrics.add(node.p2p_id.clone(), &metrics_of_node); - - for metric in &metrics_of_node { - aggregated_metrics.add(metric); - } - } - - Ok(( - aggregated_metrics.finish(), - ddn_aggregated_metrics.finish(), - offline_nodes, - )) - } - - fn fetch_nodes( - contract_id: ::AccountId, - ) -> ResultStr> { - let nobody = T::AccountId::decode(&mut sp_runtime::traits::TrailingZeroInput::zeroes()); - let call_data = Self::encode_get_all_ddc_nodes(); - let contract_exec_result = pallet_contracts::Pallet::::bare_call( - nobody.unwrap(), - contract_id, - 0u32.into(), - Weight::from_ref_time(100_000_000_000), - None, - call_data, - false - ); - - let mut data = match &contract_exec_result.result { - Ok(v) => &v.data[..], - Err(exec_error) => { - warn!( - "[OCW] Error in call get_all_ddc_nodes of smart contract. Error: {:?}", - exec_error - ); - return Ok(Vec::new()); - } - }; - - let ddc_nodes = Vec::::decode(&mut data) - .map_err(|_| "[OCW] error decoding get_all_ddc_nodes result")?; - - Ok(ddc_nodes) - } - - fn fetch_node_metrics( - node_url: &str, - day_start_ms: u64, - end_ms: u64, - ) -> ResultStr> { - let metrics_url = format!( - "{}{}{}{}{}{}", - node_url, - HTTP_METRICS, - METRICS_PARAM_FROM, - day_start_ms / 1000, - METRICS_PARAM_TO, - end_ms / 1000 - ); - - let metrics: Vec = Self::http_get_json(&metrics_url)?; - - Ok(metrics - .into_iter() - .map(|data| Metric { - app_id: data.appPubKey, - storage_bytes: data.storageBytes, - wcu_used: data.wcuUsed, - rcu_used: data.rcuUsed, - }) - .collect()) - } - - fn http_get_json(url: &str) -> ResultStr { - let body = Self::http_get_request(url).map_err(|err| { - error!("[OCW] Error while getting {}: {:?}", url, err); - "HTTP GET error" - })?; - - let parsed = serde_json::from_slice(&body).map_err(|err| { - warn!("[OCW] Error while parsing JSON from {}: {:?}", url, err); - "HTTP JSON parse error" - }); - - parsed - } - - fn http_get_request(http_url: &str) -> Result, http::Error> { - info!("[OCW] Sending request to: {:?}", http_url); - - // Initiate an external HTTP GET request. This is using high-level wrappers from `sp_runtime`. - let request = http::Request::get(http_url); - - let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); - - let pending = request - .deadline(deadline) - .send() - .map_err(|_| http::Error::IoError)?; - - let response = pending - .try_wait(deadline) - .map_err(|_| http::Error::DeadlineReached)??; - - if response.code != 200 { - warn!( - "[OCW] http_get_request unexpected status code: {}", - response.code - ); - return Err(http::Error::Unknown); - } - - // Next we fully read the response body and collect it to a vector of bytes. - Ok(response.body().collect::>()) - } - - /// Prepare get_current_period_ms call params. - /// Must match the contract function here: https://github.com/Cerebellum-Network/cere-enterprise-smart-contracts/blob/dev/cere02/lib.rs - fn encode_get_current_period_ms() -> Vec { - CURRENT_PERIOD_MS.to_vec() - } - - /// Prepare encode_get_current_period_ms call params. - fn encode_get_all_ddc_nodes() -> Vec { - GET_ALL_DDC_NODES_SELECTOR.to_vec() - } - - /// Prepare finalize_metric_period call params. - /// Must match the contract function here: https://github.com/Cerebellum-Network/cere-enterprise-smart-contracts/blob/dev/cere02/lib.rs - fn encode_finalize_metric_period(in_day_start_ms: u64) -> Vec { - let mut call_data = FINALIZE_METRIC_PERIOD.to_vec(); - in_day_start_ms.encode_to(&mut call_data); - - call_data - } - - /// Prepare report_metrics call params. - /// Must match the contract function here: https://github.com/Cerebellum-Network/cere-enterprise-smart-contracts/blob/dev/cere02/lib.rs - fn encode_report_metrics( - app_id: &AccountId32, - day_start_ms: u64, - storage_bytes: u64, - wcu_used: u64, - rcu_used: u64, - ) -> Vec { - let mut call_data = REPORT_METRICS_SELECTOR.to_vec(); - app_id.encode_to(&mut call_data); - day_start_ms.encode_to(&mut call_data); - storage_bytes.encode_to(&mut call_data); - wcu_used.encode_to(&mut call_data); - rcu_used.encode_to(&mut call_data); - - call_data - } - - fn encode_report_metrics_ddn( - p2p_id: String, - day_start_ms: u64, - storage_bytes: u64, - wcu_used: u64, - rcu_used: u64, - ) -> Vec { - let mut call_data = REPORT_METRICS_DDN_SELECTOR.to_vec(); - p2p_id.encode_to(&mut call_data); - day_start_ms.encode_to(&mut call_data); - storage_bytes.encode_to(&mut call_data); - wcu_used.encode_to(&mut call_data); - rcu_used.encode_to(&mut call_data); - - call_data - } - - fn encode_report_ddn_status(p2p_id: &String, is_online: bool) -> Vec { - let mut call_data = REPORT_DDN_STATUS_SELECTOR.to_vec(); - p2p_id.encode_to(&mut call_data); - is_online.encode_to(&mut call_data); - call_data - } - - fn account_id_from_hex(id_hex: &str) -> ResultStr { - let id_hex = id_hex.trim_start_matches("0x"); - if id_hex.len() != 64 { - return Err("Wrong length of hex-encoded account ID, expected 64"); - } - let mut bytes = [0u8; 32]; - hex::decode_to_slice(id_hex, &mut bytes).map_err(|_| "invalid hex address.")?; - Ok(AccountId32::from(bytes)) - } + Ok(()) + } + + fn report_ddn_status_to_sc( + contract_id: ::AccountId, + signer: &Signer, + p2p_id: &String, + is_online: bool, + ) -> ResultStr<()> { + info!("[OCW] Using Contract Address: {:?}", contract_id); + + let results = signer.send_signed_transaction(|account| { + info!( + "[OCW] Sending transactions from {:?}: report_ddn_status({:?}, {:?})", + account.id, p2p_id, is_online, + ); + + let call_data = Self::encode_report_ddn_status(&p2p_id, is_online); + + let contract_id_unl = <::Lookup as StaticLookup>::unlookup( + contract_id.clone(), + ); + + pallet_contracts::Call::call { + dest: contract_id_unl, + value: 0u32.into(), + gas_limit: Weight::from_ref_time(100_000_000_000), + storage_deposit_limit: None, + data: call_data, + } + }); + + match &results { + None | Some((_, Err(()))) => return Err("Error while submitting TX to SC"), + Some((_, Ok(()))) => {}, + } + + Ok(()) + } + + fn fetch_all_metrics( + contract_id: ::AccountId, + day_start_ms: u64, + ) -> ResultStr<(Vec, Vec, Vec)> { + let a_moment_ago_ms = sp_io::offchain::timestamp() + .sub(Duration::from_millis(END_TIME_DELAY_MS)) + .unix_millis(); + + let mut aggregated_metrics = MetricsAggregator::default(); + let mut ddn_aggregated_metrics = DDNMetricsAggregator::default(); + + let nodes = Self::fetch_nodes(contract_id)?; + let mut offline_nodes: Vec = Vec::new(); + + for node in nodes { + let metrics_of_node = + match Self::fetch_node_metrics(&node.url, day_start_ms, a_moment_ago_ms) { + Ok(value) => value, + Err(_) => { + offline_nodes.push(node); + continue + }, + }; + + ddn_aggregated_metrics.add(node.p2p_id.clone(), &metrics_of_node); + + for metric in &metrics_of_node { + aggregated_metrics.add(metric); + } + } + + Ok((aggregated_metrics.finish(), ddn_aggregated_metrics.finish(), offline_nodes)) + } + + fn fetch_nodes(contract_id: ::AccountId) -> ResultStr> { + let nobody = T::AccountId::decode(&mut sp_runtime::traits::TrailingZeroInput::zeroes()); + let call_data = Self::encode_get_all_ddc_nodes(); + let contract_exec_result = pallet_contracts::Pallet::::bare_call( + nobody.unwrap(), + contract_id, + 0u32.into(), + Weight::from_ref_time(100_000_000_000), + None, + call_data, + false, + ); + + let mut data = match &contract_exec_result.result { + Ok(v) => &v.data[..], + Err(exec_error) => { + warn!( + "[OCW] Error in call get_all_ddc_nodes of smart contract. Error: {:?}", + exec_error + ); + return Ok(Vec::new()) + }, + }; + + let ddc_nodes = Vec::::decode(&mut data) + .map_err(|_| "[OCW] error decoding get_all_ddc_nodes result")?; + + Ok(ddc_nodes) + } + + fn fetch_node_metrics( + node_url: &str, + day_start_ms: u64, + end_ms: u64, + ) -> ResultStr> { + let metrics_url = format!( + "{}{}{}{}{}{}", + node_url, + HTTP_METRICS, + METRICS_PARAM_FROM, + day_start_ms / 1000, + METRICS_PARAM_TO, + end_ms / 1000 + ); + + let metrics: Vec = Self::http_get_json(&metrics_url)?; + + Ok(metrics + .into_iter() + .map(|data| Metric { + app_id: data.appPubKey, + storage_bytes: data.storageBytes, + wcu_used: data.wcuUsed, + rcu_used: data.rcuUsed, + }) + .collect()) + } + + fn http_get_json(url: &str) -> ResultStr { + let body = Self::http_get_request(url).map_err(|err| { + error!("[OCW] Error while getting {}: {:?}", url, err); + "HTTP GET error" + })?; + + let parsed = serde_json::from_slice(&body).map_err(|err| { + warn!("[OCW] Error while parsing JSON from {}: {:?}", url, err); + "HTTP JSON parse error" + }); + + parsed + } + + fn http_get_request(http_url: &str) -> Result, http::Error> { + info!("[OCW] Sending request to: {:?}", http_url); + + // Initiate an external HTTP GET request. This is using high-level wrappers from + // `sp_runtime`. + let request = http::Request::get(http_url); + + let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); + + let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; + + let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; + + if response.code != 200 { + warn!("[OCW] http_get_request unexpected status code: {}", response.code); + return Err(http::Error::Unknown) + } + + // Next we fully read the response body and collect it to a vector of bytes. + Ok(response.body().collect::>()) + } + + /// Prepare get_current_period_ms call params. + /// Must match the contract function here: https://github.com/Cerebellum-Network/cere-enterprise-smart-contracts/blob/dev/cere02/lib.rs + fn encode_get_current_period_ms() -> Vec { + CURRENT_PERIOD_MS.to_vec() + } + + /// Prepare encode_get_current_period_ms call params. + fn encode_get_all_ddc_nodes() -> Vec { + GET_ALL_DDC_NODES_SELECTOR.to_vec() + } + + /// Prepare finalize_metric_period call params. + /// Must match the contract function here: https://github.com/Cerebellum-Network/cere-enterprise-smart-contracts/blob/dev/cere02/lib.rs + fn encode_finalize_metric_period(in_day_start_ms: u64) -> Vec { + let mut call_data = FINALIZE_METRIC_PERIOD.to_vec(); + in_day_start_ms.encode_to(&mut call_data); + + call_data + } + + /// Prepare report_metrics call params. + /// Must match the contract function here: https://github.com/Cerebellum-Network/cere-enterprise-smart-contracts/blob/dev/cere02/lib.rs + fn encode_report_metrics( + app_id: &AccountId32, + day_start_ms: u64, + storage_bytes: u64, + wcu_used: u64, + rcu_used: u64, + ) -> Vec { + let mut call_data = REPORT_METRICS_SELECTOR.to_vec(); + app_id.encode_to(&mut call_data); + day_start_ms.encode_to(&mut call_data); + storage_bytes.encode_to(&mut call_data); + wcu_used.encode_to(&mut call_data); + rcu_used.encode_to(&mut call_data); + + call_data + } + + fn encode_report_metrics_ddn( + p2p_id: String, + day_start_ms: u64, + storage_bytes: u64, + wcu_used: u64, + rcu_used: u64, + ) -> Vec { + let mut call_data = REPORT_METRICS_DDN_SELECTOR.to_vec(); + p2p_id.encode_to(&mut call_data); + day_start_ms.encode_to(&mut call_data); + storage_bytes.encode_to(&mut call_data); + wcu_used.encode_to(&mut call_data); + rcu_used.encode_to(&mut call_data); + + call_data + } + + fn encode_report_ddn_status(p2p_id: &String, is_online: bool) -> Vec { + let mut call_data = REPORT_DDN_STATUS_SELECTOR.to_vec(); + p2p_id.encode_to(&mut call_data); + is_online.encode_to(&mut call_data); + call_data + } + + fn account_id_from_hex(id_hex: &str) -> ResultStr { + let id_hex = id_hex.trim_start_matches("0x"); + if id_hex.len() != 64 { + return Err("Wrong length of hex-encoded account ID, expected 64") + } + let mut bytes = [0u8; 32]; + hex::decode_to_slice(id_hex, &mut bytes).map_err(|_| "invalid hex address.")?; + Ok(AccountId32::from(bytes)) + } } #[derive(Default)] struct MetricsAggregator(Vec); impl MetricsAggregator { - fn add(&mut self, metric: &Metric) { - let existing_pubkey_index = self - .0 - .iter() - .position(|one_result_obj| metric.app_id == one_result_obj.app_id); - - if existing_pubkey_index.is_none() { - // New app. - let new_metric_obj = Metric { - app_id: metric.app_id.clone(), - storage_bytes: metric.storage_bytes, - wcu_used: metric.wcu_used, - rcu_used: metric.rcu_used, - }; - self.0.push(new_metric_obj); - } else { - // Add to metrics of an existing app. - self.0[existing_pubkey_index.unwrap()].storage_bytes += metric.storage_bytes; - self.0[existing_pubkey_index.unwrap()].wcu_used += metric.wcu_used; - self.0[existing_pubkey_index.unwrap()].rcu_used += metric.rcu_used; - } - } - - fn finish(self) -> Vec { - self.0 - } + fn add(&mut self, metric: &Metric) { + let existing_pubkey_index = + self.0.iter().position(|one_result_obj| metric.app_id == one_result_obj.app_id); + + if existing_pubkey_index.is_none() { + // New app. + let new_metric_obj = Metric { + app_id: metric.app_id.clone(), + storage_bytes: metric.storage_bytes, + wcu_used: metric.wcu_used, + rcu_used: metric.rcu_used, + }; + self.0.push(new_metric_obj); + } else { + // Add to metrics of an existing app. + self.0[existing_pubkey_index.unwrap()].storage_bytes += metric.storage_bytes; + self.0[existing_pubkey_index.unwrap()].wcu_used += metric.wcu_used; + self.0[existing_pubkey_index.unwrap()].rcu_used += metric.rcu_used; + } + } + + fn finish(self) -> Vec { + self.0 + } } #[derive(Default)] struct DDNMetricsAggregator(Vec); impl DDNMetricsAggregator { - fn add(&mut self, p2p_id: String, metrics: &Vec) { - let existing_pubkey_index = self - .0 - .iter() - .position(|one_result_obj| p2p_id == one_result_obj.p2p_id); - - // Only if key does not exists - add new item, otherwise - skip - if existing_pubkey_index.is_none() { - let mut storage_bytes_sum = 0; - let mut wcu_used_sum = 0; - let mut rcu_used_sum = 0; - - for metric_item in metrics.iter() { - storage_bytes_sum += metric_item.storage_bytes; - wcu_used_sum += metric_item.wcu_used; - rcu_used_sum += metric_item.rcu_used; - } - - let new_metric_obj = MetricDDN { - p2p_id, - storage_bytes: storage_bytes_sum, - wcu_used: wcu_used_sum, - rcu_used: rcu_used_sum, - }; - self.0.push(new_metric_obj); - } - } - - fn finish(self) -> Vec { - self.0 - } + fn add(&mut self, p2p_id: String, metrics: &Vec) { + let existing_pubkey_index = + self.0.iter().position(|one_result_obj| p2p_id == one_result_obj.p2p_id); + + // Only if key does not exists - add new item, otherwise - skip + if existing_pubkey_index.is_none() { + let mut storage_bytes_sum = 0; + let mut wcu_used_sum = 0; + let mut rcu_used_sum = 0; + + for metric_item in metrics.iter() { + storage_bytes_sum += metric_item.storage_bytes; + wcu_used_sum += metric_item.wcu_used; + rcu_used_sum += metric_item.rcu_used; + } + + let new_metric_obj = MetricDDN { + p2p_id, + storage_bytes: storage_bytes_sum, + wcu_used: wcu_used_sum, + rcu_used: rcu_used_sum, + }; + self.0.push(new_metric_obj); + } + } + + fn finish(self) -> Vec { + self.0 + } } // TODO: remove, or write meaningful events. decl_event!( - /// Events generated by the module. - pub enum Event - where - AccountId = ::AccountId, - { - NewDdcMetric(AccountId, Vec), - } + /// Events generated by the module. + pub enum Event + where + AccountId = ::AccountId, + { + NewDdcMetric(AccountId, Vec), + } ); -pub trait Config: frame_system::Config + pallet_contracts::Config + CreateSignedTransaction> - where ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode { - /// The identifier type for an offchain worker. - type AuthorityId: AppCrypto< - ::Public, - ::Signature, - >; - - // TODO: remove, or use Event and Call. - /// The overarching event type. - type Event: From> + Into<::Event>; - /// The overarching dispatch call type. - type Call: From>; - - type BlockInterval: Get; +pub trait Config: + frame_system::Config + + pallet_contracts::Config + + CreateSignedTransaction> +where + ::AccountId: AsRef<[u8]> + UncheckedFrom, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, +{ + /// The identifier type for an offchain worker. + type AuthorityId: AppCrypto<::Public, ::Signature>; + + // TODO: remove, or use Event and Call. + /// The overarching event type. + type RuntimeEvent: From> + Into<::RuntimeEvent>; + /// The overarching dispatch call type. + type RuntimeCall: From>; + + type BlockInterval: Get; } diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs b/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs index 461016c3f..6c0dbbe09 100644 --- a/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs +++ b/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs @@ -1,21 +1,20 @@ use frame_support::traits::{Currency, OffchainWorker}; use frame_system::Config as FSC; use pallet_contracts::{self as contracts, Config as CC}; -use sp_core::{ - offchain::{testing, OffchainWorkerExt, OffchainDbExt, Timestamp as OCWTimestamp, TransactionPoolExt} +use sp_core::offchain::{ + testing, OffchainDbExt, OffchainWorkerExt, Timestamp as OCWTimestamp, TransactionPoolExt, }; use sp_runtime::{traits::Hash, AccountId32, RuntimeAppPublic}; use test_runtime::{ - AccountId, Balance, Balances, Contracts, DdcMetricsOffchainWorker, Origin, System, Test, - Timestamp, + AccountId, Balance, Balances, Contracts, DdcMetricsOffchainWorker, RuntimeOrigin, System, Test, + Timestamp, }; -use sp_keystore::{KeystoreExt, testing::KeyStore}; -use sp_keystore::SyncCryptoStore; +use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; use std::sync::Arc; use crate::{ - CURRENT_PERIOD_MS, FINALIZE_METRIC_PERIOD, REPORT_DDN_STATUS_SELECTOR, REPORT_METRICS_SELECTOR, + CURRENT_PERIOD_MS, FINALIZE_METRIC_PERIOD, REPORT_DDN_STATUS_SELECTOR, REPORT_METRICS_SELECTOR, }; use codec::Encode; use frame_support::weights::Weight; @@ -28,145 +27,123 @@ type T = Test; #[test] fn test_contract_api() { - // Parse the contract spec. - let contract_meta = include_str!("./test_data/metadata.json"); - let contract_meta: serde_json::Value = serde_json::from_str(contract_meta).unwrap(); - let messages = contract_meta - .pointer("/spec/messages") - .unwrap() - .as_array() - .unwrap(); - - // Find the report_metrics function. - let report_metrics = messages - .iter() - .find(|msg| msg.pointer("/name/0").unwrap().as_str().unwrap() == "report_metrics") - .unwrap(); - - // Check the selector. - let selector = from_hex(report_metrics.get("selector").unwrap().as_str().unwrap()).unwrap(); - assert_eq!(REPORT_METRICS_SELECTOR.to_vec(), selector); - - // Find the get_current_period_ms function. - let get_current_period_ms = messages - .iter() - .find(|msg| msg.pointer("/name/0").unwrap().as_str().unwrap() == "get_current_period_ms") - .unwrap(); - - // Check the selector for get_current_period_ms - let selector_get_current_period_ms = from_hex( - get_current_period_ms - .get("selector") - .unwrap() - .as_str() - .unwrap(), - ) - .unwrap(); - assert_eq!(CURRENT_PERIOD_MS.to_vec(), selector_get_current_period_ms); - - // Find the finalize_metric_period function. - let finalize_metric_period = messages - .iter() - .find(|msg| msg.pointer("/name/0").unwrap().as_str().unwrap() == "finalize_metric_period") - .unwrap(); - - // Check the selector for finalize_metric_period - let selector_finalize_metric_period = from_hex( - finalize_metric_period - .get("selector") - .unwrap() - .as_str() - .unwrap(), - ) - .unwrap(); - assert_eq!( - FINALIZE_METRIC_PERIOD.to_vec(), - selector_finalize_metric_period - ); - - // Find the report_ddn_status function. - let report_ddn_status = messages - .iter() - .find(|msg| msg.pointer("/name/0").unwrap().as_str().unwrap() == "report_ddn_status") - .unwrap(); - - // Check the selector for report_ddn_status - let selector_report_ddn_status = - from_hex(report_ddn_status.get("selector").unwrap().as_str().unwrap()).unwrap(); - assert_eq!( - REPORT_DDN_STATUS_SELECTOR.to_vec(), - selector_report_ddn_status - ); + // Parse the contract spec. + let contract_meta = include_str!("./test_data/metadata.json"); + let contract_meta: serde_json::Value = serde_json::from_str(contract_meta).unwrap(); + let messages = contract_meta.pointer("/spec/messages").unwrap().as_array().unwrap(); + + // Find the report_metrics function. + let report_metrics = messages + .iter() + .find(|msg| msg.pointer("/name/0").unwrap().as_str().unwrap() == "report_metrics") + .unwrap(); + + // Check the selector. + let selector = from_hex(report_metrics.get("selector").unwrap().as_str().unwrap()).unwrap(); + assert_eq!(REPORT_METRICS_SELECTOR.to_vec(), selector); + + // Find the get_current_period_ms function. + let get_current_period_ms = messages + .iter() + .find(|msg| msg.pointer("/name/0").unwrap().as_str().unwrap() == "get_current_period_ms") + .unwrap(); + + // Check the selector for get_current_period_ms + let selector_get_current_period_ms = + from_hex(get_current_period_ms.get("selector").unwrap().as_str().unwrap()).unwrap(); + assert_eq!(CURRENT_PERIOD_MS.to_vec(), selector_get_current_period_ms); + + // Find the finalize_metric_period function. + let finalize_metric_period = messages + .iter() + .find(|msg| msg.pointer("/name/0").unwrap().as_str().unwrap() == "finalize_metric_period") + .unwrap(); + + // Check the selector for finalize_metric_period + let selector_finalize_metric_period = + from_hex(finalize_metric_period.get("selector").unwrap().as_str().unwrap()).unwrap(); + assert_eq!(FINALIZE_METRIC_PERIOD.to_vec(), selector_finalize_metric_period); + + // Find the report_ddn_status function. + let report_ddn_status = messages + .iter() + .find(|msg| msg.pointer("/name/0").unwrap().as_str().unwrap() == "report_ddn_status") + .unwrap(); + + // Check the selector for report_ddn_status + let selector_report_ddn_status = + from_hex(report_ddn_status.get("selector").unwrap().as_str().unwrap()).unwrap(); + assert_eq!(REPORT_DDN_STATUS_SELECTOR.to_vec(), selector_report_ddn_status); } #[test] fn test_encode_report_metrics() { - let call_data = DdcMetricsOffchainWorker::encode_report_metrics( - &AccountId32::from([2; 32]), - 3 + (4 << 8), - 5 + (6 << 16), - 7 + (8 << 24), - 9 + (16 << 24), - ); - assert_eq!( - call_data, - vec![ - 53, 50, 11, 190, // Selector - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, // 32 bytes, app_id - 3, 4, 0, 0, 0, 0, 0, 0, // 8 bytes, day_start_ms - 5, 0, 6, 0, 0, 0, 0, 0, // 8 bytes, storage_bytes - 7, 0, 0, 8, 0, 0, 0, 0, // 8 bytes, wcu_used - 9, 0, 0, 16, 0, 0, 0, 0 // 8 bytes, rcu_used - ] - ); + let call_data = DdcMetricsOffchainWorker::encode_report_metrics( + &AccountId32::from([2; 32]), + 3 + (4 << 8), + 5 + (6 << 16), + 7 + (8 << 24), + 9 + (16 << 24), + ); + assert_eq!( + call_data, + vec![ + 53, 50, 11, 190, // Selector + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, // 32 bytes, app_id + 3, 4, 0, 0, 0, 0, 0, 0, // 8 bytes, day_start_ms + 5, 0, 6, 0, 0, 0, 0, 0, // 8 bytes, storage_bytes + 7, 0, 0, 8, 0, 0, 0, 0, // 8 bytes, wcu_used + 9, 0, 0, 16, 0, 0, 0, 0 // 8 bytes, rcu_used + ] + ); } #[test] fn test_encode_get_current_period_ms() { - let call_data = DdcMetricsOffchainWorker::encode_get_current_period_ms(); - assert_eq!( - call_data, - vec![ + let call_data = DdcMetricsOffchainWorker::encode_get_current_period_ms(); + assert_eq!( + call_data, + vec![ 172, 228, 236, 179, // Selector ] - ); + ); } #[test] fn test_encode_finalize_metric_period() { - let call_data = DdcMetricsOffchainWorker::encode_finalize_metric_period(INIT_TIME_MS); - assert_eq!( - call_data, - vec![ - 178, 105, 213, 87, // Selector - 80, 152, 94, 120, 118, 1, 0, 0, // 8 bytes, in_day_start_ms - ] - ); + let call_data = DdcMetricsOffchainWorker::encode_finalize_metric_period(INIT_TIME_MS); + assert_eq!( + call_data, + vec![ + 178, 105, 213, 87, // Selector + 80, 152, 94, 120, 118, 1, 0, 0, // 8 bytes, in_day_start_ms + ] + ); } #[test] fn test_encode_report_ddn_status() { - let call_data = DdcMetricsOffchainWorker::encode_report_ddn_status( - &String::from_utf8(vec![0, 1, 2, 3]).unwrap(), - true, - ); - assert_eq!( - call_data, - [ - REPORT_DDN_STATUS_SELECTOR.to_vec(), // Selector - vec![ - 16, // size of p2p_id - 0, 1, 2, 3, // p2p_id - 1 // is_online - ], - ] - .concat() - ); + let call_data = DdcMetricsOffchainWorker::encode_report_ddn_status( + &String::from_utf8(vec![0, 1, 2, 3]).unwrap(), + true, + ); + assert_eq!( + call_data, + [ + REPORT_DDN_STATUS_SELECTOR.to_vec(), // Selector + vec![ + 16, // size of p2p_id + 0, 1, 2, 3, // p2p_id + 1 // is_online + ], + ] + .concat() + ); } fn build_ext() -> sp_io::TestExternalities { - build_ext_for_contracts() + build_ext_for_contracts() } // Some day, and some time during that day. @@ -175,241 +152,232 @@ const INIT_TIME_MS: u64 = INIT_DAY_MS + 1234 * 1000; // Taken from pallet_contracts::tests::ExtBuilder fn build_ext_for_contracts() -> sp_io::TestExternalities { - let mut t = frame_system::GenesisConfig::default() - .build_storage::() - .unwrap(); - pallet_balances::GenesisConfig:: { balances: vec![] } - .assimilate_storage(&mut t) - .unwrap(); - let mut ext = sp_io::TestExternalities::new(t); - ext.execute_with(|| { - System::set_block_number(1); - Timestamp::set_timestamp(INIT_TIME_MS); - }); - ext + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + pallet_balances::GenesisConfig:: { balances: vec![] } + .assimilate_storage(&mut t) + .unwrap(); + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + System::set_block_number(1); + Timestamp::set_timestamp(INIT_TIME_MS); + }); + ext } #[test] fn should_submit_signed_transaction_on_chain() { - let mut t = build_ext(); - - let (pool, pool_state) = testing::TestTransactionPoolExt::new(); - t.register_extension(TransactionPoolExt::new(pool)); - - const PHRASE: &str = - "news slush supreme milk chapter athlete soap sausage put clutch what kitten"; - let keystore = KeyStore::new(); - keystore - .sr25519_generate_new( - crate::crypto::Public::ID, - Some(&format!("{}/hunter1", PHRASE)), - ) - .unwrap(); - t.register_extension(KeystoreExt(Arc::new(keystore))); - - let (offchain, offchain_state) = testing::TestOffchainExt::new(); - t.register_extension(OffchainDbExt::new(offchain.clone())); - t.register_extension(OffchainWorkerExt::new(offchain)); - - { - let mut state = offchain_state.write(); - - state.timestamp = OCWTimestamp::from_unix_millis(INIT_TIME_MS); - - let mut expect_request = |url: &str, response: &[u8]| { - state.expect_request(testing::PendingRequest { - method: "GET".into(), - uri: url.to_string(), - response: Some(response.to_vec()), - sent: true, - ..Default::default() - }); - }; - - // List partitions from a boot node. - expect_request("https://node-0.ddc.stage.cere.network/api/rest/metrics?isMaster=true&active=true&from=1608336000&to=1608337114", + let mut t = build_ext(); + + let (pool, pool_state) = testing::TestTransactionPoolExt::new(); + t.register_extension(TransactionPoolExt::new(pool)); + + const PHRASE: &str = + "news slush supreme milk chapter athlete soap sausage put clutch what kitten"; + let keystore = KeyStore::new(); + keystore + .sr25519_generate_new(crate::crypto::Public::ID, Some(&format!("{}/hunter1", PHRASE))) + .unwrap(); + t.register_extension(KeystoreExt(Arc::new(keystore))); + + let (offchain, offchain_state) = testing::TestOffchainExt::new(); + t.register_extension(OffchainDbExt::new(offchain.clone())); + t.register_extension(OffchainWorkerExt::new(offchain)); + + { + let mut state = offchain_state.write(); + + state.timestamp = OCWTimestamp::from_unix_millis(INIT_TIME_MS); + + let mut expect_request = |url: &str, response: &[u8]| { + state.expect_request(testing::PendingRequest { + method: "GET".into(), + uri: url.to_string(), + response: Some(response.to_vec()), + sent: true, + ..Default::default() + }); + }; + + // List partitions from a boot node. + expect_request("https://node-0.ddc.stage.cere.network/api/rest/metrics?isMaster=true&active=true&from=1608336000&to=1608337114", include_bytes!("test_data/ddc_metrics_node-0.json")); - // List partitions from a boot node. - expect_request("https://node-3.ddc.stage.cere.network/api/rest/metrics?isMaster=true&active=true&from=1608336000&to=1608337114", + // List partitions from a boot node. + expect_request("https://node-3.ddc.stage.cere.network/api/rest/metrics?isMaster=true&active=true&from=1608336000&to=1608337114", include_bytes!("test_data/ddc_metrics_node-3.json")); - } - - t.execute_with(|| { - let contract_id = deploy_contract(); - - let kind = sp_core::offchain::StorageKind::PERSISTENT; - sp_io::offchain::local_storage_set( - kind, - b"ddc-metrics-offchain-worker::sc_address", - contract_id.as_ref(), - ); - - // Trigger the worker. - DdcMetricsOffchainWorker::offchain_worker(0); - - let events = System::events(); - eprintln!("Events: {:?}\n", events); - - // Get the transaction from the worker. - let transactions = pool_state.read().transactions.clone(); - eprintln!("Transactions: {:?}\n", transactions); - assert_eq!(transactions.len(), 4); // (2 x send_metrics_to_sc) + (2 x send_metrics_ddn_to_sc) - - // Check metrics of an app based on ddc_metrics_node-0.json and ddc_metrics_node-3.json. - let app_id = AccountId32::from(hex!( - "00a2e826451b78afb99241b1331e7594526329225ff8937dbc62f43ec20d1830" - )); - let expected_call = - DdcMetricsOffchainWorker::encode_report_metrics(&app_id, INIT_DAY_MS, 2 + 20, 0, 0); - assert!( - transactions[0].ends_with(&expected_call), - "Expected a specific call to the report_metrics function" - ); - - // Check metrics of the second app. - let app_id = AccountId32::from(hex!( - "100ad4097b6e60700a5d5c5294cb6d663090ef5f547e84cc20ec6bcc7a552f13" - )); - let expected_call = - DdcMetricsOffchainWorker::encode_report_metrics(&app_id, INIT_DAY_MS, 200, 0, 0); - assert!( - transactions[1].ends_with(&expected_call), - "Expected a specific call to the report_metrics function" - ); - - let expected_call = DdcMetricsOffchainWorker::encode_report_metrics_ddn( - "12D3KooWB4SMhKK12ASU4qH1ZYh3pN9vsW9QbFTwkjZxUhTqmYaS".to_string(), - INIT_DAY_MS, - 2 + 200, - 0, - 0, - ); - assert!( - transactions[2].ends_with(&expected_call), - "Expected a specific call to the report_metrics_ddn function" - ); - - let expected_call = DdcMetricsOffchainWorker::encode_report_metrics_ddn( - "12D3KooWJLuJEmtYf3bakUwe2q1uMcnbCBKRg7GkpG6Ws74Aq6NC".to_string(), - INIT_DAY_MS, - 20, - 0, - 0, - ); - assert!( - transactions[3].ends_with(&expected_call), - "Expected a specific call to the report_metrics_ddn function" - ); - }); + } + + t.execute_with(|| { + let contract_id = deploy_contract(); + + let kind = sp_core::offchain::StorageKind::PERSISTENT; + sp_io::offchain::local_storage_set( + kind, + b"ddc-metrics-offchain-worker::sc_address", + contract_id.as_ref(), + ); + + // Trigger the worker. + DdcMetricsOffchainWorker::offchain_worker(0); + + let events = System::events(); + eprintln!("Events: {:?}\n", events); + + // Get the transaction from the worker. + let transactions = pool_state.read().transactions.clone(); + eprintln!("Transactions: {:?}\n", transactions); + assert_eq!(transactions.len(), 4); // (2 x send_metrics_to_sc) + (2 x send_metrics_ddn_to_sc) + + // Check metrics of an app based on ddc_metrics_node-0.json and ddc_metrics_node-3.json. + let app_id = AccountId32::from(hex!( + "00a2e826451b78afb99241b1331e7594526329225ff8937dbc62f43ec20d1830" + )); + let expected_call = + DdcMetricsOffchainWorker::encode_report_metrics(&app_id, INIT_DAY_MS, 2 + 20, 0, 0); + assert!( + transactions[0].ends_with(&expected_call), + "Expected a specific call to the report_metrics function" + ); + + // Check metrics of the second app. + let app_id = AccountId32::from(hex!( + "100ad4097b6e60700a5d5c5294cb6d663090ef5f547e84cc20ec6bcc7a552f13" + )); + let expected_call = + DdcMetricsOffchainWorker::encode_report_metrics(&app_id, INIT_DAY_MS, 200, 0, 0); + assert!( + transactions[1].ends_with(&expected_call), + "Expected a specific call to the report_metrics function" + ); + + let expected_call = DdcMetricsOffchainWorker::encode_report_metrics_ddn( + "12D3KooWB4SMhKK12ASU4qH1ZYh3pN9vsW9QbFTwkjZxUhTqmYaS".to_string(), + INIT_DAY_MS, + 2 + 200, + 0, + 0, + ); + assert!( + transactions[2].ends_with(&expected_call), + "Expected a specific call to the report_metrics_ddn function" + ); + + let expected_call = DdcMetricsOffchainWorker::encode_report_metrics_ddn( + "12D3KooWJLuJEmtYf3bakUwe2q1uMcnbCBKRg7GkpG6Ws74Aq6NC".to_string(), + INIT_DAY_MS, + 20, + 0, + 0, + ); + assert!( + transactions[3].ends_with(&expected_call), + "Expected a specific call to the report_metrics_ddn function" + ); + }); } #[test] fn should_run_contract() { - let mut t = build_ext(); - - t.execute_with(|| { - let alice = AccountId::from([1; 32]); - let contract_id = deploy_contract(); - let call_data = DdcMetricsOffchainWorker::encode_get_current_period_ms(); - - pallet_contracts::Module::::call( - Origin::signed(alice.clone()), - contract_id.clone(), - 0, - Weight::from_ref_time(100_000_000_000), - None, - call_data.clone(), - ) - .unwrap(); - - let contract_exec_result = pallet_contracts::Pallet::::bare_call( - alice.clone(), - contract_id, - 0, - Weight::from_ref_time(100_000_000_000), - None, - call_data, - false, - ); - match &contract_exec_result.result { - Ok(res) => { - //println!("XXX Contract returned {:?}", res.data); - assert_eq!(res.data.len(), 8); // size of u64 - } - Err(_) => panic!("error in contract call"), - }; - }); + let mut t = build_ext(); + + t.execute_with(|| { + let alice = AccountId::from([1; 32]); + let contract_id = deploy_contract(); + let call_data = DdcMetricsOffchainWorker::encode_get_current_period_ms(); + + pallet_contracts::Module::::call( + RuntimeOrigin::signed(alice.clone()), + contract_id.clone(), + 0, + Weight::from_ref_time(100_000_000_000), + None, + call_data.clone(), + ) + .unwrap(); + + let contract_exec_result = pallet_contracts::Pallet::::bare_call( + alice.clone(), + contract_id, + 0, + Weight::from_ref_time(100_000_000_000), + None, + call_data, + false, + ); + match &contract_exec_result.result { + Ok(res) => { + //println!("XXX Contract returned {:?}", res.data); + assert_eq!(res.data.len(), 8); // size of u64 + }, + Err(_) => panic!("error in contract call"), + }; + }); } pub const CTOR_SELECTOR: [u8; 4] = hex!("9bae9d5e"); fn encode_constructor() -> Vec { - let mut call_data = CTOR_SELECTOR.to_vec(); - let x = 0 as u128; - for _ in 0..9 { - x.encode_to(&mut call_data); - } - call_data + let mut call_data = CTOR_SELECTOR.to_vec(); + let x = 0 as u128; + for _ in 0..9 { + x.encode_to(&mut call_data); + } + call_data } fn deploy_contract() -> AccountId { - // Admin account who deploys the contract. - let alice = AccountId::from([1; 32]); - let _ = Balances::deposit_creating(&alice, 1_000_000_000_000); - - // Load the contract code. - let wasm = &include_bytes!("./test_data/ddc.wasm")[..]; - let wasm_hash = ::Hashing::hash(wasm); - let contract_args = encode_constructor(); - - // Deploy the contract. - //let endowment = contracts::Config::::subsistence_threshold_uncached(); - const GAS_LIMIT: frame_support::weights::Weight = Weight::from_ref_time(100_000_000_000); - const ENDOWMENT: Balance = 100_000_000_000; - Contracts::instantiate_with_code( - Origin::signed(alice.clone()), - ENDOWMENT, - GAS_LIMIT, - None, - wasm.to_vec(), - contract_args.clone(), - vec![] - ) - .unwrap(); - - // Configure worker with the contract address. - let contract_id = Contracts::contract_address( - &alice, - &wasm_hash, - &vec![], - ); - - pub const ADD_DDC_NODE_SELECTOR: [u8; 4] = hex!("11a9e1b9"); - - let call_data_items = vec![ + // Admin account who deploys the contract. + let alice = AccountId::from([1; 32]); + let _ = Balances::deposit_creating(&alice, 1_000_000_000_000); + + // Load the contract code. + let wasm = &include_bytes!("./test_data/ddc.wasm")[..]; + let wasm_hash = ::Hashing::hash(wasm); + let contract_args = encode_constructor(); + + // Deploy the contract. + //let endowment = contracts::Config::::subsistence_threshold_uncached(); + const GAS_LIMIT: frame_support::weights::Weight = Weight::from_ref_time(100_000_000_000); + const ENDOWMENT: Balance = 100_000_000_000; + Contracts::instantiate_with_code( + RuntimeOrigin::signed(alice.clone()), + ENDOWMENT, + GAS_LIMIT, + None, + wasm.to_vec(), + contract_args.clone(), + vec![], + ) + .unwrap(); + + // Configure worker with the contract address. + let contract_id = Contracts::contract_address(&alice, &wasm_hash, &vec![]); + + pub const ADD_DDC_NODE_SELECTOR: [u8; 4] = hex!("11a9e1b9"); + + let call_data_items = vec![ ["12D3KooWB4SMhKK12ASU4qH1ZYh3pN9vsW9QbFTwkjZxUhTqmYaS", "/dns4/node-0.ddc.dev.cere.network/tcp/5000/p2p/12D3KooWB4SMhKK12ASU4qH1ZYh3pN9vsW9QbFTwkjZxUhTqmYaS", "https://node-0.ddc.stage.cere.network"], ["12D3KooWJLuJEmtYf3bakUwe2q1uMcnbCBKRg7GkpG6Ws74Aq6NC", "/dns4/node-3.ddc.dev.cere.network/tcp/5000/p2p/12D3KooWJLuJEmtYf3bakUwe2q1uMcnbCBKRg7GkpG6Ws74Aq6NC", "https://node-3.ddc.stage.cere.network"], ]; - let permissions: u64 = 1; - - for call_data_item in call_data_items { - let mut call_data = ADD_DDC_NODE_SELECTOR.to_vec(); - call_data_item[0].encode_to(&mut call_data); - call_data_item[1].encode_to(&mut call_data); - call_data_item[2].encode_to(&mut call_data); - permissions.encode_to(&mut call_data); - - let results = Contracts::call( - Origin::signed(alice.clone()), - contract_id.clone(), - 0, - Weight::from_ref_time(1_000_000_000_000), - None, - call_data, - ); - results.unwrap(); - } - - contract_id + let permissions: u64 = 1; + + for call_data_item in call_data_items { + let mut call_data = ADD_DDC_NODE_SELECTOR.to_vec(); + call_data_item[0].encode_to(&mut call_data); + call_data_item[1].encode_to(&mut call_data); + call_data_item[2].encode_to(&mut call_data); + permissions.encode_to(&mut call_data); + + let results = Contracts::call( + RuntimeOrigin::signed(alice.clone()), + contract_id.clone(), + 0, + Weight::from_ref_time(1_000_000_000_000), + None, + call_data, + ); + results.unwrap(); + } + + contract_id } diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs b/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs index 5f851003f..10cee8408 100644 --- a/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs +++ b/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs @@ -2,19 +2,22 @@ // // Inspired from pos-network-node/frame/contracts/src/tests.rs -use crate::{*, self as pallet_ddc_metrics_offchain_worker}; +use crate::{self as pallet_ddc_metrics_offchain_worker, *}; use codec::{Decode, Encode}; -use frame_support::{ parameter_types, traits::Get, weights::Weight }; -use frame_support::traits::{ConstU32, Currency, Everything, Nothing}; +use frame_support::{ + parameter_types, + traits::{ConstU32, Currency, Everything, Get, Nothing}, + weights::Weight, +}; use sp_core::H256; use sp_runtime::{ - generic, - testing::TestXt, - traits::{ - BlakeTwo256, Convert, Extrinsic as ExtrinsicT, IdentifyAccount, IdentityLookup, Verify, - }, - MultiSignature, Perbill, + generic, + testing::TestXt, + traits::{ + BlakeTwo256, Convert, Extrinsic as ExtrinsicT, IdentifyAccount, IdentityLookup, Verify, + }, + MultiSignature, Perbill, }; use std::cell::RefCell; @@ -42,179 +45,178 @@ frame_support::construct_runtime!( { System: frame_system::{Pallet, Call, Config, Storage, Event}, Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - Contracts: contracts::{Pallet, Call, Storage, Event}, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, - Randomness: pallet_randomness_collective_flip::{Pallet, Storage}, - DdcMetricsOffchainWorker: pallet_ddc_metrics_offchain_worker::{Pallet, Call, Event}, - } + Contracts: contracts::{Pallet, Call, Storage, Event}, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, + Randomness: pallet_randomness_collective_flip::{Pallet, Storage}, + DdcMetricsOffchainWorker: pallet_ddc_metrics_offchain_worker::{Pallet, Call, Event}, + } ); parameter_types! { - pub const BlockHashCount: BlockNumber = 250; - pub const MaximumBlockWeight: Weight = Weight::from_ref_time(1024); - pub const MaximumBlockLength: u32 = 2 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::one(); + pub const BlockHashCount: BlockNumber = 250; + pub const MaximumBlockWeight: Weight = Weight::from_ref_time(1024); + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl frame_system::Config for Test { - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - type Origin = Origin; - type Index = u64; - type BlockNumber = BlockNumber; - type Hash = H256; - type Call = Call; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - // u64; // sp_core::sr25519::Public; - type Lookup = IdentityLookup; - type Header = generic::Header; - type Event = Event; - type BlockHashCount = BlockHashCount; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type RuntimeOrigin = RuntimeOrigin; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type RuntimeCall = RuntimeCall; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + // u64; // sp_core::sr25519::Public; + type Lookup = IdentityLookup; + type Header = generic::Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type DbWeight = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; } impl pallet_balances::Config for Test { - type Balance = Balance; - type DustRemoval = (); - type Event = Event; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = (); + type Balance = Balance; + type DustRemoval = (); + type RuntimeEvent = RuntimeEvent; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxLocks = (); + type MaxReserves = (); + type ReserveIdentifier = (); } thread_local! { - static EXISTENTIAL_DEPOSIT: RefCell = RefCell::new(1); + static EXISTENTIAL_DEPOSIT: RefCell = RefCell::new(1); } pub struct ExistentialDeposit; impl Get for ExistentialDeposit { - fn get() -> Balance { - EXISTENTIAL_DEPOSIT.with(|v| *v.borrow()) - } + fn get() -> Balance { + EXISTENTIAL_DEPOSIT.with(|v| *v.borrow()) + } } parameter_types! { - pub const MinimumPeriod: u64 = 1; + pub const MinimumPeriod: u64 = 1; } impl pallet_timestamp::Config for Test { - type Moment = Moment; - type OnTimestampSet = (); - type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); + type Moment = Moment; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); } parameter_types! { - pub const SignedClaimHandicap: BlockNumber = 2; - pub const TombstoneDeposit: Balance = 16; - pub const StorageSizeOffset: u32 = 8; - pub const RentByteFee: Balance = 4; - pub const RentDepositOffset: Balance = 10_000; - pub const SurchargeReward: Balance = 150; - pub const MaxDepth: u32 = 100; - pub const MaxValueSize: u32 = 16_384; - pub Schedule: pallet_contracts::Schedule = Default::default(); + pub const SignedClaimHandicap: BlockNumber = 2; + pub const TombstoneDeposit: Balance = 16; + pub const StorageSizeOffset: u32 = 8; + pub const RentByteFee: Balance = 4; + pub const RentDepositOffset: Balance = 10_000; + pub const SurchargeReward: Balance = 150; + pub const MaxDepth: u32 = 100; + pub const MaxValueSize: u32 = 16_384; + pub Schedule: pallet_contracts::Schedule = Default::default(); } // Contracts for Test Runtime. -use contracts::{Config as contractsConfig}; +use contracts::Config as contractsConfig; -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; impl contracts::Config for Test { - type Time = Timestamp; - type Randomness = Randomness; - type Currency = Balances; - type Event = Event; - type CallStack = [pallet_contracts::Frame; 31]; - type WeightPrice = Self; //pallet_transaction_payment::Module; - type WeightInfo = (); - type ChainExtension = (); - type DeletionQueueDepth = (); - type DeletionWeightLimit = (); - type Schedule = Schedule; - type Call = Call; - type CallFilter = Nothing; - type DepositPerByte = DepositPerByte; - type DepositPerItem = DepositPerItem; - type AddressGenerator = pallet_contracts::DefaultAddressGenerator; - type ContractAccessWeight = (); - type MaxCodeLen = ConstU32<{ 128 * 1024 }>; - type RelaxedMaxCodeLen = ConstU32<{ 256 * 1024 }>; - type MaxStorageKeyLen = ConstU32<128>; + type Time = Timestamp; + type Randomness = Randomness; + type Currency = Balances; + type RuntimeEvent = RuntimeEvent; + type CallStack = [pallet_contracts::Frame; 31]; + type WeightPrice = Self; //pallet_transaction_payment::Module; + type WeightInfo = (); + type ChainExtension = (); + type DeletionQueueDepth = (); + type DeletionWeightLimit = (); + type Schedule = Schedule; + type RuntimeCall = RuntimeCall; + type CallFilter = Nothing; + type DepositPerByte = DepositPerByte; + type DepositPerItem = DepositPerItem; + type AddressGenerator = pallet_contracts::DefaultAddressGenerator; + type ContractAccessWeight = (); + type MaxCodeLen = ConstU32<{ 128 * 1024 }>; + type MaxStorageKeyLen = ConstU32<128>; } parameter_types! { - pub const TransactionByteFee: u64 = 0; - pub const DepositPerItem: Balance = 0; + pub const TransactionByteFee: u64 = 0; + pub const DepositPerItem: Balance = 0; pub const DepositPerByte: Balance = 0; } impl Convert> for Test { - fn convert(w: Weight) -> BalanceOf { - w.ref_time().into() - } + fn convert(w: Weight) -> BalanceOf { + w.ref_time().into() + } } // -- End contracts runtime -- use frame_system::offchain::{ - AppCrypto, CreateSignedTransaction, SendTransactionTypes, SigningTypes, + AppCrypto, CreateSignedTransaction, SendTransactionTypes, SigningTypes, }; -pub type Extrinsic = TestXt; +pub type Extrinsic = TestXt; impl SigningTypes for Test { - type Public = ::Signer; - type Signature = Signature; + type Public = ::Signer; + type Signature = Signature; } impl SendTransactionTypes for Test where - Call: From, + RuntimeCall: From, { - type OverarchingCall = Call; - type Extrinsic = Extrinsic; - + type OverarchingCall = RuntimeCall; + type Extrinsic = Extrinsic; } impl pallet_randomness_collective_flip::Config for Test {} impl CreateSignedTransaction for Test where - Call: From, + RuntimeCall: From, { - fn create_transaction>( - call: Call, - _public: ::Signer, - _account: AccountId, - nonce: u64, - ) -> Option<(Call, ::SignaturePayload)> { - Some((call, (nonce, ()))) - } + fn create_transaction>( + call: RuntimeCall, + _public: ::Signer, + _account: AccountId, + nonce: u64, + ) -> Option<(RuntimeCall, ::SignaturePayload)> { + Some((call, (nonce, ()))) + } } parameter_types! { - pub const OcwBlockInterval: u32 = crate::BLOCK_INTERVAL; + pub const OcwBlockInterval: u32 = crate::BLOCK_INTERVAL; } impl Config for Test { - type BlockInterval = OcwBlockInterval; + type BlockInterval = OcwBlockInterval; - type AuthorityId = crypto::TestAuthId; + type AuthorityId = crypto::TestAuthId; - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; } diff --git a/pallets/ddc-staking/Cargo.toml b/pallets/ddc-staking/Cargo.toml index aef51993e..c5a4e6873 100644 --- a/pallets/ddc-staking/Cargo.toml +++ b/pallets/ddc-staking/Cargo.toml @@ -1,22 +1,26 @@ [package] name = "pallet-ddc-staking" -version = "4.7.0" +version = "4.8.0" edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } [dev-dependencies] -substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/pallets/ddc-staking/README.md b/pallets/ddc-staking/README.md index ce688f876..ef00bef50 100644 --- a/pallets/ddc-staking/README.md +++ b/pallets/ddc-staking/README.md @@ -1 +1,16 @@ # DDC Staking Pallet + +The DDC Staking module is used to manage funds at stake by Cere DDC participants. + +## Overview + +The DDC Staking module is the means by which an account can voluntarily place funds under deposit to join DDC CDN or storage network. + +### Terminology + +- DDC Staking: The process of locking up funds for some time in order to become a participant of the DDC. +- Stash account: The account holding an owner's funds used for staking. +- Controller account: The account that controls an owner's funds for staking. +- Edge: CDN participant. +- Storage: Storage network participant. +- Era: A time period of DDC participants activity data capture and accumulation which will further be used to calculate pay outs. diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index bb1d513c1..87b671426 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -86,6 +86,9 @@ benchmarks! { let (edge_stash, edge_controller) = create_stash_controller_with_balance::(0, T::DefaultEdgeBondSize::get())?; DdcStaking::::serve(RawOrigin::Signed(edge_controller.clone()).into(), 1)?; assert!(Edges::::contains_key(&edge_stash)); + CurrentEra::::put(1); + DdcStaking::::chill(RawOrigin::Signed(edge_controller.clone()).into())?; + CurrentEra::::put(1 + Settings::::get(1).edge_chill_delay); whitelist_account!(edge_controller); }: _(RawOrigin::Signed(edge_controller)) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 2105e53f9..27d430ede 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -1,17 +1,35 @@ +//! # DDC Staking Pallet +//! +//! The DDC Staking pallet is used to manage funds at stake by CDN and storage network maintainers. +//! +//! - [`Config`] +//! - [`Call`] +//! - [`Pallet`] +//! +//! ## GenesisConfig +//! +//! The DDC Staking pallet depends on the [`GenesisConfig`]. The +//! `GenesisConfig` is optional and allow to set some initial stakers in DDC. + #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; - #[cfg(any(feature = "runtime-benchmarks", test))] pub mod testing_utils; +#[cfg(test)] +pub(crate) mod mock; +#[cfg(test)] +mod tests; + pub mod weights; use crate::weights::WeightInfo; use codec::{Decode, Encode, HasCompact}; use frame_support::{ + assert_ok, pallet_prelude::*, parameter_types, traits::{ @@ -178,7 +196,7 @@ pub mod pallet { #[pallet::constant] type DefaultStorageChillDelay: Get; - type Event: From> + IsType<::Event>; + type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// Number of eras that staked funds must remain bonded for. #[pallet::constant] type BondingDuration: Get; @@ -227,6 +245,83 @@ pub mod pallet { #[pallet::getter(fn current_era)] pub type CurrentEra = StorageValue<_, EraIndex>; + #[pallet::genesis_config] + pub struct GenesisConfig { + pub edges: Vec<(T::AccountId, T::AccountId, BalanceOf, ClusterId)>, + pub storages: Vec<(T::AccountId, T::AccountId, BalanceOf, ClusterId)>, + pub settings: Vec<(ClusterId, BalanceOf, EraIndex, BalanceOf, EraIndex)>, + } + + #[cfg(feature = "std")] + impl Default for GenesisConfig { + fn default() -> Self { + GenesisConfig { + edges: Default::default(), + storages: Default::default(), + settings: Default::default(), + } + } + } + + #[pallet::genesis_build] + impl GenesisBuild for GenesisConfig { + fn build(&self) { + // clusters' settings + for &( + cluster, + edge_bond_size, + edge_chill_delay, + storage_bond_size, + storage_chill_delay, + ) in &self.settings + { + Settings::::insert( + cluster, + ClusterSettings:: { + edge_bond_size, + edge_chill_delay, + storage_bond_size, + storage_chill_delay, + }, + ); + } + + // Add initial CDN participants + for &(ref stash, ref controller, balance, cluster) in &self.edges { + assert!( + T::Currency::free_balance(&stash) >= balance, + "Stash do not have enough balance to participate in CDN." + ); + assert_ok!(Pallet::::bond( + T::RuntimeOrigin::from(Some(stash.clone()).into()), + T::Lookup::unlookup(controller.clone()), + balance, + )); + assert_ok!(Pallet::::serve( + T::RuntimeOrigin::from(Some(controller.clone()).into()), + cluster, + )); + } + + // Add initial storage network participants + for &(ref stash, ref controller, balance, cluster) in &self.storages { + assert!( + T::Currency::free_balance(&stash) >= balance, + "Stash do not have enough balance to participate in storage network." + ); + assert_ok!(Pallet::::bond( + T::RuntimeOrigin::from(Some(stash.clone()).into()), + T::Lookup::unlookup(controller.clone()), + balance, + )); + assert_ok!(Pallet::::store( + T::RuntimeOrigin::from(Some(controller.clone()).into()), + cluster, + )); + } + } + } + #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { @@ -709,10 +804,6 @@ pub mod pallet { /// This function will add a CDN participant to the `Edges` storage map. /// /// If the CDN participant already exists, their cluster will be updated. - /// - /// NOTE: you must ALWAYS use this function to add a CDN participant to the system. Any - /// access to `Edges` outside of this function is almost certainly - /// wrong. pub fn do_add_edge(who: &T::AccountId, cluster: ClusterId) { Edges::::insert(who, cluster); } @@ -720,10 +811,6 @@ pub mod pallet { /// This function will remove a CDN participant from the `Edges` map. /// /// Returns true if `who` was removed from `Edges`, otherwise false. - /// - /// NOTE: you must ALWAYS use this function to remove a storage network participant from the - /// system. Any access to `Edges` outside of this function is almost certainly - /// wrong. pub fn do_remove_edge(who: &T::AccountId) -> bool { Edges::::take(who).is_some() } @@ -731,10 +818,6 @@ pub mod pallet { /// This function will add a storage network participant to the `Storages` storage map. /// /// If the storage network participant already exists, their cluster will be updated. - /// - /// NOTE: you must ALWAYS use this function to add a storage network participant to the - /// system. Any access to `Storages` outside of this function is almost certainly - /// wrong. pub fn do_add_storage(who: &T::AccountId, cluster: ClusterId) { Storages::::insert(who, cluster); } @@ -742,10 +825,6 @@ pub mod pallet { /// This function will remove a storage network participant from the `Storages` map. /// /// Returns true if `who` was removed from `Storages`, otherwise false. - /// - /// NOTE: you must ALWAYS use this function to remove a storage network participant from the - /// system. Any access to `Storages` outside of this function is almost certainly - /// wrong. pub fn do_remove_storage(who: &T::AccountId) -> bool { Storages::::take(who).is_some() } diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs new file mode 100644 index 000000000..dea8eb524 --- /dev/null +++ b/pallets/ddc-staking/src/mock.rs @@ -0,0 +1,244 @@ +//! Test utilities + +#![allow(dead_code)] + +use crate::{self as pallet_ddc_staking, *}; +use frame_support::{ + construct_runtime, + traits::{ConstU32, ConstU64, Everything, GenesisBuild}, + weights::constants::RocksDbWeight, +}; +use frame_system::mocking::{MockBlock, MockUncheckedExtrinsic}; +use sp_core::H256; +use sp_io::TestExternalities; +use sp_runtime::{ + testing::Header, + traits::{BlakeTwo256, IdentityLookup}, +}; +use sp_std::collections::btree_map::BTreeMap; + +/// The AccountId alias in this test module. +pub(crate) type AccountId = u64; +pub(crate) type AccountIndex = u64; +pub(crate) type BlockNumber = u64; +pub(crate) type Balance = u128; + +type UncheckedExtrinsic = MockUncheckedExtrinsic; +type Block = MockBlock; + +construct_runtime!( + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + DdcStaking: pallet_ddc_staking::{Pallet, Call, Config, Storage, Event}, + } +); + +parameter_types! { + pub static ExistentialDeposit: Balance = 1; +} + +impl frame_system::Config for Test { + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type DbWeight = RocksDbWeight; + type RuntimeOrigin = RuntimeOrigin; + type Index = AccountIndex; + type BlockNumber = BlockNumber; + type RuntimeCall = RuntimeCall; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = ConstU64<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = ConstU32<16>; +} + +impl pallet_balances::Config for Test { + type MaxLocks = ConstU32<1024>; + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); +} + +impl pallet_timestamp::Config for Test { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = ConstU64<5>; + type WeightInfo = (); +} + +parameter_types! { + pub const BondingDuration: EraIndex = 10; + pub const DefaultEdgeBondSize: Balance = 100; + pub const DefaultEdgeChillDelay: EraIndex = 1; + pub const DefaultStorageBondSize: Balance = 100; + pub const DefaultStorageChillDelay: EraIndex = 1; +} + +impl crate::pallet::Config for Test { + type BondingDuration = BondingDuration; + type Currency = Balances; + type DefaultEdgeBondSize = DefaultEdgeBondSize; + type DefaultEdgeChillDelay = DefaultEdgeChillDelay; + type DefaultStorageBondSize = DefaultStorageBondSize; + type DefaultStorageChillDelay = DefaultStorageChillDelay; + type RuntimeEvent = RuntimeEvent; + type UnixTime = Timestamp; + type WeightInfo = (); +} + +pub(crate) type DdcStakingCall = crate::Call; +pub(crate) type TestRuntimeCall = ::RuntimeCall; + +pub struct ExtBuilder { + has_edges: bool, + has_storages: bool, + stakes: BTreeMap, + edges: Vec<(AccountId, AccountId, Balance, ClusterId)>, + storages: Vec<(AccountId, AccountId, Balance, ClusterId)>, +} + +impl Default for ExtBuilder { + fn default() -> Self { + Self { + has_edges: true, + has_storages: true, + stakes: Default::default(), + edges: Default::default(), + storages: Default::default(), + } + } +} + +impl ExtBuilder { + pub fn has_edges(mut self, has: bool) -> Self { + self.has_edges = has; + self + } + pub fn has_storages(mut self, has: bool) -> Self { + self.has_storages = has; + self + } + pub fn set_stake(mut self, who: AccountId, stake: Balance) -> Self { + self.stakes.insert(who, stake); + self + } + pub fn add_edge( + mut self, + stash: AccountId, + controller: AccountId, + stake: Balance, + cluster: ClusterId, + ) -> Self { + self.edges.push((stash, controller, stake, cluster)); + self + } + pub fn add_storage( + mut self, + stash: AccountId, + controller: AccountId, + stake: Balance, + cluster: ClusterId, + ) -> Self { + self.storages.push((stash, controller, stake, cluster)); + self + } + fn build(self) -> TestExternalities { + sp_tracing::try_init_simple(); + let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); + + let _ = pallet_balances::GenesisConfig:: { + balances: vec![ + (1, 100), + (2, 100), + (3, 100), + (4, 100), + // edge controllers + (10, 100), + (20, 100), + // storage controllers + (30, 100), + (40, 100), + // edge stashes + (11, 100), + (21, 100), + // storage stashes + (31, 100), + (41, 100), + ], + } + .assimilate_storage(&mut storage); + let mut edges = vec![]; + if self.has_edges { + edges = vec![ + // (stash, controller, stake, cluster) + (11, 10, 100, 1), + (21, 20, 100, 1), + ]; + } + let mut storages = vec![]; + if self.has_storages { + storages = vec![ + // (stash, controller, stake, cluster) + (31, 30, 100, 1), + (41, 40, 100, 1), + ]; + } + + let _ = pallet_ddc_staking::GenesisConfig:: { edges, storages, ..Default::default() } + .assimilate_storage(&mut storage); + + TestExternalities::new(storage) + } + pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + sp_tracing::try_init_simple(); + let mut ext = self.build(); + ext.execute_with(test); + ext.execute_with(post_condition); + } +} + +fn post_condition() { + check_ledgers(); +} + +fn check_ledgers() { + // check the ledger of all stakers. + Bonded::::iter().for_each(|(_, controller)| assert_ledger_consistent(controller)) +} + +fn assert_ledger_consistent(controller: AccountId) { + // ensures ledger.total == ledger.active + sum(ledger.unlocking). + let ledger = DdcStaking::ledger(controller).expect("Not a controller."); + let real_total: Balance = ledger.unlocking.iter().fold(ledger.active, |a, c| a + c.value); + assert_eq!(real_total, ledger.total); + assert!( + ledger.active >= Balances::minimum_balance() || ledger.active == 0, + "{}: active ledger amount ({}) must be greater than ED {}", + controller, + ledger.active, + Balances::minimum_balance() + ); +} diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs new file mode 100644 index 000000000..461f064d5 --- /dev/null +++ b/pallets/ddc-staking/src/tests.rs @@ -0,0 +1,178 @@ +//! Tests for the module. + +use super::{mock::*, *}; +use frame_support::{assert_noop, assert_ok, traits::ReservableCurrency}; +use pallet_balances::Error as BalancesError; + +pub const BLOCK_TIME: u64 = 1000; +pub const INIT_TIMESTAMP: u64 = 30_000; + +#[test] +fn set_settings_works() { + ExtBuilder::default().build_and_execute(|| { + // setting works + assert_ok!(DdcStaking::set_settings( + RuntimeOrigin::root(), + 1, + Some(ClusterSettings { + edge_bond_size: 10, + edge_chill_delay: 2, + storage_bond_size: 10, + storage_chill_delay: 2, + }), + )); + let settings = DdcStaking::settings(1); + assert_eq!(settings.edge_bond_size, 10); + assert_eq!(settings.edge_chill_delay, 2); + assert_eq!(settings.storage_bond_size, 10); + assert_eq!(settings.storage_chill_delay, 2); + + // removing works + assert_ok!(DdcStaking::set_settings(RuntimeOrigin::root(), 1, None)); + let settings = DdcStaking::settings(1); + let default_settings: ClusterSettings = Default::default(); + assert_eq!(settings.edge_bond_size, default_settings.edge_bond_size); + assert_eq!(settings.edge_chill_delay, default_settings.edge_chill_delay); + assert_eq!(settings.storage_bond_size, default_settings.storage_bond_size); + assert_eq!(settings.storage_chill_delay, default_settings.storage_chill_delay); + }); +} + +#[test] +fn basic_setup_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!(DdcStaking::bonded(&11), Some(10)); + // Account 21 is stashed and locked, and account 20 is the controller + assert_eq!(DdcStaking::bonded(&21), Some(20)); + // Account 1 is not a stashed + assert_eq!(DdcStaking::bonded(&1), None); + + // Account 10 controls the stash from account 11, which is 100 units + assert_eq!( + DdcStaking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 100, + active: 100, + chilling: Default::default(), + unlocking: Default::default(), + }) + ); + // Account 20 controls the stash from account 21, which is 100 units + assert_eq!( + DdcStaking::ledger(&20), + Some(StakingLedger { + stash: 21, + total: 100, + active: 100, + chilling: Default::default(), + unlocking: Default::default(), + }) + ); + // Account 1 does not control any stash + assert_eq!(DdcStaking::ledger(&1), None); + + // Cluster 1 settings are default + assert_eq!(DdcStaking::settings(1), Default::default()); + }); +} + +#[test] +fn change_controller_works() { + ExtBuilder::default().build_and_execute(|| { + // 10 and 11 are bonded as stash controller. + assert_eq!(DdcStaking::bonded(&11), Some(10)); + + // 10 can control 11 who is initially a validator. + assert_ok!(DdcStaking::withdraw_unbonded(RuntimeOrigin::signed(10))); + + // Change controller. + assert_ok!(DdcStaking::set_controller(RuntimeOrigin::signed(11), 3)); + assert_eq!(DdcStaking::bonded(&11), Some(3)); + + // 10 is no longer in control. + assert_noop!(DdcStaking::serve(RuntimeOrigin::signed(10), 1), Error::::NotController); + // 3 is a new controller. + assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(3), 1)); + }) +} + +#[test] +fn staking_should_work() { + ExtBuilder::default().build_and_execute(|| { + // Put some money in account that we'll use. + for i in 1..5 { + let _ = Balances::make_free_balance_be(&i, 2000); + } + + // Add new CDN participant, account 3 controlled by 4. + assert_ok!(DdcStaking::bond(RuntimeOrigin::signed(3), 4, 1500)); + assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), 1)); + + // Account 4 controls the stash from account 3, which is 1500 units and 3 is a CDN + // participant. + assert_eq!(DdcStaking::bonded(&3), Some(4)); + assert_eq!( + DdcStaking::ledger(&4), + Some(StakingLedger { + stash: 3, + total: 1500, + active: 1500, + chilling: Default::default(), + unlocking: Default::default(), + }) + ); + assert_eq!(DdcStaking::edges(3), Some(1)); + + // Set `CurrentEra`. + Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); + DdcStaking::on_finalize(System::block_number()); + + // Schedule CDN participant removal. + assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); + + // Removal is scheduled, stashed value of 4 is still lock. + let chilling = + DdcStaking::current_era().unwrap() + DdcStaking::settings(1).edge_chill_delay; + assert_eq!( + DdcStaking::ledger(&4), + Some(StakingLedger { + stash: 3, + total: 1500, + active: 1500, + chilling: Some(chilling), + unlocking: Default::default(), + }) + ); + // It cannot reserve more than 500 that it has free from the total 2000 + assert_noop!(Balances::reserve(&3, 501), BalancesError::::LiquidityRestrictions); + assert_ok!(Balances::reserve(&3, 409)); + + // Set `CurrentEra` to the value allows us to chill. + while DdcStaking::current_era().unwrap() < chilling { + System::set_block_number(System::block_number() + 1); + Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); + DdcStaking::on_finalize(System::block_number()); + } + + // Ledger is not changed until we make another call to `chill`. + assert_eq!( + DdcStaking::ledger(&4), + Some(StakingLedger { + stash: 3, + total: 1500, + active: 1500, + chilling: Some(chilling), + unlocking: Default::default(), + }) + ); + + // Actual CDN participant removal. + assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); + + // Account 3 is no longer a CDN participant. + assert_eq!(DdcStaking::edges(3), None); + }); +} diff --git a/pallets/ddc-staking/src/weights.rs b/pallets/ddc-staking/src/weights.rs old mode 100755 new mode 100644 index f08655fb9..937eece23 --- a/pallets/ddc-staking/src/weights.rs +++ b/pallets/ddc-staking/src/weights.rs @@ -1,8 +1,8 @@ - -//! Autogenerated weights for `pallet_ddc_staking` +//! Autogenerated weights for pallet_ddc_staking //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-02, STEPS: `500`, REPEAT: 200, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-07-04, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `e14`, CPU: `11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: @@ -10,23 +10,23 @@ // benchmark // pallet // --chain=dev -// --steps=500 -// --repeat=200 +// --steps=50 +// --repeat=20 // --pallet=pallet_ddc_staking // --extrinsic=* // --execution=wasm // --wasm-execution=compiled -// --output=./frame/ddc-staking/src +// --template=./.maintain/frame-weight-template.hbs +// --output=./pallets/ddc-staking/src #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] -use frame_support::{traits::Get, weights::Weight}; +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use sp_std::marker::PhantomData; - -/// Weight functions needed for pallet_staking. +/// Weight functions needed for pallet_ddc_staking. pub trait WeightInfo { fn bond() -> Weight; fn unbond() -> Weight; @@ -37,63 +37,137 @@ pub trait WeightInfo { fn set_controller() -> Weight; } -/// Weight functions for `pallet_ddc_staking`. +/// Weights for pallet_ddc_staking using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:1 w:1) // Storage: Balances Locks (r:1 w:1) fn bond() -> Weight { - Weight::from_ref_time(51_000_000) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) + Weight::from_ref_time(49_113_000 as u64) + .saturating_add(T::DbWeight::get().reads(3 as u64)) + .saturating_add(T::DbWeight::get().writes(3 as u64)) } - // Storage: DdcStaking Ledger (r:1 w:0) + // Storage: DdcStaking Ledger (r:1 w:1) + // Storage: DdcStaking Edges (r:1 w:0) + // Storage: DdcStaking Storages (r:1 w:0) + // Storage: DdcStaking CurrentEra (r:1 w:0) + // Storage: Balances Locks (r:1 w:1) + // Storage: System Account (r:1 w:1) fn unbond() -> Weight { - Weight::from_ref_time(10_000_000) - .saturating_add(T::DbWeight::get().reads(1)) + Weight::from_ref_time(47_727_000 as u64) + .saturating_add(T::DbWeight::get().reads(6 as u64)) + .saturating_add(T::DbWeight::get().writes(3 as u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CurrentEra (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unbonded() -> Weight { - Weight::from_ref_time(46_000_000) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) + Weight::from_ref_time(69_750_000 as u64) + .saturating_add(T::DbWeight::get().reads(4 as u64)) + .saturating_add(T::DbWeight::get().writes(3 as u64)) } // Storage: DdcStaking Ledger (r:1 w:0) - // Storage: DdcStaking MinStorageBond (r:1 w:0) + // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Edges (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:1) - // Storage: DdcStaking CounterForStorages (r:1 w:1) fn store() -> Weight { - Weight::from_ref_time(22_000_000) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) + Weight::from_ref_time(26_112_000 as u64) + .saturating_add(T::DbWeight::get().reads(4 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) } // Storage: DdcStaking Ledger (r:1 w:0) - // Storage: DdcStaking MinEdgeBond (r:1 w:0) + // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) // Storage: DdcStaking Edges (r:1 w:1) - // Storage: DdcStaking CounterForEdges (r:1 w:1) fn serve() -> Weight { - Weight::from_ref_time(22_000_000) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) + Weight::from_ref_time(19_892_000 as u64) + .saturating_add(T::DbWeight::get().reads(4 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) } - // Storage: DdcStaking Ledger (r:1 w:0) + // Storage: DdcStaking Ledger (r:1 w:1) + // Storage: DdcStaking CurrentEra (r:1 w:0) + // Storage: DdcStaking Edges (r:1 w:1) + // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) + fn chill() -> Weight { + Weight::from_ref_time(77_450_000 as u64) + .saturating_add(T::DbWeight::get().reads(5 as u64)) + .saturating_add(T::DbWeight::get().writes(2 as u64)) + } + // Storage: DdcStaking Bonded (r:1 w:1) + // Storage: DdcStaking Ledger (r:2 w:2) + fn set_controller() -> Weight { + Weight::from_ref_time(38_521_000 as u64) + .saturating_add(T::DbWeight::get().reads(3 as u64)) + .saturating_add(T::DbWeight::get().writes(3 as u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + // Storage: DdcStaking Bonded (r:1 w:1) + // Storage: DdcStaking Ledger (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + fn bond() -> Weight { + Weight::from_ref_time(49_113_000 as u64) + .saturating_add(RocksDbWeight::get().reads(3 as u64)) + .saturating_add(RocksDbWeight::get().writes(3 as u64)) + } + // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking Edges (r:1 w:0) + // Storage: DdcStaking Storages (r:1 w:0) + // Storage: DdcStaking CurrentEra (r:1 w:0) + // Storage: Balances Locks (r:1 w:1) + // Storage: System Account (r:1 w:1) + fn unbond() -> Weight { + Weight::from_ref_time(47_727_000 as u64) + .saturating_add(RocksDbWeight::get().reads(6 as u64)) + .saturating_add(RocksDbWeight::get().writes(3 as u64)) + } + // Storage: DdcStaking Ledger (r:1 w:1) + // Storage: DdcStaking CurrentEra (r:1 w:0) + // Storage: Balances Locks (r:1 w:1) + // Storage: System Account (r:1 w:1) + fn withdraw_unbonded() -> Weight { + Weight::from_ref_time(69_750_000 as u64) + .saturating_add(RocksDbWeight::get().reads(4 as u64)) + .saturating_add(RocksDbWeight::get().writes(3 as u64)) + } + // Storage: DdcStaking Ledger (r:1 w:0) + // Storage: DdcStaking Settings (r:1 w:0) + // Storage: DdcStaking Edges (r:1 w:0) + // Storage: DdcStaking Storages (r:1 w:1) + fn store() -> Weight { + Weight::from_ref_time(26_112_000 as u64) + .saturating_add(RocksDbWeight::get().reads(4 as u64)) + .saturating_add(RocksDbWeight::get().writes(1 as u64)) + } + // Storage: DdcStaking Ledger (r:1 w:0) + // Storage: DdcStaking Settings (r:1 w:0) + // Storage: DdcStaking Storages (r:1 w:0) + // Storage: DdcStaking Edges (r:1 w:1) + fn serve() -> Weight { + Weight::from_ref_time(19_892_000 as u64) + .saturating_add(RocksDbWeight::get().reads(4 as u64)) + .saturating_add(RocksDbWeight::get().writes(1 as u64)) + } + // Storage: DdcStaking Ledger (r:1 w:1) + // Storage: DdcStaking CurrentEra (r:1 w:0) + // Storage: DdcStaking Edges (r:1 w:1) + // Storage: DdcStaking Settings (r:1 w:0) + // Storage: DdcStaking Storages (r:1 w:0) fn chill() -> Weight { - Weight::from_ref_time(15_000_000) - .saturating_add(T::DbWeight::get().reads(3)) + Weight::from_ref_time(77_450_000 as u64) + .saturating_add(RocksDbWeight::get().reads(5 as u64)) + .saturating_add(RocksDbWeight::get().writes(2 as u64)) } // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:2 w:2) fn set_controller() -> Weight { - Weight::from_ref_time(20_000_000) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) + Weight::from_ref_time(38_521_000 as u64) + .saturating_add(RocksDbWeight::get().reads(3 as u64)) + .saturating_add(RocksDbWeight::get().writes(3 as u64)) } } diff --git a/pallets/ddc/Cargo.toml b/pallets/ddc/Cargo.toml index 94c517cea..c15ee4ac7 100644 --- a/pallets/ddc/Cargo.toml +++ b/pallets/ddc/Cargo.toml @@ -6,7 +6,7 @@ homepage = 'https://www.cere.network/' license = 'Unlicense' name = 'pallet-cere-ddc' repository = 'https://github.com/Cerebellum-Network/ddc-pallet' -version = '4.7.0' +version = '4.8.0' readme = 'README.md' [package.metadata.docs.rs] @@ -14,15 +14,15 @@ targets = ['x86_64-unknown-linux-gnu'] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } [dev-dependencies] -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } serde = { version = "1.0.101" } [features] diff --git a/pallets/ddc/src/lib.rs b/pallets/ddc/src/lib.rs index d8008c2b8..e1d572af6 100644 --- a/pallets/ddc/src/lib.rs +++ b/pallets/ddc/src/lib.rs @@ -1,10 +1,13 @@ #![cfg_attr(not(feature = "std"), no_std)] use frame_support::{ - decl_error, decl_event, decl_module, decl_storage, + decl_error, + decl_event, + decl_module, + decl_storage, // dispatch, ensure, - traits::{ Get }, + traits::Get, }; use frame_system::ensure_signed; @@ -22,7 +25,7 @@ mod tests; /// Configure the pallet by specifying the parameters and types on which it depends. pub trait Config: frame_system::Config { /// Because this pallet emits events, it depends on the runtime's definition of an event. - type Event: From> + Into<::Event>; + type RuntimeEvent: From> + Into<::RuntimeEvent>; /// The minimum length a name may be. type MinLength: Get; @@ -52,7 +55,7 @@ decl_event!( { /// A data string was set. \[who\] DataStringSet(AccountId), - + /// A data string was changed. \[who\] DataStringChanged(AccountId), } @@ -73,7 +76,7 @@ decl_error! { // Dispatchable functions must be annotated with a weight and must return a DispatchResult. decl_module! { /// CereDDCModule declaration. - pub struct Module for enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::RuntimeOrigin { // Errors must be initialized if they are used by the pallet. type Error = Error; diff --git a/pallets/ddc/src/mock.rs b/pallets/ddc/src/mock.rs index ff59e6902..0bb912223 100644 --- a/pallets/ddc/src/mock.rs +++ b/pallets/ddc/src/mock.rs @@ -1,14 +1,12 @@ -use crate::{Module}; +use crate as pallet_cere_ddc; +use crate::Module; +use frame_support::{construct_runtime, parameter_types, traits::Everything}; +use frame_system as system; use sp_core::H256; -use frame_support::{ - traits::{Everything}, - construct_runtime, parameter_types -}; use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, testing::Header, + testing::Header, + traits::{BlakeTwo256, IdentityLookup}, }; -use frame_system as system; -use crate as pallet_cere_ddc; // Configure a mock runtime to test the pallet. type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; @@ -33,8 +31,8 @@ impl system::Config for Test { type BaseCallFilter = Everything; type BlockWeights = (); type BlockLength = (); - type Origin = Origin; - type Call = Call; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -42,7 +40,7 @@ impl system::Config for Test { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; - type Event = (); + type RuntimeEvent = (); type BlockHashCount = BlockHashCount; type DbWeight = (); type Version = (); @@ -62,7 +60,7 @@ parameter_types! { } impl pallet_cere_ddc::Config for Test { - type Event = (); + type RuntimeEvent = (); type MinLength = MinLength; type MaxLength = MaxLength; } diff --git a/pallets/ddc/src/tests.rs b/pallets/ddc/src/tests.rs index 512eaac29..95f5927ae 100644 --- a/pallets/ddc/src/tests.rs +++ b/pallets/ddc/src/tests.rs @@ -7,7 +7,7 @@ const BOB: u64 = 2; fn send_data_works_valid_input() { new_test_ext().execute_with(|| { // Dispatch a signed extrinsic. - assert_ok!(CereDDCModule::send_data(Origin::signed(1), BOB, b"12345678".to_vec())); + assert_ok!(CereDDCModule::send_data(RuntimeOrigin::signed(1), BOB, b"12345678".to_vec())); }); } @@ -16,7 +16,7 @@ fn send_data_error_too_long() { new_test_ext().execute_with(|| { // Ensure the expected error is thrown when no value is present. assert_noop!( - CereDDCModule::send_data(Origin::signed(1), BOB, b"TestTooLongString".to_vec()), + CereDDCModule::send_data(RuntimeOrigin::signed(1), BOB, b"TestTooLongString".to_vec()), Error::::TooLong ); }); @@ -27,7 +27,7 @@ fn send_data_error_too_short() { new_test_ext().execute_with(|| { // Ensure the expected error is thrown when no value is present. assert_noop!( - CereDDCModule::send_data(Origin::signed(1), BOB, b"Short".to_vec()), + CereDDCModule::send_data(RuntimeOrigin::signed(1), BOB, b"Short".to_vec()), Error::::TooShort ); }); diff --git a/pallets/erc20/Cargo.toml b/pallets/erc20/Cargo.toml index 8d1cb2536..fafa6ae83 100644 --- a/pallets/erc20/Cargo.toml +++ b/pallets/erc20/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-erc20" -version = "4.7.0" +version = "4.8.0" authors = ["Parity Technologies "] edition = "2021" license = "Unlicense" @@ -15,19 +15,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.136", optional = true } codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false } -sp-arithmetic = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +sp-arithmetic = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-chainbridge = { version = "4.2.0", default-features = false, path = "../chainbridge" } pallet-erc721 = { version = "4.2.0", default-features = false, path = "../erc721" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } [features] default = ["std"] diff --git a/pallets/erc20/src/lib.rs b/pallets/erc20/src/lib.rs index cd7fb21e2..8f861d10d 100644 --- a/pallets/erc20/src/lib.rs +++ b/pallets/erc20/src/lib.rs @@ -4,50 +4,49 @@ use pallet_chainbridge as bridge; use pallet_erc721 as erc721; -use sp_std::marker::PhantomData; +use codec::{Decode, Encode}; use frame_support::{ - dispatch::{DispatchResult}, decl_module, decl_storage, decl_event, decl_error, - traits::{Currency, EnsureOrigin, ExistenceRequirement::AllowDeath, Get}, + decl_error, decl_event, decl_module, decl_storage, + dispatch::DispatchResult, ensure, - weights::{DispatchClass, ClassifyDispatch, WeighData, Weight, PaysFee, Pays}, + traits::{Currency, EnsureOrigin, ExistenceRequirement::AllowDeath, Get}, + weights::{ClassifyDispatch, DispatchClass, Pays, PaysFee, WeighData, Weight}, }; -use sp_std::prelude::*; -use frame_system::{self as system, ensure_signed, ensure_root}; +use frame_system::{self as system, ensure_root, ensure_signed}; use sp_arithmetic::traits::SaturatedConversion; use sp_core::U256; -use codec::{Encode, Decode}; use sp_runtime::{ - traits::{ - SignedExtension, Bounded, DispatchInfoOf, UniqueSaturatedInto, - }, + traits::{Bounded, DispatchInfoOf, SignedExtension, UniqueSaturatedInto}, transaction_validity::{ - ValidTransaction, TransactionValidityError, InvalidTransaction, TransactionValidity, + InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction, }, }; +use sp_std::{marker::PhantomData, prelude::*}; type ResourceId = bridge::ResourceId; type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; + <::Currency as Currency<::AccountId>>::Balance; pub trait Config: system::Config + bridge::Config + erc721::Config { - type Event: From> + Into<::Event>; - /// Specifies the origin check provided by the bridge for calls that can only be called by the bridge pallet - type BridgeOrigin: EnsureOrigin; - - /// The currency mechanism. - type Currency: Currency; - - /// Ids can be defined by the runtime and passed in, perhaps from blake2b_128 hashes. - type HashId: Get; - type NativeTokenId: Get; - type Erc721Id: Get; + type RuntimeEvent: From> + Into<::RuntimeEvent>; + /// Specifies the origin check provided by the bridge for calls that can only be called by the + /// bridge pallet + type BridgeOrigin: EnsureOrigin; + + /// The currency mechanism. + type Currency: Currency; + + /// Ids can be defined by the runtime and passed in, perhaps from blake2b_128 hashes. + type HashId: Get; + type NativeTokenId: Get; + type Erc721Id: Get; } decl_error! { - pub enum Error for Module{ - InvalidTransfer, - } + pub enum Error for Module{ + InvalidTransfer, + } } decl_storage! { @@ -55,93 +54,93 @@ decl_storage! { } decl_event!( - pub enum Event where - ::Hash, - { - Remark(Hash), - } + pub enum Event where + ::Hash, + { + Remark(Hash), + } ); decl_module! { - pub struct Module for enum Call where origin: T::Origin { - const HashId: ResourceId = T::HashId::get(); - const NativeTokenId: ResourceId = T::NativeTokenId::get(); - const Erc721Id: ResourceId = T::Erc721Id::get(); - - fn deposit_event() = default; - - // - // Initiation calls. These start a bridge transfer. - // - - /// Transfers an arbitrary hash to a (whitelisted) destination chain. - #[weight = 195_000_000] - pub fn transfer_hash(origin, hash: T::Hash, dest_id: bridge::ChainId) -> DispatchResult { - ensure_signed(origin)?; - - let resource_id = T::HashId::get(); - let metadata: Vec = hash.as_ref().to_vec(); - >::transfer_generic(dest_id, resource_id, metadata) - } - - /// Transfers some amount of the native token to some recipient on a (whitelisted) destination chain. - #[weight = 195_000_000] - pub fn transfer_native(origin, amount: BalanceOf, recipient: Vec, dest_id: bridge::ChainId) -> DispatchResult { - let source = ensure_signed(origin)?; - ensure!(>::chain_whitelisted(dest_id), Error::::InvalidTransfer); - let bridge_id = >::account_id(); - T::Currency::transfer(&source, &bridge_id, amount.into(), AllowDeath)?; - - let resource_id = T::NativeTokenId::get(); + pub struct Module for enum Call where origin: T::RuntimeOrigin { + const HashId: ResourceId = T::HashId::get(); + const NativeTokenId: ResourceId = T::NativeTokenId::get(); + const Erc721Id: ResourceId = T::Erc721Id::get(); + + fn deposit_event() = default; + + // + // Initiation calls. These start a bridge transfer. + // + + /// Transfers an arbitrary hash to a (whitelisted) destination chain. + #[weight = 195_000_000] + pub fn transfer_hash(origin, hash: T::Hash, dest_id: bridge::ChainId) -> DispatchResult { + ensure_signed(origin)?; + + let resource_id = T::HashId::get(); + let metadata: Vec = hash.as_ref().to_vec(); + >::transfer_generic(dest_id, resource_id, metadata) + } + + /// Transfers some amount of the native token to some recipient on a (whitelisted) destination chain. + #[weight = 195_000_000] + pub fn transfer_native(origin, amount: BalanceOf, recipient: Vec, dest_id: bridge::ChainId) -> DispatchResult { + let source = ensure_signed(origin)?; + ensure!(>::chain_whitelisted(dest_id), Error::::InvalidTransfer); + let bridge_id = >::account_id(); + T::Currency::transfer(&source, &bridge_id, amount.into(), AllowDeath)?; + + let resource_id = T::NativeTokenId::get(); let number_amount: u128 = amount.saturated_into(); - >::transfer_fungible(dest_id, resource_id, recipient, U256::from(number_amount)) - } - - - /// Transfer a non-fungible token (erc721) to a (whitelisted) destination chain. - #[weight = 195_000_000] - pub fn transfer_erc721(origin, recipient: Vec, token_id: U256, dest_id: bridge::ChainId) -> DispatchResult { - let source = ensure_signed(origin)?; - ensure!(>::chain_whitelisted(dest_id), Error::::InvalidTransfer); - match >::tokens(&token_id) { - Some(token) => { - >::burn_token(source, token_id)?; - let resource_id = T::Erc721Id::get(); - let tid: &mut [u8] = &mut[0; 32]; - token_id.to_big_endian(tid); - >::transfer_nonfungible(dest_id, resource_id, tid.to_vec(), recipient, token.metadata) - } - None => Err(Error::::InvalidTransfer)? - } - } - - // - // Executable calls. These can be triggered by a bridge transfer initiated on another chain - // - - /// Executes a simple currency transfer using the bridge account as the source - #[weight = 195_000_000] - pub fn transfer(origin, to: T::AccountId, amount: BalanceOf) -> DispatchResult { - let source = T::BridgeOrigin::ensure_origin(origin)?; - ::Currency::transfer(&source, &to, amount.into(), AllowDeath)?; - Ok(()) - } - - /// This can be called by the bridge to demonstrate an arbitrary call from a proposal. - #[weight = 195_000_000] - pub fn remark(origin, hash: T::Hash) -> DispatchResult { - T::BridgeOrigin::ensure_origin(origin)?; - Self::deposit_event(RawEvent::Remark(hash)); - Ok(()) - } - - /// Allows the bridge to issue new erc721 tokens - #[weight = 195_000_000] - pub fn mint_erc721(origin, recipient: T::AccountId, id: U256, metadata: Vec) -> DispatchResult { - T::BridgeOrigin::ensure_origin(origin)?; - >::mint_token(recipient, id, metadata)?; - Ok(()) - } - } + >::transfer_fungible(dest_id, resource_id, recipient, U256::from(number_amount)) + } + + + /// Transfer a non-fungible token (erc721) to a (whitelisted) destination chain. + #[weight = 195_000_000] + pub fn transfer_erc721(origin, recipient: Vec, token_id: U256, dest_id: bridge::ChainId) -> DispatchResult { + let source = ensure_signed(origin)?; + ensure!(>::chain_whitelisted(dest_id), Error::::InvalidTransfer); + match >::tokens(&token_id) { + Some(token) => { + >::burn_token(source, token_id)?; + let resource_id = T::Erc721Id::get(); + let tid: &mut [u8] = &mut[0; 32]; + token_id.to_big_endian(tid); + >::transfer_nonfungible(dest_id, resource_id, tid.to_vec(), recipient, token.metadata) + } + None => Err(Error::::InvalidTransfer)? + } + } + + // + // Executable calls. These can be triggered by a bridge transfer initiated on another chain + // + + /// Executes a simple currency transfer using the bridge account as the source + #[weight = 195_000_000] + pub fn transfer(origin, to: T::AccountId, amount: BalanceOf) -> DispatchResult { + let source = T::BridgeOrigin::ensure_origin(origin)?; + ::Currency::transfer(&source, &to, amount.into(), AllowDeath)?; + Ok(()) + } + + /// This can be called by the bridge to demonstrate an arbitrary call from a proposal. + #[weight = 195_000_000] + pub fn remark(origin, hash: T::Hash) -> DispatchResult { + T::BridgeOrigin::ensure_origin(origin)?; + Self::deposit_event(RawEvent::Remark(hash)); + Ok(()) + } + + /// Allows the bridge to issue new erc721 tokens + #[weight = 195_000_000] + pub fn mint_erc721(origin, recipient: T::AccountId, id: U256, metadata: Vec) -> DispatchResult { + T::BridgeOrigin::ensure_origin(origin)?; + >::mint_token(recipient, id, metadata)?; + Ok(()) + } + } } diff --git a/pallets/erc721/Cargo.toml b/pallets/erc721/Cargo.toml index 210c4f2f7..5f7d02e22 100644 --- a/pallets/erc721/Cargo.toml +++ b/pallets/erc721/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-erc721" -version = "4.7.0" +version = "4.8.0" authors = ["Parity Technologies "] edition = "2021" license = "Unlicense" @@ -15,17 +15,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.136", optional = true } codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-std = { version = "4.0.0", default-features = false,git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0", default-features = false,git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-chainbridge = { version = "4.2.0", default-features = false, path = "../chainbridge" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } [features] default = ["std"] diff --git a/pallets/erc721/src/lib.rs b/pallets/erc721/src/lib.rs index f43413aec..c0da9c7a3 100644 --- a/pallets/erc721/src/lib.rs +++ b/pallets/erc721/src/lib.rs @@ -1,26 +1,24 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::marker::PhantomData; +use codec::{Decode, Encode}; use frame_support::{ - dispatch::{DispatchResult}, decl_module, decl_storage, decl_event, decl_error, + decl_error, decl_event, decl_module, decl_storage, + dispatch::{ClassifyDispatch, DispatchClass, DispatchResult, Pays, PaysFee, WeighData}, ensure, traits::Get, - weights::{DispatchClass, ClassifyDispatch, WeighData, Weight, PaysFee, Pays}, + weights::Weight, }; -use sp_std::prelude::*; -use frame_system::{self as system, ensure_signed, ensure_root}; +use frame_system::{self as system, ensure_root, ensure_signed}; use sp_core::U256; -use codec::{Encode, Decode}; use sp_runtime::{ - traits::{ - SignedExtension, Bounded, SaturatedConversion, DispatchInfoOf, - }, + traits::{Bounded, DispatchInfoOf, SaturatedConversion, SignedExtension}, transaction_validity::{ - ValidTransaction, TransactionValidityError, InvalidTransaction, TransactionValidity, + InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction, }, RuntimeDebug, }; +use sp_std::{marker::PhantomData, prelude::*}; mod mock; mod tests; @@ -29,135 +27,136 @@ type TokenId = U256; #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, scale_info::TypeInfo)] pub struct Erc721Token { - pub id: TokenId, - pub metadata: Vec, + pub id: TokenId, + pub metadata: Vec, } pub trait Config: system::Config { - type Event: From> + Into<::Event>; + type RuntimeEvent: From> + Into<::RuntimeEvent>; - /// Some identifier for this token type, possibly the originating ethereum address. - /// This is not explicitly used for anything, but may reflect the bridge's notion of resource ID. - type Identifier: Get<[u8; 32]>; + /// Some identifier for this token type, possibly the originating ethereum address. + /// This is not explicitly used for anything, but may reflect the bridge's notion of resource + /// ID. + type Identifier: Get<[u8; 32]>; } decl_error! { - pub enum Error for Module { - /// ID not recognized - TokenIdDoesNotExist, - /// Already exists with an owner - TokenAlreadyExists, - /// Origin is not owner - NotOwner, - } + pub enum Error for Module { + /// ID not recognized + TokenIdDoesNotExist, + /// Already exists with an owner + TokenAlreadyExists, + /// Origin is not owner + NotOwner, + } } decl_storage! { trait Store for Module as TokenStorage { - /// Maps tokenId to Erc721 object - Tokens get(fn tokens): map hasher(opaque_blake2_256) TokenId => Option; - /// Maps tokenId to owner - TokenOwner get(fn owner_of): map hasher(opaque_blake2_256) TokenId => Option; - /// Total number of tokens in existence - TokenCount get(fn token_count): U256 = U256::zero(); - } + /// Maps tokenId to Erc721 object + Tokens get(fn tokens): map hasher(opaque_blake2_256) TokenId => Option; + /// Maps tokenId to owner + TokenOwner get(fn owner_of): map hasher(opaque_blake2_256) TokenId => Option; + /// Total number of tokens in existence + TokenCount get(fn token_count): U256 = U256::zero(); + } } decl_event!( pub enum Event - where - ::AccountId, - { - /// New token created - Minted(AccountId, TokenId), - /// Token transfer between two parties - Transferred(AccountId, AccountId, TokenId), - /// Token removed from the system - Burned(TokenId), - } + where + ::AccountId, + { + /// New token created + Minted(AccountId, TokenId), + /// Token transfer between two parties + Transferred(AccountId, AccountId, TokenId), + /// Token removed from the system + Burned(TokenId), + } ); decl_module! { - pub struct Module for enum Call where origin: T::Origin { - type Error = Error; - fn deposit_event() = default; + pub struct Module for enum Call where origin: T::RuntimeOrigin { + type Error = Error; + fn deposit_event() = default; - /// Creates a new token with the given token ID and metadata, and gives ownership to owner - #[weight = 195_000_000] - pub fn mint(origin, owner: T::AccountId, id: TokenId, metadata: Vec) -> DispatchResult { - ensure_root(origin)?; + /// Creates a new token with the given token ID and metadata, and gives ownership to owner + #[weight = 195_000_000] + pub fn mint(origin, owner: T::AccountId, id: TokenId, metadata: Vec) -> DispatchResult { + ensure_root(origin)?; - Self::mint_token(owner, id, metadata)?; + Self::mint_token(owner, id, metadata)?; - Ok(()) - } + Ok(()) + } - /// Changes ownership of a token sender owns - #[weight = 195_000_000] - pub fn transfer(origin, to: T::AccountId, id: TokenId) -> DispatchResult { - let sender = ensure_signed(origin)?; + /// Changes ownership of a token sender owns + #[weight = 195_000_000] + pub fn transfer(origin, to: T::AccountId, id: TokenId) -> DispatchResult { + let sender = ensure_signed(origin)?; - Self::transfer_from(sender, to, id)?; + Self::transfer_from(sender, to, id)?; - Ok(()) - } + Ok(()) + } - /// Remove token from the system - #[weight = 195_000_000] - pub fn burn(origin, id: TokenId) -> DispatchResult { - ensure_root(origin)?; + /// Remove token from the system + #[weight = 195_000_000] + pub fn burn(origin, id: TokenId) -> DispatchResult { + ensure_root(origin)?; - let owner = Self::owner_of(id).ok_or(Error::::TokenIdDoesNotExist)?; + let owner = Self::owner_of(id).ok_or(Error::::TokenIdDoesNotExist)?; - Self::burn_token(owner, id)?; + Self::burn_token(owner, id)?; - Ok(()) - } - } + Ok(()) + } + } } impl Module { - /// Creates a new token in the system. - pub fn mint_token(owner: T::AccountId, id: TokenId, metadata: Vec) -> DispatchResult { - ensure!(!Tokens::contains_key(id), Error::::TokenAlreadyExists); + /// Creates a new token in the system. + pub fn mint_token(owner: T::AccountId, id: TokenId, metadata: Vec) -> DispatchResult { + ensure!(!Tokens::contains_key(id), Error::::TokenAlreadyExists); - let new_token = Erc721Token { id, metadata }; + let new_token = Erc721Token { id, metadata }; - ::insert(&id, new_token); - >::insert(&id, owner.clone()); - let new_total = ::get().saturating_add(U256::one()); - ::put(new_total); + ::insert(&id, new_token); + >::insert(&id, owner.clone()); + let new_total = ::get().saturating_add(U256::one()); + ::put(new_total); - Self::deposit_event(RawEvent::Minted(owner, id)); + Self::deposit_event(RawEvent::Minted(owner, id)); - Ok(()) - } + Ok(()) + } - /// Modifies ownership of a token - pub fn transfer_from(from: T::AccountId, to: T::AccountId, id: TokenId) -> DispatchResult { - // Check from is owner and token exists - let owner = Self::owner_of(id).ok_or(Error::::TokenIdDoesNotExist)?; - ensure!(owner == from, Error::::NotOwner); - // Update owner - >::insert(&id, to.clone()); + /// Modifies ownership of a token + pub fn transfer_from(from: T::AccountId, to: T::AccountId, id: TokenId) -> DispatchResult { + // Check from is owner and token exists + let owner = Self::owner_of(id).ok_or(Error::::TokenIdDoesNotExist)?; + ensure!(owner == from, Error::::NotOwner); + // Update owner + >::insert(&id, to.clone()); - Self::deposit_event(RawEvent::Transferred(from, to, id)); + Self::deposit_event(RawEvent::Transferred(from, to, id)); - Ok(()) - } + Ok(()) + } - /// Deletes a token from the system. - pub fn burn_token(from: T::AccountId, id: TokenId) -> DispatchResult { - let owner = Self::owner_of(id).ok_or(Error::::TokenIdDoesNotExist)?; - ensure!(owner == from, Error::::NotOwner); + /// Deletes a token from the system. + pub fn burn_token(from: T::AccountId, id: TokenId) -> DispatchResult { + let owner = Self::owner_of(id).ok_or(Error::::TokenIdDoesNotExist)?; + ensure!(owner == from, Error::::NotOwner); - ::remove(&id); - >::remove(&id); - let new_total = ::get().saturating_sub(U256::one()); - ::put(new_total); + ::remove(&id); + >::remove(&id); + let new_total = ::get().saturating_sub(U256::one()); + ::put(new_total); - Self::deposit_event(RawEvent::Burned(id)); + Self::deposit_event(RawEvent::Burned(id)); - Ok(()) - } + Ok(()) + } } diff --git a/pallets/erc721/src/mock.rs b/pallets/erc721/src/mock.rs index bb872fa8f..24ee23b92 100644 --- a/pallets/erc721/src/mock.rs +++ b/pallets/erc721/src/mock.rs @@ -1,96 +1,94 @@ #![cfg(test)] -use frame_support::{ord_parameter_types, parameter_types, weights::Weight}; -use frame_support::traits::Everything; +use frame_support::{ord_parameter_types, parameter_types, traits::Everything, weights::Weight}; use frame_system::{self as system}; -use sp_core::hashing::blake2_128; -use sp_core::H256; +use sp_core::{hashing::blake2_128, H256}; use sp_runtime::{ - testing::Header, - traits::{BlakeTwo256, Block as BlockT, IdentityLookup}, - BuildStorage, Perbill, + testing::Header, + traits::{BlakeTwo256, Block as BlockT, IdentityLookup}, + BuildStorage, Perbill, }; use crate::{self as erc721, Config}; -use pallet_chainbridge as bridge; pub use pallet_balances as balances; +use pallet_chainbridge as bridge; parameter_types! { - pub const BlockHashCount: u64 = 250; - pub const MaximumBlockWeight: Weight = Weight::from_ref_time(1024); - pub const MaximumBlockLength: u32 = 2 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::one(); + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: Weight = Weight::from_ref_time(1024); + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl frame_system::Config for Test { - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - 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 = Event; - type BlockHashCount = BlockHashCount; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type DbWeight = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; } parameter_types! { - pub const ExistentialDeposit: u64 = 1; + pub const ExistentialDeposit: u64 = 1; } ord_parameter_types! { - pub const One: u64 = 1; + pub const One: u64 = 1; } impl pallet_balances::Config for Test { - type Balance = u64; - type DustRemoval = (); - type Event = Event; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = (); + type Balance = u64; + type DustRemoval = (); + type RuntimeEvent = RuntimeEvent; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxLocks = (); + type MaxReserves = (); + type ReserveIdentifier = (); } parameter_types! { - pub Erc721Id: bridge::ResourceId = bridge::derive_resource_id(1, &blake2_128(b"NFT")); + pub Erc721Id: bridge::ResourceId = bridge::derive_resource_id(1, &blake2_128(b"NFT")); } impl Config for Test { - type Event = Event; - type Identifier = Erc721Id; + type RuntimeEvent = RuntimeEvent; + type Identifier = Erc721Id; } pub type Block = sp_runtime::generic::Block; -pub type UncheckedExtrinsic = sp_runtime::generic::UncheckedExtrinsic; +pub type UncheckedExtrinsic = sp_runtime::generic::UncheckedExtrinsic; frame_support::construct_runtime!( - pub enum Test where - Block = Block, - NodeBlock = Block, - UncheckedExtrinsic = UncheckedExtrinsic - { - System: system::{Pallet, Call, Event}, - Balances: balances::{Pallet, Call, Storage, Config, Event}, - Erc721: erc721::{Pallet, Call, Storage, Event}, - } + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic + { + System: system::{Pallet, Call, Event}, + Balances: balances::{Pallet, Call, Storage, Config, Event}, + Erc721: erc721::{Pallet, Call, Storage, Event}, + } ); pub const USER_A: u64 = 0x1; @@ -99,12 +97,10 @@ pub const USER_C: u64 = 0x3; pub const ENDOWED_BALANCE: u64 = 100_000_000; pub fn new_test_ext() -> sp_io::TestExternalities { - GenesisConfig { - balances: balances::GenesisConfig { - balances: vec![(USER_A, ENDOWED_BALANCE)], - }, - } - .build_storage() - .unwrap() - .into() + GenesisConfig { + balances: balances::GenesisConfig { balances: vec![(USER_A, ENDOWED_BALANCE)] }, + } + .build_storage() + .unwrap() + .into() } diff --git a/pallets/erc721/src/tests.rs b/pallets/erc721/src/tests.rs index 416a71737..f273f83a3 100644 --- a/pallets/erc721/src/tests.rs +++ b/pallets/erc721/src/tests.rs @@ -1,99 +1,75 @@ #![cfg(test)] -use super::mock::{new_test_ext, Erc721, Origin, Test, USER_A, USER_B, USER_C}; -use super::*; +use super::{ + mock::{new_test_ext, Erc721, RuntimeOrigin, Test, USER_A, USER_B, USER_C}, + *, +}; use frame_support::{assert_noop, assert_ok}; use sp_core::U256; #[test] fn mint_burn_tokens() { - new_test_ext().execute_with(|| { - let id_a: U256 = 1.into(); - let id_b: U256 = 2.into(); - let metadata_a: Vec = vec![1, 2, 3]; - let metadata_b: Vec = vec![4, 5, 6]; + new_test_ext().execute_with(|| { + let id_a: U256 = 1.into(); + let id_b: U256 = 2.into(); + let metadata_a: Vec = vec![1, 2, 3]; + let metadata_b: Vec = vec![4, 5, 6]; - assert_ok!(Erc721::mint( - Origin::root(), - USER_A, - id_a, - metadata_a.clone() - )); - assert_eq!( - Erc721::tokens(id_a).unwrap(), - Erc721Token { - id: id_a, - metadata: metadata_a.clone() - } - ); - assert_eq!(Erc721::token_count(), 1.into()); - assert_noop!( - Erc721::mint(Origin::root(), USER_A, id_a, metadata_a.clone()), - Error::::TokenAlreadyExists - ); + assert_ok!(Erc721::mint(RuntimeOrigin::root(), USER_A, id_a, metadata_a.clone())); + assert_eq!( + Erc721::tokens(id_a).unwrap(), + Erc721Token { id: id_a, metadata: metadata_a.clone() } + ); + assert_eq!(Erc721::token_count(), 1.into()); + assert_noop!( + Erc721::mint(RuntimeOrigin::root(), USER_A, id_a, metadata_a.clone()), + Error::::TokenAlreadyExists + ); - assert_ok!(Erc721::mint( - Origin::root(), - USER_A, - id_b, - metadata_b.clone() - )); - assert_eq!( - Erc721::tokens(id_b).unwrap(), - Erc721Token { - id: id_b, - metadata: metadata_b.clone() - } - ); - assert_eq!(Erc721::token_count(), 2.into()); - assert_noop!( - Erc721::mint(Origin::root(), USER_A, id_b, metadata_b.clone()), - Error::::TokenAlreadyExists - ); + assert_ok!(Erc721::mint(RuntimeOrigin::root(), USER_A, id_b, metadata_b.clone())); + assert_eq!( + Erc721::tokens(id_b).unwrap(), + Erc721Token { id: id_b, metadata: metadata_b.clone() } + ); + assert_eq!(Erc721::token_count(), 2.into()); + assert_noop!( + Erc721::mint(RuntimeOrigin::root(), USER_A, id_b, metadata_b.clone()), + Error::::TokenAlreadyExists + ); - assert_ok!(Erc721::burn(Origin::root(), id_a)); - assert_eq!(Erc721::token_count(), 1.into()); - assert!(!::contains_key(&id_a)); - assert!(!>::contains_key(&id_a)); + assert_ok!(Erc721::burn(RuntimeOrigin::root(), id_a)); + assert_eq!(Erc721::token_count(), 1.into()); + assert!(!::contains_key(&id_a)); + assert!(!>::contains_key(&id_a)); - assert_ok!(Erc721::burn(Origin::root(), id_b)); - assert_eq!(Erc721::token_count(), 0.into()); - assert!(!::contains_key(&id_b)); - assert!(!>::contains_key(&id_b)); - }) + assert_ok!(Erc721::burn(RuntimeOrigin::root(), id_b)); + assert_eq!(Erc721::token_count(), 0.into()); + assert!(!::contains_key(&id_b)); + assert!(!>::contains_key(&id_b)); + }) } #[test] fn transfer_tokens() { - new_test_ext().execute_with(|| { - let id_a: U256 = 1.into(); - let id_b: U256 = 2.into(); - let metadata_a: Vec = vec![1, 2, 3]; - let metadata_b: Vec = vec![4, 5, 6]; + new_test_ext().execute_with(|| { + let id_a: U256 = 1.into(); + let id_b: U256 = 2.into(); + let metadata_a: Vec = vec![1, 2, 3]; + let metadata_b: Vec = vec![4, 5, 6]; - assert_ok!(Erc721::mint( - Origin::root(), - USER_A, - id_a, - metadata_a.clone() - )); - assert_ok!(Erc721::mint( - Origin::root(), - USER_A, - id_b, - metadata_b.clone() - )); + assert_ok!(Erc721::mint(RuntimeOrigin::root(), USER_A, id_a, metadata_a.clone())); + assert_ok!(Erc721::mint(RuntimeOrigin::root(), USER_A, id_b, metadata_b.clone())); - assert_ok!(Erc721::transfer(Origin::signed(USER_A), USER_B, id_a)); - assert_eq!(Erc721::owner_of(id_a).unwrap(), USER_B); + assert_ok!(Erc721::transfer(RuntimeOrigin::signed(USER_A), USER_B, id_a)); + assert_eq!(Erc721::owner_of(id_a).unwrap(), USER_B); - assert_ok!(Erc721::transfer(Origin::signed(USER_A), USER_C, id_b)); - assert_eq!(Erc721::owner_of(id_b).unwrap(), USER_C); + assert_ok!(Erc721::transfer(RuntimeOrigin::signed(USER_A), USER_C, id_b)); + assert_eq!(Erc721::owner_of(id_b).unwrap(), USER_C); - assert_ok!(Erc721::transfer(Origin::signed(USER_B), USER_A, id_a)); - assert_eq!(Erc721::owner_of(id_a).unwrap(), USER_A); + assert_ok!(Erc721::transfer(RuntimeOrigin::signed(USER_B), USER_A, id_a)); + assert_eq!(Erc721::owner_of(id_a).unwrap(), USER_A); - assert_ok!(Erc721::transfer(Origin::signed(USER_C), USER_A, id_b)); - assert_eq!(Erc721::owner_of(id_b).unwrap(), USER_A); - }) + assert_ok!(Erc721::transfer(RuntimeOrigin::signed(USER_C), USER_A, id_b)); + assert_eq!(Erc721::owner_of(id_b).unwrap(), USER_A); + }) } diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 6fbcee84a..65de7e088 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,30 +1,30 @@ [package] name = "cere-rpc" -version = "4.7.0" +version = "4.8.0" edition = "2021" [dependencies] jsonrpsee = { version = "0.15.1", features = ["server"] } -sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sc-rpc-api = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sc-consensus-babe-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sc-consensus-epochs = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sc-finality-grandpa-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -substrate-frame-rpc-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -pallet-transaction-payment-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -substrate-state-trie-migration-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-rpc-api = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-consensus-babe-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-consensus-epochs = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-finality-grandpa-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +substrate-frame-rpc-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +pallet-transaction-payment-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +substrate-state-trie-migration-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs index a47380803..9abf2af02 100644 --- a/rpc/src/lib.rs +++ b/rpc/src/lib.rs @@ -93,13 +93,13 @@ where B: sc_client_api::Backend + Send + Sync + 'static, B::State: sc_client_api::backend::StateBackend>, { - use pallet_contracts_rpc::{ContractsApiServer, Contracts}; - use pallet_transaction_payment_rpc::{TransactionPaymentApiServer, TransactionPayment}; - use sc_consensus_babe_rpc::{BabeApiServer, Babe}; + use pallet_contracts_rpc::{Contracts, ContractsApiServer}; + use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; + use sc_consensus_babe_rpc::{Babe, BabeApiServer}; use sc_finality_grandpa_rpc::GrandpaApiServer; use sc_rpc::dev::{Dev, DevApiServer}; use sc_sync_state_rpc::{SyncState, SyncStateApiServer}; - use substrate_frame_rpc_system::{SystemApiServer, System}; + use substrate_frame_rpc_system::{System, SystemApiServer}; use substrate_state_trie_migration_rpc::StateMigrationApiServer; let mut io = RpcModule::new(()); @@ -148,8 +148,12 @@ where )?; io.merge( - substrate_state_trie_migration_rpc::StateMigration::new(client.clone(), backend, deny_unsafe) - .into_rpc(), + substrate_state_trie_migration_rpc::StateMigration::new( + client.clone(), + backend, + deny_unsafe, + ) + .into_rpc(), )?; io.merge(Dev::new(client, deny_unsafe).into_rpc())?; diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index a969e8de0..885bd1c58 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-dev-runtime" -version = "4.7.0" +version = "4.8.0" authors = ["Parity Technologies "] edition = "2021" build = "build.rs" @@ -24,86 +24,87 @@ hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.16", default-features = false } # primitives -sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false, version = "4.0.0-dev" } -sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, version = "4.0.0-dev" } +sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } # frame dependencies -frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } -pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-authorship = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-bags-list = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } -pallet-elections-phragmen = { version = "5.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-indices = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-membership = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-multisig = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.29" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.29" } -pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true , branch = "polkadot-v0.9.29" } -pallet-offences = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-offences-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false, optional = true } -pallet-proxy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-recovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false } -pallet-session-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false, optional = true } -pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-tips = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-transaction-storage = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-authorship = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-bags-list = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +pallet-elections-phragmen = { version = "5.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } +pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-indices = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-membership = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-multisig = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } +pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } +pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true , branch = "polkadot-v0.9.30" } +pallet-offences = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-offences-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } +pallet-proxy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-recovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +pallet-session-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } +pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-tips = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-storage = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } cere-runtime-common = { path = "../common", default-features = false } cere-dev-runtime-constants = { path = "./constants", default-features = false } -pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../../pallets/ddc-staking" } -pallet-chainbridge = { version = "4.7.0", default-features = false, path = "../../pallets/chainbridge" } -pallet-cere-ddc = { version = "4.7.0", default-features = false, path = "../../pallets/ddc" } -pallet-erc721 = { version = "4.7.0", default-features = false, path = "../../pallets/erc721" } -pallet-erc20 = { version = "4.7.0", default-features = false, path = "../../pallets/erc20" } -pallet-ddc-metrics-offchain-worker = { version = "4.7.0", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } +pallet-ddc-staking = { version = "4.8.0", default-features = false, path = "../../pallets/ddc-staking" } +pallet-chainbridge = { version = "4.8.0", default-features = false, path = "../../pallets/chainbridge" } +pallet-cere-ddc = { version = "4.8.0", default-features = false, path = "../../pallets/ddc" } +pallet-erc721 = { version = "4.8.0", default-features = false, path = "../../pallets/erc721" } +pallet-erc20 = { version = "4.8.0", default-features = false, path = "../../pallets/erc20" } +pallet-ddc-metrics-offchain-worker = { version = "4.8.0", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } [build-dependencies] -substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] @@ -125,6 +126,7 @@ std = [ "pallet-contracts-primitives/std", "pallet-contracts-rpc-runtime-api/std", "pallet-democracy/std", + "pallet-fast-unstake/std", "pallet-elections-phragmen/std", "frame-executive/std", "pallet-cere-ddc/std", @@ -197,6 +199,7 @@ runtime-benchmarks = [ "pallet-election-provider-multi-phase/runtime-benchmarks", "pallet-election-provider-support-benchmarking/runtime-benchmarks", "pallet-elections-phragmen/runtime-benchmarks", + "pallet-fast-unstake/runtime-benchmarks", "pallet-grandpa/runtime-benchmarks", "pallet-identity/runtime-benchmarks", "pallet-im-online/runtime-benchmarks", @@ -204,11 +207,11 @@ runtime-benchmarks = [ "pallet-membership/runtime-benchmarks", "pallet-multisig/runtime-benchmarks", "pallet-nomination-pools/runtime-benchmarks", - "pallet-nomination-pools-benchmarking", - "pallet-offences-benchmarking", + "pallet-nomination-pools-benchmarking/runtime-benchmarks", + "pallet-offences-benchmarking/runtime-benchmarks", "pallet-proxy/runtime-benchmarks", "pallet-scheduler/runtime-benchmarks", - "pallet-session-benchmarking", + "pallet-session-benchmarking/runtime-benchmarks", "pallet-society/runtime-benchmarks", "pallet-staking/runtime-benchmarks", "pallet-ddc-staking/runtime-benchmarks", @@ -217,7 +220,7 @@ runtime-benchmarks = [ "pallet-treasury/runtime-benchmarks", "pallet-utility/runtime-benchmarks", "pallet-vesting/runtime-benchmarks", - "frame-system-benchmarking", + "frame-system-benchmarking/runtime-benchmarks", "hex-literal", ] try-runtime = [ @@ -236,6 +239,7 @@ try-runtime = [ "pallet-democracy/try-runtime", "pallet-election-provider-multi-phase/try-runtime", "pallet-elections-phragmen/try-runtime", + "pallet-fast-unstake/try-runtime", "pallet-grandpa/try-runtime", "pallet-identity/try-runtime", "pallet-im-online/try-runtime", diff --git a/runtime/cere-dev/constants/Cargo.toml b/runtime/cere-dev/constants/Cargo.toml index 84ab98517..68ca79a56 100644 --- a/runtime/cere-dev/constants/Cargo.toml +++ b/runtime/cere-dev/constants/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "cere-dev-runtime-constants" -version = "4.7.0" +version = "4.8.0" authors = ["Parity Technologies "] edition = "2021" [dependencies] -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.29" } +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/runtime/cere-dev/src/impls.rs b/runtime/cere-dev/src/impls.rs index d23489fb8..dd38a6a1d 100644 --- a/runtime/cere-dev/src/impls.rs +++ b/runtime/cere-dev/src/impls.rs @@ -31,18 +31,18 @@ impl OnUnbalanced for Author { #[cfg(test)] mod multiplier_tests { + use crate::{ + AdjustmentVariable, MinimumMultiplier, Runtime, RuntimeBlockWeights as BlockWeights, + System, TargetBlockFullness, TransactionPayment, + }; + use cere_dev_runtime_constants::{currency::*, time::*}; + use frame_support::weights::{DispatchClass, Weight, WeightToFee as WeightToFeeT}; use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment}; use sp_runtime::{ assert_eq_error_rate, traits::{Convert, One, Zero}, FixedPointNumber, }; - use cere_dev_runtime_constants::{currency::*, time::*}; - use crate::{ - AdjustmentVariable, MinimumMultiplier, Runtime, RuntimeBlockWeights as BlockWeights, - System, TargetBlockFullness, TransactionPayment, - }; - use frame_support::weights::{DispatchClass, Weight, WeightToFee as WeightToFeeT}; fn max_normal() -> Weight { BlockWeights::get() @@ -197,7 +197,8 @@ mod multiplier_tests { // `cargo test congested_chain_simulation -- --nocapture` to get some insight. // almost full. The entire quota of normal transactions is taken. - let block_weight = BlockWeights::get().get(DispatchClass::Normal).max_total.unwrap() - Weight::from_ref_time(100); + let block_weight = BlockWeights::get().get(DispatchClass::Normal).max_total.unwrap() - + Weight::from_ref_time(100); // Default substrate weight. let tx_weight = frame_support::weights::constants::ExtrinsicBaseWeight::get(); diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index f3806856c..439fcadb3 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -22,17 +22,18 @@ // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit = "256"] +use cere_runtime_common::{BalanceToU256, U256ToBalance}; use codec::{Decode, Encode, MaxEncodedLen}; use frame_election_provider_support::{ - onchain, ExtendedBalance, SequentialPhragmen, VoteWeight, BalancingConfig + onchain, BalancingConfig, ExtendedBalance, SequentialPhragmen, VoteWeight, }; use frame_support::{ construct_runtime, pallet_prelude::Get, parameter_types, traits::{ - ConstU16, ConstU32, Currency, EitherOfDiverse, EqualPrivilegeOnly, Everything, Imbalance, - InstanceFilter, KeyOwnerProofSystem, LockIdentifier, Nothing, OnUnbalanced, + ConstU128, ConstU16, ConstU32, Currency, EitherOfDiverse, EqualPrivilegeOnly, Everything, + Imbalance, InstanceFilter, KeyOwnerProofSystem, LockIdentifier, Nothing, OnUnbalanced, U128CurrencyToVote, }, weights::{ @@ -74,7 +75,7 @@ use sp_runtime::{ SaturatedConversion, StaticLookup, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, FixedU128, FixedPointNumber, Perbill, Percent, Permill, Perquintill, + ApplyExtrinsicResult, FixedPointNumber, FixedU128, Perbill, Percent, Permill, Perquintill, }; use sp_staking::EraIndex; use sp_std::prelude::*; @@ -82,7 +83,6 @@ use sp_std::prelude::*; use sp_version::NativeVersion; use sp_version::RuntimeVersion; use static_assertions::const_assert; -use cere_runtime_common::{BalanceToU256, U256ToBalance}; #[cfg(any(feature = "std", test))] pub use frame_system::Call as SystemCall; @@ -130,10 +130,10 @@ 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: 47000, + spec_version: 48000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 4, + transaction_version: 5, state_version: 0, }; @@ -209,8 +209,8 @@ impl frame_system::Config for Runtime { type BlockWeights = RuntimeBlockWeights; type BlockLength = RuntimeBlockLength; type DbWeight = RocksDbWeight; - type Origin = Origin; - type Call = Call; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; type Index = Index; type BlockNumber = BlockNumber; type Hash = Hash; @@ -218,7 +218,7 @@ impl frame_system::Config for Runtime { type AccountId = AccountId; type Lookup = Indices; type Header = generic::Header; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type BlockHashCount = BlockHashCount; type Version = Version; type PalletInfo = PalletInfo; @@ -234,8 +234,8 @@ impl frame_system::Config for Runtime { impl pallet_randomness_collective_flip::Config for Runtime {} impl pallet_utility::Config for Runtime { - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; type PalletsOrigin = OriginCaller; type WeightInfo = pallet_utility::weights::SubstrateWeight; } @@ -248,8 +248,8 @@ parameter_types! { } impl pallet_multisig::Config for Runtime { - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; type Currency = Balances; type DepositBase = DepositBase; type DepositFactor = DepositFactor; @@ -291,25 +291,27 @@ impl Default for ProxyType { Self::Any } } -impl InstanceFilter for ProxyType { - fn filter(&self, c: &Call) -> bool { +impl InstanceFilter for ProxyType { + fn filter(&self, c: &RuntimeCall) -> bool { match self { ProxyType::Any => true, ProxyType::NonTransfer => !matches!( c, - Call::Balances(..) | - Call::Vesting(pallet_vesting::Call::vested_transfer { .. }) | - Call::Indices(pallet_indices::Call::transfer { .. }) | - Call::NominationPools(..) + RuntimeCall::Balances(..) | + RuntimeCall::Vesting(pallet_vesting::Call::vested_transfer { .. }) | + RuntimeCall::Indices(pallet_indices::Call::transfer { .. }) | + RuntimeCall::NominationPools(..) ), ProxyType::Governance => matches!( c, - Call::Democracy(..) | - Call::Council(..) | Call::Society(..) | - Call::TechnicalCommittee(..) | - Call::Elections(..) | Call::Treasury(..) + RuntimeCall::Democracy(..) | + RuntimeCall::Council(..) | + RuntimeCall::Society(..) | + RuntimeCall::TechnicalCommittee(..) | + RuntimeCall::Elections(..) | + RuntimeCall::Treasury(..) ), - ProxyType::Staking => matches!(c, Call::Staking(..)), + ProxyType::Staking => matches!(c, RuntimeCall::Staking(..)), } } fn is_superset(&self, o: &Self) -> bool { @@ -324,8 +326,8 @@ impl InstanceFilter for ProxyType { } impl pallet_proxy::Config for Runtime { - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; type Currency = Balances; type ProxyType = ProxyType; type ProxyDepositBase = ProxyDepositBase; @@ -344,10 +346,10 @@ parameter_types! { } impl pallet_scheduler::Config for Runtime { - type Event = Event; - type Origin = Origin; + type RuntimeEvent = RuntimeEvent; + type RuntimeOrigin = RuntimeOrigin; type PalletsOrigin = OriginCaller; - type Call = Call; + type RuntimeCall = RuntimeCall; type MaximumWeight = MaximumSchedulerWeight; type ScheduleOrigin = EnsureRoot; type MaxScheduledPerBlock = ConstU32<50>; @@ -399,7 +401,7 @@ impl pallet_indices::Config for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type WeightInfo = pallet_indices::weights::SubstrateWeight; } @@ -417,7 +419,7 @@ impl pallet_balances::Config for Runtime { type ReserveIdentifier = [u8; 8]; type Balance = Balance; type DustRemoval = (); - type Event = Event; + type RuntimeEvent = RuntimeEvent; type ExistentialDeposit = ExistentialDeposit; type AccountStore = frame_system::Pallet; type WeightInfo = pallet_balances::weights::SubstrateWeight; @@ -432,7 +434,7 @@ parameter_types! { } impl pallet_transaction_payment::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = CurrencyAdapter; type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = IdentityFee; @@ -473,7 +475,7 @@ impl_opaque_keys! { } impl pallet_session::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type ValidatorId = ::AccountId; type ValidatorIdOf = pallet_staking::StashOf; type ShouldEndSession = Babe; @@ -523,7 +525,7 @@ impl pallet_staking::Config for Runtime { type UnixTime = Timestamp; type CurrencyToVote = U128CurrencyToVote; type RewardRemainder = Treasury; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Slash = Treasury; // send the slashed funds to the treasury. type Reward = (); // rewards are minted from the void type SessionsPerEra = SessionsPerEra; @@ -542,12 +544,22 @@ impl pallet_staking::Config for Runtime { type ElectionProvider = ElectionProviderMultiPhase; type GenesisElectionProvider = onchain::UnboundedExecution; type VoterList = VoterList; + type TargetList = pallet_staking::UseValidatorsMap; type MaxUnlockingChunks = ConstU32<32>; + type HistoryDepth = frame_support::traits::ConstU32<84>; type OnStakerSlash = NominationPools; type WeightInfo = pallet_staking::weights::SubstrateWeight; type BenchmarkingConfig = StakingBenchmarkingConfig; } +impl pallet_fast_unstake::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ControlOrigin = frame_system::EnsureRoot; + type Deposit = ConstU128<{ DOLLARS }>; + type DepositCurrency = Balances; + type WeightInfo = (); +} + parameter_types! { // phase durations. 1/4 of the last session for each. pub const SignedPhase: u32 = EPOCH_DURATION_IN_BLOCKS / 4; @@ -666,7 +678,7 @@ impl pallet_election_provider_multi_phase::MinerConfig for Runtime { } impl pallet_election_provider_multi_phase::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; type EstimateCallFee = TransactionPayment; type SignedPhase = SignedPhase; @@ -701,8 +713,9 @@ parameter_types! { pub const BagThresholds: &'static [u64] = &voter_bags::THRESHOLDS; } -impl pallet_bags_list::Config for Runtime { - type Event = Event; +type VoterBagsListInstance = pallet_bags_list::Instance1; +impl pallet_bags_list::Config for Runtime { + type RuntimeEvent = RuntimeEvent; type ScoreProvider = Staking; type WeightInfo = pallet_bags_list::weights::SubstrateWeight; type BagThresholds = BagThresholds; @@ -720,8 +733,8 @@ parameter_types! { } impl pallet_democracy::Config for Runtime { - type Proposal = Call; - type Event = Event; + type Proposal = RuntimeCall; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; type EnactmentPeriod = EnactmentPeriod; type LaunchPeriod = LaunchPeriod; @@ -778,9 +791,9 @@ parameter_types! { type CouncilCollective = pallet_collective::Instance1; impl pallet_collective::Config for Runtime { - type Origin = Origin; - type Proposal = Call; - type Event = Event; + type RuntimeOrigin = RuntimeOrigin; + type Proposal = RuntimeCall; + type RuntimeEvent = RuntimeEvent; type MotionDuration = CouncilMotionDuration; type MaxProposals = CouncilMaxProposals; type MaxMembers = CouncilMaxMembers; @@ -805,7 +818,7 @@ parameter_types! { const_assert!(DesiredMembers::get() <= CouncilMaxMembers::get()); impl pallet_elections_phragmen::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type PalletId = ElectionsPhragmenPalletId; type Currency = Balances; type ChangeMembers = Council; @@ -834,9 +847,9 @@ parameter_types! { type TechnicalCollective = pallet_collective::Instance2; impl pallet_collective::Config for Runtime { - type Origin = Origin; - type Proposal = Call; - type Event = Event; + type RuntimeOrigin = RuntimeOrigin; + type Proposal = RuntimeCall; + type RuntimeEvent = RuntimeEvent; type MotionDuration = TechnicalMotionDuration; type MaxProposals = TechnicalMaxProposals; type MaxMembers = TechnicalMaxMembers; @@ -849,7 +862,7 @@ type EnsureRootOrHalfCouncil = EitherOfDiverse< pallet_collective::EnsureProportionMoreThan, >; impl pallet_membership::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type AddOrigin = EnsureRootOrHalfCouncil; type RemoveOrigin = EnsureRootOrHalfCouncil; type SwapOrigin = EnsureRootOrHalfCouncil; @@ -886,7 +899,7 @@ impl pallet_treasury::Config for Runtime { EnsureRoot, pallet_collective::EnsureProportionMoreThan, >; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type OnSlash = (); type ProposalBond = ProposalBond; type ProposalBondMinimum = ProposalBondMinimum; @@ -912,7 +925,7 @@ parameter_types! { } impl pallet_bounties::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type BountyDepositBase = BountyDepositBase; type BountyDepositPayoutDelay = BountyDepositPayoutDelay; type BountyUpdatePeriod = BountyUpdatePeriod; @@ -931,14 +944,14 @@ parameter_types! { } impl pallet_child_bounties::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type MaxActiveChildBountyCount = ConstU32<5>; type ChildBountyValueMinimum = ChildBountyValueMinimum; type WeightInfo = pallet_child_bounties::weights::SubstrateWeight; } impl pallet_tips::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type DataDepositPerByte = DataDepositPerByte; type MaximumReasonLength = MaximumReasonLength; type Tippers = Elections; @@ -966,8 +979,8 @@ impl pallet_contracts::Config for Runtime { type Time = Timestamp; type Randomness = RandomnessCollectiveFlip; type Currency = Balances; - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; /// The safest default is to allow no calls at all. /// /// Runtimes should whitelist dispatchables that are allowed to be called from contracts @@ -987,13 +1000,12 @@ impl pallet_contracts::Config for Runtime { type AddressGenerator = pallet_contracts::DefaultAddressGenerator; type ContractAccessWeight = pallet_contracts::DefaultContractAccessWeight; type MaxCodeLen = ConstU32<{ 128 * 1024 }>; - type RelaxedMaxCodeLen = ConstU32<{ 256 * 1024 }>; type MaxStorageKeyLen = ConstU32<128>; } impl pallet_sudo::Config for Runtime { - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; } parameter_types! { @@ -1008,14 +1020,14 @@ parameter_types! { impl frame_system::offchain::CreateSignedTransaction for Runtime where - Call: From, + RuntimeCall: From, { fn create_transaction>( - call: Call, + call: RuntimeCall, public: ::Signer, account: AccountId, nonce: Index, - ) -> Option<(Call, ::SignaturePayload)> { + ) -> Option<(RuntimeCall, ::SignaturePayload)> { let tip = 0; // take the biggest period possible. let period = @@ -1055,15 +1067,15 @@ impl frame_system::offchain::SigningTypes for Runtime { impl frame_system::offchain::SendTransactionTypes for Runtime where - Call: From, + RuntimeCall: From, { type Extrinsic = UncheckedExtrinsic; - type OverarchingCall = Call; + type OverarchingCall = RuntimeCall; } impl pallet_im_online::Config for Runtime { type AuthorityId = ImOnlineId; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type NextSessionRotation = Babe; type ValidatorSet = Historical; type ReportUnresponsiveness = Offences; @@ -1075,7 +1087,7 @@ impl pallet_im_online::Config for Runtime { } impl pallet_offences::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; } @@ -1085,8 +1097,7 @@ impl pallet_authority_discovery::Config for Runtime { } impl pallet_grandpa::Config for Runtime { - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; type KeyOwnerProofSystem = Historical; @@ -1118,7 +1129,7 @@ parameter_types! { } impl pallet_identity::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; type BasicDeposit = BasicDeposit; type FieldDeposit = FieldDeposit; @@ -1140,9 +1151,9 @@ parameter_types! { } impl pallet_recovery::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type WeightInfo = pallet_recovery::weights::SubstrateWeight; - type Call = Call; + type RuntimeCall = RuntimeCall; type Currency = Balances; type ConfigDepositBase = ConfigDepositBase; type FriendDepositFactor = FriendDepositFactor; @@ -1163,7 +1174,7 @@ parameter_types! { } impl pallet_society::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type PalletId = SocietyPalletId; type Currency = Balances; type Randomness = RandomnessCollectiveFlip; @@ -1186,7 +1197,7 @@ parameter_types! { } impl pallet_vesting::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; type BlockNumberToBalance = ConvertInto; type MinVestedTransfer = MinVestedTransfer; @@ -1208,7 +1219,7 @@ impl pallet_cere_ddc::Config for Runtime { type MinLength = MinDataLength; type MaxLength = MaxDataLength; // The ubiquitous event type. - type Event = Event; + type RuntimeEvent = RuntimeEvent; } parameter_types! { @@ -1218,9 +1229,9 @@ parameter_types! { /// Configure the send data pallet impl pallet_chainbridge::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type AdminOrigin = frame_system::EnsureRoot; - type Proposal = Call; + type Proposal = RuntimeCall; type ChainId = ChainId; type ProposalLifetime = ProposalLifetime; } @@ -1234,12 +1245,12 @@ parameter_types! { } impl pallet_erc721::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Identifier = NFTTokenId; } impl pallet_erc20::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type BridgeOrigin = pallet_chainbridge::EnsureBridge; type Currency = pallet_balances::Pallet; type HashId = HashId; @@ -1258,7 +1269,7 @@ parameter_types! { } impl pallet_nomination_pools::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; type CurrencyBalance = Balance; type RewardCounter = FixedU128; @@ -1301,8 +1312,8 @@ impl pallet_ddc_metrics_offchain_worker::Config for Runtime { type AuthorityId = pallet_ddc_metrics_offchain_worker::crypto::TestAuthId; - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; } parameter_types! { @@ -1319,7 +1330,7 @@ impl pallet_ddc_staking::Config for Runtime { type DefaultEdgeChillDelay = DefaultEdgeChillDelay; type DefaultStorageBondSize = DefaultStorageBondSize; type DefaultStorageChillDelay = DefaultStorageChillDelay; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type UnixTime = Timestamp; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; } @@ -1366,9 +1377,10 @@ construct_runtime!( Multisig: pallet_multisig, Bounties: pallet_bounties, Tips: pallet_tips, - VoterList: pallet_bags_list, + VoterList: pallet_bags_list::, ChildBounties: pallet_child_bounties, NominationPools: pallet_nomination_pools, + FastUnstake: pallet_fast_unstake, CereDDCModule: pallet_cere_ddc::{Pallet, Call, Storage, Event}, ChainBridge: pallet_chainbridge::{Pallet, Call, Storage, Event}, Erc721: pallet_erc721::{Pallet, Call, Storage, Event}, @@ -1403,12 +1415,21 @@ pub type SignedExtra = ( frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, ); + +pub struct StakingMigrationV11OldPallet; +impl Get<&'static str> for StakingMigrationV11OldPallet { + fn get() -> &'static str { + "VoterList" + } +} + /// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic; /// The payload being signed in transactions. -pub type SignedPayload = generic::SignedPayload; +pub type SignedPayload = generic::SignedPayload; /// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; +pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, @@ -1416,7 +1437,14 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, - (InitiateNominationPools, pallet_nomination_pools::migration::v3::MigrateToV3), + ( + pallet_staking::migrations::v11::MigrateToV11< + Runtime, + VoterList, + StakingMigrationV11OldPallet, + >, + pallet_staking::migrations::v12::MigrateToV12, + ), >; #[cfg(feature = "runtime-benchmarks")] @@ -1438,6 +1466,7 @@ mod benches { [pallet_election_provider_multi_phase, ElectionProviderMultiPhase] [pallet_election_provider_support_benchmarking, EPSBench::] [pallet_elections_phragmen, Elections] + [pallet_fast_unstake, FastUnstake] [pallet_grandpa, Grandpa] [pallet_identity, Identity] [pallet_im_online, ImOnline] @@ -1670,13 +1699,13 @@ impl_runtime_apis! { } } - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi for Runtime { - fn query_call_info(call: Call, len: u32) -> RuntimeDispatchInfo { + fn query_call_info(call: RuntimeCall, len: u32) -> RuntimeDispatchInfo { TransactionPayment::query_call_info(call, len) } - fn query_call_fee_details(call: Call, len: u32) -> FeeDetails { + fn query_call_fee_details(call: RuntimeCall, len: u32) -> FeeDetails { TransactionPayment::query_call_fee_details(call, len) } } @@ -1817,7 +1846,7 @@ mod tests { fn validate_transaction_submitter_bounds() { fn is_submit_signed_transaction() where - T: CreateSignedTransaction, + T: CreateSignedTransaction, { } @@ -1837,11 +1866,11 @@ mod tests { #[test] fn call_size() { - let size = core::mem::size_of::(); + let size = core::mem::size_of::(); assert!( size <= 208, - "size of Call {} is more than 208 bytes: some calls have too big arguments, use Box to reduce the - size of Call. + "size of RuntimeCall {} is more than 208 bytes: some calls have too big arguments, use Box to reduce the + size of RuntimeCall. If the limit is too strong, maybe consider increase the limit to 300.", size, ); diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index dc0e26fa4..30c080f8f 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-runtime" -version = "4.7.0" +version = "4.8.0" authors = ["Parity Technologies "] edition = "2021" build = "build.rs" @@ -24,85 +24,86 @@ hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.16", default-features = false } # primitives -sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false, version = "4.0.0-dev" } -sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, version = "4.0.0-dev" } +sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } # frame dependencies -frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } -pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-authorship = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-bags-list = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", optional = true } -pallet-elections-phragmen = { version = "5.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-indices = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-membership = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-multisig = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.29" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.29" } -pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true , branch = "polkadot-v0.9.29" } -pallet-offences = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-offences-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false, optional = true } -pallet-proxy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-recovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false } -pallet-session-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29", default-features = false, optional = true } -pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-tips = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-transaction-storage = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-authorship = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-bags-list = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +pallet-elections-phragmen = { version = "5.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } +pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-indices = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-membership = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-multisig = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } +pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } +pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true , branch = "polkadot-v0.9.30" } +pallet-offences = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-offences-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } +pallet-proxy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-recovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +pallet-session-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } +pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-tips = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-storage = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } cere-runtime-common = { path = "../common", default-features = false } cere-runtime-constants = { path = "./constants", default-features = false } -pallet-chainbridge = { version = "4.7.0", default-features = false, path = "../../pallets/chainbridge" } -pallet-cere-ddc = { version = "4.7.0", default-features = false, path = "../../pallets/ddc" } -pallet-erc721 = { version = "4.7.0", default-features = false, path = "../../pallets/erc721" } -pallet-erc20 = { version = "4.7.0", default-features = false, path = "../../pallets/erc20" } -pallet-ddc-metrics-offchain-worker = { version = "4.7.0", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } +pallet-chainbridge = { version = "4.8.0", default-features = false, path = "../../pallets/chainbridge" } +pallet-cere-ddc = { version = "4.8.0", default-features = false, path = "../../pallets/ddc" } +pallet-erc721 = { version = "4.8.0", default-features = false, path = "../../pallets/erc721" } +pallet-erc20 = { version = "4.8.0", default-features = false, path = "../../pallets/erc20" } +pallet-ddc-metrics-offchain-worker = { version = "4.8.0", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } [build-dependencies] -substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } +substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] @@ -124,6 +125,7 @@ std = [ "pallet-contracts-primitives/std", "pallet-contracts-rpc-runtime-api/std", "pallet-democracy/std", + "pallet-fast-unstake/std", "pallet-elections-phragmen/std", "frame-executive/std", "pallet-cere-ddc/std", @@ -195,6 +197,7 @@ runtime-benchmarks = [ "pallet-election-provider-multi-phase/runtime-benchmarks", "pallet-election-provider-support-benchmarking/runtime-benchmarks", "pallet-elections-phragmen/runtime-benchmarks", + "pallet-fast-unstake/runtime-benchmarks", "pallet-grandpa/runtime-benchmarks", "pallet-identity/runtime-benchmarks", "pallet-im-online/runtime-benchmarks", @@ -202,11 +205,11 @@ runtime-benchmarks = [ "pallet-membership/runtime-benchmarks", "pallet-multisig/runtime-benchmarks", "pallet-nomination-pools/runtime-benchmarks", - "pallet-nomination-pools-benchmarking", - "pallet-offences-benchmarking", + "pallet-nomination-pools-benchmarking/runtime-benchmarks", + "pallet-offences-benchmarking/runtime-benchmarks", "pallet-proxy/runtime-benchmarks", "pallet-scheduler/runtime-benchmarks", - "pallet-session-benchmarking", + "pallet-session-benchmarking/runtime-benchmarks", "pallet-society/runtime-benchmarks", "pallet-staking/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", @@ -214,7 +217,7 @@ runtime-benchmarks = [ "pallet-treasury/runtime-benchmarks", "pallet-utility/runtime-benchmarks", "pallet-vesting/runtime-benchmarks", - "frame-system-benchmarking", + "frame-system-benchmarking/runtime-benchmarks", "hex-literal", ] try-runtime = [ @@ -233,6 +236,7 @@ try-runtime = [ "pallet-democracy/try-runtime", "pallet-election-provider-multi-phase/try-runtime", "pallet-elections-phragmen/try-runtime", + "pallet-fast-unstake/try-runtime", "pallet-grandpa/try-runtime", "pallet-identity/try-runtime", "pallet-im-online/try-runtime", diff --git a/runtime/cere/constants/Cargo.toml b/runtime/cere/constants/Cargo.toml index d43ceedc5..cfbde8792 100644 --- a/runtime/cere/constants/Cargo.toml +++ b/runtime/cere/constants/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "cere-runtime-constants" -version = "4.7.0" +version = "4.8.0" authors = ["Parity Technologies "] edition = "2021" [dependencies] -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.29" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.29" } +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/runtime/cere/src/impls.rs b/runtime/cere/src/impls.rs index 9d2b654b0..9597162dc 100644 --- a/runtime/cere/src/impls.rs +++ b/runtime/cere/src/impls.rs @@ -31,18 +31,18 @@ impl OnUnbalanced for Author { #[cfg(test)] mod multiplier_tests { + use crate::{ + AdjustmentVariable, MinimumMultiplier, Runtime, RuntimeBlockWeights as BlockWeights, + System, TargetBlockFullness, TransactionPayment, + }; + use cere_runtime_constants::{currency::*, time::*}; + use frame_support::weights::{DispatchClass, Weight, WeightToFee as WeightToFeeT}; use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment}; use sp_runtime::{ assert_eq_error_rate, traits::{Convert, One, Zero}, FixedPointNumber, }; - use cere_runtime_constants::{currency::*, time::*}; - use crate::{ - AdjustmentVariable, MinimumMultiplier, Runtime, RuntimeBlockWeights as BlockWeights, - System, TargetBlockFullness, TransactionPayment, - }; - use frame_support::weights::{DispatchClass, Weight, WeightToFee as WeightToFeeT}; fn max_normal() -> Weight { BlockWeights::get() @@ -197,7 +197,8 @@ mod multiplier_tests { // `cargo test congested_chain_simulation -- --nocapture` to get some insight. // almost full. The entire quota of normal transactions is taken. - let block_weight = BlockWeights::get().get(DispatchClass::Normal).max_total.unwrap() - Weight::from_ref_time(100); + let block_weight = BlockWeights::get().get(DispatchClass::Normal).max_total.unwrap() - + Weight::from_ref_time(100); // Default substrate weight. let tx_weight = frame_support::weights::constants::ExtrinsicBaseWeight::get(); diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index bdfe7eeff..33150f46f 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -22,17 +22,18 @@ // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit = "256"] +use cere_runtime_common::{BalanceToU256, U256ToBalance}; use codec::{Decode, Encode, MaxEncodedLen}; use frame_election_provider_support::{ - onchain, ExtendedBalance, SequentialPhragmen, VoteWeight, BalancingConfig + onchain, BalancingConfig, ExtendedBalance, SequentialPhragmen, VoteWeight, }; use frame_support::{ construct_runtime, pallet_prelude::Get, parameter_types, traits::{ - ConstU16, ConstU32, Currency, EitherOfDiverse, EqualPrivilegeOnly, Everything, Imbalance, - InstanceFilter, KeyOwnerProofSystem, LockIdentifier, Nothing, OnUnbalanced, + ConstU128, ConstU16, ConstU32, Currency, EitherOfDiverse, EqualPrivilegeOnly, Everything, + Imbalance, InstanceFilter, KeyOwnerProofSystem, LockIdentifier, Nothing, OnUnbalanced, U128CurrencyToVote, }, weights::{ @@ -73,14 +74,13 @@ use sp_runtime::{ SaturatedConversion, StaticLookup, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, FixedU128, FixedPointNumber, Perbill, Percent, Permill, Perquintill, + ApplyExtrinsicResult, FixedPointNumber, FixedU128, Perbill, Percent, Permill, Perquintill, }; use sp_std::prelude::*; #[cfg(any(feature = "std", test))] use sp_version::NativeVersion; use sp_version::RuntimeVersion; use static_assertions::const_assert; -use cere_runtime_common::{BalanceToU256, U256ToBalance}; #[cfg(any(feature = "std", test))] pub use frame_system::Call as SystemCall; @@ -128,10 +128,10 @@ 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: 47000, + spec_version: 48000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 4, + transaction_version: 5, state_version: 0, }; @@ -207,8 +207,8 @@ impl frame_system::Config for Runtime { type BlockWeights = RuntimeBlockWeights; type BlockLength = RuntimeBlockLength; type DbWeight = RocksDbWeight; - type Origin = Origin; - type Call = Call; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; type Index = Index; type BlockNumber = BlockNumber; type Hash = Hash; @@ -216,7 +216,7 @@ impl frame_system::Config for Runtime { type AccountId = AccountId; type Lookup = Indices; type Header = generic::Header; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type BlockHashCount = BlockHashCount; type Version = Version; type PalletInfo = PalletInfo; @@ -232,8 +232,8 @@ impl frame_system::Config for Runtime { impl pallet_randomness_collective_flip::Config for Runtime {} impl pallet_utility::Config for Runtime { - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; type PalletsOrigin = OriginCaller; type WeightInfo = pallet_utility::weights::SubstrateWeight; } @@ -246,8 +246,8 @@ parameter_types! { } impl pallet_multisig::Config for Runtime { - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; type Currency = Balances; type DepositBase = DepositBase; type DepositFactor = DepositFactor; @@ -289,25 +289,27 @@ impl Default for ProxyType { Self::Any } } -impl InstanceFilter for ProxyType { - fn filter(&self, c: &Call) -> bool { +impl InstanceFilter for ProxyType { + fn filter(&self, c: &RuntimeCall) -> bool { match self { ProxyType::Any => true, ProxyType::NonTransfer => !matches!( c, - Call::Balances(..) | - Call::Vesting(pallet_vesting::Call::vested_transfer { .. }) | - Call::Indices(pallet_indices::Call::transfer { .. }) | - Call::NominationPools(..) + RuntimeCall::Balances(..) | + RuntimeCall::Vesting(pallet_vesting::Call::vested_transfer { .. }) | + RuntimeCall::Indices(pallet_indices::Call::transfer { .. }) | + RuntimeCall::NominationPools(..) ), ProxyType::Governance => matches!( c, - Call::Democracy(..) | - Call::Council(..) | Call::Society(..) | - Call::TechnicalCommittee(..) | - Call::Elections(..) | Call::Treasury(..) + RuntimeCall::Democracy(..) | + RuntimeCall::Council(..) | + RuntimeCall::Society(..) | + RuntimeCall::TechnicalCommittee(..) | + RuntimeCall::Elections(..) | + RuntimeCall::Treasury(..) ), - ProxyType::Staking => matches!(c, Call::Staking(..)), + ProxyType::Staking => matches!(c, RuntimeCall::Staking(..)), } } fn is_superset(&self, o: &Self) -> bool { @@ -322,8 +324,8 @@ impl InstanceFilter for ProxyType { } impl pallet_proxy::Config for Runtime { - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; type Currency = Balances; type ProxyType = ProxyType; type ProxyDepositBase = ProxyDepositBase; @@ -342,10 +344,10 @@ parameter_types! { } impl pallet_scheduler::Config for Runtime { - type Event = Event; - type Origin = Origin; + type RuntimeEvent = RuntimeEvent; + type RuntimeOrigin = RuntimeOrigin; type PalletsOrigin = OriginCaller; - type Call = Call; + type RuntimeCall = RuntimeCall; type MaximumWeight = MaximumSchedulerWeight; type ScheduleOrigin = EnsureRoot; type MaxScheduledPerBlock = ConstU32<50>; @@ -397,7 +399,7 @@ impl pallet_indices::Config for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type WeightInfo = pallet_indices::weights::SubstrateWeight; } @@ -415,7 +417,7 @@ impl pallet_balances::Config for Runtime { type ReserveIdentifier = [u8; 8]; type Balance = Balance; type DustRemoval = (); - type Event = Event; + type RuntimeEvent = RuntimeEvent; type ExistentialDeposit = ExistentialDeposit; type AccountStore = frame_system::Pallet; type WeightInfo = pallet_balances::weights::SubstrateWeight; @@ -430,7 +432,7 @@ parameter_types! { } impl pallet_transaction_payment::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = CurrencyAdapter; type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = IdentityFee; @@ -471,7 +473,7 @@ impl_opaque_keys! { } impl pallet_session::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type ValidatorId = ::AccountId; type ValidatorIdOf = pallet_staking::StashOf; type ShouldEndSession = Babe; @@ -506,6 +508,7 @@ parameter_types! { pub const MaxNominatorRewardedPerValidator: u32 = 256; pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); pub OffchainRepeat: BlockNumber = 5; + pub HistoryDepth: u32 = 84; } pub struct StakingBenchmarkingConfig; @@ -521,7 +524,7 @@ impl pallet_staking::Config for Runtime { type UnixTime = Timestamp; type CurrencyToVote = U128CurrencyToVote; type RewardRemainder = Treasury; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Slash = Treasury; // send the slashed funds to the treasury. type Reward = (); // rewards are minted from the void type SessionsPerEra = SessionsPerEra; @@ -540,12 +543,22 @@ impl pallet_staking::Config for Runtime { type ElectionProvider = ElectionProviderMultiPhase; type GenesisElectionProvider = onchain::UnboundedExecution; type VoterList = VoterList; + type TargetList = pallet_staking::UseValidatorsMap; type MaxUnlockingChunks = ConstU32<32>; + type HistoryDepth = HistoryDepth; type OnStakerSlash = NominationPools; type WeightInfo = pallet_staking::weights::SubstrateWeight; type BenchmarkingConfig = StakingBenchmarkingConfig; } +impl pallet_fast_unstake::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ControlOrigin = frame_system::EnsureRoot; + type Deposit = ConstU128<{ DOLLARS }>; + type DepositCurrency = Balances; + type WeightInfo = (); +} + parameter_types! { // phase durations. 1/4 of the last session for each. pub const SignedPhase: u32 = EPOCH_DURATION_IN_BLOCKS / 4; @@ -664,7 +677,7 @@ impl pallet_election_provider_multi_phase::MinerConfig for Runtime { } impl pallet_election_provider_multi_phase::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; type EstimateCallFee = TransactionPayment; type SignedPhase = SignedPhase; @@ -699,8 +712,9 @@ parameter_types! { pub const BagThresholds: &'static [u64] = &voter_bags::THRESHOLDS; } -impl pallet_bags_list::Config for Runtime { - type Event = Event; +type VoterBagsListInstance = pallet_bags_list::Instance1; +impl pallet_bags_list::Config for Runtime { + type RuntimeEvent = RuntimeEvent; type ScoreProvider = Staking; type WeightInfo = pallet_bags_list::weights::SubstrateWeight; type BagThresholds = BagThresholds; @@ -718,8 +732,8 @@ parameter_types! { } impl pallet_democracy::Config for Runtime { - type Proposal = Call; - type Event = Event; + type Proposal = RuntimeCall; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; type EnactmentPeriod = EnactmentPeriod; type LaunchPeriod = LaunchPeriod; @@ -776,9 +790,9 @@ parameter_types! { type CouncilCollective = pallet_collective::Instance1; impl pallet_collective::Config for Runtime { - type Origin = Origin; - type Proposal = Call; - type Event = Event; + type RuntimeOrigin = RuntimeOrigin; + type Proposal = RuntimeCall; + type RuntimeEvent = RuntimeEvent; type MotionDuration = CouncilMotionDuration; type MaxProposals = CouncilMaxProposals; type MaxMembers = CouncilMaxMembers; @@ -803,7 +817,7 @@ parameter_types! { const_assert!(DesiredMembers::get() <= CouncilMaxMembers::get()); impl pallet_elections_phragmen::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type PalletId = ElectionsPhragmenPalletId; type Currency = Balances; type ChangeMembers = Council; @@ -832,9 +846,9 @@ parameter_types! { type TechnicalCollective = pallet_collective::Instance2; impl pallet_collective::Config for Runtime { - type Origin = Origin; - type Proposal = Call; - type Event = Event; + type RuntimeOrigin = RuntimeOrigin; + type Proposal = RuntimeCall; + type RuntimeEvent = RuntimeEvent; type MotionDuration = TechnicalMotionDuration; type MaxProposals = TechnicalMaxProposals; type MaxMembers = TechnicalMaxMembers; @@ -847,7 +861,7 @@ type EnsureRootOrHalfCouncil = EitherOfDiverse< pallet_collective::EnsureProportionMoreThan, >; impl pallet_membership::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type AddOrigin = EnsureRootOrHalfCouncil; type RemoveOrigin = EnsureRootOrHalfCouncil; type SwapOrigin = EnsureRootOrHalfCouncil; @@ -884,7 +898,7 @@ impl pallet_treasury::Config for Runtime { EnsureRoot, pallet_collective::EnsureProportionMoreThan, >; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type OnSlash = (); type ProposalBond = ProposalBond; type ProposalBondMinimum = ProposalBondMinimum; @@ -910,7 +924,7 @@ parameter_types! { } impl pallet_bounties::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type BountyDepositBase = BountyDepositBase; type BountyDepositPayoutDelay = BountyDepositPayoutDelay; type BountyUpdatePeriod = BountyUpdatePeriod; @@ -929,14 +943,14 @@ parameter_types! { } impl pallet_child_bounties::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type MaxActiveChildBountyCount = ConstU32<5>; type ChildBountyValueMinimum = ChildBountyValueMinimum; type WeightInfo = pallet_child_bounties::weights::SubstrateWeight; } impl pallet_tips::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type DataDepositPerByte = DataDepositPerByte; type MaximumReasonLength = MaximumReasonLength; type Tippers = Elections; @@ -964,8 +978,8 @@ impl pallet_contracts::Config for Runtime { type Time = Timestamp; type Randomness = RandomnessCollectiveFlip; type Currency = Balances; - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; /// The safest default is to allow no calls at all. /// /// Runtimes should whitelist dispatchables that are allowed to be called from contracts @@ -985,13 +999,12 @@ impl pallet_contracts::Config for Runtime { type AddressGenerator = pallet_contracts::DefaultAddressGenerator; type ContractAccessWeight = pallet_contracts::DefaultContractAccessWeight; type MaxCodeLen = ConstU32<{ 128 * 1024 }>; - type RelaxedMaxCodeLen = ConstU32<{ 256 * 1024 }>; type MaxStorageKeyLen = ConstU32<128>; } impl pallet_sudo::Config for Runtime { - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; } parameter_types! { @@ -1006,14 +1019,14 @@ parameter_types! { impl frame_system::offchain::CreateSignedTransaction for Runtime where - Call: From, + RuntimeCall: From, { fn create_transaction>( - call: Call, + call: RuntimeCall, public: ::Signer, account: AccountId, nonce: Index, - ) -> Option<(Call, ::SignaturePayload)> { + ) -> Option<(RuntimeCall, ::SignaturePayload)> { let tip = 0; // take the biggest period possible. let period = @@ -1053,15 +1066,15 @@ impl frame_system::offchain::SigningTypes for Runtime { impl frame_system::offchain::SendTransactionTypes for Runtime where - Call: From, + RuntimeCall: From, { type Extrinsic = UncheckedExtrinsic; - type OverarchingCall = Call; + type OverarchingCall = RuntimeCall; } impl pallet_im_online::Config for Runtime { type AuthorityId = ImOnlineId; - type Event = Event; + type RuntimeEvent = RuntimeEvent; type NextSessionRotation = Babe; type ValidatorSet = Historical; type ReportUnresponsiveness = Offences; @@ -1073,7 +1086,7 @@ impl pallet_im_online::Config for Runtime { } impl pallet_offences::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; } @@ -1083,8 +1096,7 @@ impl pallet_authority_discovery::Config for Runtime { } impl pallet_grandpa::Config for Runtime { - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; type KeyOwnerProofSystem = Historical; @@ -1116,7 +1128,7 @@ parameter_types! { } impl pallet_identity::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; type BasicDeposit = BasicDeposit; type FieldDeposit = FieldDeposit; @@ -1138,9 +1150,9 @@ parameter_types! { } impl pallet_recovery::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type WeightInfo = pallet_recovery::weights::SubstrateWeight; - type Call = Call; + type RuntimeCall = RuntimeCall; type Currency = Balances; type ConfigDepositBase = ConfigDepositBase; type FriendDepositFactor = FriendDepositFactor; @@ -1161,7 +1173,7 @@ parameter_types! { } impl pallet_society::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type PalletId = SocietyPalletId; type Currency = Balances; type Randomness = RandomnessCollectiveFlip; @@ -1184,7 +1196,7 @@ parameter_types! { } impl pallet_vesting::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; type BlockNumberToBalance = ConvertInto; type MinVestedTransfer = MinVestedTransfer; @@ -1206,7 +1218,7 @@ impl pallet_cere_ddc::Config for Runtime { type MinLength = MinDataLength; type MaxLength = MaxDataLength; // The ubiquitous event type. - type Event = Event; + type RuntimeEvent = RuntimeEvent; } parameter_types! { @@ -1216,9 +1228,9 @@ parameter_types! { /// Configure the send data pallet impl pallet_chainbridge::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type AdminOrigin = frame_system::EnsureRoot; - type Proposal = Call; + type Proposal = RuntimeCall; type ChainId = ChainId; type ProposalLifetime = ProposalLifetime; } @@ -1232,12 +1244,12 @@ parameter_types! { } impl pallet_erc721::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Identifier = NFTTokenId; } impl pallet_erc20::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type BridgeOrigin = pallet_chainbridge::EnsureBridge; type Currency = pallet_balances::Pallet; type HashId = HashId; @@ -1256,7 +1268,7 @@ parameter_types! { } impl pallet_nomination_pools::Config for Runtime { - type Event = Event; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; type CurrencyBalance = Balance; type RewardCounter = FixedU128; @@ -1299,8 +1311,8 @@ impl pallet_ddc_metrics_offchain_worker::Config for Runtime { type AuthorityId = pallet_ddc_metrics_offchain_worker::crypto::TestAuthId; - type Event = Event; - type Call = Call; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; } construct_runtime!( @@ -1345,9 +1357,10 @@ construct_runtime!( Multisig: pallet_multisig, Bounties: pallet_bounties, Tips: pallet_tips, - VoterList: pallet_bags_list, + VoterList: pallet_bags_list::, ChildBounties: pallet_child_bounties, NominationPools: pallet_nomination_pools, + FastUnstake: pallet_fast_unstake, CereDDCModule: pallet_cere_ddc::{Pallet, Call, Storage, Event}, ChainBridge: pallet_chainbridge::{Pallet, Call, Storage, Event}, Erc721: pallet_erc721::{Pallet, Call, Storage, Event}, @@ -1381,12 +1394,21 @@ pub type SignedExtra = ( frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, ); + +pub struct StakingMigrationV11OldPallet; +impl Get<&'static str> for StakingMigrationV11OldPallet { + fn get() -> &'static str { + "VoterList" + } +} + /// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic; /// The payload being signed in transactions. -pub type SignedPayload = generic::SignedPayload; +pub type SignedPayload = generic::SignedPayload; /// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; +pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, @@ -1394,7 +1416,14 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, - (InitiateNominationPools, pallet_nomination_pools::migration::v3::MigrateToV3), + ( + pallet_staking::migrations::v11::MigrateToV11< + Runtime, + VoterList, + StakingMigrationV11OldPallet, + >, + pallet_staking::migrations::v12::MigrateToV12, + ), >; #[cfg(feature = "runtime-benchmarks")] @@ -1416,6 +1445,7 @@ mod benches { [pallet_election_provider_multi_phase, ElectionProviderMultiPhase] [pallet_election_provider_support_benchmarking, EPSBench::] [pallet_elections_phragmen, Elections] + [pallet_fast_unstake, FastUnstake] [pallet_grandpa, Grandpa] [pallet_identity, Identity] [pallet_im_online, ImOnline] @@ -1647,13 +1677,13 @@ impl_runtime_apis! { } } - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi for Runtime { - fn query_call_info(call: Call, len: u32) -> RuntimeDispatchInfo { + fn query_call_info(call: RuntimeCall, len: u32) -> RuntimeDispatchInfo { TransactionPayment::query_call_info(call, len) } - fn query_call_fee_details(call: Call, len: u32) -> FeeDetails { + fn query_call_fee_details(call: RuntimeCall, len: u32) -> FeeDetails { TransactionPayment::query_call_fee_details(call, len) } } @@ -1794,7 +1824,7 @@ mod tests { fn validate_transaction_submitter_bounds() { fn is_submit_signed_transaction() where - T: CreateSignedTransaction, + T: CreateSignedTransaction, { } @@ -1814,11 +1844,11 @@ mod tests { #[test] fn call_size() { - let size = core::mem::size_of::(); + let size = core::mem::size_of::(); assert!( size <= 208, - "size of Call {} is more than 208 bytes: some calls have too big arguments, use Box to reduce the - size of Call. + "size of RuntimeCall {} is more than 208 bytes: some calls have too big arguments, use Box to reduce the + size of RuntimeCall. If the limit is too strong, maybe consider increase the limit to 300.", size, ); diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 4bb9ac00c..0871c1d68 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-runtime-common" -version = "4.7.0" +version = "4.8.0" authors = ["Parity Technologies "] edition = "2021" @@ -10,7 +10,7 @@ no_std = [] std = [] [dependencies] -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.29" } -frame-support = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.29" } -sp-core = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.29" } -node-primitives = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.29" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } +frame-support = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } +sp-core = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } +node-primitives = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs index 4a322d5e4..03d133233 100644 --- a/runtime/common/src/lib.rs +++ b/runtime/common/src/lib.rs @@ -1,20 +1,20 @@ #![cfg_attr(not(feature = "std"), no_std)] -use node_primitives::{Balance}; +use node_primitives::Balance; /// Convert a balance to an unsigned 256-bit number, use in nomination pools. pub struct BalanceToU256; impl sp_runtime::traits::Convert for BalanceToU256 { - fn convert(n: Balance) -> sp_core::U256 { - n.into() - } + fn convert(n: Balance) -> sp_core::U256 { + n.into() + } } /// Convert an unsigned 256-bit number to balance, use in nomination pools. pub struct U256ToBalance; impl sp_runtime::traits::Convert for U256ToBalance { - fn convert(n: sp_core::U256) -> Balance { - use frame_support::traits::Defensive; - n.try_into().defensive_unwrap_or(Balance::MAX) - } + fn convert(n: sp_core::U256) -> Balance { + use frame_support::traits::Defensive; + n.try_into().defensive_unwrap_or(Balance::MAX) + } } diff --git a/scripts/init.sh b/scripts/init.sh index 0d2354d27..beca622b2 100755 --- a/scripts/init.sh +++ b/scripts/init.sh @@ -7,3 +7,5 @@ echo "*** Initializing WASM build environment" rustup install nightly-2022-10-09 rustup target add wasm32-unknown-unknown --toolchain nightly-2022-10-09 + +ln -sf $PWD/scripts/pre-commit.sh $PWD/.git/hooks/pre-commit || true diff --git a/scripts/pre-commit.sh b/scripts/pre-commit.sh new file mode 100755 index 000000000..d84399d28 --- /dev/null +++ b/scripts/pre-commit.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +# Prevent committing badly formatted code +cargo +nightly fmt -- --check +if [ $? -ne 0 ]; then + echo "Run \`cargo +nightly fmt\` to fix formatting issues before committing." + exit 1 +fi From 2c473603ecff5aa9da437f62185b48c71e2cadeb Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 14 Aug 2023 14:55:04 +0600 Subject: [PATCH 253/583] Get DDC era from DDC staking pallet --- pallets/ddc-validator/src/lib.rs | 50 ++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 98c7dcf45..a4f92d645 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -266,17 +266,24 @@ pub mod pallet { Signal::::set(Some(false)); - let era = Self::get_current_era(); - log::info!("current era: {:?}", era); + let current_ddc_era = match ddc_staking::pallet::Pallet::::current_era() { + Some(era) => era, + None => { + defensive!("DDC era not set"); + return Weight::from_ref_time(0) + }, + }; + log::info!("current DDC era: {:?}", current_ddc_era); // Produce an assignment for the next era if it's not produced yet. match Self::last_managed_era() { - Some(last_managed_era) if era < last_managed_era => return Weight::from_ref_time(0), + Some(last_managed_era) if current_ddc_era < last_managed_era => + return Weight::from_ref_time(0), _ => (), }; - match Self::assign(3usize, era + 1) { - Ok(_) => >::put(era + 1), + match Self::assign(3usize, current_ddc_era + 1) { + Ok(_) => >::put(current_ddc_era + 1), Err(AssignmentError::DefensiveEmptyQuorumsCycle) => { defensive!("unexpectedly empty quorums cycle"); }, @@ -308,10 +315,16 @@ pub mod pallet { _ => 0, // let's consider an absent or undecodable data as we never did a validation }; - let current_era = Self::get_current_era(); + let current_ddc_era = match ddc_staking::pallet::Pallet::::current_era() { + Some(era) => era, + None => { + defensive!("DDC era not set"); + return + }, + }; // Skip if the validation is already complete for the era. - if current_era <= last_validated_era { + if current_ddc_era <= last_validated_era { should_validate_because_new_era = false; } @@ -486,14 +499,6 @@ pub mod pallet { Ok(signer) } - // Get the current era; Shall we start era count from 0 or from 1? - fn get_current_era() -> EraIndex { - ((::TimeProvider::now().as_millis() - TIME_START_MS) / - ERA_DURATION_MS) - .try_into() - .unwrap() - } - fn validate(bytes_sent: &dac::BytesSent, bytes_received: &dac::BytesReceived) -> bool { let percentage_difference = 1f32 - (bytes_received.sum as f32 / bytes_sent.sum as f32); @@ -668,7 +673,8 @@ pub mod pallet { } fn validate_edges() -> Result<(), &'static str> { - let current_era = Self::get_current_era(); + let current_ddc_era = + ddc_staking::pallet::Pallet::::current_era().ok_or("DDC era not set")?; let mock_data_url = Self::get_mock_data_url(); let data_provider_url = Self::get_data_provider_url(); info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); @@ -679,7 +685,7 @@ pub mod pallet { info!("validator: {:?}", validator); - let assigned_edges = Self::assignments(current_era - 1, validator.clone()) + let assigned_edges = Self::assignments(current_ddc_era - 1, validator.clone()) .expect("No assignments for the previous era"); info!("assigned_edges: {:?}", assigned_edges); @@ -692,7 +698,7 @@ pub mod pallet { "{}{}{}/$.{}", mock_data_url, "ddc:dac:aggregation:nodes:", - current_era - 1, + current_ddc_era - 1, utils::account_to_string::(assigned_edge.clone()) ); info!("edge url: {:?}", edge_url); @@ -748,7 +754,7 @@ pub mod pallet { let response = shm::share_intermediate_validation_result( &data_provider_url, - current_era - 1, + current_ddc_era - 1, &validator_str, &edge_str, is_valid, @@ -765,7 +771,7 @@ pub mod pallet { if let Ok(res) = response { let edge = utils::account_to_string::(assigned_edge.clone()); - let prev_era = (current_era - 1) as EraIndex; + let prev_era = (current_ddc_era - 1) as EraIndex; let quorum = Self::find_validators_from_quorum(&validator, &prev_era); let validations_res = shm::get_intermediate_decisions( &data_provider_url, @@ -803,7 +809,7 @@ pub mod pallet { }); let _payout_tx_res = signer.send_signed_transaction(|_account| { - Call::payout_cdn_owners { era: current_era } + Call::payout_cdn_owners { era: current_ddc_era } }); let final_res = dac::get_final_decision(validations_res); @@ -812,7 +818,7 @@ pub mod pallet { let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { - era: current_era, + era: current_ddc_era, cdn_node: utils::string_to_account::(edge.clone()), validation_decision: final_res.clone(), }); From 04abd0d0109fcbc5ca9ec7bdcee73496eb5870c3 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 14 Aug 2023 15:37:44 +0600 Subject: [PATCH 254/583] Prevent OCW panic on validator's key absence --- pallets/ddc-validator/src/lib.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index a4f92d645..31bae53c0 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -681,7 +681,10 @@ pub mod pallet { // let signer = Self::get_signer().unwrap(); // let validator = signer.get_any_account().unwrap().id; - let validator = Self::get_public_key().unwrap(); + let validator = match Self::get_public_key() { + Some(key) => key, + None => return Err("No validator public key found."), + }; info!("validator: {:?}", validator); From 5173708aad490c8fad1d131be90fd4b587cc4d17 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 14 Aug 2023 16:07:13 +0600 Subject: [PATCH 255/583] Log warning with DDC validation error --- pallets/ddc-validator/src/lib.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 31bae53c0..0d0a08da4 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -332,7 +332,10 @@ pub mod pallet { let should_validate_because_signal = Signal::::get().unwrap_or(false); if should_validate_because_new_era || should_validate_because_signal { - Self::validate_edges(); + let validation_result = Self::validate_edges(); + if let Err(e) = validation_result { + log::warn!("🔎 DDC validation failed. {}", e); + } } } } From a3bec690fd4441d5abc7b2cb5409bdaa8212eeb2 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 18 Jul 2023 16:18:58 +0200 Subject: [PATCH 256/583] Fix contracts dissapearing --- runtime/cere-dev/src/lib.rs | 1 + runtime/cere/src/lib.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 439fcadb3..c71b6c699 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1444,6 +1444,7 @@ pub type Executive = frame_executive::Executive< StakingMigrationV11OldPallet, >, pallet_staking::migrations::v12::MigrateToV12, + pallet_contracts::Migration, ), >; diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 33150f46f..bfd41e3b5 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -1423,6 +1423,7 @@ pub type Executive = frame_executive::Executive< StakingMigrationV11OldPallet, >, pallet_staking::migrations::v12::MigrateToV12, + pallet_contracts::Migration, ), >; From 4b7ae63a338ac12420806de41bdf3825604f45a7 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Mon, 14 Aug 2023 13:08:50 +0200 Subject: [PATCH 257/583] Bump version --- CHANGELOG.md | 6 ++++ Cargo.lock | 32 +++++++++---------- Cargo.toml | 2 +- cli/Cargo.toml | 2 +- node/client/Cargo.toml | 2 +- node/service/Cargo.toml | 2 +- pallets/chainbridge/Cargo.toml | 2 +- .../ddc-metrics-offchain-worker/Cargo.toml | 2 +- pallets/ddc-staking/Cargo.toml | 2 +- pallets/ddc/Cargo.toml | 2 +- pallets/erc20/Cargo.toml | 2 +- pallets/erc721/Cargo.toml | 2 +- rpc/Cargo.toml | 2 +- runtime/cere-dev/Cargo.toml | 14 ++++---- runtime/cere-dev/constants/Cargo.toml | 2 +- runtime/cere-dev/src/lib.rs | 2 +- runtime/cere/Cargo.toml | 12 +++---- runtime/cere/constants/Cargo.toml | 2 +- runtime/cere/src/lib.rs | 2 +- runtime/common/Cargo.toml | 2 +- 20 files changed, 51 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9122f8269..e378bf759 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - ... +## [4.8.1] + +### Added + +- [C,D] Contract migration + ## [4.8.0] ### Added diff --git a/Cargo.lock b/Cargo.lock index 8b70b378c..004f09538 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -725,7 +725,7 @@ dependencies = [ [[package]] name = "cere" -version = "4.8.0" +version = "4.8.1" dependencies = [ "cere-cli", "sc-cli", @@ -735,7 +735,7 @@ dependencies = [ [[package]] name = "cere-cli" -version = "4.8.0" +version = "4.8.1" dependencies = [ "cere-client", "cere-service", @@ -749,7 +749,7 @@ dependencies = [ [[package]] name = "cere-client" -version = "4.8.0" +version = "4.8.1" dependencies = [ "cere-dev-runtime", "cere-runtime", @@ -784,7 +784,7 @@ dependencies = [ [[package]] name = "cere-dev-runtime" -version = "4.8.0" +version = "4.8.1" dependencies = [ "cere-dev-runtime-constants", "cere-runtime-common", @@ -872,7 +872,7 @@ dependencies = [ [[package]] name = "cere-dev-runtime-constants" -version = "4.8.0" +version = "4.8.1" dependencies = [ "node-primitives", "sp-runtime", @@ -880,7 +880,7 @@ dependencies = [ [[package]] name = "cere-rpc" -version = "4.8.0" +version = "4.8.1" dependencies = [ "jsonrpsee", "node-primitives", @@ -910,7 +910,7 @@ dependencies = [ [[package]] name = "cere-runtime" -version = "4.8.0" +version = "4.8.1" dependencies = [ "cere-runtime-common", "cere-runtime-constants", @@ -997,7 +997,7 @@ dependencies = [ [[package]] name = "cere-runtime-common" -version = "4.8.0" +version = "4.8.1" dependencies = [ "frame-support", "node-primitives", @@ -1007,7 +1007,7 @@ dependencies = [ [[package]] name = "cere-runtime-constants" -version = "4.8.0" +version = "4.8.1" dependencies = [ "node-primitives", "sp-runtime", @@ -1015,7 +1015,7 @@ dependencies = [ [[package]] name = "cere-service" -version = "4.8.0" +version = "4.8.1" dependencies = [ "cere-client", "cere-dev-runtime", @@ -4677,7 +4677,7 @@ dependencies = [ [[package]] name = "pallet-cere-ddc" -version = "4.8.0" +version = "4.8.1" dependencies = [ "frame-support", "frame-system", @@ -4692,7 +4692,7 @@ dependencies = [ [[package]] name = "pallet-chainbridge" -version = "4.8.0" +version = "4.8.1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4829,7 +4829,7 @@ dependencies = [ [[package]] name = "pallet-ddc-metrics-offchain-worker" -version = "4.8.0" +version = "4.8.1" dependencies = [ "alt_serde", "frame-support", @@ -4855,7 +4855,7 @@ dependencies = [ [[package]] name = "pallet-ddc-staking" -version = "4.8.0" +version = "4.8.1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4946,7 +4946,7 @@ dependencies = [ [[package]] name = "pallet-erc20" -version = "4.8.0" +version = "4.8.1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4966,7 +4966,7 @@ dependencies = [ [[package]] name = "pallet-erc721" -version = "4.8.0" +version = "4.8.1" dependencies = [ "frame-benchmarking", "frame-support", diff --git a/Cargo.toml b/Cargo.toml index 7be78ede0..21bfbe271 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ path = "src/main.rs" [package] name = "cere" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" -version = "4.8.0" +version = "4.8.1" edition = "2021" build = "build.rs" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 4d1fe40d0..460371d3c 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-cli" -version = "4.8.0" +version = "4.8.1" edition = "2021" [package.metadata.wasm-pack.profile.release] diff --git a/node/client/Cargo.toml b/node/client/Cargo.toml index eb4f2be13..dbafa5fa8 100644 --- a/node/client/Cargo.toml +++ b/node/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-client" -version = "4.8.0" +version = "4.8.1" edition = "2021" [dependencies] diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index 65c79d982..d444e3244 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-service" -version = "4.8.0" +version = "4.8.1" edition = "2021" [dependencies] diff --git a/pallets/chainbridge/Cargo.toml b/pallets/chainbridge/Cargo.toml index b1f2b953a..de714f861 100644 --- a/pallets/chainbridge/Cargo.toml +++ b/pallets/chainbridge/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-chainbridge" -version = "4.8.0" +version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" license = "Unlicense" diff --git a/pallets/ddc-metrics-offchain-worker/Cargo.toml b/pallets/ddc-metrics-offchain-worker/Cargo.toml index e9de68b71..74747a397 100644 --- a/pallets/ddc-metrics-offchain-worker/Cargo.toml +++ b/pallets/ddc-metrics-offchain-worker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-ddc-metrics-offchain-worker" -version = "4.8.0" +version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" license = "Unlicense" diff --git a/pallets/ddc-staking/Cargo.toml b/pallets/ddc-staking/Cargo.toml index c5a4e6873..ce16ead54 100644 --- a/pallets/ddc-staking/Cargo.toml +++ b/pallets/ddc-staking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-ddc-staking" -version = "4.8.0" +version = "4.8.1" edition = "2021" [dependencies] diff --git a/pallets/ddc/Cargo.toml b/pallets/ddc/Cargo.toml index c15ee4ac7..9c89014d1 100644 --- a/pallets/ddc/Cargo.toml +++ b/pallets/ddc/Cargo.toml @@ -6,7 +6,7 @@ homepage = 'https://www.cere.network/' license = 'Unlicense' name = 'pallet-cere-ddc' repository = 'https://github.com/Cerebellum-Network/ddc-pallet' -version = '4.8.0' +version = '4.8.1' readme = 'README.md' [package.metadata.docs.rs] diff --git a/pallets/erc20/Cargo.toml b/pallets/erc20/Cargo.toml index fafa6ae83..6cce2c8d4 100644 --- a/pallets/erc20/Cargo.toml +++ b/pallets/erc20/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-erc20" -version = "4.8.0" +version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" license = "Unlicense" diff --git a/pallets/erc721/Cargo.toml b/pallets/erc721/Cargo.toml index 5f7d02e22..3f586f103 100644 --- a/pallets/erc721/Cargo.toml +++ b/pallets/erc721/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-erc721" -version = "4.8.0" +version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" license = "Unlicense" diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 65de7e088..e037f35f4 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-rpc" -version = "4.8.0" +version = "4.8.1" edition = "2021" [dependencies] diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 885bd1c58..830a27c08 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-dev-runtime" -version = "4.8.0" +version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" build = "build.rs" @@ -96,12 +96,12 @@ pallet-transaction-storage = { version = "4.0.0-dev", default-features = false, pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } cere-runtime-common = { path = "../common", default-features = false } cere-dev-runtime-constants = { path = "./constants", default-features = false } -pallet-ddc-staking = { version = "4.8.0", default-features = false, path = "../../pallets/ddc-staking" } -pallet-chainbridge = { version = "4.8.0", default-features = false, path = "../../pallets/chainbridge" } -pallet-cere-ddc = { version = "4.8.0", default-features = false, path = "../../pallets/ddc" } -pallet-erc721 = { version = "4.8.0", default-features = false, path = "../../pallets/erc721" } -pallet-erc20 = { version = "4.8.0", default-features = false, path = "../../pallets/erc20" } -pallet-ddc-metrics-offchain-worker = { version = "4.8.0", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } +pallet-ddc-staking = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-staking" } +pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } +pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } +pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } +pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } +pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } [build-dependencies] substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/runtime/cere-dev/constants/Cargo.toml b/runtime/cere-dev/constants/Cargo.toml index 68ca79a56..5fdb89737 100644 --- a/runtime/cere-dev/constants/Cargo.toml +++ b/runtime/cere-dev/constants/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-dev-runtime-constants" -version = "4.8.0" +version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index c71b6c699..1823209fc 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -130,7 +130,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: 48000, + spec_version: 48001, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index 30c080f8f..59a2668cd 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-runtime" -version = "4.8.0" +version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" build = "build.rs" @@ -96,11 +96,11 @@ pallet-transaction-storage = { version = "4.0.0-dev", default-features = false, pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } cere-runtime-common = { path = "../common", default-features = false } cere-runtime-constants = { path = "./constants", default-features = false } -pallet-chainbridge = { version = "4.8.0", default-features = false, path = "../../pallets/chainbridge" } -pallet-cere-ddc = { version = "4.8.0", default-features = false, path = "../../pallets/ddc" } -pallet-erc721 = { version = "4.8.0", default-features = false, path = "../../pallets/erc721" } -pallet-erc20 = { version = "4.8.0", default-features = false, path = "../../pallets/erc20" } -pallet-ddc-metrics-offchain-worker = { version = "4.8.0", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } +pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } +pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } +pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } +pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } +pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } [build-dependencies] substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/runtime/cere/constants/Cargo.toml b/runtime/cere/constants/Cargo.toml index cfbde8792..2188486ef 100644 --- a/runtime/cere/constants/Cargo.toml +++ b/runtime/cere/constants/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-runtime-constants" -version = "4.8.0" +version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index bfd41e3b5..9145da19c 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -128,7 +128,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: 48000, + spec_version: 48001, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 0871c1d68..15c08df07 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-runtime-common" -version = "4.8.0" +version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" From 28efd5283b43000349a3d46a6324d918651e7441 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 14 Aug 2023 14:05:02 +0200 Subject: [PATCH 258/583] add data structures for UI --- pallets/ddc-staking/src/lib.rs | 36 ++++++++++++++++++++++++++++++++ pallets/ddc-validator/src/lib.rs | 15 ++++++++----- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 31ea79181..f810e8bad 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -69,6 +69,24 @@ pub struct EraRewardPoints { pub individual: BTreeMap, } +/// Reward points of an era. Used to split era total payout between stakers. +#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Clone)] +pub struct EraRewardPointsPerNode { + /// Era points accrued + pub era: EraIndex, + /// Total number of points for node + pub points: RewardPoint +} + +/// Reward paid for some era. +#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Clone)] +pub struct EraRewardsPaid { + /// Era number + pub era: EraIndex, + /// Cere tokens paid + pub reward: Balance, +} + impl Default for EraRewardPoints { fn default() -> Self { EraRewardPoints { total: Default::default(), individual: BTreeMap::new() } @@ -279,6 +297,12 @@ pub mod pallet { #[pallet::getter(fn rewards)] pub type Rewards = StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf, ValueQuery>; + + /// Map from all "stash" accounts to the paid out rewards + #[pallet::storage] + #[pallet::getter(fn paideras)] + pub type PaidEras = + StorageMap<_, Blake2_128Concat, T::AccountId, Vec>>, ValueQuery>; /// The current era index. /// @@ -296,6 +320,14 @@ pub mod pallet { pub type ErasEdgesRewardPoints = StorageMap<_, Twox64Concat, EraIndex, EraRewardPoints, ValueQuery>; + /// The reward each CDN participant earned in the era. + /// + /// See also [`pallet_staking::ErasRewardPoints`]. + #[pallet::storage] + #[pallet::getter(fn eras_edges_reward_points_per_node)] + pub type ErasEdgesRewardPointsPerNode = + StorageMap<_, Twox64Concat, T::AccountId, Vec, ValueQuery>; + /// Price per byte of the bucket traffic in smallest units of the currency. #[pallet::storage] #[pallet::getter(fn pricing)] @@ -828,6 +860,10 @@ pub mod pallet { *current_balance += reward; }); log::info!("Total rewards to be inserted: {:?}", Self::rewards(&stash)); + PaidEras::::mutate(&stash, |current_rewards| { + let rewards = EraRewardsPaid { era, reward }; + current_rewards.push(rewards); + }); } Self::deposit_event(Event::::PayoutNodes(era, era_reward_points.clone() ,price_per_byte)); log::info!("Payout event executed"); diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 016c7132b..56bd56a30 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -385,8 +385,12 @@ pub mod pallet { >::mutate(era, |era_rewards| { for (staker, points) in stakers_points.clone().into_iter() { - *era_rewards.individual.entry(staker).or_default() += points; + *era_rewards.individual.entry(staker.clone()).or_default() += points; era_rewards.total += points; + >::mutate(staker, |current_reward_points| { + let rewards = ddc_staking::EraRewardPointsPerNode { era, points }; + current_reward_points.push(rewards); + }); } }); @@ -681,9 +685,8 @@ pub mod pallet { info!("node aggregates: {:?}", node_aggregates); // No data for node - if (node_aggregates.len() == 0) { - continue - } + if node_aggregates.len() == 0 { continue; } + let request_ids = &node_aggregates[0].request_ids; info!("request_ids: {:?}", request_ids); @@ -715,11 +718,13 @@ pub mod pallet { }, }; - info!("decision: {:?}", decision); + info!("decision to be encoded: {:?}", decision); let serialized_decision = serde_json::to_string(&decision).unwrap(); let encoded_decision = shm::base64_encode(&serialized_decision.as_bytes().to_vec()).unwrap(); + info!("encoded decision: {:?}", encoded_decision); + let validator_str = utils::account_to_string::(validator.clone()); let edge_str = utils::account_to_string::(assigned_edge.clone()); From 8aea195b81fc1f241ff2d3b1b8fc67610b21b650 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 14 Aug 2023 18:01:39 +0200 Subject: [PATCH 259/583] update double spend protection for charging owners & paying stakers --- pallets/ddc-staking/src/lib.rs | 28 +++++++++++++++++++++++++--- pallets/ddc-validator/src/lib.rs | 10 +++++----- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index f810e8bad..748e4d85f 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -300,9 +300,22 @@ pub mod pallet { /// Map from all "stash" accounts to the paid out rewards #[pallet::storage] - #[pallet::getter(fn paideras)] - pub type PaidEras = + #[pallet::getter(fn paideraspernode)] + pub type PaidErasPerNode = StorageMap<_, Blake2_128Concat, T::AccountId, Vec>>, ValueQuery>; + + // Map to check if validation decision was performed for the era + #[pallet::storage] + #[pallet::getter(fn paideras)] + pub(super) type PaidEras = + StorageMap<_, Twox64Concat, EraIndex, bool, ValueQuery>; + + // Map to check if validation decision was performed for the era + #[pallet::storage] + #[pallet::getter(fn contentownerscharged)] + pub(super) type EraContentOwnersCharged = + StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, bool, ValueQuery>; + /// The current era index. /// @@ -380,6 +393,7 @@ pub mod pallet { /// Action is allowed at some point of time in future not reached yet. TooEarly, DuplicateRewardPoints, + DoubleSpendRewards, PricingNotSet, BudgetOverflow, } @@ -758,6 +772,14 @@ pub mod pallet { #[pallet::weight(100_000)] pub fn payout_stakers(origin: OriginFor, era: EraIndex) -> DispatchResult { ensure_signed(origin)?; + + // not tested + ensure!( + !Self::paideras(era), + Error::::DoubleSpendRewards + ); + + PaidEras::::insert(era, true); Self::do_payout_stakers(era) } @@ -860,7 +882,7 @@ pub mod pallet { *current_balance += reward; }); log::info!("Total rewards to be inserted: {:?}", Self::rewards(&stash)); - PaidEras::::mutate(&stash, |current_rewards| { + PaidErasPerNode::::mutate(&stash, |current_rewards| { let rewards = EraRewardsPaid { era, reward }; current_rewards.push(rewards); }); diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 56bd56a30..80b2cbd82 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -203,7 +203,7 @@ pub mod pallet { // Map to check if validation decision was performed for the era #[pallet::storage] - #[pallet::getter(fn contentOwnersCharged)] + #[pallet::getter(fn content_owners_charged)] pub(super) type EraContentOwnersCharged = StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, bool, ValueQuery>; @@ -410,10 +410,10 @@ pub mod pallet { let era = Self::get_current_era(); // not tested - // ensure!( - // Self::contentOwnersCharged(era, &controller), - // Error::::ContentOwnersDoubleSpend - // ); + ensure!( + !Self::content_owners_charged(era, &controller), + Error::::ContentOwnersDoubleSpend + ); ensure!( OffchainWorkerKeys::::contains_key(&controller), From 8cf99a051f2fb327400596f1505fbd3450bb9897 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 15 Aug 2023 12:16:04 +0600 Subject: [PATCH 260/583] Fix faulty test --- pallets/ddc-validator/src/tests.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index 400e96f64..343f86dfa 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -6,7 +6,7 @@ use crate::{ use codec::Decode; use frame_support::{ assert_ok, - traits::{OffchainWorker, OnInitialize}, + traits::{OffchainWorker, OnFinalize, OnInitialize}, }; use pallet_ddc_accounts::BucketsDetails; use sp_core::offchain::{testing, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt}; @@ -124,11 +124,13 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { Timestamp::set_timestamp( (TIME_START_MS + ERA_DURATION_MS * (era_to_validate as u128 - 1)) as u64, ); + DdcStaking::on_finalize(era_block_number - 1); // set DDC era counter DdcValidator::on_initialize(era_block_number - 1); // make assignments Timestamp::set_timestamp( (TIME_START_MS + ERA_DURATION_MS * (era_to_validate as u128 + 1)) as u64, ); + DdcStaking::on_finalize(era_block_number + 1); // inc DDC era counter DdcValidator::offchain_worker(era_block_number + 1); // execute assignments let mut transactions = pool_state.read().transactions.clone(); From fd09216335416b8d9ef40f030d4b44f928537eff Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 15 Aug 2023 16:46:06 +0200 Subject: [PATCH 261/583] fix trigerring payments for era not validated --- pallets/ddc-staking/src/lib.rs | 17 ++++++++++++++++- runtime/cere-dev/src/lib.rs | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 748e4d85f..95a36e1e0 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -260,6 +260,8 @@ pub mod pallet { /// Time used for computing era index. It is guaranteed to start being called from the first /// `on_finalize`. type UnixTime: UnixTime; + + type TimeProvider: UnixTime; } @@ -392,6 +394,7 @@ pub mod pallet { AlreadyInRole, /// Action is allowed at some point of time in future not reached yet. TooEarly, + EraNotValidated, DuplicateRewardPoints, DoubleSpendRewards, PricingNotSet, @@ -772,13 +775,18 @@ pub mod pallet { #[pallet::weight(100_000)] pub fn payout_stakers(origin: OriginFor, era: EraIndex) -> DispatchResult { ensure_signed(origin)?; + let current_era = Self::get_current_era(); - // not tested ensure!( !Self::paideras(era), Error::::DoubleSpendRewards ); + ensure!( + current_era >= era + 2, + Error::::EraNotValidated + ); + PaidEras::::insert(era, true); Self::do_payout_stakers(era) } @@ -1022,5 +1030,12 @@ pub mod pallet { } }); } + + // Get the current era; Shall we start era count from 0 or from 1? + fn get_current_era() -> EraIndex { + ((::TimeProvider::now().as_millis() - DDC_ERA_START_MS) / DDC_ERA_DURATION_MS) + .try_into() + .unwrap() + } } } diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 6e882828d..12728a6ad 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1270,6 +1270,7 @@ impl pallet_ddc_staking::Config for Runtime { type DefaultStorageChillDelay = DefaultStorageChillDelay; type Event = Event; type UnixTime = Timestamp; + type TimeProvider = pallet_timestamp::Pallet; type StakersPayoutSource = Ddc_Accounts_Pallet_Id; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; } From ce8f94d6991e789acb136edfad0f22d227d7aa93 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 16 Aug 2023 14:39:40 +0600 Subject: [PATCH 262/583] Fix validation rerun by validated era storing --- pallets/ddc-validator/src/lib.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 0d0a08da4..e457260bd 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -331,12 +331,17 @@ pub mod pallet { // Validation start forced externally? let should_validate_because_signal = Signal::::get().unwrap_or(false); - if should_validate_because_new_era || should_validate_because_signal { - let validation_result = Self::validate_edges(); - if let Err(e) = validation_result { - log::warn!("🔎 DDC validation failed. {}", e); - } + if !should_validate_because_new_era && !should_validate_because_signal { + return + } + + if let Err(e) = Self::validate_edges() { + log::warn!("🔎 DDC validation failed. {}", e); + return } + + last_validated_era_storage.set(¤t_ddc_era); + log::info!("🔎 DDC validation complete for {} era.", current_ddc_era); } } From f03247799a7d3493f4ff0d6aac6847a7365322e5 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 16 Aug 2023 10:55:12 +0200 Subject: [PATCH 263/583] extra checks intermediate progress --- pallets/ddc-validator/src/lib.rs | 44 +++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 80b2cbd82..fed90bb3f 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -218,6 +218,12 @@ pub mod pallet { pub type ValidationDecisions = StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, ValidationDecision>; + // Map to check if validation decision was performed for the era + #[pallet::storage] + #[pallet::getter(fn validation_decision_set_for_node)] + pub(super) type ValidationDecisionSetForNode = + StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, bool, ValueQuery>; + /// The last era for which the tasks assignment produced. #[pallet::storage] #[pallet::getter(fn last_managed_era)] @@ -233,7 +239,8 @@ pub mod pallet { pub enum Error { NotController, OCWKeyNotRegistered, - ContentOwnersDoubleSpend + ContentOwnersDoubleSpend, + ValidationDecisionAlreadySet, } #[pallet::event] @@ -351,16 +358,25 @@ pub mod pallet { cdn_node: T::AccountId, validation_decision: ValidationDecision, ) -> DispatchResult { - ensure_signed(origin)?; + let controller = ensure_signed(origin)?; - // ToDo: check if origin is a validator. + ensure!( + OffchainWorkerKeys::::contains_key(&controller), + Error::::OCWKeyNotRegistered + ); + + ensure!( + !Self::validation_decision_set_for_node(era, &cdn_node), + Error::::ValidationDecisionAlreadySet + ); // ToDo: check if the era is current - 1. - // ToDo: check if the validation decision is not set yet. // ToDo: check cdn_node is known to ddc-staking. ValidationDecisions::::insert(era, cdn_node.clone(), validation_decision.clone()); - Self::deposit_event(Event::::ValidationDecision(era, cdn_node, validation_decision)); + Self::deposit_event(Event::::ValidationDecision(era, cdn_node.clone(), validation_decision)); + + ValidationDecisionSetForNode::::insert(era, cdn_node, true); Ok(()) } @@ -381,7 +397,12 @@ pub mod pallet { era: EraIndex, stakers_points: Vec<(T::AccountId, u64)>, ) -> DispatchResult { - ensure_signed(origin)?; + let controller = ensure_signed(origin)?; + + ensure!( + OffchainWorkerKeys::::contains_key(&controller), + Error::::OCWKeyNotRegistered + ); >::mutate(era, |era_rewards| { for (staker, points) in stakers_points.clone().into_iter() { @@ -409,7 +430,6 @@ pub mod pallet { let era = Self::get_current_era(); - // not tested ensure!( !Self::content_owners_charged(era, &controller), Error::::ContentOwnersDoubleSpend @@ -432,15 +452,9 @@ pub mod pallet { origin: OriginFor, era: EraIndex, ) -> DispatchResult { - let controller = ensure_signed(origin)?; - ensure!( - OffchainWorkerKeys::::contains_key(&controller), - Error::::OCWKeyNotRegistered - ); - - >::do_payout_stakers(era); + ensure_signed(origin)?; - Ok(()) + >::do_payout_stakers(era) } #[pallet::weight(100_000)] From 9db942194d060e6df2da0207abc2ac01835845bf Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 16 Aug 2023 18:02:12 +0200 Subject: [PATCH 264/583] finish with safety checks --- pallets/ddc-validator/src/lib.rs | 40 ++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index fed90bb3f..baef8543f 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -224,6 +224,12 @@ pub mod pallet { pub(super) type ValidationDecisionSetForNode = StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, bool, ValueQuery>; + // Map to check if reward points were set for the era + #[pallet::storage] + #[pallet::getter(fn reward_points_set_for_node)] + pub(super) type RewardPointsSetForNode = + StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, bool, ValueQuery>; + /// The last era for which the tasks assignment produced. #[pallet::storage] #[pallet::getter(fn last_managed_era)] @@ -241,6 +247,7 @@ pub mod pallet { OCWKeyNotRegistered, ContentOwnersDoubleSpend, ValidationDecisionAlreadySet, + NodeNotActive } #[pallet::event] @@ -369,8 +376,12 @@ pub mod pallet { !Self::validation_decision_set_for_node(era, &cdn_node), Error::::ValidationDecisionAlreadySet ); + + ensure!( + >::contains_key(&cdn_node), + Error::::NodeNotActive + ); // ToDo: check if the era is current - 1. - // ToDo: check cdn_node is known to ddc-staking. ValidationDecisions::::insert(era, cdn_node.clone(), validation_decision.clone()); @@ -406,12 +417,17 @@ pub mod pallet { >::mutate(era, |era_rewards| { for (staker, points) in stakers_points.clone().into_iter() { - *era_rewards.individual.entry(staker.clone()).or_default() += points; - era_rewards.total += points; - >::mutate(staker, |current_reward_points| { - let rewards = ddc_staking::EraRewardPointsPerNode { era, points }; - current_reward_points.push(rewards); - }); + if !Self::reward_points_set_for_node(era, &staker) { // check if rewards were not yet set for era for node + if >::contains_key(&staker) { // check if node is active + *era_rewards.individual.entry(staker.clone()).or_default() += points; + era_rewards.total += points; + >::mutate(&staker, |current_reward_points| { + let rewards = ddc_staking::EraRewardPointsPerNode { era, points }; + current_reward_points.push(rewards); + }); + RewardPointsSetForNode::::insert(era, staker, true); + } + } } }); @@ -429,16 +445,16 @@ pub mod pallet { log::info!("Controller is {:?}", controller); let era = Self::get_current_era(); - - ensure!( - !Self::content_owners_charged(era, &controller), - Error::::ContentOwnersDoubleSpend - ); ensure!( OffchainWorkerKeys::::contains_key(&controller), Error::::OCWKeyNotRegistered ); + + ensure!( + !Self::content_owners_charged(era, &controller), + Error::::ContentOwnersDoubleSpend + ); >::charge_payments_new(paying_accounts); From 84ae0b20c14c6973a929b3cd108f1797539453e8 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 17 Aug 2023 10:27:17 +0200 Subject: [PATCH 265/583] charge content owners based on pricing (fix bug) --- pallets/ddc-accounts/src/lib.rs | 4 +++- pallets/ddc-validator/src/lib.rs | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index d7e6e2560..ebc877c81 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -12,6 +12,7 @@ use scale_info::TypeInfo; use sp_runtime::{ traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, Zero}, RuntimeDebug, + SaturatedConversion, }; use sp_staking::EraIndex; @@ -566,13 +567,14 @@ pub mod pallet { // Charge payments from content owners pub fn charge_payments_new( paying_accounts: Vec>>, + pricing: u128, ) -> DispatchResult { let mut total_charged = BalanceOf::::zero(); for bucket_details in paying_accounts.iter() { let bucket: Bucket = Self::buckets(bucket_details.bucket_id).unwrap(); let content_owner = bucket.owner_id; - let amount = bucket_details.amount; + let amount = bucket_details.amount * pricing.saturated_into::>(); let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotController)?; if ledger.active >= amount { diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index baef8543f..75eb21ee1 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -456,7 +456,8 @@ pub mod pallet { Error::::ContentOwnersDoubleSpend ); - >::charge_payments_new(paying_accounts); + let pricing: u128 = >::pricing().unwrap(); + >::charge_payments_new(paying_accounts, pricing); EraContentOwnersCharged::::insert(era, controller, true); From e935b3e78fa1df64be2952d2eb32fec205080a10 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 17 Aug 2023 17:12:04 +0600 Subject: [PATCH 266/583] Enable DDC validation depending on storage key --- pallets/ddc-validator/src/lib.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index e457260bd..45519095d 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -75,6 +75,10 @@ type ResultStr = Result; /// assignment. const LAST_VALIDATED_ERA_KEY: &[u8; 40] = b"pallet-ddc-validator::last_validated_era"; +/// Local storage key that holds the flag to enable DDC validation. Set it to true (0x01) to enable +/// DDC validation, set it to false (0x00) or delete the key to disable it. +const ENABLE_DDC_VALIDATION_KEY: &[u8; 21] = b"enable-ddc-validation"; + pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); pub const TIME_START_MS: u128 = 1_672_531_200_000; @@ -299,6 +303,12 @@ pub mod pallet { return } + // Skip if DDC validation is not enabled. + match StorageValueRef::persistent(ENABLE_DDC_VALIDATION_KEY).get::() { + Ok(Some(enabled)) if enabled == true => (), + _ => return, + } + let mut should_validate_because_new_era = true; let mut validation_lock = From 91cb3e57cda5874268b7cf6ce0859fb2eb01f0ad Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 17 Aug 2023 18:58:48 +0600 Subject: [PATCH 267/583] New CLI parameter for enabling DDC validation --- cli/src/cli.rs | 5 +++++ cli/src/command.rs | 10 +++++++--- node/service/src/lib.rs | 17 ++++++++++++++++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/cli/src/cli.rs b/cli/src/cli.rs index b9759c047..b60cea5b2 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -13,6 +13,11 @@ pub struct RunCmd { #[clap(flatten)] pub base: sc_cli::RunCmd, + /// Enable DDC validation (disabled by default). Works only on validator nodes with enabled + /// offchain workers. + #[clap(long)] + pub enable_ddc_validation: bool, + /// Force using Cere Dev runtime. #[clap(long = "force-cere-dev")] pub force_cere_dev: bool, diff --git a/cli/src/command.rs b/cli/src/command.rs index 5884387bc..0c86611fb 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -242,9 +242,13 @@ pub fn run() -> sc_cli::Result<()> { None => { let runner = cli.create_runner(&cli.run.base)?; runner.run_node_until_exit(|config| async move { - cere_service::build_full(config, cli.run.no_hardware_benchmarks) - .map(|full| full.task_manager) - .map_err(Error::Service) + cere_service::build_full( + config, + cli.run.no_hardware_benchmarks, + cli.run.enable_ddc_validation, + ) + .map(|full| full.task_manager) + .map_err(Error::Service) }) }, } diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 8a84ed755..3f6ffa118 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -6,7 +6,7 @@ pub use cere_dev_runtime; pub use cere_runtime; use futures::prelude::*; -use sc_client_api::BlockBackend; +use sc_client_api::{Backend, BlockBackend}; use sc_consensus_babe::{self, SlotProportion}; use sc_network::Event; use sc_service::{ @@ -29,6 +29,7 @@ pub use sc_executor::NativeElseWasmExecutor; use sc_network_common::service::NetworkEventStream; pub use sc_service::ChainSpec; pub use sp_api::ConstructRuntimeApi; +pub use sp_core::offchain::OffchainStorage; type FullSelectChain = sc_consensus::LongestChain; type FullGrandpaBlockImport = sc_finality_grandpa::GrandpaBlockImport< @@ -269,12 +270,14 @@ where pub fn build_full( config: Configuration, disable_hardware_benchmarks: bool, + enable_ddc_validation: bool, ) -> Result, ServiceError> { #[cfg(feature = "cere-dev-native")] if config.chain_spec.is_cere_dev() { return new_full::( config, disable_hardware_benchmarks, + enable_ddc_validation, |_, _| (), ) .map(|full| full.with_client(Client::CereDev)) @@ -285,6 +288,7 @@ pub fn build_full( return new_full::( config, disable_hardware_benchmarks, + enable_ddc_validation, |_, _| (), ) .map(|full| full.with_client(Client::Cere)) @@ -318,6 +322,7 @@ impl NewFull { pub fn new_full( mut config: Configuration, disable_hardware_benchmarks: bool, + enable_ddc_validation: bool, with_startup_data: impl FnOnce( &sc_consensus_babe::BabeBlockImport< Block, @@ -347,6 +352,16 @@ where let basics = new_partial_basics::(&config)?; + basics + .backend + .offchain_storage() + .expect("no off-chain storage, DDC validation is not possible") + .set( + sp_core::offchain::STORAGE_PREFIX, + b"enable-ddc-validation", + if enable_ddc_validation { &[1] } else { &[0] }, + ); + let sc_service::PartialComponents { client, backend, From 4887a6161a624b355ce649b30e76094f537cd7a4 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 18 Aug 2023 13:10:04 +0600 Subject: [PATCH 268/583] Enable validation while testing --- pallets/ddc-validator/src/tests.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index 343f86dfa..918668a64 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -1,7 +1,7 @@ use crate::{ mock::{Timestamp, *}, shm, utils, DacTotalAggregates, EraIndex, ValidationDecision, DEFAULT_DATA_PROVIDER_URL, - ERA_DURATION_MS, ERA_IN_BLOCKS, KEY_TYPE, TIME_START_MS, + ENABLE_DDC_VALIDATION_KEY, ERA_DURATION_MS, ERA_IN_BLOCKS, KEY_TYPE, TIME_START_MS, }; use codec::Decode; use frame_support::{ @@ -11,6 +11,7 @@ use frame_support::{ use pallet_ddc_accounts::BucketsDetails; use sp_core::offchain::{testing, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt}; use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; +use sp_runtime::offchain::storage::StorageValueRef; use std::sync::Arc; const OCW_PUB_KEY_STR: &str = "d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67"; @@ -131,6 +132,7 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { (TIME_START_MS + ERA_DURATION_MS * (era_to_validate as u128 + 1)) as u64, ); DdcStaking::on_finalize(era_block_number + 1); // inc DDC era counter + StorageValueRef::persistent(ENABLE_DDC_VALIDATION_KEY).set(&true); // enable validation DdcValidator::offchain_worker(era_block_number + 1); // execute assignments let mut transactions = pool_state.read().transactions.clone(); From 23b92e90ea02b6b259e34f8a47deb7f2ef54846f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 18 Aug 2023 14:22:48 +0600 Subject: [PATCH 269/583] Simplify imports --- pallets/ddc-validator/src/tests.rs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index 918668a64..ab3cbad39 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -1,13 +1,6 @@ -use crate::{ - mock::{Timestamp, *}, - shm, utils, DacTotalAggregates, EraIndex, ValidationDecision, DEFAULT_DATA_PROVIDER_URL, - ENABLE_DDC_VALIDATION_KEY, ERA_DURATION_MS, ERA_IN_BLOCKS, KEY_TYPE, TIME_START_MS, -}; +use super::*; +use crate::mock::{Timestamp, *}; use codec::Decode; -use frame_support::{ - assert_ok, - traits::{OffchainWorker, OnFinalize, OnInitialize}, -}; use pallet_ddc_accounts::BucketsDetails; use sp_core::offchain::{testing, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt}; use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; From 220c4ed27d486c5ed3a05e59a15379c40b87688d Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 18 Aug 2023 14:37:53 +0600 Subject: [PATCH 270/583] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e378bf759..9cef36998 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- ... +- [D] New `pallet-ddc-validator` which implements DDC CDN nodes validation and rewarding. You can enable DDC validation providing `--enable-ddc-validation` argument. It will only work on the nodes with validation and offchain workers enabled as well. +- [D] Several calls for `pallet-ddc-staking` to distribute rewards. ### Changed From af9bf78612837a34a2cb6e5e60bea28bc201b1b0 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 18 Aug 2023 14:38:59 +0600 Subject: [PATCH 271/583] Bump spec version --- runtime/cere-dev/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 8a65c5727..7bfa438ae 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -131,7 +131,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: 48001, + spec_version: 48002, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, From 9416bfc8ab2dab466e8ee3dde24ae4eb30b1cb85 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 18 Aug 2023 17:30:24 +0600 Subject: [PATCH 272/583] Prevent panicking during the validation assignment --- pallets/ddc-validator/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 45519095d..ed5f29d01 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -273,7 +273,7 @@ pub mod pallet { let current_ddc_era = match ddc_staking::pallet::Pallet::::current_era() { Some(era) => era, None => { - defensive!("DDC era not set"); + log::debug!("DDC era not set"); return Weight::from_ref_time(0) }, }; @@ -289,7 +289,7 @@ pub mod pallet { match Self::assign(3usize, current_ddc_era + 1) { Ok(_) => >::put(current_ddc_era + 1), Err(AssignmentError::DefensiveEmptyQuorumsCycle) => { - defensive!("unexpectedly empty quorums cycle"); + log::debug!("unexpectedly empty quorums cycle"); }, Err(e) => log::debug!("assignment error: {:?}", e), }; From be50afc2f6e1d5a64a7557a9bc49144ead0a4baf Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 18 Aug 2023 17:36:37 +0600 Subject: [PATCH 273/583] Decrease validation assignment logs severity --- pallets/ddc-validator/src/lib.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index ed5f29d01..b97e10259 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -273,26 +273,23 @@ pub mod pallet { let current_ddc_era = match ddc_staking::pallet::Pallet::::current_era() { Some(era) => era, None => { - log::debug!("DDC era not set"); + log::debug!("DDC era not set."); return Weight::from_ref_time(0) }, }; - log::info!("current DDC era: {:?}", current_ddc_era); + log::debug!("Current DDC era: {:?}.", current_ddc_era); // Produce an assignment for the next era if it's not produced yet. match Self::last_managed_era() { Some(last_managed_era) if current_ddc_era < last_managed_era => return Weight::from_ref_time(0), _ => (), - }; + } match Self::assign(3usize, current_ddc_era + 1) { Ok(_) => >::put(current_ddc_era + 1), - Err(AssignmentError::DefensiveEmptyQuorumsCycle) => { - log::debug!("unexpectedly empty quorums cycle"); - }, - Err(e) => log::debug!("assignment error: {:?}", e), - }; + Err(e) => log::debug!("DDC validation assignment error: {:?}.", e), + } Weight::from_ref_time(0) } @@ -582,7 +579,7 @@ pub mod pallet { /// set. fn assign(quorum_size: usize, era: EraIndex) -> Result<(), AssignmentError> { let validators: Vec = >::iter_keys().collect(); - log::info!("current validators: {:?}", validators); + log::debug!("Current validators: {:?}.", validators); if validators.len() == 0 { return Err(AssignmentError::NoValidators) @@ -596,7 +593,7 @@ pub mod pallet { } let edges: Vec = >::iter_keys().collect(); - log::info!("current edges: {:?}", edges); + log::debug!("Current edges: {:?}.", edges); if edges.len() == 0 { return Ok(()) From 52fa467f917f206d9aa39518426de4552a15e774 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 18 Aug 2023 15:24:55 +0200 Subject: [PATCH 274/583] Return validation errro in absence of assignment --- pallets/ddc-validator/src/lib.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index f78ba66f6..019d0db9d 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -761,8 +761,10 @@ pub mod pallet { info!("validator: {:?}", validator); - let assigned_edges = Self::assignments(current_ddc_era - 1, validator.clone()) - .expect("No assignments for the previous era"); + let assigned_edges = match Self::assignments(current_ddc_era - 1, validator.clone()) { + Some(edges) => edges, + None => return Err("No assignments for the previous era."), + }; info!("assigned_edges: {:?}", assigned_edges); From 756951545c7b3ee03e7db2967e84e847a7db9481 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 18 Aug 2023 15:27:03 +0200 Subject: [PATCH 275/583] Decrease pallet-ddc-accounts logs severity --- pallets/ddc-accounts/src/lib.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index 92c9979fc..ca12b1ffd 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -98,7 +98,7 @@ impl current_era { true } else { @@ -175,7 +175,7 @@ pub mod pallet { #[pallet::getter(fn bonded)] pub type Bonded = StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; - /// Map from all (unlocked) "controller" accounts to the info regarding the staking. + /// Map from all (unlocked) "controller" accounts to the debug regarding the staking. #[pallet::storage] #[pallet::getter(fn ledger)] pub type Ledger = @@ -431,7 +431,7 @@ pub mod pallet { // Note: bonding for extra era to allow for accounting let era = Self::get_current_era() + T::BondingDuration::get(); - log::info!("Era for the unbond: {:?}", era); + log::debug!("Era for the unbond: {:?}", era); if let Some(mut chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) @@ -471,27 +471,27 @@ pub mod pallet { let (stash, old_total) = (ledger.stash.clone(), ledger.total); let current_era = Self::get_current_era(); ledger = ledger.consolidate_unlocked(current_era); - log::info!("Current era: {:?}", current_era); + log::debug!("Current era: {:?}", current_era); if ledger.unlocking.is_empty() && ledger.active < T::Currency::minimum_balance() { - log::info!("Killing stash"); + log::debug!("Killing stash"); // 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 accounts-related information. Self::kill_stash(&stash)?; } else { - log::info!("Updating ledger"); + log::debug!("Updating ledger"); // This was the consequence of a partial unbond. just update the ledger and move on. Self::update_ledger(&controller, &ledger); }; - log::info!("Current total: {:?}", ledger.total); - log::info!("Old total: {:?}", old_total); + log::debug!("Current total: {:?}", ledger.total); + log::debug!("Old total: {:?}", old_total); // `old_total` should never be less than the new total because // `consolidate_unlocked` strictly subtracts balance. if ledger.total < old_total { - log::info!("Preparing for transfer"); + log::debug!("Preparing for transfer"); // Already checked that this won't overflow by entry condition. let value = old_total - ledger.total; @@ -579,7 +579,7 @@ pub mod pallet { ledger.total -= amount; ledger.active -= amount; total_charged += amount; - log::info!("Ledger updated state: {:?}", &ledger); + log::debug!("Ledger updated state: {:?}", &ledger); Self::update_ledger(&content_owner, &ledger); } else { let diff = amount - ledger.active; @@ -587,15 +587,15 @@ pub mod pallet { ledger.total -= ledger.active; ledger.active = BalanceOf::::zero(); let (ledger, charged) = ledger.charge_unlocking(diff); - log::info!("Ledger updated state: {:?}", &ledger); + log::debug!("Ledger updated state: {:?}", &ledger); Self::update_ledger(&content_owner, &ledger); total_charged += charged; } } - log::info!("Total charged: {:?}", &total_charged); + log::debug!("Total charged: {:?}", &total_charged); Self::deposit_event(Event::::Charged(total_charged)); - log::info!("Deposit event executed"); + log::debug!("Deposit event executed"); Ok(()) } From 0bcfaccd683e13af2eccea77dfc381e11359370c Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 18 Aug 2023 15:30:33 +0200 Subject: [PATCH 276/583] decrease pallet-ddc-validator logs severity to debug --- pallets/ddc-validator/src/dac.rs | 26 ++++++++++++------------ pallets/ddc-validator/src/lib.rs | 35 ++++++++++++++++---------------- pallets/ddc-validator/src/shm.rs | 9 ++++---- 3 files changed, 34 insertions(+), 36 deletions(-) diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index d1fe5021b..dab51abe8 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -5,7 +5,7 @@ use alloc::{format, string::String}; // ToDo: remove String usage use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use codec::{Decode, Encode}; use lite_json::{json::JsonValue, json_parser::parse_json}; -use log::info; +use log::debug; use serde_json::{Map, Value}; use sp_runtime::{ generic::Era, @@ -394,19 +394,19 @@ fn get_file_request_url(data_provider_url: &String) -> String { } pub(crate) fn fetch_cdn_node_aggregates_request(url: &String) -> Vec { - log::info!("fetch_file_request | url: {:?}", url); + log::debug!("fetch_file_request | url: {:?}", url); let response: FileRequestWrapper = http_get_json(&url).unwrap(); - log::info!("response.json: {:?}", response.json); + log::debug!("response.json: {:?}", response.json); let map: Vec = serde_json::from_str(response.json.as_str()).unwrap(); - // log::info!("response.json: {:?}", response.json); + // log::debug!("response.json: {:?}", response.json); map } pub(crate) fn fetch_file_request(url: &String) -> FileRequest { - log::info!("fetch_file_request | url: {:?}", url); + log::debug!("fetch_file_request | url: {:?}", url); let response: FileRequestWrapper = http_get_json(&url).unwrap(); - log::info!("response.json: {:?}", response.json); + log::debug!("response.json: {:?}", response.json); let map: FileRequest = serde_json::from_str(response.json.as_str()).unwrap(); @@ -418,17 +418,17 @@ pub(crate) fn fetch_data( era: EraIndex, cdn_node: &T::AccountId, ) -> (BytesSent, BytesReceived) { - log::info!("[DAC Validator] DAC Validator is running. Current era is {}", era); + log::debug!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error let bytes_sent_query = get_bytes_sent_query_url(data_provider_url, era); let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).unwrap(); - log::info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); + log::debug!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); let bytes_sent = BytesSent::new(bytes_sent_res); // Todo: handle the error let bytes_received_query = get_bytes_received_query_url(data_provider_url, era); let bytes_received_res: RedisFtAggregate = http_get_json(&bytes_received_query).unwrap(); - log::info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); + log::debug!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); let bytes_received = BytesReceived::new(bytes_received_res); (bytes_sent, bytes_received) @@ -438,17 +438,17 @@ pub(crate) fn fetch_data1( data_provider_url: &String, era: EraIndex, ) -> (Vec, Vec) { - log::info!("[DAC Validator] DAC Validator is running. Current era is {}", era); + log::debug!("[DAC Validator] DAC Validator is running. Current era is {}", era); // Todo: handle the error let bytes_sent_query = get_bytes_sent_query_url(data_provider_url, era); let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).unwrap(); - log::info!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); + log::debug!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); let bytes_sent = BytesSent::get_all(bytes_sent_res); // Todo: handle the error let bytes_received_query = get_bytes_received_query_url(data_provider_url, era); let bytes_received_res: RedisFtAggregate = http_get_json(&bytes_received_query).unwrap(); - log::info!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); + log::debug!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); let bytes_received = BytesReceived::get_all(bytes_received_res); (bytes_sent, bytes_received) @@ -503,7 +503,7 @@ pub(crate) fn http_get_json(url: &str) -> crate::ResultSt // } fn http_get_request(http_url: &str) -> Result, http::Error> { - // log::info!("[DAC Validator] Sending request to: {:?}", http_url); + // log::debug!("[DAC Validator] Sending request to: {:?}", http_url); // Initiate an external HTTP GET request. This is using high-level wrappers from // `sp_runtime`. diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 019d0db9d..8ab55ff2d 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -46,7 +46,6 @@ pub use frame_system::{ pallet_prelude::*, }; pub use lite_json::json::JsonValue; -use log::info; pub use pallet::*; pub use pallet_ddc_accounts::{self as ddc_accounts, BucketsDetails}; pub use pallet_ddc_staking::{self as ddc_staking}; @@ -381,7 +380,7 @@ pub mod pallet { } last_validated_era_storage.set(¤t_ddc_era); - log::info!("🔎 DDC validation complete for {} era.", current_ddc_era); + log::debug!("🔎 DDC validation complete for {} era.", current_ddc_era); } } @@ -496,7 +495,7 @@ pub mod pallet { paying_accounts: Vec>>, ) -> DispatchResult { let controller = ensure_signed(origin)?; - log::info!("Controller is {:?}", controller); + log::debug!("Controller is {:?}", controller); let era = Self::get_current_era(); @@ -750,7 +749,7 @@ pub mod pallet { ddc_staking::pallet::Pallet::::current_era().ok_or("DDC era not set")?; let mock_data_url = Self::get_mock_data_url(); let data_provider_url = Self::get_data_provider_url(); - info!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); + log::debug!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); // let signer = Self::get_signer().unwrap(); // let validator = signer.get_any_account().unwrap().id; @@ -759,20 +758,20 @@ pub mod pallet { None => return Err("No validator public key found."), }; - info!("validator: {:?}", validator); + log::debug!("validator: {:?}", validator); let assigned_edges = match Self::assignments(current_ddc_era - 1, validator.clone()) { Some(edges) => edges, None => return Err("No assignments for the previous era."), }; - info!("assigned_edges: {:?}", assigned_edges); + log::debug!("assigned_edges: {:?}", assigned_edges); // Calculate CDN nodes reward points from validation decision aggregates let mut cdn_nodes_reward_points: Vec<(T::AccountId, u64)> = vec![]; for assigned_edge in assigned_edges.iter() { - info!("assigned edge: {:?}", assigned_edge); + log::debug!("assigned edge: {:?}", assigned_edge); // form url for each node let edge_url = format!( @@ -782,10 +781,10 @@ pub mod pallet { current_ddc_era - 1, utils::account_to_string::(assigned_edge.clone()) ); - info!("edge url: {:?}", edge_url); + log::debug!("edge url: {:?}", edge_url); let node_aggregates = dac::fetch_cdn_node_aggregates_request(&edge_url); - info!("node aggregates: {:?}", node_aggregates); + log::debug!("node aggregates: {:?}", node_aggregates); // No data for node if (node_aggregates.len() == 0) { @@ -793,7 +792,7 @@ pub mod pallet { } let request_ids = &node_aggregates[0].request_ids; - info!("request_ids: {:?}", request_ids); + log::debug!("request_ids: {:?}", request_ids); // Store bucket payments let payments_per_bucket = &mut Vec::new(); @@ -808,7 +807,7 @@ pub mod pallet { let (bytes_sent, bytes_received) = dac::get_served_bytes_sum(&requests); let is_valid = Self::is_valid(bytes_sent, bytes_received); - info!("bytes_sent, bytes_received: {:?}, {:?}", bytes_sent, bytes_received); + log::debug!("bytes_sent, bytes_received: {:?}, {:?}", bytes_sent, bytes_received); let payload = serde_json::to_string(&requests).unwrap(); let decision = ValidationDecision { @@ -823,12 +822,12 @@ pub mod pallet { }, }; - info!("decision to be encoded: {:?}", decision); + log::debug!("decision to be encoded: {:?}", decision); let serialized_decision = serde_json::to_string(&decision).unwrap(); let encoded_decision = shm::base64_encode(&serialized_decision.as_bytes().to_vec()).unwrap(); - info!("encoded decision: {:?}", encoded_decision); + log::debug!("encoded decision: {:?}", encoded_decision); let validator_str = utils::account_to_string::(validator.clone()); let edge_str = utils::account_to_string::(assigned_edge.clone()); @@ -849,7 +848,7 @@ pub mod pallet { } if let Ok(res) = response.clone() { - info!("shm res: {:?}", res.to_string()); + log::debug!("shm res: {:?}", res.to_string()); } if let Ok(res) = response { @@ -863,10 +862,10 @@ pub mod pallet { quorum, ); - log::info!("get_intermediate_decisions result: {:?}", validations_res); + log::debug!("get_intermediate_decisions result: {:?}", validations_res); if validations_res.len() == QUORUM_SIZE { - log::info!("payments per bucket: {:?}", payments_per_bucket); + log::debug!("payments per bucket: {:?}", payments_per_bucket); let mut payments: BTreeMap< u128, @@ -890,7 +889,7 @@ pub mod pallet { for (_, bucket_info) in payments { final_payments.push(bucket_info); } - log::info!("final payments: {:?}", final_payments); + log::debug!("final payments: {:?}", final_payments); // Store CDN node reward points on-chain let signer: Signer = Signer::<_, _>::any_account(); @@ -917,7 +916,7 @@ pub mod pallet { validation_decision: final_res.clone(), }); - log::info!("final_res: {:?}", final_res); + log::debug!("final_res: {:?}", final_res); cdn_nodes_reward_points.push(( utils::string_to_account::(final_res.edge), diff --git a/pallets/ddc-validator/src/shm.rs b/pallets/ddc-validator/src/shm.rs index 72c293745..2d557d37d 100644 --- a/pallets/ddc-validator/src/shm.rs +++ b/pallets/ddc-validator/src/shm.rs @@ -12,7 +12,6 @@ use crate::{dac, utils, ValidationDecision}; use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use base64::prelude::*; use lite_json::json::JsonValue; -use log::info; use sp_runtime::offchain::{http, Duration}; use sp_staking::EraIndex; use sp_std::prelude::*; @@ -74,14 +73,14 @@ pub fn share_intermediate_validation_result( let unescaped_json = utils::unescape(&json_str); let url_encoded_json = utils::url_encode(&unescaped_json); - log::info!("json_str: {:?}", json_str); + log::debug!("json_str: {:?}", json_str); let url = format!( "{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{}", shared_memory_webdis_url, validator, cdn_node, era, url_encoded_json, ); - log::info!("share_intermediate_validation_result url: {:?}", url); + log::debug!("share_intermediate_validation_result url: {:?}", url); let request = http::Request::get(url.as_str()); let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; @@ -95,7 +94,7 @@ pub fn share_intermediate_validation_result( http::Error::Unknown })?; - log::info!("body_str: {:?}", body_str); + log::debug!("body_str: {:?}", body_str); let json = lite_json::parse_json(body_str).map_err(|_| { log::warn!("No JSON body"); @@ -138,7 +137,7 @@ pub(crate) fn decode_intermediate_decisions( let data_str = String::from_utf8_lossy(&data); let data_trimmed = data_str.trim_end_matches('\0'); - info!("data_str: {:?}", data_trimmed); + log::debug!("data_str: {:?}", data_trimmed); let decoded_decision: ValidationDecision = serde_json::from_str(&data_trimmed).unwrap(); From be0eb4ebf1214ee362d5e3127908f0719bfc34a8 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 18 Aug 2023 15:45:46 +0200 Subject: [PATCH 277/583] fix remaining conflicts not smotted by git --- pallets/ddc-staking/src/lib.rs | 24 +----------------------- pallets/ddc-validator/src/lib.rs | 19 +++++++++++++------ runtime/cere-dev/src/lib.rs | 7 ------- 3 files changed, 14 insertions(+), 36 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 6f45e0f35..1630df783 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -240,7 +240,6 @@ pub mod pallet { type DefaultStorageChillDelay: Get; type RuntimeEvent: From> + IsType<::RuntimeEvent>; - type Event: From> + IsType<::Event>; /// Number of eras that staked funds must remain bonded for. #[pallet::constant] type BondingDuration: Get; @@ -898,6 +897,7 @@ pub mod pallet { >::set(Some(price_per_byte)); Ok(()) } + } impl Pallet { pub fn do_payout_stakers(era: EraIndex) -> DispatchResult { @@ -1063,28 +1063,6 @@ pub mod pallet { Storages::::take(who).is_some() } - /// This function will add a storage network participant to the `Storages` storage map. - /// - /// If the storage network participant already exists, their cluster will be updated. - /// - /// NOTE: you must ALWAYS use this function to add a storage network participant to the - /// system. Any access to `Storages` outside of this function is almost certainly - /// wrong. - pub fn do_add_storage(who: &T::AccountId, cluster: ClusterId) { - Storages::::insert(who, cluster); - } - - /// This function will remove a storage network participant from the `Storages` map. - /// - /// Returns true if `who` was removed from `Storages`, otherwise false. - /// - /// NOTE: you must ALWAYS use this function to remove a storage network participant from the - /// system. Any access to `Storages` outside of this function is almost certainly - /// wrong. - pub fn do_remove_storage(who: &T::AccountId) -> bool { - Storages::::take(who).is_some() - } - /// Reset the chilling era for a controller. pub fn reset_chilling(controller: &T::AccountId) { Ledger::::mutate(&controller, |maybe_ledger| { diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 8ab55ff2d..21ee1d199 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -80,8 +80,8 @@ const ENABLE_DDC_VALIDATION_KEY: &[u8; 21] = b"enable-ddc-validation"; pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); -pub const TIME_START_MS: u128 = 1_672_531_200_000; -pub const ERA_DURATION_MS: u128 = 120_000; +pub const DDC_ERA_START_MS: u128 = 1_672_531_200_000; +pub const DDC_ERA_DURATION_MS: u128 = 120_000; pub const ERA_IN_BLOCKS: u8 = 20; pub const BYTES_TO_CERE: u64 = 1; // this should have a logic built on top and adjusted @@ -634,7 +634,7 @@ pub mod pallet { result } - fn assign(quorum_size: usize, era: EraIndex) { + fn assign(quorum_size: usize, era: EraIndex) -> Result<(), AssignmentError> { let validators: Vec = OffchainWorkerKeys::::iter_keys().collect(); log::debug!("Current validators: {:?}.", validators); @@ -744,6 +744,13 @@ pub mod pallet { } } + fn get_current_era() -> EraIndex { + ((::TimeProvider::now().as_millis() - DDC_ERA_START_MS) / + DDC_ERA_DURATION_MS) + .try_into() + .unwrap() + } + fn validate_edges() -> Result<(), &'static str> { let current_ddc_era = ddc_staking::pallet::Pallet::::current_era().ok_or("DDC era not set")?; @@ -787,7 +794,7 @@ pub mod pallet { log::debug!("node aggregates: {:?}", node_aggregates); // No data for node - if (node_aggregates.len() == 0) { + if node_aggregates.len() == 0 { continue } @@ -911,7 +918,7 @@ pub mod pallet { let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { - era: current_era - 1, + era: current_ddc_era - 1, cdn_node: utils::string_to_account::(edge.clone()), validation_decision: final_res.clone(), }); @@ -931,7 +938,7 @@ pub mod pallet { if cdn_nodes_reward_points.len() > 0 { let _tx_res = signer.send_signed_transaction(|_account| Call::set_era_reward_points { - era: current_era - 1, + era: current_ddc_era - 1, stakers_points: cdn_nodes_reward_points.clone(), }); } diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 05f57249f..11be6ce59 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1324,12 +1324,6 @@ parameter_types! { pub const DefaultStorageChillDelay: EraIndex = 7 * 24 * 60 / 2; // approx. 1 week with 2 min DDC era } -parameter_types! { - pub const DefaultEdgeBondSize: Balance = 100 * DOLLARS; - pub const DefaultEdgeChillDelay: EraIndex = 7 * 24 * 60 / 2; // approx. 1 week with 2 min DDC era - pub const DefaultStorageBondSize: Balance = 100 * DOLLARS; - pub const DefaultStorageChillDelay: EraIndex = 7 * 24 * 60 / 2; // approx. 1 week with 2 min DDC era -} impl pallet_ddc_staking::Config for Runtime { type BondingDuration = BondingDuration; type Currency = Balances; @@ -1338,7 +1332,6 @@ impl pallet_ddc_staking::Config for Runtime { type DefaultStorageBondSize = DefaultStorageBondSize; type DefaultStorageChillDelay = DefaultStorageChillDelay; type RuntimeEvent = RuntimeEvent; - type Event = Event; type TimeProvider = pallet_timestamp::Pallet; type StakersPayoutSource = Ddc_Accounts_Pallet_Id; type UnixTime = Timestamp; From c08c89021818779da274293553de8e709d35ea01 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 21 Aug 2023 17:43:36 +0200 Subject: [PATCH 278/583] fix tests --- pallets/ddc-staking/src/mock.rs | 1 + pallets/ddc-validator/src/mock.rs | 1 + pallets/ddc-validator/src/tests.rs | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index c82675b73..88b696b81 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -107,6 +107,7 @@ impl crate::pallet::Config for Test { type DefaultStorageChillDelay = DefaultStorageChillDelay; type RuntimeEvent = RuntimeEvent; type UnixTime = Timestamp; + type TimeProvider = Timestamp; type WeightInfo = (); type StakersPayoutSource = DdcAccountsPalletId; } diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index c398c2ac8..77e1f0718 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -273,6 +273,7 @@ impl pallet_ddc_staking::Config for Test { type RuntimeEvent = RuntimeEvent; type StakersPayoutSource = DdcAccountsPalletId; type UnixTime = Timestamp; + type TimeProvider = Timestamp; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; } diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index ab3cbad39..4d9b0bdd7 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -116,13 +116,13 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { System::set_block_number(era_block_number); // required for randomness Timestamp::set_timestamp( - (TIME_START_MS + ERA_DURATION_MS * (era_to_validate as u128 - 1)) as u64, + (DDC_ERA_START_MS + DDC_ERA_DURATION_MS * (era_to_validate as u128 - 1)) as u64, ); DdcStaking::on_finalize(era_block_number - 1); // set DDC era counter DdcValidator::on_initialize(era_block_number - 1); // make assignments Timestamp::set_timestamp( - (TIME_START_MS + ERA_DURATION_MS * (era_to_validate as u128 + 1)) as u64, + (DDC_ERA_START_MS + DDC_ERA_DURATION_MS * (era_to_validate as u128 + 1)) as u64, ); DdcStaking::on_finalize(era_block_number + 1); // inc DDC era counter StorageValueRef::persistent(ENABLE_DDC_VALIDATION_KEY).set(&true); // enable validation From 26a4ab8423baa0428c65172bbf5c682e0adce324 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 22 Aug 2023 21:15:03 +0200 Subject: [PATCH 279/583] update log info and debug --- pallets/ddc-staking/src/lib.rs | 8 ++++---- pallets/ddc-validator/src/dac.rs | 1 - pallets/ddc-validator/src/lib.rs | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 1630df783..ad5913c15 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -920,7 +920,7 @@ pub mod pallet { Ok(value) => value, Err(_) => Err(Error::::BudgetOverflow)?, }; - log::info!( + log::debug!( "Will payout to DDC stakers for era {:?} from account {:?} with total budget {:?} \ , there are {:?} stakers earned {:?} reward points with price per byte {:?}", era, @@ -935,7 +935,7 @@ pub mod pallet { for (stash, points) in era_reward_points.clone().individual { let part = Perbill::from_rational(points, era_reward_points.total); let reward: BalanceOf = part * payout_budget; - log::info!( + log::debug!( "Rewarding {:?} with {:?} points, its part is {:?}, reward size {:?}, balance \ on payout source account {:?}", stash, @@ -953,7 +953,7 @@ pub mod pallet { Rewards::::mutate(&stash, |current_balance| { *current_balance += reward; }); - log::info!("Total rewards to be inserted: {:?}", Self::rewards(&stash)); + log::debug!("Total rewards to be inserted: {:?}", Self::rewards(&stash)); PaidErasPerNode::::mutate(&stash, |current_rewards| { let rewards = EraRewardsPaid { era, reward }; current_rewards.push(rewards); @@ -964,7 +964,7 @@ pub mod pallet { era_reward_points.clone(), price_per_byte, )); - log::info!("Payout event executed"); + log::debug!("Payout event executed"); log::debug!( "Balance left on payout source account {:?}", diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index dab51abe8..8910ea70f 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -5,7 +5,6 @@ use alloc::{format, string::String}; // ToDo: remove String usage use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use codec::{Decode, Encode}; use lite_json::{json::JsonValue, json_parser::parse_json}; -use log::debug; use serde_json::{Map, Value}; use sp_runtime::{ generic::Era, diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 21ee1d199..d480a88b0 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -380,7 +380,7 @@ pub mod pallet { } last_validated_era_storage.set(¤t_ddc_era); - log::debug!("🔎 DDC validation complete for {} era.", current_ddc_era); + log::info!("🔎 DDC validation complete for {} era.", current_ddc_era); } } From 069fbe63c99c40f71ec8c526c89ddb179e9eeca3 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 23 Aug 2023 09:59:47 +0200 Subject: [PATCH 280/583] use current_era from ddc_staking --- pallets/ddc-accounts/Cargo.toml | 1 + pallets/ddc-accounts/src/lib.rs | 51 ++++++++++++++++---------------- pallets/ddc-staking/src/lib.rs | 10 +------ pallets/ddc-validator/src/lib.rs | 17 +++-------- 4 files changed, 31 insertions(+), 48 deletions(-) diff --git a/pallets/ddc-accounts/Cargo.toml b/pallets/ddc-accounts/Cargo.toml index 869e758e6..89f3de545 100644 --- a/pallets/ddc-accounts/Cargo.toml +++ b/pallets/ddc-accounts/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index ca12b1ffd..b4e4ddc6d 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -8,21 +8,17 @@ use frame_support::{ traits::{Currency, DefensiveSaturating, ExistenceRequirement, UnixTime}, BoundedVec, PalletId, }; +pub use pallet_ddc_staking::{self as ddc_staking}; use scale_info::TypeInfo; use sp_runtime::{ traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, Zero}, RuntimeDebug, SaturatedConversion, }; - use sp_staking::EraIndex; use sp_std::prelude::*; pub use pallet::*; -pub const TIME_START_MS: u128 = 1_672_531_200_000; -pub const ERA_DURATION_MS: u128 = 120_000; -pub const ERA_IN_BLOCKS: u8 = 20; - /// The balance type of this pallet. pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; @@ -158,7 +154,7 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config { + pub trait Config: frame_system::Config + ddc_staking::Config { /// The accounts's pallet id, used for deriving its sovereign account ID. #[pallet::constant] type PalletId: Get; @@ -245,9 +241,9 @@ pub mod pallet { impl GenesisBuild for GenesisConfig { fn build(&self) { let account_id = >::account_id(); - let min = T::Currency::minimum_balance(); - if T::Currency::free_balance(&account_id) < min { - let _ = T::Currency::make_free_balance_be(&account_id, min); + let min = ::Currency::minimum_balance(); + if ::Currency::free_balance(&account_id) < min { + let _ = ::Currency::make_free_balance_be(&account_id, min); } } } @@ -336,7 +332,7 @@ pub mod pallet { } // Reject a deposit which is considered to be _dust_. - if value < T::Currency::minimum_balance() { + if value < ::Currency::minimum_balance() { Err(Error::::InsufficientDeposit)? } @@ -344,7 +340,7 @@ pub mod pallet { >::insert(&stash, &controller); - let stash_balance = T::Currency::free_balance(&stash); + let stash_balance = ::Currency::free_balance(&stash); let value = value.min(stash_balance); Self::deposit_event(Event::::Deposited(stash.clone(), value)); let item = AccountsLedger { @@ -373,13 +369,13 @@ pub mod pallet { let controller = Self::bonded(&stash).ok_or(Error::::NotStash)?; let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - let stash_balance = T::Currency::free_balance(&stash); + let stash_balance = ::Currency::free_balance(&stash); let extra = stash_balance.min(max_additional); ledger.total += extra; ledger.active += extra; // Last check: the new active amount of ledger must be more than ED. ensure!( - ledger.active >= T::Currency::minimum_balance(), + ledger.active >= ::Currency::minimum_balance(), Error::::InsufficientDeposit ); @@ -424,13 +420,15 @@ pub mod pallet { ledger.active -= value; // Avoid there being a dust balance left in the accounts system. - if ledger.active < T::Currency::minimum_balance() { + if ledger.active < ::Currency::minimum_balance() { value += ledger.active; ledger.active = Zero::zero(); } + let current_era = + ddc_staking::pallet::Pallet::::current_era().ok_or("DDC era not set")?; // Note: bonding for extra era to allow for accounting - let era = Self::get_current_era() + T::BondingDuration::get(); + let era = current_era + ::BondingDuration::get(); log::debug!("Era for the unbond: {:?}", era); if let Some(mut chunk) = @@ -469,11 +467,14 @@ pub mod pallet { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; let (stash, old_total) = (ledger.stash.clone(), ledger.total); - let current_era = Self::get_current_era(); + let current_era = + ddc_staking::pallet::Pallet::::current_era().ok_or("DDC era not set")?; ledger = ledger.consolidate_unlocked(current_era); log::debug!("Current era: {:?}", current_era); - if ledger.unlocking.is_empty() && ledger.active < T::Currency::minimum_balance() { + if ledger.unlocking.is_empty() && + ledger.active < ::Currency::minimum_balance() + { log::debug!("Killing stash"); // 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 @@ -497,7 +498,12 @@ pub mod pallet { let account_id = Self::account_id(); - T::Currency::transfer(&account_id, &stash, value, ExistenceRequirement::KeepAlive)?; + ::Currency::transfer( + &account_id, + &stash, + value, + ExistenceRequirement::KeepAlive, + )?; Self::deposit_event(Event::::Withdrawn(stash, value)); } @@ -519,7 +525,7 @@ pub mod pallet { ) -> DispatchResult { let account_id = Self::account_id(); - T::Currency::transfer( + ::Currency::transfer( stash, &account_id, ledger.total, @@ -555,13 +561,6 @@ pub mod pallet { Ok(()) } - // Get the current era. - fn get_current_era() -> EraIndex { - ((T::TimeProvider::now().as_millis() - TIME_START_MS) / ERA_DURATION_MS) - .try_into() - .unwrap() - } - // Charge payments from content owners pub fn charge_payments_new( paying_accounts: Vec>>, diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index ad5913c15..e2ab974fa 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -845,7 +845,7 @@ pub mod pallet { #[pallet::weight(100_000)] pub fn payout_stakers(origin: OriginFor, era: EraIndex) -> DispatchResult { ensure_signed(origin)?; - let current_era = Self::get_current_era(); + let current_era = Self::current_era().ok_or("DDC era not set")?; ensure!(!Self::paideras(era), Error::::DoubleSpendRewards); @@ -1083,13 +1083,5 @@ pub mod pallet { } }); } - - // Get the current era; Shall we start era count from 0 or from 1? - fn get_current_era() -> EraIndex { - ((::TimeProvider::now().as_millis() - DDC_ERA_START_MS) / - DDC_ERA_DURATION_MS) - .try_into() - .unwrap() - } } } diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index d480a88b0..e9a00b0bb 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -80,9 +80,6 @@ const ENABLE_DDC_VALIDATION_KEY: &[u8; 21] = b"enable-ddc-validation"; pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); -pub const DDC_ERA_START_MS: u128 = 1_672_531_200_000; -pub const DDC_ERA_DURATION_MS: u128 = 120_000; -pub const ERA_IN_BLOCKS: u8 = 20; pub const BYTES_TO_CERE: u64 = 1; // this should have a logic built on top and adjusted /// Offchain local storage key that holds the last era in which the validator completed its @@ -497,7 +494,8 @@ pub mod pallet { let controller = ensure_signed(origin)?; log::debug!("Controller is {:?}", controller); - let era = Self::get_current_era(); + let current_era = + ddc_staking::pallet::Pallet::::current_era().ok_or("DDC era not set")?; ensure!( OffchainWorkerKeys::::contains_key(&controller), @@ -505,14 +503,14 @@ pub mod pallet { ); ensure!( - !Self::content_owners_charged(era, &controller), + !Self::content_owners_charged(current_era, &controller), Error::::ContentOwnersDoubleSpend ); let pricing: u128 = >::pricing().unwrap(); >::charge_payments_new(paying_accounts, pricing); - EraContentOwnersCharged::::insert(era, controller, true); + EraContentOwnersCharged::::insert(current_era, controller, true); Ok(()) } @@ -744,13 +742,6 @@ pub mod pallet { } } - fn get_current_era() -> EraIndex { - ((::TimeProvider::now().as_millis() - DDC_ERA_START_MS) / - DDC_ERA_DURATION_MS) - .try_into() - .unwrap() - } - fn validate_edges() -> Result<(), &'static str> { let current_ddc_era = ddc_staking::pallet::Pallet::::current_era().ok_or("DDC era not set")?; From 0b6ca691acba4b721f0fd21eaec57b7bdd6d87a7 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 23 Aug 2023 10:08:32 +0200 Subject: [PATCH 281/583] change hash type to Identity for accountId --- pallets/ddc-accounts/src/lib.rs | 4 ++-- pallets/ddc-staking/src/lib.rs | 24 +++++++++--------------- pallets/ddc-validator/src/lib.rs | 13 ++++++------- 3 files changed, 17 insertions(+), 24 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index b4e4ddc6d..526b7295c 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -169,13 +169,13 @@ pub mod pallet { /// Map from all locked "stash" accounts to the controller account. #[pallet::storage] #[pallet::getter(fn bonded)] - pub type Bonded = StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; + pub type Bonded = StorageMap<_, Identity, T::AccountId, T::AccountId>; /// Map from all (unlocked) "controller" accounts to the debug regarding the staking. #[pallet::storage] #[pallet::getter(fn ledger)] pub type Ledger = - StorageMap<_, Blake2_128Concat, T::AccountId, AccountsLedger>>; + StorageMap<_, Identity, T::AccountId, AccountsLedger>>; #[pallet::type_value] pub fn DefaultBucketCount() -> u128 { diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index e2ab974fa..2d9dd66a6 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -258,7 +258,7 @@ pub mod pallet { /// Map from all locked "stash" accounts to the controller account. #[pallet::storage] #[pallet::getter(fn bonded)] - pub type Bonded = StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; + pub type Bonded = StorageMap<_, Identity, T::AccountId, T::AccountId>; /// DDC clusters staking settings. #[pallet::storage] @@ -270,36 +270,30 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn ledger)] pub type Ledger = - StorageMap<_, Blake2_128Concat, T::AccountId, StakingLedger>>; + StorageMap<_, Identity, T::AccountId, StakingLedger>>; /// The map of (wannabe) CDN participants stash keys to the DDC cluster ID they wish to /// participate into. #[pallet::storage] #[pallet::getter(fn edges)] - pub type Edges = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; + pub type Edges = StorageMap<_, Identity, T::AccountId, ClusterId>; /// The map of (wannabe) storage network participants stash keys to the DDC cluster ID they wish /// to participate into.. #[pallet::storage] #[pallet::getter(fn storages)] - pub type Storages = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; + pub type Storages = StorageMap<_, Identity, T::AccountId, ClusterId>; /// Map from all "stash" accounts to the paid out rewards #[pallet::storage] #[pallet::getter(fn rewards)] - pub type Rewards = - StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf, ValueQuery>; + pub type Rewards = StorageMap<_, Identity, T::AccountId, BalanceOf, ValueQuery>; /// Map from all "stash" accounts to the paid out rewards #[pallet::storage] #[pallet::getter(fn paideraspernode)] - pub type PaidErasPerNode = StorageMap< - _, - Blake2_128Concat, - T::AccountId, - Vec>>, - ValueQuery, - >; + pub type PaidErasPerNode = + StorageMap<_, Identity, T::AccountId, Vec>>, ValueQuery>; // Map to check if validation decision was performed for the era #[pallet::storage] @@ -310,7 +304,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn contentownerscharged)] pub(super) type EraContentOwnersCharged = - StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, bool, ValueQuery>; + StorageDoubleMap<_, Identity, EraIndex, Twox64Concat, T::AccountId, bool, ValueQuery>; /// The current era index. /// @@ -334,7 +328,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn eras_edges_reward_points_per_node)] pub type ErasEdgesRewardPointsPerNode = - StorageMap<_, Twox64Concat, T::AccountId, Vec, ValueQuery>; + StorageMap<_, Identity, T::AccountId, Vec, ValueQuery>; /// Price per byte of the bucket traffic in smallest units of the currency. #[pallet::storage] diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index e9a00b0bb..f9ce7da87 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -222,13 +222,13 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn assignments)] pub(super) type Assignments = - StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, Vec>; + StorageDoubleMap<_, Twox64Concat, EraIndex, Identity, T::AccountId, Vec>; // Map to check if validation decision was performed for the era #[pallet::storage] #[pallet::getter(fn content_owners_charged)] pub(super) type EraContentOwnersCharged = - StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, bool, ValueQuery>; + StorageDoubleMap<_, Twox64Concat, EraIndex, Identity, T::AccountId, bool, ValueQuery>; /// A signal to start a process on all the validators. #[pallet::storage] @@ -239,19 +239,19 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn validation_decisions)] pub type ValidationDecisions = - StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, ValidationDecision>; + StorageDoubleMap<_, Twox64Concat, EraIndex, Identity, T::AccountId, ValidationDecision>; // Map to check if validation decision was performed for the era #[pallet::storage] #[pallet::getter(fn validation_decision_set_for_node)] pub(super) type ValidationDecisionSetForNode = - StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, bool, ValueQuery>; + StorageDoubleMap<_, Twox64Concat, EraIndex, Identity, T::AccountId, bool, ValueQuery>; // Map to check if reward points were set for the era #[pallet::storage] #[pallet::getter(fn reward_points_set_for_node)] pub(super) type RewardPointsSetForNode = - StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, bool, ValueQuery>; + StorageDoubleMap<_, Twox64Concat, EraIndex, Identity, T::AccountId, bool, ValueQuery>; /// The last era for which the tasks assignment produced. #[pallet::storage] @@ -261,8 +261,7 @@ pub mod pallet { /// The mapping of controller accounts to OCW public keys #[pallet::storage] #[pallet::getter(fn ocw_keys)] - pub type OffchainWorkerKeys = - StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; + pub type OffchainWorkerKeys = StorageMap<_, Identity, T::AccountId, T::AccountId>; #[pallet::error] pub enum Error { From b9d4eedf160ee6d1381c0ce8e60fa290b1c5282f Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 23 Aug 2023 10:31:30 +0200 Subject: [PATCH 282/583] add missing error types and remove unwrap from exstrinsics --- pallets/ddc-accounts/src/lib.rs | 8 +++++--- pallets/ddc-staking/src/lib.rs | 5 ++++- pallets/ddc-validator/src/lib.rs | 13 +++++++------ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index 526b7295c..773f53126 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -225,6 +225,8 @@ pub mod pallet { NoMoreChunks, /// Internal state has become somehow corrupted and the operation cannot continue. BadState, + /// Current era not set + DDCEraNotSet, } #[pallet::genesis_config] @@ -425,8 +427,8 @@ pub mod pallet { ledger.active = Zero::zero(); } - let current_era = - ddc_staking::pallet::Pallet::::current_era().ok_or("DDC era not set")?; + let current_era = ddc_staking::pallet::Pallet::::current_era() + .ok_or(Error::::DDCEraNotSet)?; // Note: bonding for extra era to allow for accounting let era = current_era + ::BondingDuration::get(); log::debug!("Era for the unbond: {:?}", era); @@ -468,7 +470,7 @@ pub mod pallet { let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; let (stash, old_total) = (ledger.stash.clone(), ledger.total); let current_era = - ddc_staking::pallet::Pallet::::current_era().ok_or("DDC era not set")?; + ddc_staking::pallet::Pallet::::current_era().ok_or(Error::::DDCEraNotSet)?; ledger = ledger.consolidate_unlocked(current_era); log::debug!("Current era: {:?}", current_era); diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 2d9dd66a6..64aa27968 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -463,6 +463,7 @@ pub mod pallet { DoubleSpendRewards, PricingNotSet, BudgetOverflow, + DDCEraNotSet, } #[pallet::hooks] @@ -839,10 +840,12 @@ pub mod pallet { #[pallet::weight(100_000)] pub fn payout_stakers(origin: OriginFor, era: EraIndex) -> DispatchResult { ensure_signed(origin)?; - let current_era = Self::current_era().ok_or("DDC era not set")?; + let current_era = Self::current_era().ok_or(Error::::DDCEraNotSet)?; + // Makes sure this era hasn't been paid out yet ensure!(!Self::paideras(era), Error::::DoubleSpendRewards); + // This should be adjusted based on the finality of validation ensure!(current_era >= era + 2, Error::::EraNotValidated); PaidEras::::insert(era, true); diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index f9ce7da87..a63706e2a 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -265,11 +265,13 @@ pub mod pallet { #[pallet::error] pub enum Error { + DDCEraNotSet, NotController, OCWKeyNotRegistered, ContentOwnersDoubleSpend, ValidationDecisionAlreadySet, NodeNotActive, + PricingNotSet, } #[pallet::event] @@ -494,7 +496,7 @@ pub mod pallet { log::debug!("Controller is {:?}", controller); let current_era = - ddc_staking::pallet::Pallet::::current_era().ok_or("DDC era not set")?; + ddc_staking::pallet::Pallet::::current_era().ok_or(Error::::DDCEraNotSet)?; ensure!( OffchainWorkerKeys::::contains_key(&controller), @@ -506,12 +508,11 @@ pub mod pallet { Error::::ContentOwnersDoubleSpend ); - let pricing: u128 = >::pricing().unwrap(); - >::charge_payments_new(paying_accounts, pricing); - + let pricing: u128 = + >::pricing().ok_or(Error::::PricingNotSet)?; EraContentOwnersCharged::::insert(current_era, controller, true); - Ok(()) + >::charge_payments_new(paying_accounts, pricing) } #[pallet::weight(100_000)] @@ -525,7 +526,7 @@ pub mod pallet { pub fn set_ocw_key(origin: OriginFor, ocw_pub: T::AccountId) -> DispatchResult { let controller = ensure_signed(origin)?; let ledger = staking::Ledger::::get(&controller).ok_or(Error::::NotController)?; - let era = staking::Pallet::::current_era().unwrap(); + let era = staking::Pallet::::current_era().ok_or(Error::::DDCEraNotSet)?; ensure!( staking::ErasStakers::::contains_key(era, &ledger.stash), From a52f28d8dc6ab4da49726685f09b050fde261817 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 23 Aug 2023 15:26:39 +0200 Subject: [PATCH 283/583] remove type TimeProvider --- Cargo.lock | 1 + pallets/ddc-accounts/src/lib.rs | 1 - pallets/ddc-staking/src/lib.rs | 2 -- pallets/ddc-staking/src/mock.rs | 1 - pallets/ddc-validator/src/lib.rs | 1 - pallets/ddc-validator/src/mock.rs | 3 --- runtime/cere-dev/src/lib.rs | 3 --- 7 files changed, 1 insertion(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dbbcfb847..3a7808820 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4833,6 +4833,7 @@ dependencies = [ "frame-support", "frame-system", "log", + "pallet-ddc-staking", "parity-scale-codec", "scale-info", "sp-io", diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index 773f53126..2cb567438 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -163,7 +163,6 @@ pub mod pallet { /// Number of eras that staked funds must remain bonded for. #[pallet::constant] type BondingDuration: Get; - type TimeProvider: UnixTime; } /// Map from all locked "stash" accounts to the controller account. diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 64aa27968..224077247 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -251,8 +251,6 @@ pub mod pallet { /// Time used for computing era index. It is guaranteed to start being called from the first /// `on_finalize`. type UnixTime: UnixTime; - - type TimeProvider: UnixTime; } /// Map from all locked "stash" accounts to the controller account. diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 88b696b81..c82675b73 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -107,7 +107,6 @@ impl crate::pallet::Config for Test { type DefaultStorageChillDelay = DefaultStorageChillDelay; type RuntimeEvent = RuntimeEvent; type UnixTime = Timestamp; - type TimeProvider = Timestamp; type WeightInfo = (); type StakersPayoutSource = DdcAccountsPalletId; } diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index a63706e2a..c29ea49cf 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -200,7 +200,6 @@ pub mod pallet { type RuntimeCall: From>; type AuthorityId: AppCrypto; - type TimeProvider: UnixTime; /// Number of validators expected to produce an individual validation decision to form a /// consensus. Tasks assignment procedure use this value to determine the number of diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index 77e1f0718..c79fc5b0e 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -253,7 +253,6 @@ impl pallet_ddc_accounts::Config for Test { type Currency = Balances; type RuntimeEvent = RuntimeEvent; type PalletId = DdcAccountsPalletId; - type TimeProvider = pallet_timestamp::Pallet; } parameter_types! { @@ -273,7 +272,6 @@ impl pallet_ddc_staking::Config for Test { type RuntimeEvent = RuntimeEvent; type StakersPayoutSource = DdcAccountsPalletId; type UnixTime = Timestamp; - type TimeProvider = Timestamp; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; } @@ -288,7 +286,6 @@ impl pallet_ddc_validator::Config for Test { type Randomness = RandomnessCollectiveFlip; type RuntimeCall = RuntimeCall; type AuthorityId = pallet_ddc_validator::crypto::TestAuthId; - type TimeProvider = pallet_timestamp::Pallet; type ValidationThreshold = ValidationThreshold; type ValidatorsMax = (); } diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 11be6ce59..803f9d3bf 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1332,7 +1332,6 @@ impl pallet_ddc_staking::Config for Runtime { type DefaultStorageBondSize = DefaultStorageBondSize; type DefaultStorageChillDelay = DefaultStorageChillDelay; type RuntimeEvent = RuntimeEvent; - type TimeProvider = pallet_timestamp::Pallet; type StakersPayoutSource = Ddc_Accounts_Pallet_Id; type UnixTime = Timestamp; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; @@ -1347,7 +1346,6 @@ impl pallet_ddc_accounts::Config for Runtime { type Currency = Balances; type PalletId = Ddc_Accounts_Pallet_Id; type RuntimeEvent = RuntimeEvent; - type TimeProvider = pallet_timestamp::Pallet; } parameter_types! { @@ -1362,7 +1360,6 @@ impl pallet_ddc_validator::Config for Runtime { type RuntimeCall = RuntimeCall; type RuntimeEvent = RuntimeEvent; type AuthorityId = pallet_ddc_validator::crypto::TestAuthId; - type TimeProvider = pallet_timestamp::Pallet; type ValidationThreshold = ValidationThreshold; type ValidatorsMax = ValidatorsMax; } From dc9c6afdb97e73a674541699b118ac7fb73a0efd Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 23 Aug 2023 15:33:23 +0200 Subject: [PATCH 284/583] remove deprecated method and rename charge_payments to charge_content_owners --- pallets/ddc-accounts/src/lib.rs | 36 +------------------------------- pallets/ddc-validator/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 36 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index 2cb567438..75a9e2ba2 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -251,40 +251,6 @@ pub mod pallet { #[pallet::call] impl Pallet { - #[pallet::weight(10_000)] - pub fn charge_payments( - origin: OriginFor, - paying_accounts: Vec>>, - ) -> DispatchResult { - let validator = ensure_signed(origin)?; - let mut total_charged = BalanceOf::::zero(); - - for bucket_details in paying_accounts.iter() { - let bucket: Bucket = Self::buckets(bucket_details.bucket_id).unwrap(); - let content_owner = bucket.owner_id; - let amount = bucket_details.amount; - - let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotController)?; - if ledger.active >= amount { - ledger.total -= amount; - ledger.active -= amount; - total_charged += amount; - Self::update_ledger(&content_owner, &ledger); - } else { - let diff = amount - ledger.active; - total_charged += ledger.active; - ledger.total -= ledger.active; - ledger.active = BalanceOf::::zero(); - let (ledger, charged) = ledger.charge_unlocking(diff); - Self::update_ledger(&content_owner, &ledger); - total_charged += charged; - } - } - Self::deposit_event(Event::::Charged(total_charged)); - - Ok(()) - } - #[pallet::weight(10_000)] pub fn create_bucket( origin: OriginFor, @@ -563,7 +529,7 @@ pub mod pallet { } // Charge payments from content owners - pub fn charge_payments_new( + pub fn charge_content_owners( paying_accounts: Vec>>, pricing: u128, ) -> DispatchResult { diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index c29ea49cf..961110cd2 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -511,7 +511,7 @@ pub mod pallet { >::pricing().ok_or(Error::::PricingNotSet)?; EraContentOwnersCharged::::insert(current_era, controller, true); - >::charge_payments_new(paying_accounts, pricing) + >::charge_content_owners(paying_accounts, pricing) } #[pallet::weight(100_000)] From eb68fbc14bb7c9c7f0e71116ea08e3cd756314e6 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 23 Aug 2023 15:34:43 +0200 Subject: [PATCH 285/583] remove obsolete method; payout_cdn_owners can be called directly from ddc-staking --- pallets/ddc-validator/src/lib.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 961110cd2..4ae5764bc 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -511,14 +511,7 @@ pub mod pallet { >::pricing().ok_or(Error::::PricingNotSet)?; EraContentOwnersCharged::::insert(current_era, controller, true); - >::charge_content_owners(paying_accounts, pricing) - } - - #[pallet::weight(100_000)] - pub fn payout_cdn_owners(origin: OriginFor, era: EraIndex) -> DispatchResult { - ensure_signed(origin)?; - - >::do_payout_stakers(era) + >::charge_content_owners(paying_accounts, pricing) } #[pallet::weight(100_000)] From 6ea65792ff9816ce48c031dcee9e3534724f8bc8 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 23 Aug 2023 15:36:08 +0200 Subject: [PATCH 286/583] remove obsolete method set_era_reward_points --- pallets/ddc-staking/src/lib.rs | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 224077247..cf065f122 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -850,39 +850,6 @@ pub mod pallet { Self::do_payout_stakers(era) } - /// Set reward points for CDN participants at the given era. - /// - /// The dispatch origin for this call must be _Signed_ by the validator. - /// - /// `stakers_points` is a vector of (stash account ID, reward points) pairs. The rewards - /// distribution will be based on total reward points, with each CDN participant receiving a - /// proportionate reward based on their individual reward points. - /// - /// See also [`ErasEdgesRewardPoints`]. - #[pallet::weight(100_000)] - pub fn set_era_reward_points( - origin: OriginFor, - era: EraIndex, - stakers_points: Vec<(T::AccountId, u64)>, - ) -> DispatchResult { - ensure_signed(origin)?; - - // ToDo: ensure origin is a validator eligible to set rewards - - // Check that a staker mentioned only once, fail with an error otherwise. - let unique_stakers_count = - stakers_points.iter().map(|(staker, _)| staker).collect::>().len(); - if unique_stakers_count != stakers_points.len() { - Err(Error::::DuplicateRewardPoints)? - } - - // ToDo: check that all accounts had an active stake at the era - - Self::reward_by_ids(era, stakers_points); - - Ok(()) - } - /// Set price per byte of the bucket traffic in smallest units of the currency. /// /// The dispatch origin for this call must be _Root_. From db20b704824a5d6f82418f1ab2dbd83044b3ed54 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 24 Aug 2023 10:36:44 +0200 Subject: [PATCH 287/583] fix comments for errors and exstrinsics --- pallets/ddc-accounts/src/lib.rs | 4 +-- pallets/ddc-staking/src/lib.rs | 30 ++++++++++++------- pallets/ddc-validator/src/lib.rs | 51 ++++++++++++++++---------------- 3 files changed, 47 insertions(+), 38 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index 75a9e2ba2..9e892a90e 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -185,7 +185,7 @@ pub mod pallet { pub type BucketsCount = StorageValue>; - /// Map from all locked accounts and their buckets to the bucket structure + /// Map from bucket ID to to the bucket structure #[pallet::storage] #[pallet::getter(fn buckets)] pub type Buckets = @@ -224,7 +224,7 @@ pub mod pallet { NoMoreChunks, /// Internal state has become somehow corrupted and the operation cannot continue. BadState, - /// Current era not set + /// Current era not set during runtime DDCEraNotSet, } diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index cf065f122..4f1482181 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -88,7 +88,7 @@ pub struct EraRewardPoints { pub individual: BTreeMap, } -/// Reward points of an era. Used to split era total payout between stakers. +/// Reward points for particular era. To be used in a mapping. #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Clone)] pub struct EraRewardPointsPerNode { /// Era points accrued @@ -282,28 +282,28 @@ pub mod pallet { #[pallet::getter(fn storages)] pub type Storages = StorageMap<_, Identity, T::AccountId, ClusterId>; - /// Map from all "stash" accounts to the paid out rewards + /// Map from all "stash" accounts to the total paid out rewards + /// + /// P.S. Not part of Mainnet #[pallet::storage] #[pallet::getter(fn rewards)] pub type Rewards = StorageMap<_, Identity, T::AccountId, BalanceOf, ValueQuery>; - /// Map from all "stash" accounts to the paid out rewards + /// Map from all "stash" accounts to the paid out rewards per era + /// + /// P.S. Not part of Mainnet #[pallet::storage] #[pallet::getter(fn paideraspernode)] pub type PaidErasPerNode = StorageMap<_, Identity, T::AccountId, Vec>>, ValueQuery>; - // Map to check if validation decision was performed for the era + /// Map to check if CDN participants received payments for specific era + /// + /// Used to avoid double-spend in method [payout_stakers] #[pallet::storage] #[pallet::getter(fn paideras)] pub(super) type PaidEras = StorageMap<_, Twox64Concat, EraIndex, bool, ValueQuery>; - // Map to check if validation decision was performed for the era - #[pallet::storage] - #[pallet::getter(fn contentownerscharged)] - pub(super) type EraContentOwnersCharged = - StorageDoubleMap<_, Identity, EraIndex, Twox64Concat, T::AccountId, bool, ValueQuery>; - /// The current era index. /// /// This is the latest planned era, depending on how the Session pallet queues the validator @@ -313,6 +313,7 @@ pub mod pallet { pub type CurrentEra = StorageValue<_, EraIndex>; /// The reward each CDN participant earned in the era. + /// Mapping from Era to vector of CDN participants and respective rewards /// /// See also [`pallet_staking::ErasRewardPoints`]. #[pallet::storage] @@ -321,8 +322,9 @@ pub mod pallet { StorageMap<_, Twox64Concat, EraIndex, EraRewardPoints, ValueQuery>; /// The reward each CDN participant earned in the era. + /// Mapping from each CDN participant to vector of eras and rewards /// - /// See also [`pallet_staking::ErasRewardPoints`]. + /// P.S. Not part of Mainnet #[pallet::storage] #[pallet::getter(fn eras_edges_reward_points_per_node)] pub type ErasEdgesRewardPointsPerNode = @@ -456,11 +458,17 @@ pub mod pallet { AlreadyInRole, /// Action is allowed at some point of time in future not reached yet. TooEarly, + /// We are not yet sure that era has been valdiated by this time EraNotValidated, + /// Attempt to assign reward point for some era more than once DuplicateRewardPoints, + /// Attempt to double spend the assigned rewards per era DoubleSpendRewards, + /// Pricing has not been set by sudo PricingNotSet, + /// Payout amount overflows BudgetOverflow, + /// Current era not set during runtime DDCEraNotSet, } diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 4ae5764bc..c29112c98 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -223,7 +223,8 @@ pub mod pallet { pub(super) type Assignments = StorageDoubleMap<_, Twox64Concat, EraIndex, Identity, T::AccountId, Vec>; - // Map to check if validation decision was performed for the era + /// Map to from era and account ID to bool indicateing that a particular content owner was + /// charged for the era #[pallet::storage] #[pallet::getter(fn content_owners_charged)] pub(super) type EraContentOwnersCharged = @@ -264,13 +265,20 @@ pub mod pallet { #[pallet::error] pub enum Error { - DDCEraNotSet, + /// Caller is not controller of validator node NotController, + /// OCW key has not been registered by validator OCWKeyNotRegistered, + /// Attempt to charge content owners twice ContentOwnersDoubleSpend, + /// Validation decision has been already set for CDN node for some era ValidationDecisionAlreadySet, + /// Node is not participating in the network NodeNotActive, + /// Pricing has not been set by sudo PricingNotSet, + /// Current era not set during runtime + DDCEraNotSet, } #[pallet::event] @@ -398,6 +406,10 @@ pub mod pallet { } /// Set validation decision for a given CDN node in an era. + /// + /// Only registered validator keys can call this exstrinsic. + /// Validation decision can be set only once per era per CDN node. + /// CDN node should be active. #[pallet::weight(10_000)] pub fn set_validation_decision( origin: OriginFor, @@ -438,14 +450,13 @@ pub mod pallet { /// Set reward points for CDN participants at the given era. /// - /// ToDo: remove it when the off-chain worker will be able to set reward points using the - /// same call defined in `pallet-ddc-staking`. + /// Only registered validator keys can call this exstrinsic. + /// Reward points can be set only once per era per CDN node. + /// CDN node should be active. /// /// `stakers_points` is a vector of (stash account ID, reward points) pairs. The rewards /// distribution will be based on total reward points, with each CDN participant receiving a /// proportionate reward based on their individual reward points. - /// - /// See also [`pallet_ddc_staking::ErasEdgesRewardPoints`]. #[pallet::weight(100_000)] pub fn set_era_reward_points( origin: OriginFor, @@ -462,9 +473,7 @@ pub mod pallet { >::mutate(era, |era_rewards| { for (staker, points) in stakers_points.clone().into_iter() { if !Self::reward_points_set_for_node(era, &staker) { - // check if rewards were not yet set for era for node if >::contains_key(&staker) { - // check if node is active *era_rewards.individual.entry(staker.clone()).or_default() += points; era_rewards.total += points; >::mutate( @@ -486,30 +495,34 @@ pub mod pallet { Ok(()) } + /// Exstrinsic deducts balances of content owners + /// + /// Only registered validator keys can call this exstrinsic. + /// Reward points can be set only once per era per validator. #[pallet::weight(100_000)] pub fn charge_payments_content_owners( origin: OriginFor, paying_accounts: Vec>>, ) -> DispatchResult { - let controller = ensure_signed(origin)?; - log::debug!("Controller is {:?}", controller); + let validator_ocw = ensure_signed(origin)?; + log::debug!("validator is {:?}", validator_ocw); let current_era = ddc_staking::pallet::Pallet::::current_era().ok_or(Error::::DDCEraNotSet)?; ensure!( - OffchainWorkerKeys::::contains_key(&controller), + OffchainWorkerKeys::::contains_key(&validator_ocw), Error::::OCWKeyNotRegistered ); ensure!( - !Self::content_owners_charged(current_era, &controller), + !Self::content_owners_charged(current_era, &validator_ocw), Error::::ContentOwnersDoubleSpend ); let pricing: u128 = >::pricing().ok_or(Error::::PricingNotSet)?; - EraContentOwnersCharged::::insert(current_era, controller, true); + EraContentOwnersCharged::::insert(current_era, validator_ocw, true); >::charge_content_owners(paying_accounts, pricing) } @@ -565,18 +578,6 @@ pub mod pallet { Ok(signer) } - fn validate(bytes_sent: &dac::BytesSent, bytes_received: &dac::BytesReceived) -> bool { - let percentage_difference = 1f32 - (bytes_received.sum as f32 / bytes_sent.sum as f32); - - return if percentage_difference >= 0.0 && - (T::ValidationThreshold::get() as f32 - percentage_difference) > 0.0 - { - true - } else { - false - } - } - fn is_valid(bytes_sent: u64, bytes_received: u64) -> bool { if bytes_sent == bytes_received { return true From e7f081e5425b60e6ba60811d11cebdd43dfee8ca Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 24 Aug 2023 13:28:22 +0200 Subject: [PATCH 288/583] rename ocw key to validator key & some formatting --- pallets/ddc-validator/src/lib.rs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index c29112c98..f8eb7f6cb 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -268,7 +268,7 @@ pub mod pallet { /// Caller is not controller of validator node NotController, /// OCW key has not been registered by validator - OCWKeyNotRegistered, + DDCValidatorKeyNotRegistered, /// Attempt to charge content owners twice ContentOwnersDoubleSpend, /// Validation decision has been already set for CDN node for some era @@ -316,7 +316,7 @@ pub mod pallet { }; log::debug!("Current DDC era: {:?}.", current_ddc_era); - // Produce an assignment for the next era if it's not produced yet. + // Skip assignment if already exists for current era match Self::last_managed_era() { Some(last_managed_era) if current_ddc_era < last_managed_era => return Weight::from_ref_time(0), @@ -331,7 +331,7 @@ pub mod pallet { Weight::from_ref_time(0) } - fn offchain_worker(block_number: T::BlockNumber) { + fn offchain_worker(_block_number: T::BlockNumber) { // Skip if not a validator. if !sp_io::offchain::is_validator() { return @@ -421,7 +421,7 @@ pub mod pallet { ensure!( OffchainWorkerKeys::::contains_key(&controller), - Error::::OCWKeyNotRegistered + Error::::DDCValidatorKeyNotRegistered ); ensure!( @@ -467,7 +467,7 @@ pub mod pallet { ensure!( OffchainWorkerKeys::::contains_key(&controller), - Error::::OCWKeyNotRegistered + Error::::DDCValidatorKeyNotRegistered ); >::mutate(era, |era_rewards| { @@ -512,9 +512,11 @@ pub mod pallet { ensure!( OffchainWorkerKeys::::contains_key(&validator_ocw), - Error::::OCWKeyNotRegistered + Error::::DDCValidatorKeyNotRegistered ); + // ToDo check that key is in active validator set + ensure!( !Self::content_owners_charged(current_era, &validator_ocw), Error::::ContentOwnersDoubleSpend @@ -528,14 +530,13 @@ pub mod pallet { } #[pallet::weight(100_000)] - pub fn set_ocw_key(origin: OriginFor, ocw_pub: T::AccountId) -> DispatchResult { + pub fn set_validator_key(origin: OriginFor, ocw_pub: T::AccountId) -> DispatchResult { let controller = ensure_signed(origin)?; let ledger = staking::Ledger::::get(&controller).ok_or(Error::::NotController)?; - let era = staking::Pallet::::current_era().ok_or(Error::::DDCEraNotSet)?; ensure!( - staking::ErasStakers::::contains_key(era, &ledger.stash), - Error::::NotController + staking::Validators::::contains_key(&ledger.stash), + Error::::NotController // ToDo change error type ); OffchainWorkerKeys::::insert(ocw_pub, controller); From bccba8a46e2ccb7ded18c211754a77f2c5f258d5 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 24 Aug 2023 13:52:54 +0200 Subject: [PATCH 289/583] add another safety check to verify that stash key belonging to validator who registered the ddc validator key is in the active set --- pallets/ddc-validator/src/lib.rs | 69 +++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index f8eb7f6cb..2fca6f69e 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -82,13 +82,7 @@ pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); pub const BYTES_TO_CERE: u64 = 1; // this should have a logic built on top and adjusted -/// Offchain local storage key that holds the last era in which the validator completed its -/// assignment. -const LAST_VALIDATED_ERA_LOCK_KEY: &[u8; 45] = b"pallet-ddc-validator::last-validated-era-lock"; -const LAST_VALIDATED_ERA_STORAGE_KEY: &[u8; 48] = - b"pallet-ddc-validator::last-validated-era-storage"; /// Webdis in experimental cluster connected to Redis in dev. -// pub const DEFAULT_DATA_PROVIDER_URL: &str = "https://dev-dac-redis.network-dev.aws.cere.io"; pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://webdis:7379"; // pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; @@ -258,15 +252,17 @@ pub mod pallet { #[pallet::getter(fn last_managed_era)] pub type LastManagedEra = StorageValue<_, EraIndex>; - /// The mapping of controller accounts to OCW public keys + /// The mapping of ddc validator keys to validator stash keys #[pallet::storage] - #[pallet::getter(fn ocw_keys)] + #[pallet::getter(fn get_stash_for_ddc_validator)] pub type OffchainWorkerKeys = StorageMap<_, Identity, T::AccountId, T::AccountId>; #[pallet::error] pub enum Error { /// Caller is not controller of validator node NotController, + /// Checked stash is not an active validator + NotValidatorStash, /// OCW key has not been registered by validator DDCValidatorKeyNotRegistered, /// Attempt to charge content owners twice @@ -408,6 +404,7 @@ pub mod pallet { /// Set validation decision for a given CDN node in an era. /// /// Only registered validator keys can call this exstrinsic. + /// Validator should be in the active set. /// Validation decision can be set only once per era per CDN node. /// CDN node should be active. #[pallet::weight(10_000)] @@ -417,13 +414,20 @@ pub mod pallet { cdn_node: T::AccountId, validation_decision: ValidationDecision, ) -> DispatchResult { - let controller = ensure_signed(origin)?; + let ddc_valitor_key = ensure_signed(origin)?; ensure!( - OffchainWorkerKeys::::contains_key(&controller), + OffchainWorkerKeys::::contains_key(&ddc_valitor_key), Error::::DDCValidatorKeyNotRegistered ); + ensure!( + staking::Validators::::contains_key(Self::get_stash_for_ddc_validator( + &ddc_valitor_key).unwrap() + ), + Error::::NotValidatorStash + ); + ensure!( !Self::validation_decision_set_for_node(era, &cdn_node), Error::::ValidationDecisionAlreadySet @@ -433,7 +437,6 @@ pub mod pallet { >::contains_key(&cdn_node), Error::::NodeNotActive ); - // ToDo: check if the era is current - 1. ValidationDecisions::::insert(era, cdn_node.clone(), validation_decision.clone()); @@ -451,6 +454,7 @@ pub mod pallet { /// Set reward points for CDN participants at the given era. /// /// Only registered validator keys can call this exstrinsic. + /// Validator should be in the active set. /// Reward points can be set only once per era per CDN node. /// CDN node should be active. /// @@ -463,13 +467,20 @@ pub mod pallet { era: EraIndex, stakers_points: Vec<(T::AccountId, u64)>, ) -> DispatchResult { - let controller = ensure_signed(origin)?; + let ddc_valitor_key = ensure_signed(origin)?; ensure!( - OffchainWorkerKeys::::contains_key(&controller), + OffchainWorkerKeys::::contains_key(&ddc_valitor_key), Error::::DDCValidatorKeyNotRegistered ); + ensure!( + staking::Validators::::contains_key(Self::get_stash_for_ddc_validator( + &ddc_valitor_key).unwrap() + ), + Error::::NotValidatorStash + ); + >::mutate(era, |era_rewards| { for (staker, points) in stakers_points.clone().into_iter() { if !Self::reward_points_set_for_node(era, &staker) { @@ -504,42 +515,54 @@ pub mod pallet { origin: OriginFor, paying_accounts: Vec>>, ) -> DispatchResult { - let validator_ocw = ensure_signed(origin)?; - log::debug!("validator is {:?}", validator_ocw); + let ddc_valitor_key = ensure_signed(origin)?; + log::debug!("validator is {:?}", &ddc_valitor_key); let current_era = ddc_staking::pallet::Pallet::::current_era().ok_or(Error::::DDCEraNotSet)?; ensure!( - OffchainWorkerKeys::::contains_key(&validator_ocw), + OffchainWorkerKeys::::contains_key(&ddc_valitor_key), Error::::DDCValidatorKeyNotRegistered ); - // ToDo check that key is in active validator set + ensure!( + staking::Validators::::contains_key(Self::get_stash_for_ddc_validator( + &ddc_valitor_key).unwrap() + ), + Error::::NotValidatorStash + ); ensure!( - !Self::content_owners_charged(current_era, &validator_ocw), + !Self::content_owners_charged(current_era, &ddc_valitor_key), Error::::ContentOwnersDoubleSpend ); let pricing: u128 = >::pricing().ok_or(Error::::PricingNotSet)?; - EraContentOwnersCharged::::insert(current_era, validator_ocw, true); + EraContentOwnersCharged::::insert(current_era, ddc_valitor_key, true); >::charge_content_owners(paying_accounts, pricing) } + /// Exstrinsic registers a ddc validator key for future use + /// + /// Only controller of validator can call this exstrinsic + /// Validator has to be in the active set #[pallet::weight(100_000)] - pub fn set_validator_key(origin: OriginFor, ocw_pub: T::AccountId) -> DispatchResult { + pub fn set_validator_key( + origin: OriginFor, + ddc_validator_pub: T::AccountId, + ) -> DispatchResult { let controller = ensure_signed(origin)?; let ledger = staking::Ledger::::get(&controller).ok_or(Error::::NotController)?; ensure!( staking::Validators::::contains_key(&ledger.stash), - Error::::NotController // ToDo change error type + Error::::NotValidatorStash ); - OffchainWorkerKeys::::insert(ocw_pub, controller); + OffchainWorkerKeys::::insert(ddc_validator_pub, &ledger.stash); Ok(()) } } @@ -901,7 +924,7 @@ pub mod pallet { let signer = Self::get_signer().unwrap(); - let tx_res = + let _tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { era: current_ddc_era - 1, cdn_node: utils::string_to_account::(edge.clone()), From b295a3c046971cc8f51661826c77a10fa4baa6d4 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 24 Aug 2023 13:58:55 +0200 Subject: [PATCH 290/583] simplify do_payout_stakers --- pallets/ddc-staking/src/lib.rs | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 4f1482181..ab96cd6ae 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -871,8 +871,7 @@ pub mod pallet { impl Pallet { pub fn do_payout_stakers(era: EraIndex) -> DispatchResult { - // ToDo: check that the era is finished - // ToDo: check reward points are set + // ToDo: check that validation is finalised for era let era_reward_points: EraRewardPoints = >::get(&era); @@ -885,32 +884,18 @@ pub mod pallet { // An account we withdraw the funds from and the amount of funds to withdraw. let payout_source_account: T::AccountId = T::StakersPayoutSource::get().into_account_truncating(); - let payout_budget: BalanceOf = - match (price_per_byte * era_reward_points.total as u128).try_into() { - Ok(value) => value, - Err(_) => Err(Error::::BudgetOverflow)?, - }; - log::debug!( - "Will payout to DDC stakers for era {:?} from account {:?} with total budget {:?} \ - , there are {:?} stakers earned {:?} reward points with price per byte {:?}", - era, - payout_source_account, - payout_budget, - era_reward_points.individual.len(), - era_reward_points.total, - price_per_byte, - ); // Transfer a part of the budget to each CDN participant rewarded this era. for (stash, points) in era_reward_points.clone().individual { - let part = Perbill::from_rational(points, era_reward_points.total); - let reward: BalanceOf = part * payout_budget; + let reward: BalanceOf = match (points as u128 * price_per_byte).try_into() { + Ok(value) => value, + Err(_) => Err(Error::::BudgetOverflow)?, + }; log::debug!( - "Rewarding {:?} with {:?} points, its part is {:?}, reward size {:?}, balance \ + "Rewarding {:?} with {:?} points, reward size {:?}, balance \ on payout source account {:?}", stash, points, - part, reward, T::Currency::free_balance(&payout_source_account) ); From 76687df3d48a6731ebbb8c40eb2e3bc6a674b55d Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 24 Aug 2023 22:35:04 +0200 Subject: [PATCH 291/583] update validator tests --- pallets/ddc-staking/src/lib.rs | 4 ++-- pallets/ddc-validator/src/tests.rs | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index ab96cd6ae..0fa560a08 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -59,10 +59,10 @@ pub use pallet::*; /// /// If you are changing this, check `on_finalize` hook to ensure `CurrentEra` is capable to hold the /// value with the new era duration. -const DDC_ERA_DURATION_MS: u128 = 120_000; +pub const DDC_ERA_DURATION_MS: u128 = 120_000; /// 2023-01-01 00:00:00 UTC -const DDC_ERA_START_MS: u128 = 1_672_531_200_000; +pub const DDC_ERA_START_MS: u128 = 1_672_531_200_000; const DDC_STAKING_ID: LockIdentifier = *b"ddcstake"; // DDC maintainer's stake /// Counter for the number of "reward" points earned by a given staker. diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index 4d9b0bdd7..745deb3f8 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -2,6 +2,7 @@ use super::*; use crate::mock::{Timestamp, *}; use codec::Decode; use pallet_ddc_accounts::BucketsDetails; +use pallet_ddc_staking::{DDC_ERA_DURATION_MS, DDC_ERA_START_MS}; use sp_core::offchain::{testing, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt}; use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; use sp_runtime::offchain::storage::StorageValueRef; @@ -112,7 +113,7 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { } t.execute_with(|| { - let era_block_number = ERA_IN_BLOCKS as u32 * era_to_validate; + let era_block_number = 20 as u32 * era_to_validate; System::set_block_number(era_block_number); // required for randomness Timestamp::set_timestamp( @@ -152,7 +153,7 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { assert!(tx.signature.is_some()); assert_eq!( tx.call, - crate::mock::RuntimeCall::DdcValidator(crate::Call::payout_cdn_owners { + crate::mock::RuntimeCall::DdcStaking(pallet_ddc_staking::Call::payout_stakers { era: era_to_validate + 1 }) ); From cbf0f1ff164cf01305944513a3b560cb2a2a8dfb Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 24 Aug 2023 22:37:59 +0200 Subject: [PATCH 292/583] use snake_case for getters --- pallets/ddc-staking/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 0fa560a08..134d45a78 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -293,7 +293,7 @@ pub mod pallet { /// /// P.S. Not part of Mainnet #[pallet::storage] - #[pallet::getter(fn paideraspernode)] + #[pallet::getter(fn paid_eras_per_node)] pub type PaidErasPerNode = StorageMap<_, Identity, T::AccountId, Vec>>, ValueQuery>; @@ -301,7 +301,7 @@ pub mod pallet { /// /// Used to avoid double-spend in method [payout_stakers] #[pallet::storage] - #[pallet::getter(fn paideras)] + #[pallet::getter(fn paid_eras)] pub(super) type PaidEras = StorageMap<_, Twox64Concat, EraIndex, bool, ValueQuery>; /// The current era index. @@ -849,7 +849,7 @@ pub mod pallet { let current_era = Self::current_era().ok_or(Error::::DDCEraNotSet)?; // Makes sure this era hasn't been paid out yet - ensure!(!Self::paideras(era), Error::::DoubleSpendRewards); + ensure!(!Self::paid_eras(era), Error::::DoubleSpendRewards); // This should be adjusted based on the finality of validation ensure!(current_era >= era + 2, Error::::EraNotValidated); From e723bd2ad660c6a760c2e2d29b217a53714124c2 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 24 Aug 2023 22:43:58 +0200 Subject: [PATCH 293/583] deposit events should be placed in the end of an exstrinsic as they are not reversible --- pallets/ddc-accounts/src/lib.rs | 11 ++++------- pallets/ddc-staking/src/lib.rs | 4 ++-- pallets/ddc-validator/src/lib.rs | 22 +++++++++++----------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index 9e892a90e..1f24c4449 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -53,12 +53,6 @@ pub struct BucketsDetails { pub amount: Balance, } -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct ReceiverDetails { - cdn_owner: AccountId, - amount: Balance, -} - #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct AccountsLedger { /// The stash account whose balance is actually locked and can be used for CDN usage. @@ -251,6 +245,9 @@ pub mod pallet { #[pallet::call] impl Pallet { + /// Create new bucket with provided public availability & reserved resources + /// + /// Anyone can create a bucket #[pallet::weight(10_000)] pub fn create_bucket( origin: OriginFor, @@ -309,7 +306,6 @@ pub mod pallet { let stash_balance = ::Currency::free_balance(&stash); let value = value.min(stash_balance); - Self::deposit_event(Event::::Deposited(stash.clone(), value)); let item = AccountsLedger { stash: stash.clone(), total: value, @@ -317,6 +313,7 @@ pub mod pallet { unlocking: Default::default(), }; Self::update_ledger_and_deposit(&stash, &controller, &item)?; + Self::deposit_event(Event::::Deposited(stash.clone(), value)); Ok(()) } diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 134d45a78..f355c3d8a 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -528,15 +528,15 @@ pub mod pallet { let stash_balance = T::Currency::free_balance(&stash); let value = value.min(stash_balance); - Self::deposit_event(Event::::Bonded(stash.clone(), value)); let item = StakingLedger { - stash, + stash: stash.clone(), total: value, active: value, chilling: Default::default(), unlocking: Default::default(), }; Self::update_ledger(&controller, &item); + Self::deposit_event(Event::::Bonded(stash, value)); Ok(()) } diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 2fca6f69e..3658306da 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -422,8 +422,8 @@ pub mod pallet { ); ensure!( - staking::Validators::::contains_key(Self::get_stash_for_ddc_validator( - &ddc_valitor_key).unwrap() + staking::Validators::::contains_key( + Self::get_stash_for_ddc_validator(&ddc_valitor_key).unwrap() ), Error::::NotValidatorStash ); @@ -440,14 +440,14 @@ pub mod pallet { ValidationDecisions::::insert(era, cdn_node.clone(), validation_decision.clone()); + ValidationDecisionSetForNode::::insert(era, cdn_node.clone(), true); + Self::deposit_event(Event::::ValidationDecision( era, - cdn_node.clone(), + cdn_node, validation_decision, )); - ValidationDecisionSetForNode::::insert(era, cdn_node, true); - Ok(()) } @@ -475,8 +475,8 @@ pub mod pallet { ); ensure!( - staking::Validators::::contains_key(Self::get_stash_for_ddc_validator( - &ddc_valitor_key).unwrap() + staking::Validators::::contains_key( + Self::get_stash_for_ddc_validator(&ddc_valitor_key).unwrap() ), Error::::NotValidatorStash ); @@ -527,8 +527,8 @@ pub mod pallet { ); ensure!( - staking::Validators::::contains_key(Self::get_stash_for_ddc_validator( - &ddc_valitor_key).unwrap() + staking::Validators::::contains_key( + Self::get_stash_for_ddc_validator(&ddc_valitor_key).unwrap() ), Error::::NotValidatorStash ); @@ -546,8 +546,8 @@ pub mod pallet { } /// Exstrinsic registers a ddc validator key for future use - /// - /// Only controller of validator can call this exstrinsic + /// + /// Only controller of validator can call this exstrinsic /// Validator has to be in the active set #[pallet::weight(100_000)] pub fn set_validator_key( From 5da16c40cd0a4d2bd698d3cdb5b68da287b57e14 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 25 Aug 2023 14:27:09 +0200 Subject: [PATCH 294/583] remove unnecessary moethds and unused imports; change naming --- pallets/ddc-accounts/src/lib.rs | 5 +- pallets/ddc-staking/src/lib.rs | 16 +- pallets/ddc-validator/src/dac.rs | 287 +---------------------------- pallets/ddc-validator/src/lib.rs | 26 +-- pallets/ddc-validator/src/shm.rs | 2 +- pallets/ddc-validator/src/utils.rs | 1 - 6 files changed, 20 insertions(+), 317 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index 1f24c4449..dc2edbbf5 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -5,7 +5,7 @@ use codec::{Decode, Encode, HasCompact}; use frame_support::{ parameter_types, - traits::{Currency, DefensiveSaturating, ExistenceRequirement, UnixTime}, + traits::{Currency, DefensiveSaturating, ExistenceRequirement}, BoundedVec, PalletId, }; pub use pallet_ddc_staking::{self as ddc_staking}; @@ -138,7 +138,6 @@ pub mod pallet { use super::*; use frame_support::{ pallet_prelude::*, sp_runtime::traits::StaticLookup, traits::LockableCurrency, - Blake2_128Concat, }; use frame_system::pallet_prelude::*; @@ -164,7 +163,7 @@ pub mod pallet { #[pallet::getter(fn bonded)] pub type Bonded = StorageMap<_, Identity, T::AccountId, T::AccountId>; - /// Map from all (unlocked) "controller" accounts to the debug regarding the staking. + /// Map from all (unlocked) "controller" accounts to the info regarding the staking. #[pallet::storage] #[pallet::getter(fn ledger)] pub type Ledger = diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index f355c3d8a..f192687a6 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -30,7 +30,6 @@ use crate::weights::WeightInfo; use codec::{Decode, Encode, HasCompact}; use frame_support::{ assert_ok, - dispatch::Codec, pallet_prelude::*, parameter_types, traits::{ @@ -42,16 +41,11 @@ use frame_support::{ use frame_system::pallet_prelude::*; use scale_info::TypeInfo; use sp_runtime::{ - traits::{ - AccountIdConversion, AtLeast32BitUnsigned, CheckedSub, Saturating, StaticLookup, Zero, - }, - Perbill, RuntimeDebug, + traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, StaticLookup, Zero}, + RuntimeDebug, }; use sp_staking::EraIndex; -use sp_std::{ - collections::{btree_map::BTreeMap, btree_set::BTreeSet}, - prelude::*, -}; +use sp_std::{collections::btree_map::BTreeMap, prelude::*}; pub use pallet::*; @@ -528,15 +522,15 @@ pub mod pallet { let stash_balance = T::Currency::free_balance(&stash); let value = value.min(stash_balance); + Self::deposit_event(Event::::Bonded(stash.clone(), value)); let item = StakingLedger { - stash: stash.clone(), + stash, total: value, active: value, chilling: Default::default(), unlocking: Default::default(), }; Self::update_ledger(&controller, &item); - Self::deposit_event(Event::::Bonded(stash, value)); Ok(()) } diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index 8910ea70f..a4c81320f 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -1,19 +1,10 @@ //! A module with Data Activity Capture (DAC) interaction. use crate::{utils, DacTotalAggregates, ValidationDecision}; -use alloc::{format, string::String}; // ToDo: remove String usage +use alloc::string::String; // ToDo: remove String usage use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use codec::{Decode, Encode}; -use lite_json::{json::JsonValue, json_parser::parse_json}; -use serde_json::{Map, Value}; -use sp_runtime::{ - generic::Era, - offchain::{ - http, - http::{Method, Request}, - Duration, - }, -}; +use sp_runtime::offchain::{http, Duration}; use sp_staking::EraIndex; pub use sp_std::{ collections::{btree_map::BTreeMap, btree_set::BTreeSet}, @@ -192,47 +183,6 @@ pub(crate) struct FinalDecision { #[serde(crate = "alt_serde")] pub(crate) struct FinalDecisions(BTreeMap); -impl BytesSent { - pub fn new(aggregate: RedisFtAggregate) -> BytesSent { - let data = aggregate.ft_aggregate[1].clone(); - - match data { - FtAggregate::Node(node) => - return BytesSent { - node_public_key: node[1].clone(), - era: node[3].clone().parse::().expect("era must be convertible u32") - as EraIndex, - sum: node[5].parse::().expect("bytesSentSum must be convertible to u32"), - }, - FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), - } - } - - pub fn get_all(aggregation: RedisFtAggregate) -> Vec { - let mut res: Vec = vec![]; - for i in 1..aggregation.ft_aggregate.len() { - let data = aggregation.ft_aggregate[i].clone(); - match data { - FtAggregate::Node(node) => { - let node = BytesSent { - node_public_key: node[1].clone(), - era: node[3].clone().parse::().expect("era must be convertible u32") - as EraIndex, - sum: node[5] - .parse::() - .expect("bytesSentSum must be convertible to u32"), - }; - - res.push(node); - }, - FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), - } - } - - return res - } -} - #[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] pub struct BytesReceived { pub node_public_key: String, @@ -240,55 +190,12 @@ pub struct BytesReceived { pub sum: u32, } -impl BytesReceived { - pub fn new(aggregate: RedisFtAggregate) -> BytesReceived { - let data = aggregate.ft_aggregate[1].clone(); - - match data { - FtAggregate::Node(node) => - return BytesReceived { - node_public_key: node[1].clone(), - era: node[3].clone().parse::().expect("era must be convertible u32") - as EraIndex, - sum: node[5] - .parse::() - .expect("bytesReceivedSum must be convertible to u32"), - }, - FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), - } - } - - pub fn get_all(aggregation: RedisFtAggregate) -> Vec { - let mut res: Vec = vec![]; - for i in 1..aggregation.ft_aggregate.len() { - let data = aggregation.ft_aggregate[i].clone(); - match data { - FtAggregate::Node(node) => { - let node = BytesReceived { - node_public_key: node[1].clone(), - era: node[3].clone().parse::().expect("era must be convertible u32") - as EraIndex, - sum: node[5] - .parse::() - .expect("bytesReceivedSum must be convertible to u32"), - }; - - res.push(node); - }, - FtAggregate::Length(_) => panic!("[DAC Validator] Not a Node"), - } - } - - return res - } -} - fn get_timestamps_with_ack(file_requests: &Requests) -> Vec { let mut timestamps: Vec = Vec::new(); for (_, file_request) in file_requests { for (_, chunk) in &file_request.chunks { - if let Some(ack) = &chunk.ack { + if let Some(_ack) = &chunk.ack { timestamps.push(chunk.log.timestamp); } } @@ -386,12 +293,6 @@ fn is_lies_within_threshold( false } -fn get_file_request_url(data_provider_url: &String) -> String { - let res = format!("{}/JSON.GET/testddc:dac:data", data_provider_url); - - res -} - pub(crate) fn fetch_cdn_node_aggregates_request(url: &String) -> Vec { log::debug!("fetch_file_request | url: {:?}", url); let response: FileRequestWrapper = http_get_json(&url).unwrap(); @@ -412,67 +313,6 @@ pub(crate) fn fetch_file_request(url: &String) -> FileRequest { map } -pub(crate) fn fetch_data( - data_provider_url: &String, - era: EraIndex, - cdn_node: &T::AccountId, -) -> (BytesSent, BytesReceived) { - log::debug!("[DAC Validator] DAC Validator is running. Current era is {}", era); - // Todo: handle the error - let bytes_sent_query = get_bytes_sent_query_url(data_provider_url, era); - let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).unwrap(); - log::debug!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); - let bytes_sent = BytesSent::new(bytes_sent_res); - - // Todo: handle the error - let bytes_received_query = get_bytes_received_query_url(data_provider_url, era); - let bytes_received_res: RedisFtAggregate = http_get_json(&bytes_received_query).unwrap(); - log::debug!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); - let bytes_received = BytesReceived::new(bytes_received_res); - - (bytes_sent, bytes_received) -} - -pub(crate) fn fetch_data1( - data_provider_url: &String, - era: EraIndex, -) -> (Vec, Vec) { - log::debug!("[DAC Validator] DAC Validator is running. Current era is {}", era); - // Todo: handle the error - let bytes_sent_query = get_bytes_sent_query_url(data_provider_url, era); - let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).unwrap(); - log::debug!("[DAC Validator] Bytes sent sum is fetched: {:?}", bytes_sent_res); - let bytes_sent = BytesSent::get_all(bytes_sent_res); - - // Todo: handle the error - let bytes_received_query = get_bytes_received_query_url(data_provider_url, era); - let bytes_received_res: RedisFtAggregate = http_get_json(&bytes_received_query).unwrap(); - log::debug!("[DAC Validator] Bytes received sum is fetched:: {:?}", bytes_received_res); - let bytes_received = BytesReceived::get_all(bytes_received_res); - - (bytes_sent, bytes_received) -} - -pub(crate) fn fetch_data2( - data_provider_url: &String, - era: EraIndex, -) -> Result<(String, Vec, String, Vec), ()> { - let bytes_sent_query = get_bytes_sent_query_url(data_provider_url, era); - let bytes_sent_res: RedisFtAggregate = http_get_json(&bytes_sent_query).map_err(|_| ())?; - let bytes_sent = BytesSent::get_all(bytes_sent_res); - - let bytes_received_query = get_bytes_received_query_url(data_provider_url, era); - let bytes_received_res: RedisFtAggregate = - http_get_json(&bytes_received_query).map_err(|_| ())?; - let bytes_received = BytesReceived::get_all(bytes_received_res); - - Ok((bytes_sent_query, bytes_sent, bytes_received_query, bytes_received)) -} - -fn get_bytes_received_query_url(data_provider_url: &String, era: EraIndex) -> String { - format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesReceived/AS/bytesReceivedSum", data_provider_url, era, era) -} - pub(crate) fn http_get_json(url: &str) -> crate::ResultStr { let body = http_get_request(url).map_err(|err| { log::error!("[DAC Validator] Error while getting {}: {:?}", url, err); @@ -487,20 +327,6 @@ pub(crate) fn http_get_json(url: &str) -> crate::ResultSt parsed } -// pub(crate) fn http_get_json_lite(url: &str) -> crate::ResultStr { -// let body = http_get_request(url).map_err(|err| { -// log::error!("[DAC Validator] Error while getting {}: {:?}", url, err); -// "HTTP GET error" -// })?; - -// let parsed = serde_json::from_slice(&body).map_err(|err| { -// log::warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); -// "HTTP JSON parse error" -// }); - -// parsed -// } - fn http_get_request(http_url: &str) -> Result, http::Error> { // log::debug!("[DAC Validator] Sending request to: {:?}", http_url); @@ -523,101 +349,6 @@ fn http_get_request(http_url: &str) -> Result, http::Error> { Ok(response.body().collect::>()) } -fn filter_data( - s: &Vec, - r: &Vec, - a: &T::AccountId, -) -> (BytesSent, BytesReceived) { - let ac = utils::account_to_string::(a.clone()); - - let filtered_s = &*s.into_iter().find(|bs| bs.node_public_key == ac).unwrap(); - let filtered_r = &*r.into_iter().find(|br| br.node_public_key == ac).unwrap(); - - (filtered_s.clone(), filtered_r.clone()) -} - -fn get_bytes_sent_query_url(data_provider_url: &String, era: EraIndex) -> String { - format!("{}/FT.AGGREGATE/ddc:dac:searchCommonIndex/@era:[{}%20{}]/GROUPBY/2/@nodePublicKey/@era/REDUCE/SUM/1/@bytesSent/AS/bytesSentSum", data_provider_url, era, era) -} - -pub(crate) fn fetch_aggregates( - data_provider_url: &String, - era: EraIndex, -) -> Result { - let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); - let url = - format!("{}/JSON.GET/ddc:dac:aggregation:nodes:{}?type=query", data_provider_url, era); - let request = http::Request::get(url.as_str()); - let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; - let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; - if response.code != 200 { - log::warn!("Unexpected status code: {}", response.code); - return Err(http::Error::Unknown) - } - let body = response.body().collect::>(); - let body_str = sp_std::str::from_utf8(&body).map_err(|_| { - log::warn!("No UTF-8 body"); - http::Error::Unknown - })?; - let json = lite_json::parse_json(body_str).map_err(|_| { - log::warn!("No JSON body"); - http::Error::Unknown - })?; - Ok(json) -} - -pub(crate) fn make_http_put(url: &String, payload: &String) -> Result<(), http::Error> { - let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); - - let request = http::Request::new(url.as_str()) - .method(Method::Put) - .body(vec![payload.as_bytes()]); - - let pending_req = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; - let response = pending_req.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; - - if response.code != 200 { - log::warn!("Unexpected status code: {}", response.code); - return Err(http::Error::Unknown) - } - - let body = response.body().collect::>(); - let body_str = sp_std::str::from_utf8(&body).map_err(|_| { - log::warn!("No UTF-8 body"); - http::Error::Unknown - })?; - - let json = lite_json::parse_json(body_str).map_err(|_| { - log::warn!("No JSON body"); - http::Error::Unknown - })?; - - Ok(()) -} - -pub(crate) fn fetch_validators_decisions( - data_provider_url: &String, - era: EraIndex, -) -> Result { - let url = format!("{}/HGET/mock:ddc:dac:decisions_to_eras/{}", data_provider_url, era); - let wrapper: Wrapper = http_get_json(&url).unwrap(); - - Ok(wrapper) -} - -pub(crate) fn post_final_decision( - data_provider_url: &String, - era: EraIndex, - decision: FinalDecision, -) -> Result<(), http::Error> { - let url = format!("{}/HSET/mock:ddc:dac:final_decision_to_era/{}", data_provider_url, era); - - let payload_str: String = serde_json::to_string(&decision).unwrap(); - let res = make_http_put(&url, &payload_str); - - res -} - pub(crate) fn get_final_decision(decisions: Vec) -> ValidationDecision { let common_decisions = find_largest_group(decisions).unwrap(); let decision_example = common_decisions.get(0).unwrap(); @@ -639,18 +370,6 @@ pub(crate) fn get_final_decision(decisions: Vec) -> Validati final_decision } -pub(crate) fn fetch_validation_results( - data_provider_url: &String, - era: EraIndex, - edge: &String, -) -> Result, http::Error> { - let wrapper = fetch_validators_decisions(data_provider_url, 5 as EraIndex).unwrap(); // Era is mocked for now - let mut edges: EdgesToResults = serde_json::from_str(wrapper.decisions.as_str()).unwrap(); - let results = edges.0.remove(edge).unwrap(); - - Ok(results) -} - fn find_largest_group(decisions: Vec) -> Option> { let mut groups: Vec> = Vec::new(); let half = decisions.len() / 2; diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 3658306da..48c3cca32 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -80,8 +80,6 @@ const ENABLE_DDC_VALIDATION_KEY: &[u8; 21] = b"enable-ddc-validation"; pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); -pub const BYTES_TO_CERE: u64 = 1; // this should have a logic built on top and adjusted - /// Webdis in experimental cluster connected to Redis in dev. pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://webdis:7379"; // pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; @@ -442,11 +440,7 @@ pub mod pallet { ValidationDecisionSetForNode::::insert(era, cdn_node.clone(), true); - Self::deposit_event(Event::::ValidationDecision( - era, - cdn_node, - validation_decision, - )); + Self::deposit_event(Event::::ValidationDecision(era, cdn_node, validation_decision)); Ok(()) } @@ -585,10 +579,10 @@ pub mod pallet { } } - fn get_mock_data_url() -> String { + fn get_data_url() -> String { let data_url = Self::get_data_provider_url(); - let mock_url = "/JSON.GET/"; - let url = format!("{}{}", data_url, mock_url); + let json_getter = "/JSON.GET/"; + let url = format!("{}{}", data_url, json_getter); url } @@ -762,12 +756,10 @@ pub mod pallet { fn validate_edges() -> Result<(), &'static str> { let current_ddc_era = ddc_staking::pallet::Pallet::::current_era().ok_or("DDC era not set")?; - let mock_data_url = Self::get_mock_data_url(); + let data_url = Self::get_data_url(); let data_provider_url = Self::get_data_provider_url(); log::debug!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); - // let signer = Self::get_signer().unwrap(); - // let validator = signer.get_any_account().unwrap().id; let validator = match Self::get_public_key() { Some(key) => key, None => return Err("No validator public key found."), @@ -791,7 +783,7 @@ pub mod pallet { // form url for each node let edge_url = format!( "{}{}{}/$.{}", - mock_data_url, + data_url, "ddc:dac:aggregation:nodes:", current_ddc_era - 1, utils::account_to_string::(assigned_edge.clone()) @@ -814,7 +806,7 @@ pub mod pallet { let requests = &mut dac::Requests::new(); for request_id in request_ids.iter() { let request_id_url = - format!("{}{}{}", mock_data_url, "ddc:dac:data:file:", request_id.clone()); + format!("{}{}{}", data_url, "ddc:dac:data:file:", request_id.clone()); let file_request = dac::fetch_file_request(&request_id_url); requests.insert(file_request.file_request_id.clone(), file_request.clone()); } @@ -866,7 +858,7 @@ pub mod pallet { log::debug!("shm res: {:?}", res.to_string()); } - if let Ok(res) = response { + if let Ok(_res) = response { let edge = utils::account_to_string::(assigned_edge.clone()); let prev_era = (current_ddc_era - 1) as EraIndex; let quorum = Self::find_validators_from_quorum(&validator, &prev_era); @@ -887,7 +879,7 @@ pub mod pallet { BucketsDetails>, > = BTreeMap::new(); for bucket in payments_per_bucket.into_iter() { - let cere_payment: u32 = (bucket.1 / BYTES_TO_CERE) as u32; + let cere_payment = bucket.1 as u32; if payments.contains_key(&bucket.0) { payments.entry(bucket.0).and_modify(|bucket_info| { bucket_info.amount += cere_payment.into() diff --git a/pallets/ddc-validator/src/shm.rs b/pallets/ddc-validator/src/shm.rs index 2d557d37d..6989e148f 100644 --- a/pallets/ddc-validator/src/shm.rs +++ b/pallets/ddc-validator/src/shm.rs @@ -9,7 +9,7 @@ use alloc::{format, string::String}; pub use sp_std::collections::btree_map::BTreeMap; // ToDo: remove String usage use crate::{dac, utils, ValidationDecision}; -use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; +use alt_serde::{Deserialize, Serialize}; use base64::prelude::*; use lite_json::json::JsonValue; use sp_runtime::offchain::{http, Duration}; diff --git a/pallets/ddc-validator/src/utils.rs b/pallets/ddc-validator/src/utils.rs index 709c3aa1a..5c5459b24 100644 --- a/pallets/ddc-validator/src/utils.rs +++ b/pallets/ddc-validator/src/utils.rs @@ -1,4 +1,3 @@ -use crate::dac::ValidationResult; use alloc::{format, string::String}; use codec::{Decode, Encode}; use sp_core::crypto::AccountId32; From 21360ef61ce3c01f60a053c200d052169db63774 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 25 Aug 2023 15:21:42 +0200 Subject: [PATCH 295/583] fixes base on latest comments --- .github/workflows/check.yaml | 2 +- Dockerfile | 2 +- pallets/ddc-staking/src/lib.rs | 6 +++--- pallets/ddc-validator/src/lib.rs | 24 +++++++++++++++--------- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 103b2152c..1e6a57960 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -45,4 +45,4 @@ jobs: - name: Check Build for Benchmarking run: > pushd node && - cargo check --features=runtime-benchmarks --release \ No newline at end of file + cargo check --features=runtime-benchmarks --release diff --git a/Dockerfile b/Dockerfile index e054a5a11..543bc86f6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -78,4 +78,4 @@ USER cerenetwork EXPOSE 30333 9933 9944 9615 VOLUME ["/data"] -CMD ["/usr/local/bin/cere"] \ No newline at end of file +CMD ["/usr/local/bin/cere"] diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index f192687a6..a95d5efd1 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -262,19 +262,19 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn ledger)] pub type Ledger = - StorageMap<_, Identity, T::AccountId, StakingLedger>>; + StorageMap<_, Blake2_128Concat, T::AccountId, StakingLedger>>; /// The map of (wannabe) CDN participants stash keys to the DDC cluster ID they wish to /// participate into. #[pallet::storage] #[pallet::getter(fn edges)] - pub type Edges = StorageMap<_, Identity, T::AccountId, ClusterId>; + pub type Edges = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; /// The map of (wannabe) storage network participants stash keys to the DDC cluster ID they wish /// to participate into.. #[pallet::storage] #[pallet::getter(fn storages)] - pub type Storages = StorageMap<_, Identity, T::AccountId, ClusterId>; + pub type Storages = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; /// Map from all "stash" accounts to the total paid out rewards /// diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 48c3cca32..6dbf95561 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -251,9 +251,14 @@ pub mod pallet { pub type LastManagedEra = StorageValue<_, EraIndex>; /// The mapping of ddc validator keys to validator stash keys + /// + /// Keys registered by validators are mapped to validator stash accounts. + /// The mapping is formed in the way that facilitates fast checking that storage contains key. + /// Similarly the validator stash is checked if he is still in the list of validators. #[pallet::storage] #[pallet::getter(fn get_stash_for_ddc_validator)] - pub type OffchainWorkerKeys = StorageMap<_, Identity, T::AccountId, T::AccountId>; + pub type DDCValidatorToStashKeys = + StorageMap<_, Identity, T::AccountId, T::AccountId>; #[pallet::error] pub enum Error { @@ -402,7 +407,6 @@ pub mod pallet { /// Set validation decision for a given CDN node in an era. /// /// Only registered validator keys can call this exstrinsic. - /// Validator should be in the active set. /// Validation decision can be set only once per era per CDN node. /// CDN node should be active. #[pallet::weight(10_000)] @@ -415,7 +419,7 @@ pub mod pallet { let ddc_valitor_key = ensure_signed(origin)?; ensure!( - OffchainWorkerKeys::::contains_key(&ddc_valitor_key), + DDCValidatorToStashKeys::::contains_key(&ddc_valitor_key), Error::::DDCValidatorKeyNotRegistered ); @@ -448,7 +452,6 @@ pub mod pallet { /// Set reward points for CDN participants at the given era. /// /// Only registered validator keys can call this exstrinsic. - /// Validator should be in the active set. /// Reward points can be set only once per era per CDN node. /// CDN node should be active. /// @@ -464,7 +467,7 @@ pub mod pallet { let ddc_valitor_key = ensure_signed(origin)?; ensure!( - OffchainWorkerKeys::::contains_key(&ddc_valitor_key), + DDCValidatorToStashKeys::::contains_key(&ddc_valitor_key), Error::::DDCValidatorKeyNotRegistered ); @@ -478,6 +481,7 @@ pub mod pallet { >::mutate(era, |era_rewards| { for (staker, points) in stakers_points.clone().into_iter() { if !Self::reward_points_set_for_node(era, &staker) { + // ToDo deal with edge case when node is chilling if >::contains_key(&staker) { *era_rewards.individual.entry(staker.clone()).or_default() += points; era_rewards.total += points; @@ -507,7 +511,9 @@ pub mod pallet { #[pallet::weight(100_000)] pub fn charge_payments_content_owners( origin: OriginFor, - paying_accounts: Vec>>, + paying_accounts: Vec>>, /* ToDo check if + * bounded vec + * should be used */ ) -> DispatchResult { let ddc_valitor_key = ensure_signed(origin)?; log::debug!("validator is {:?}", &ddc_valitor_key); @@ -516,7 +522,7 @@ pub mod pallet { ddc_staking::pallet::Pallet::::current_era().ok_or(Error::::DDCEraNotSet)?; ensure!( - OffchainWorkerKeys::::contains_key(&ddc_valitor_key), + DDCValidatorToStashKeys::::contains_key(&ddc_valitor_key), Error::::DDCValidatorKeyNotRegistered ); @@ -556,7 +562,7 @@ pub mod pallet { Error::::NotValidatorStash ); - OffchainWorkerKeys::::insert(ddc_validator_pub, &ledger.stash); + DDCValidatorToStashKeys::::insert(ddc_validator_pub, &ledger.stash); Ok(()) } } @@ -644,7 +650,7 @@ pub mod pallet { } fn assign(quorum_size: usize, era: EraIndex) -> Result<(), AssignmentError> { - let validators: Vec = OffchainWorkerKeys::::iter_keys().collect(); + let validators: Vec = DDCValidatorToStashKeys::::iter_keys().collect(); log::debug!("Current validators: {:?}.", validators); if validators.len() == 0 { From 16c53a38d91be1f2a76fa2baae94ebd95b72f973 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 28 Aug 2023 16:10:52 +0200 Subject: [PATCH 296/583] test with one validation in quorum works correctly --- pallets/ddc-validator/src/lib.rs | 2 +- .../set-1/final-validation-decision.json | 1 + .../mock-data/set-1/validation-decision.json | 2 +- pallets/ddc-validator/src/mock.rs | 11 +--- pallets/ddc-validator/src/tests.rs | 53 ++++++++++++------- 5 files changed, 38 insertions(+), 31 deletions(-) create mode 100644 pallets/ddc-validator/src/mock-data/set-1/final-validation-decision.json diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 6dbf95561..82fd69eae 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -322,7 +322,7 @@ pub mod pallet { _ => (), } - match Self::assign(3usize, current_ddc_era + 1) { + match Self::assign(1usize, current_ddc_era + 1) { Ok(_) => >::put(current_ddc_era + 1), Err(e) => log::debug!("DDC validation assignment error: {:?}.", e), } diff --git a/pallets/ddc-validator/src/mock-data/set-1/final-validation-decision.json b/pallets/ddc-validator/src/mock-data/set-1/final-validation-decision.json new file mode 100644 index 000000000..b63b98c6c --- /dev/null +++ b/pallets/ddc-validator/src/mock-data/set-1/final-validation-decision.json @@ -0,0 +1 @@ +{"edge":"0101010101010101010101010101010101010101010101010101010101010101","result":true,"payload":[242,221,51,34,29,242,150,119,6,131,41,15,161,173,121,43,221,22,150,173,180,224,179,58,72,4,96,188,17,164,177,109],"totals":{"received":600,"sent":600,"failed_by_client":0,"failure_rate":0}} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json b/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json index 1fd502e51..d4509acb7 100644 --- a/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json +++ b/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json @@ -1 +1 @@ -{"edge":"0101010101010101010101010101010101010101010101010101010101010101","result":true,"payload":[242, 221, 51, 34, 29, 242, 150, 119, 6, 131, 41, 15, 161, 173, 121, 43, 221, 22, 150, 173, 180, 224, 179, 58, 72, 4, 96, 188, 17, 164, 177, 109],"totals":{"received":600,"sent":600,"failed_by_client":0,"failure_rate":0}} \ No newline at end of file +{"edge":"0101010101010101010101010101010101010101010101010101010101010101","result":true,"payload":[56, 47, 100, 81, 135, 215, 168, 111, 55, 82, 203, 118, 238, 69, 174, 209, 232, 241, 187, 128, 231, 237, 139, 193, 162, 162, 91, 11, 169, 209, 27, 55],"totals":{"received":600,"sent":600,"failed_by_client":0,"failure_rate":0}} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index c79fc5b0e..00497301c 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -2,7 +2,7 @@ use crate::{self as pallet_ddc_validator, *}; use frame_election_provider_support::{onchain, SequentialPhragmen}; use frame_support::{ parameter_types, - traits::{ConstU16, ConstU64, Currency, Everything, Nothing, U128CurrencyToVote}, + traits::{Everything, Nothing, U128CurrencyToVote}, weights::Weight, PalletId, }; @@ -12,16 +12,14 @@ use pallet_session::ShouldEndSession; use sp_core::H256; use sp_io::TestExternalities; use sp_runtime::{ - curve, curve::PiecewiseLinear, generic, impl_opaque_keys, - testing::{Header, TestXt, UintAuthorityId}, + testing::{TestXt, UintAuthorityId}, traits::{ BlakeTwo256, Convert, Extrinsic as ExtrinsicT, IdentifyAccount, IdentityLookup, Verify, }, MultiSignature, Perbill, }; -use sp_staking::SessionIndex; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; type Balance = u128; @@ -96,11 +94,6 @@ parameter_types! { pub Schedule: pallet_contracts::Schedule = Default::default(); } -use contracts::Config as contractsConfig; - -type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; - pub struct TestWeightToFee; impl Convert for TestWeightToFee { fn convert(weight: u64) -> u128 { diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index 745deb3f8..d7ebc00ae 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -30,6 +30,12 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { let era_to_validate: EraIndex = 3; let cdn_node_to_validate = AccountId::from([0x1; 32]); let cdn_node_to_validate_str = utils::account_to_string::(cdn_node_to_validate.clone()); + let validator_stash = AccountId::from([ + 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, + 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, + 0xdf, 0x67, + ]); + let validator_controller = AccountId::from([0xaa; 32]); { let mut state = offchain_state.write(); @@ -115,7 +121,11 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { t.execute_with(|| { let era_block_number = 20 as u32 * era_to_validate; System::set_block_number(era_block_number); // required for randomness - + DdcValidator::set_validator_key( + RuntimeOrigin::signed(validator_controller), + validator_stash, + ) + .unwrap(); Timestamp::set_timestamp( (DDC_ERA_START_MS + DDC_ERA_DURATION_MS * (era_to_validate as u128 - 1)) as u64, ); @@ -137,42 +147,31 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { let tx = Extrinsic::decode(&mut &*tx).unwrap(); assert!(tx.signature.is_some()); - let bucket_info1 = BucketsDetails { bucket_id: 5, amount: 100u128 }; - let bucket_info2 = BucketsDetails { bucket_id: 5, amount: 200u128 }; - let bucket_info3 = BucketsDetails { bucket_id: 5, amount: 300u128 }; + let bucket_info = BucketsDetails { bucket_id: 5, amount: 600u128 }; assert_eq!( tx.call, crate::mock::RuntimeCall::DdcValidator(crate::Call::charge_payments_content_owners { - paying_accounts: vec![bucket_info3, bucket_info1, bucket_info2,] + paying_accounts: vec![bucket_info] }) ); let tx = transactions.pop().unwrap(); let tx = Extrinsic::decode(&mut &*tx).unwrap(); assert!(tx.signature.is_some()); - assert_eq!( - tx.call, - crate::mock::RuntimeCall::DdcStaking(pallet_ddc_staking::Call::payout_stakers { - era: era_to_validate + 1 - }) - ); - let tx = transactions.pop().unwrap(); - let tx = Extrinsic::decode(&mut &*tx).unwrap(); - assert!(tx.signature.is_some()); - - let common_decision: ValidationDecision = - serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")) - .unwrap(); + let common_decision: ValidationDecision = serde_json::from_slice(include_bytes!( + "./mock-data/set-1/final-validation-decision.json" + )) + .unwrap(); let common_decisions = vec![common_decision.clone()]; let serialized_decisions = serde_json::to_string(&common_decisions).unwrap(); assert_eq!( tx.call, crate::mock::RuntimeCall::DdcValidator(crate::Call::set_validation_decision { - era: era_to_validate + 1, - cdn_node: cdn_node_to_validate, + era: era_to_validate, + cdn_node: cdn_node_to_validate.clone(), validation_decision: ValidationDecision { edge: cdn_node_to_validate_str, result: true, @@ -186,5 +185,19 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { } }) ); + + let tx = transactions.pop().unwrap(); + let tx = Extrinsic::decode(&mut &*tx).unwrap(); + + let stakers_points = vec![(cdn_node_to_validate, common_decision.totals.sent)]; + + assert!(tx.signature.is_some()); + assert_eq!( + tx.call, + crate::mock::RuntimeCall::DdcValidator(crate::Call::set_era_reward_points { + era: era_to_validate, + stakers_points, + }) + ); }) } From afd04ee68845920811a3de565ceadf89b3e3528a Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 29 Aug 2023 14:18:49 +0200 Subject: [PATCH 297/583] update test to 3 validators in quorum --- pallets/ddc-validator/src/lib.rs | 2 +- pallets/ddc-validator/src/tests.rs | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 82fd69eae..6dbf95561 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -322,7 +322,7 @@ pub mod pallet { _ => (), } - match Self::assign(1usize, current_ddc_era + 1) { + match Self::assign(3usize, current_ddc_era + 1) { Ok(_) => >::put(current_ddc_era + 1), Err(e) => log::debug!("DDC validation assignment error: {:?}.", e), } diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index d7ebc00ae..b728f0fd1 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -30,12 +30,16 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { let era_to_validate: EraIndex = 3; let cdn_node_to_validate = AccountId::from([0x1; 32]); let cdn_node_to_validate_str = utils::account_to_string::(cdn_node_to_validate.clone()); - let validator_stash = AccountId::from([ + let validator_1_stash = AccountId::from([ 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, 0xdf, 0x67, ]); - let validator_controller = AccountId::from([0xaa; 32]); + let validator_1_controller = AccountId::from([0xaa; 32]); + let validator_2_stash = AccountId::from([0xb; 32]); + let validator_2_controller = AccountId::from([0xbb; 32]); + let validator_3_stash = AccountId::from([0xc; 32]); + let validator_3_controller = AccountId::from([0xcc; 32]); { let mut state = offchain_state.write(); @@ -122,8 +126,21 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { let era_block_number = 20 as u32 * era_to_validate; System::set_block_number(era_block_number); // required for randomness DdcValidator::set_validator_key( - RuntimeOrigin::signed(validator_controller), - validator_stash, + // register validator 1 + RuntimeOrigin::signed(validator_1_controller), + validator_1_stash, + ) + .unwrap(); + DdcValidator::set_validator_key( + // register validator 2 + RuntimeOrigin::signed(validator_2_controller), + validator_2_stash, + ) + .unwrap(); + DdcValidator::set_validator_key( + // register validator 3 + RuntimeOrigin::signed(validator_3_controller), + validator_3_stash, ) .unwrap(); Timestamp::set_timestamp( From 3bc461526caefd3971e37de98f1102a080df1351 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 29 Aug 2023 14:26:11 +0200 Subject: [PATCH 298/583] revert storage map types --- pallets/ddc-staking/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index a95d5efd1..d2cf2b577 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -250,7 +250,7 @@ pub mod pallet { /// Map from all locked "stash" accounts to the controller account. #[pallet::storage] #[pallet::getter(fn bonded)] - pub type Bonded = StorageMap<_, Identity, T::AccountId, T::AccountId>; + pub type Bonded = StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; /// DDC clusters staking settings. #[pallet::storage] From a9cf9559c00bf4fa15a68a56c17541b5b4350e01 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 31 Aug 2023 12:42:24 +0200 Subject: [PATCH 299/583] unit tests in progress --- pallets/ddc-validator/src/lib.rs | 13 +++- pallets/ddc-validator/src/tests.rs | 97 +++++++++++++++++++++++++++++- 2 files changed, 107 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 6dbf95561..e83211846 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -922,14 +922,23 @@ pub mod pallet { let signer = Self::get_signer().unwrap(); - let _tx_res = + let tx_res = signer.send_signed_transaction(|_acct| Call::set_validation_decision { era: current_ddc_era - 1, cdn_node: utils::string_to_account::(edge.clone()), validation_decision: final_res.clone(), }); - log::debug!("final_res: {:?}", final_res); + match &tx_res { + None | Some((_, Err(()))) => return Err("Error:"), + Some((_, Ok(()))) => {}, + } + + // match tx_res.result { + // Ok(tx_res) => println!("successfull tx: {:?}", tx_res), + // Err(error) => println!("failed tx: {:?}", error), + // } + // log::debug!("final_res: {:?}", final_res); cdn_nodes_reward_points.push(( utils::string_to_account::(final_res.edge), diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index b728f0fd1..f3c069d01 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -1,6 +1,10 @@ use super::*; -use crate::mock::{Timestamp, *}; +use crate::{ + mock::{Timestamp, *}, + Error as ValidatorError, +}; use codec::Decode; +use frame_support::{assert_noop, assert_ok}; use pallet_ddc_accounts::BucketsDetails; use pallet_ddc_staking::{DDC_ERA_DURATION_MS, DDC_ERA_START_MS}; use sp_core::offchain::{testing, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt}; @@ -218,3 +222,94 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { ); }) } + +#[test] +fn send_signal_works_as_expected() { + let mut t = new_test_ext(); + + let validator_controller = AccountId::from([0xaa; 32]); + + t.execute_with(|| { + assert_eq!(DdcValidator::signal(), None); + assert_ok!(DdcValidator::send_signal(RuntimeOrigin::signed(validator_controller))); + assert_eq!(DdcValidator::signal().unwrap(), true); + }) +} + +#[test] +fn set_validation_decision_works_as_expected() { + let mut t = new_test_ext(); + + let era_to_validate: EraIndex = 3; + let cdn_node_to_validate = AccountId::from([0x1; 32]); + let not_a_cdn_node = AccountId::from([0x2; 32]); + let validator_1_stash = AccountId::from([ + 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, + 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, + 0xdf, 0x67, + ]); + let validator_1_controller = AccountId::from([0xaa; 32]); + + let decision: ValidationDecision = + serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")) + .unwrap(); + + sp_std::if_std! { + println!("events"); + } + + t.execute_with(|| { + System::set_block_number(1); + + assert_ok!(DdcValidator::set_validator_key( + // register validator 1 + RuntimeOrigin::signed(validator_1_controller.clone()), + validator_1_stash.clone(), + )); + + assert_noop!( + DdcValidator::set_validation_decision( + RuntimeOrigin::signed(validator_1_controller), + era_to_validate, + cdn_node_to_validate.clone(), + decision.clone(), + ), + ValidatorError::::DDCValidatorKeyNotRegistered + ); + + assert_noop!( + DdcValidator::set_validation_decision( + RuntimeOrigin::signed(validator_1_stash.clone()), + era_to_validate, + not_a_cdn_node.clone(), + decision.clone() + ), + ValidatorError::::NodeNotActive + ); + + assert_ok!(DdcValidator::set_validation_decision( + RuntimeOrigin::signed(validator_1_stash.clone()), + era_to_validate, + cdn_node_to_validate.clone(), + decision.clone() + )); + + assert_noop!( + DdcValidator::set_validation_decision( + RuntimeOrigin::signed(validator_1_stash), + era_to_validate, + cdn_node_to_validate.clone(), + decision.clone() + ), + ValidatorError::::ValidationDecisionAlreadySet + ); + + let evt = System::events().into_iter().map(|evt| evt.event).collect::>(); + assert_eq!(evt.len(), 1); + assert_eq!( + evt[0], + crate::Event::ValidationDecision(era_to_validate, cdn_node_to_validate, decision) + .into() + ); + }) +} From d58f53ecc7a8d6a93a13970350400ba9c47290c8 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 25 Aug 2023 18:03:26 +0200 Subject: [PATCH 300/583] - remove unused imports and methods - replace deprecated imports - remove unused macros --- node/client/src/lib.rs | 82 +------------------ pallets/chainbridge/src/lib.rs | 15 +--- .../ddc-metrics-offchain-worker/src/lib.rs | 3 +- pallets/erc20/src/lib.rs | 12 +-- pallets/erc721/src/lib.rs | 15 +--- rpc/src/lib.rs | 1 - runtime/cere-dev/src/lib.rs | 9 +- runtime/cere/src/lib.rs | 9 +- 8 files changed, 17 insertions(+), 129 deletions(-) diff --git a/node/client/src/lib.rs b/node/client/src/lib.rs index 8de68a06a..8ff812c93 100644 --- a/node/client/src/lib.rs +++ b/node/client/src/lib.rs @@ -1,15 +1,13 @@ pub use node_primitives::{AccountId, Balance, Block, BlockNumber, Hash, Header, Index, Signature}; use sc_client_api::{AuxStore, Backend as BackendT, BlockchainEvents, KeyIterator, UsageProvider}; pub use sc_executor::NativeElseWasmExecutor; -use sp_api::{CallApiAt, Encode, NumberFor, ProvideRuntimeApi}; +use sp_api::{CallApiAt, NumberFor, ProvideRuntimeApi}; use sp_blockchain::{HeaderBackend, HeaderMetadata}; use sp_consensus::BlockStatus; -use sp_core::Pair; -use sp_keyring::Sr25519Keyring; use sp_runtime::{ generic::{BlockId, SignedBlock}, traits::{BlakeTwo256, Block as BlockT}, - Justifications, OpaqueExtrinsic, + Justifications, }; use sp_storage::{ChildInfo, StorageData, StorageKey}; use std::sync::Arc; @@ -446,82 +444,6 @@ impl sp_blockchain::HeaderBackend for Client { } } -macro_rules! with_signed_payload { - { - $self:ident, - { - $extra:ident, - $client:ident, - $raw_payload:ident - }, - { - $( $setup:tt )* - }, - ( - $period:expr, - $current_block:expr, - $nonce:expr, - $tip:expr, - $call:expr, - $genesis:expr - ), - { - $( $usage:tt )* - } - } => { - match $self { - #[cfg(feature = "cere")] - Self::Cere($client) => { - use cere_runtime as runtime; - - $( $setup )* - - let $extra: runtime::SignedExtra = ( - frame_system::CheckNonZeroSender::::new(), - frame_system::CheckSpecVersion::::new(), - frame_system::CheckTxVersion::::new(), - frame_system::CheckGenesis::::new(), - frame_system::CheckMortality::::from(sp_runtime::generic::Era::mortal( - $period, - $current_block, - )), - frame_system::CheckNonce::::from($nonce), - frame_system::CheckWeight::::new(), - pallet_transaction_payment::ChargeTransactionPayment::::from($tip), - ); - - let $raw_payload = runtime::SignedPayload::from_raw( - $call.clone(), - $extra.clone(), - ( - (), - runtime::VERSION.spec_version, - runtime::VERSION.transaction_version, - $genesis.clone(), - $genesis, - (), - (), - (), - ), - ); - - $( $usage )* - }, - #[cfg(feature = "cere-dev")] - Self::CereDev($client) => { - use cere_dev_runtime as runtime; - - $( $setup )* - - signed_payload!($extra, $raw_payload, - ($period, $current_block, $nonce, $tip, $call, $genesis)); - - $( $usage )* - }, - } - } -} - #[allow(unused_macros)] macro_rules! signed_payload { ( diff --git a/pallets/chainbridge/src/lib.rs b/pallets/chainbridge/src/lib.rs index 512c0a9c2..1e48b4a7d 100644 --- a/pallets/chainbridge/src/lib.rs +++ b/pallets/chainbridge/src/lib.rs @@ -4,10 +4,7 @@ use codec::{Decode, Encode, EncodeLike}; use frame_support::{ decl_error, decl_event, decl_module, decl_storage, - dispatch::{ - ClassifyDispatch, DispatchClass, DispatchResult, GetDispatchInfo, Pays, PaysFee, WeighData, - Weight, - }, + dispatch::{DispatchResult, GetDispatchInfo, Pays, Weight}, ensure, traits::{EnsureOrigin, Get}, PalletId, Parameter, @@ -15,16 +12,10 @@ use frame_support::{ use frame_system::{self as system, ensure_root, ensure_signed}; use sp_core::U256; use sp_runtime::{ - traits::{ - AccountIdConversion, Bounded, DispatchInfoOf, Dispatchable, SaturatedConversion, - SignedExtension, - }, - transaction_validity::{ - InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction, - }, + traits::{AccountIdConversion, Dispatchable}, RuntimeDebug, }; -use sp_std::{marker::PhantomData, prelude::*}; +use sp_std::prelude::*; mod mock; mod tests; diff --git a/pallets/ddc-metrics-offchain-worker/src/lib.rs b/pallets/ddc-metrics-offchain-worker/src/lib.rs index 5c6c07892..991fdabb2 100644 --- a/pallets/ddc-metrics-offchain-worker/src/lib.rs +++ b/pallets/ddc-metrics-offchain-worker/src/lib.rs @@ -34,8 +34,7 @@ extern crate alloc; use alloc::string::String; use core::fmt::Debug; use frame_support::weights::Weight; -use scale_info::{Type, TypeInfo}; -use sp_runtime::offchain::storage::StorageRetrievalError; +use scale_info::TypeInfo; pub const BLOCK_INTERVAL: u32 = 100; // TODO: Change to 1200 later [1h]. Now - 200 [10 minutes] for testing purposes. diff --git a/pallets/erc20/src/lib.rs b/pallets/erc20/src/lib.rs index 8f861d10d..a9474ae2f 100644 --- a/pallets/erc20/src/lib.rs +++ b/pallets/erc20/src/lib.rs @@ -4,24 +4,16 @@ use pallet_chainbridge as bridge; use pallet_erc721 as erc721; -use codec::{Decode, Encode}; use frame_support::{ decl_error, decl_event, decl_module, decl_storage, dispatch::DispatchResult, ensure, traits::{Currency, EnsureOrigin, ExistenceRequirement::AllowDeath, Get}, - weights::{ClassifyDispatch, DispatchClass, Pays, PaysFee, WeighData, Weight}, }; -use frame_system::{self as system, ensure_root, ensure_signed}; +use frame_system::{self as system, ensure_signed}; use sp_arithmetic::traits::SaturatedConversion; use sp_core::U256; -use sp_runtime::{ - traits::{Bounded, DispatchInfoOf, SignedExtension, UniqueSaturatedInto}, - transaction_validity::{ - InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction, - }, -}; -use sp_std::{marker::PhantomData, prelude::*}; +use sp_std::prelude::*; type ResourceId = bridge::ResourceId; diff --git a/pallets/erc721/src/lib.rs b/pallets/erc721/src/lib.rs index c0da9c7a3..c5b7244d7 100644 --- a/pallets/erc721/src/lib.rs +++ b/pallets/erc721/src/lib.rs @@ -3,22 +3,13 @@ use codec::{Decode, Encode}; use frame_support::{ - decl_error, decl_event, decl_module, decl_storage, - dispatch::{ClassifyDispatch, DispatchClass, DispatchResult, Pays, PaysFee, WeighData}, - ensure, + decl_error, decl_event, decl_module, decl_storage, dispatch::DispatchResult, ensure, traits::Get, - weights::Weight, }; use frame_system::{self as system, ensure_root, ensure_signed}; use sp_core::U256; -use sp_runtime::{ - traits::{Bounded, DispatchInfoOf, SaturatedConversion, SignedExtension}, - transaction_validity::{ - InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction, - }, - RuntimeDebug, -}; -use sp_std::{marker::PhantomData, prelude::*}; +use sp_runtime::RuntimeDebug; +use sp_std::prelude::*; mod mock; mod tests; diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs index 9abf2af02..e8cffa484 100644 --- a/rpc/src/lib.rs +++ b/rpc/src/lib.rs @@ -11,7 +11,6 @@ use jsonrpsee::RpcModule; use node_primitives::{AccountId, Balance, Block, BlockNumber, Hash, Index}; use sc_client_api::AuxStore; use sc_consensus_babe::{BabeConfiguration, Epoch}; -use sc_consensus_babe_rpc::Babe; use sc_consensus_epochs::SharedEpochChanges; use sc_finality_grandpa::{ FinalityProofProvider, GrandpaJustificationStream, SharedAuthoritySet, SharedVoterState, diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 1823209fc..66c8e6d18 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -22,13 +22,11 @@ // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit = "256"] -use cere_runtime_common::{BalanceToU256, U256ToBalance}; use codec::{Decode, Encode, MaxEncodedLen}; -use frame_election_provider_support::{ - onchain, BalancingConfig, ExtendedBalance, SequentialPhragmen, VoteWeight, -}; +use frame_election_provider_support::{onchain, BalancingConfig, SequentialPhragmen, VoteWeight}; use frame_support::{ construct_runtime, + dispatch::DispatchClass, pallet_prelude::Get, parameter_types, traits::{ @@ -38,7 +36,7 @@ use frame_support::{ }, weights::{ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, - ConstantMultiplier, DispatchClass, IdentityFee, Weight, + ConstantMultiplier, IdentityFee, Weight, }, PalletId, RuntimeDebug, }; @@ -50,7 +48,6 @@ pub use node_primitives::{AccountId, Signature}; use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; pub use pallet_cere_ddc; pub use pallet_chainbridge; -use pallet_contracts::weights::WeightInfo; pub use pallet_ddc_metrics_offchain_worker; pub use pallet_ddc_staking; use pallet_election_provider_multi_phase::SolutionAccuracyOf; diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 9145da19c..851bad201 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -22,13 +22,11 @@ // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit = "256"] -use cere_runtime_common::{BalanceToU256, U256ToBalance}; use codec::{Decode, Encode, MaxEncodedLen}; -use frame_election_provider_support::{ - onchain, BalancingConfig, ExtendedBalance, SequentialPhragmen, VoteWeight, -}; +use frame_election_provider_support::{onchain, BalancingConfig, SequentialPhragmen, VoteWeight}; use frame_support::{ construct_runtime, + dispatch::DispatchClass, pallet_prelude::Get, parameter_types, traits::{ @@ -38,7 +36,7 @@ use frame_support::{ }, weights::{ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, - ConstantMultiplier, DispatchClass, IdentityFee, Weight, + ConstantMultiplier, IdentityFee, Weight, }, PalletId, RuntimeDebug, }; @@ -50,7 +48,6 @@ pub use node_primitives::{AccountId, Signature}; use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; pub use pallet_cere_ddc; pub use pallet_chainbridge; -use pallet_contracts::weights::WeightInfo; pub use pallet_ddc_metrics_offchain_worker; use pallet_election_provider_multi_phase::SolutionAccuracyOf; use pallet_grandpa::{ From d9cb464b3fef8d79b1106a9519e284a448a4e9a7 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 30 Aug 2023 14:27:50 +0200 Subject: [PATCH 301/583] remove unused imports for tests; update deprecated methods for tests --- pallets/chainbridge/src/mock.rs | 6 +++--- pallets/chainbridge/src/tests.rs | 1 - pallets/ddc-metrics-offchain-worker/src/tests/mod.rs | 3 +-- .../ddc-metrics-offchain-worker/src/tests/test_runtime.rs | 3 --- pallets/ddc/src/mock.rs | 1 - pallets/erc721/src/mock.rs | 2 +- runtime/cere-dev/src/impls.rs | 5 ++++- runtime/cere/src/impls.rs | 5 ++++- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pallets/chainbridge/src/mock.rs b/pallets/chainbridge/src/mock.rs index 15a6a235b..5e22f6e92 100644 --- a/pallets/chainbridge/src/mock.rs +++ b/pallets/chainbridge/src/mock.rs @@ -3,13 +3,13 @@ use super::*; use frame_support::{ - assert_ok, ord_parameter_types, parameter_types, traits::Everything, weights::Weight, PalletId, + assert_ok, ord_parameter_types, parameter_types, traits::Everything, weights::Weight, }; use frame_system::{self as system}; use sp_core::H256; use sp_runtime::{ testing::Header, - traits::{AccountIdConversion, BlakeTwo256, Block as BlockT, IdentityLookup}, + traits::{AccountIdConversion, BlakeTwo256, IdentityLookup}, Perbill, }; @@ -146,7 +146,7 @@ pub fn new_test_ext_initialized( // include the most recent event, but do not have to include every past event. pub fn assert_events(mut expected: Vec) { let mut actual: Vec = - system::Module::::events().iter().map(|e| e.event.clone()).collect(); + system::Pallet::::events().iter().map(|e| e.event.clone()).collect(); expected.reverse(); diff --git a/pallets/chainbridge/src/tests.rs b/pallets/chainbridge/src/tests.rs index c7b3b18a2..bd0ae5a03 100644 --- a/pallets/chainbridge/src/tests.rs +++ b/pallets/chainbridge/src/tests.rs @@ -10,7 +10,6 @@ use super::{ }; use crate::mock::new_test_ext_initialized; use frame_support::{assert_noop, assert_ok}; -use frame_system::Origin; #[test] fn derive_ids() { diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs b/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs index 6c0dbbe09..a261b10c8 100644 --- a/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs +++ b/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs @@ -1,6 +1,5 @@ use frame_support::traits::{Currency, OffchainWorker}; use frame_system::Config as FSC; -use pallet_contracts::{self as contracts, Config as CC}; use sp_core::offchain::{ testing, OffchainDbExt, OffchainWorkerExt, Timestamp as OCWTimestamp, TransactionPoolExt, }; @@ -285,7 +284,7 @@ fn should_run_contract() { let contract_id = deploy_contract(); let call_data = DdcMetricsOffchainWorker::encode_get_current_period_ms(); - pallet_contracts::Module::::call( + pallet_contracts::Pallet::::call( RuntimeOrigin::signed(alice.clone()), contract_id.clone(), 0, diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs b/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs index 10cee8408..7a5033b9b 100644 --- a/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs +++ b/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs @@ -4,7 +4,6 @@ use crate::{self as pallet_ddc_metrics_offchain_worker, *}; -use codec::{Decode, Encode}; use frame_support::{ parameter_types, traits::{ConstU32, Currency, Everything, Get, Nothing}, @@ -30,8 +29,6 @@ pub type Moment = u64; // -- Implement a contracts runtime for testing -- // Macro hack: Give names to the pallets. -use frame_system as system; -use pallet_balances as balances; use pallet_contracts as contracts; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; diff --git a/pallets/ddc/src/mock.rs b/pallets/ddc/src/mock.rs index 0bb912223..c514078ba 100644 --- a/pallets/ddc/src/mock.rs +++ b/pallets/ddc/src/mock.rs @@ -1,5 +1,4 @@ use crate as pallet_cere_ddc; -use crate::Module; use frame_support::{construct_runtime, parameter_types, traits::Everything}; use frame_system as system; use sp_core::H256; diff --git a/pallets/erc721/src/mock.rs b/pallets/erc721/src/mock.rs index 24ee23b92..9406619ae 100644 --- a/pallets/erc721/src/mock.rs +++ b/pallets/erc721/src/mock.rs @@ -5,7 +5,7 @@ use frame_system::{self as system}; use sp_core::{hashing::blake2_128, H256}; use sp_runtime::{ testing::Header, - traits::{BlakeTwo256, Block as BlockT, IdentityLookup}, + traits::{BlakeTwo256, IdentityLookup}, BuildStorage, Perbill, }; diff --git a/runtime/cere-dev/src/impls.rs b/runtime/cere-dev/src/impls.rs index dd38a6a1d..c576e8d31 100644 --- a/runtime/cere-dev/src/impls.rs +++ b/runtime/cere-dev/src/impls.rs @@ -36,7 +36,10 @@ mod multiplier_tests { System, TargetBlockFullness, TransactionPayment, }; use cere_dev_runtime_constants::{currency::*, time::*}; - use frame_support::weights::{DispatchClass, Weight, WeightToFee as WeightToFeeT}; + use frame_support::{ + dispatch::DispatchClass, + weights::{Weight, WeightToFee as WeightToFeeT}, + }; use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment}; use sp_runtime::{ assert_eq_error_rate, diff --git a/runtime/cere/src/impls.rs b/runtime/cere/src/impls.rs index 9597162dc..6895f794e 100644 --- a/runtime/cere/src/impls.rs +++ b/runtime/cere/src/impls.rs @@ -36,7 +36,10 @@ mod multiplier_tests { System, TargetBlockFullness, TransactionPayment, }; use cere_runtime_constants::{currency::*, time::*}; - use frame_support::weights::{DispatchClass, Weight, WeightToFee as WeightToFeeT}; + use frame_support::{ + dispatch::DispatchClass, + weights::{Weight, WeightToFee as WeightToFeeT}, + }; use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment}; use sp_runtime::{ assert_eq_error_rate, From 91e7739991fe9499230bb8e4fdccd97ac010d2a9 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 31 Aug 2023 17:17:55 +0600 Subject: [PATCH 302/583] Storage item for cluster managers ACL --- pallets/ddc-staking/src/lib.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index d2cf2b577..38992abf8 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -329,6 +329,11 @@ pub mod pallet { #[pallet::getter(fn pricing)] pub type Pricing = StorageValue<_, u128>; + /// A list of accounts allowed to become cluster managers. + #[pallet::storage] + #[pallet::getter(fn cluster_managers)] + pub type ClusterManagers = StorageValue<_, Vec, ValueQuery>; + #[pallet::genesis_config] pub struct GenesisConfig { pub edges: Vec<(T::AccountId, T::AccountId, BalanceOf, ClusterId)>, From e58ef488ae7af8efcb3386e972da846204be8db0 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 1 Sep 2023 11:32:42 +0600 Subject: [PATCH 303/583] Add extrinsics to add and remove cluster managers --- pallets/ddc-staking/src/lib.rs | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 38992abf8..009315c30 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -866,6 +866,46 @@ pub mod pallet { >::set(Some(price_per_byte)); Ok(()) } + + /// Add a new account to the list of cluster managers. + /// + /// RuntimeOrigin must be Root to call this function. + #[pallet::weight(10_000)] + pub fn allow_cluster_manager( + origin: OriginFor, + grantee: ::Source, + ) -> DispatchResult { + ensure_root(origin)?; + + let grantee = T::Lookup::lookup(grantee)?; + ClusterManagers::::mutate(|grantees| { + if !grantees.contains(&grantee) { + grantees.push(grantee); + } + }); + + Ok(()) + } + + /// Remove an account from the list of cluster managers. + /// + /// RuntimeOrigin must be Root to call this function. + #[pallet::weight(10_000)] + pub fn disallow_cluster_manager( + origin: OriginFor, + revokee: ::Source, + ) -> DispatchResult { + ensure_root(origin)?; + + let revokee = T::Lookup::lookup(revokee)?; + ClusterManagers::::mutate(|grantees| { + if let Some(pos) = grantees.iter().position(|g| g == &revokee) { + grantees.remove(pos); + } + }); + + Ok(()) + } } impl Pallet { From 0994ca6355edad9f20ce666bf34a61de1be5fc54 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 1 Sep 2023 11:33:08 +0600 Subject: [PATCH 304/583] A test for cluster manager ACL modifications --- pallets/ddc-staking/src/tests.rs | 33 +++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index 461f064d5..6d024cf64 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -1,7 +1,9 @@ //! Tests for the module. use super::{mock::*, *}; -use frame_support::{assert_noop, assert_ok, traits::ReservableCurrency}; +use frame_support::{ + assert_noop, assert_ok, assert_storage_noop, error::BadOrigin, traits::ReservableCurrency, +}; use pallet_balances::Error as BalancesError; pub const BLOCK_TIME: u64 = 1000; @@ -176,3 +178,32 @@ fn staking_should_work() { assert_eq!(DdcStaking::edges(3), None); }); } + +#[test] +fn cluster_managers_list_can_be_managed_by_governance_only() { + ExtBuilder::default().build_and_execute(|| { + // Governance can allow an account to become cluster manager. + assert_ok!(DdcStaking::allow_cluster_manager(RuntimeOrigin::root(), 1)); + + // Repeat call does nothing. + assert_storage_noop!(assert_ok!(DdcStaking::allow_cluster_manager( + RuntimeOrigin::root(), + 1, + ))); + + // Non-governance can't allow an account to become a cluster manager. + assert_noop!(DdcStaking::allow_cluster_manager(RuntimeOrigin::signed(1), 2), BadOrigin); + + // Non-governance can't disallow an account to become a cluster manager. + assert_noop!(DdcStaking::disallow_cluster_manager(RuntimeOrigin::signed(1), 1), BadOrigin); + + // Governance can disallow an account to become a cluster manager. + assert_ok!(DdcStaking::disallow_cluster_manager(RuntimeOrigin::root(), 1)); + + // Repeat call does nothing. + assert_storage_noop!(assert_ok!(DdcStaking::disallow_cluster_manager( + RuntimeOrigin::root(), + 1, + ))); + }); +} From a1f38a7b537b8245569d78f29ddb06380cbf392d Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 1 Sep 2023 12:12:17 +0600 Subject: [PATCH 305/583] Benchmarks for cluster managers ACL --- pallets/ddc-staking/src/benchmarking.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index 87b671426..e7a35e87f 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -105,4 +105,22 @@ benchmarks! { verify { assert!(Ledger::::contains_key(&new_controller)); } + + allow_cluster_manager { + let new_cluster_manager = create_funded_user::("cluster_manager", USER_SEED, 100); + let new_cluster_manager_lookup = T::Lookup::unlookup(new_cluster_manager.clone()); + }: _(RawOrigin::Root, new_cluster_manager_lookup) + verify { + assert!(ClusterManagers::::get().contains(&new_cluster_manager)); + } + + disallow_cluster_manager { + let new_cluster_manager = create_funded_user::("cluster_manager", USER_SEED, 100); + let new_cluster_manager_lookup = T::Lookup::unlookup(new_cluster_manager.clone()); + DdcStaking::::allow_cluster_manager(RawOrigin::Root.into(), new_cluster_manager_lookup.clone())?; + assert!(ClusterManagers::::get().contains(&new_cluster_manager)); + }: _(RawOrigin::Root, new_cluster_manager_lookup) + verify { + assert!(!ClusterManagers::::get().contains(&new_cluster_manager)); + } } From 9978bea6d1459487b27e1e9e13186b039357b69f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 1 Sep 2023 12:13:19 +0600 Subject: [PATCH 306/583] Generate weights for cluster managers ACL --- pallets/ddc-staking/src/lib.rs | 4 ++-- pallets/ddc-staking/src/weights.rs | 28 +++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 009315c30..fa05a1ade 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -870,7 +870,7 @@ pub mod pallet { /// Add a new account to the list of cluster managers. /// /// RuntimeOrigin must be Root to call this function. - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::allow_cluster_manager())] pub fn allow_cluster_manager( origin: OriginFor, grantee: ::Source, @@ -890,7 +890,7 @@ pub mod pallet { /// Remove an account from the list of cluster managers. /// /// RuntimeOrigin must be Root to call this function. - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::disallow_cluster_manager())] pub fn disallow_cluster_manager( origin: OriginFor, revokee: ::Source, diff --git a/pallets/ddc-staking/src/weights.rs b/pallets/ddc-staking/src/weights.rs index 937eece23..acb858060 100644 --- a/pallets/ddc-staking/src/weights.rs +++ b/pallets/ddc-staking/src/weights.rs @@ -1,7 +1,7 @@ //! Autogenerated weights for pallet_ddc_staking //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-04, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-01, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! HOSTNAME: `e14`, CPU: `11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 @@ -35,6 +35,8 @@ pub trait WeightInfo { fn serve() -> Weight; fn chill() -> Weight; fn set_controller() -> Weight; + fn allow_cluster_manager() -> Weight; + fn disallow_cluster_manager() -> Weight; } /// Weights for pallet_ddc_staking using the Substrate node and recommended hardware. @@ -103,6 +105,18 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().reads(3 as u64)) .saturating_add(T::DbWeight::get().writes(3 as u64)) } + // Storage: DdcStaking ClusterManagers (r:1 w:1) + fn allow_cluster_manager() -> Weight { + Weight::from_ref_time(11_727_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } + // Storage: DdcStaking ClusterManagers (r:1 w:1) + fn disallow_cluster_manager() -> Weight { + Weight::from_ref_time(18_006_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } } // For backwards compatibility and tests @@ -170,4 +184,16 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(3 as u64)) .saturating_add(RocksDbWeight::get().writes(3 as u64)) } + // Storage: DdcStaking ClusterManagers (r:1 w:1) + fn allow_cluster_manager() -> Weight { + Weight::from_ref_time(11_727_000 as u64) + .saturating_add(RocksDbWeight::get().reads(1 as u64)) + .saturating_add(RocksDbWeight::get().writes(1 as u64)) + } + // Storage: DdcStaking ClusterManagers (r:1 w:1) + fn disallow_cluster_manager() -> Weight { + Weight::from_ref_time(18_006_000 as u64) + .saturating_add(RocksDbWeight::get().reads(1 as u64)) + .saturating_add(RocksDbWeight::get().writes(1 as u64)) + } } From 08b1bba172954fe13cbaeefa49a337070c38c9c9 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 1 Sep 2023 12:20:33 +0600 Subject: [PATCH 307/583] Bump cere-dev runtime `spec_version` to 48003 --- runtime/cere-dev/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 803f9d3bf..a0de3e32f 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -131,7 +131,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: 48002, + spec_version: 48003, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, From 4d4ed2573bc62c5b74de956858e7e1cabdca3c79 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 1 Sep 2023 12:23:45 +0600 Subject: [PATCH 308/583] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cef36998..db17d69ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [D] New `pallet-ddc-validator` which implements DDC CDN nodes validation and rewarding. You can enable DDC validation providing `--enable-ddc-validation` argument. It will only work on the nodes with validation and offchain workers enabled as well. - [D] Several calls for `pallet-ddc-staking` to distribute rewards. +- [D] DDC cluster managers access control list in `pallet-ddc-staking` managed by governance. ### Changed From 325c552dc21c1c8d607be3fbb4a7642832429200 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 1 Sep 2023 10:42:33 +0200 Subject: [PATCH 309/583] add unit tests and fix source code --- pallets/ddc-accounts/src/lib.rs | 5 +- pallets/ddc-validator/src/lib.rs | 54 +++-- pallets/ddc-validator/src/tests.rs | 333 ++++++++++++++++++++++++++--- 3 files changed, 354 insertions(+), 38 deletions(-) diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index dc2edbbf5..e988cdd0f 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -219,6 +219,8 @@ pub mod pallet { BadState, /// Current era not set during runtime DDCEraNotSet, + /// Bucket with specified id doesn't exist + BucketDoesNotExist, } #[pallet::genesis_config] @@ -532,7 +534,8 @@ pub mod pallet { let mut total_charged = BalanceOf::::zero(); for bucket_details in paying_accounts.iter() { - let bucket: Bucket = Self::buckets(bucket_details.bucket_id).unwrap(); + let bucket: Bucket = Self::buckets(bucket_details.bucket_id) + .ok_or(Error::::BucketDoesNotExist)?; let content_owner = bucket.owner_id; let amount = bucket_details.amount * pricing.saturated_into::>(); diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index e83211846..7eb36db1d 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -465,6 +465,7 @@ pub mod pallet { stakers_points: Vec<(T::AccountId, u64)>, ) -> DispatchResult { let ddc_valitor_key = ensure_signed(origin)?; + let mut rewards_counter = 0; ensure!( DDCValidatorToStashKeys::::contains_key(&ddc_valitor_key), @@ -488,18 +489,21 @@ pub mod pallet { >::mutate( &staker, |current_reward_points| { - let rewards = + let rewards: ddc_staking::EraRewardPointsPerNode = ddc_staking::EraRewardPointsPerNode { era, points }; current_reward_points.push(rewards); }, ); RewardPointsSetForNode::::insert(era, staker, true); + rewards_counter += 1; } } } }); - Self::deposit_event(Event::::EraRewardPoints(era, stakers_points)); + if rewards_counter > 0 { + Self::deposit_event(Event::::EraRewardPoints(era, stakers_points)); + } Ok(()) } @@ -911,13 +915,25 @@ pub mod pallet { return Err("signing key not set") } // ToDo: replace local call by a call from `ddc-staking` pallet - let _tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = + let tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = signer.send_signed_transaction(|_account| { Call::charge_payments_content_owners { paying_accounts: final_payments.clone(), } }); + for (acc, res) in &tx_res { + match res { + Ok(()) => + log::debug!("[{:?}]: submit transaction success.", acc.id), + Err(e) => log::debug!( + "[{:?}]: submit transaction failure. Reason: {:?}", + acc.id, + e + ), + } + } + let final_res = dac::get_final_decision(validations_res); let signer = Self::get_signer().unwrap(); @@ -929,17 +945,18 @@ pub mod pallet { validation_decision: final_res.clone(), }); - match &tx_res { - None | Some((_, Err(()))) => return Err("Error:"), - Some((_, Ok(()))) => {}, + for (acc, res) in &tx_res { + match res { + Ok(()) => + log::debug!("[{:?}]: submit transaction success.", acc.id), + Err(e) => log::debug!( + "[{:?}]: submit transaction failure. Reason: {:?}", + acc.id, + e + ), + } } - // match tx_res.result { - // Ok(tx_res) => println!("successfull tx: {:?}", tx_res), - // Err(error) => println!("failed tx: {:?}", error), - // } - // log::debug!("final_res: {:?}", final_res); - cdn_nodes_reward_points.push(( utils::string_to_account::(final_res.edge), final_res.totals.sent, @@ -951,11 +968,22 @@ pub mod pallet { // ToDo: replace local call by a call from `ddc-staking` pallet if cdn_nodes_reward_points.len() > 0 { - let _tx_res = + let tx_res = signer.send_signed_transaction(|_account| Call::set_era_reward_points { era: current_ddc_era - 1, stakers_points: cdn_nodes_reward_points.clone(), }); + + for (acc, res) in &tx_res { + match res { + Ok(()) => log::debug!("[{:?}]: submit transaction success.", acc.id), + Err(e) => log::debug!( + "[{:?}]: submit transaction failure. Reason: {:?}", + acc.id, + e + ), + } + } } Ok(()) diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index f3c069d01..a2bb9963a 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -1,3 +1,5 @@ +#![cfg(test)] + use super::*; use crate::{ mock::{Timestamp, *}, @@ -5,7 +7,7 @@ use crate::{ }; use codec::Decode; use frame_support::{assert_noop, assert_ok}; -use pallet_ddc_accounts::BucketsDetails; +use pallet_ddc_accounts::{BucketsDetails, Error as AccountsError}; use pallet_ddc_staking::{DDC_ERA_DURATION_MS, DDC_ERA_START_MS}; use sp_core::offchain::{testing, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt}; use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; @@ -16,6 +18,10 @@ const OCW_PUB_KEY_STR: &str = "d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1 const OCW_SEED: &str = "news slush supreme milk chapter athlete soap sausage put clutch what kitten"; +fn last_event() -> RuntimeEvent { + System::events().pop().expect("Event expected").event.into() +} + #[test] fn it_sets_validation_decision_with_one_validator_in_quorum() { let mut t = new_test_ext(); @@ -129,24 +135,21 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { t.execute_with(|| { let era_block_number = 20 as u32 * era_to_validate; System::set_block_number(era_block_number); // required for randomness - DdcValidator::set_validator_key( + assert_ok!(DdcValidator::set_validator_key( // register validator 1 RuntimeOrigin::signed(validator_1_controller), validator_1_stash, - ) - .unwrap(); - DdcValidator::set_validator_key( + )); + assert_ok!(DdcValidator::set_validator_key( // register validator 2 RuntimeOrigin::signed(validator_2_controller), validator_2_stash, - ) - .unwrap(); - DdcValidator::set_validator_key( + )); + assert_ok!(DdcValidator::set_validator_key( // register validator 3 RuntimeOrigin::signed(validator_3_controller), validator_3_stash, - ) - .unwrap(); + )); Timestamp::set_timestamp( (DDC_ERA_START_MS + DDC_ERA_DURATION_MS * (era_to_validate as u128 - 1)) as u64, ); @@ -249,27 +252,18 @@ fn set_validation_decision_works_as_expected() { 0xdf, 0x67, ]); let validator_1_controller = AccountId::from([0xaa; 32]); + let validator_1_not_controller = AccountId::from([0xdd; 32]); let decision: ValidationDecision = serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")) .unwrap(); - sp_std::if_std! { - println!("events"); - } - t.execute_with(|| { System::set_block_number(1); - assert_ok!(DdcValidator::set_validator_key( - // register validator 1 - RuntimeOrigin::signed(validator_1_controller.clone()), - validator_1_stash.clone(), - )); - assert_noop!( DdcValidator::set_validation_decision( - RuntimeOrigin::signed(validator_1_controller), + RuntimeOrigin::signed(validator_1_controller.clone()), era_to_validate, cdn_node_to_validate.clone(), decision.clone(), @@ -277,6 +271,28 @@ fn set_validation_decision_works_as_expected() { ValidatorError::::DDCValidatorKeyNotRegistered ); + // Set a mapping from stash to not a validator + DDCValidatorToStashKeys::::insert( + validator_1_stash.clone(), + validator_1_not_controller.clone(), + ); + + assert_noop!( + DdcValidator::set_validation_decision( + RuntimeOrigin::signed(validator_1_stash.clone()), + era_to_validate, + cdn_node_to_validate.clone(), + decision.clone() + ), + ValidatorError::::NotValidatorStash + ); + + assert_ok!(DdcValidator::set_validator_key( + // register validator 1 + RuntimeOrigin::signed(validator_1_controller.clone()), + validator_1_stash.clone(), + )); + assert_noop!( DdcValidator::set_validation_decision( RuntimeOrigin::signed(validator_1_stash.clone()), @@ -304,12 +320,281 @@ fn set_validation_decision_works_as_expected() { ValidatorError::::ValidationDecisionAlreadySet ); - let evt = System::events().into_iter().map(|evt| evt.event).collect::>(); - assert_eq!(evt.len(), 1); + let evt = last_event(); + assert_eq!( - evt[0], + evt, crate::Event::ValidationDecision(era_to_validate, cdn_node_to_validate, decision) .into() ); }) } + +#[test] +fn set_era_reward_points_works_as_expected() { + let mut t = new_test_ext(); + + let era_to_validate: EraIndex = 3; + let cdn_node_to_validate = AccountId::from([0x1; 32]); + let not_a_cdn_node = AccountId::from([0x2; 32]); + let validator_1_stash = AccountId::from([ + 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, + 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, + 0xdf, 0x67, + ]); + let validator_1_controller = AccountId::from([0xaa; 32]); + let validator_1_not_controller = AccountId::from([0xdd; 32]); + + let decision: ValidationDecision = + serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")) + .unwrap(); + + let stakers_points = vec![(cdn_node_to_validate.clone(), decision.totals.sent)]; + let fake_stakers_points = vec![(not_a_cdn_node.clone(), decision.totals.sent)]; + + t.execute_with(|| { + System::set_block_number(1); + + assert_noop!( + DdcValidator::set_era_reward_points( + RuntimeOrigin::signed(validator_1_controller.clone()), + era_to_validate, + stakers_points.clone(), + ), + ValidatorError::::DDCValidatorKeyNotRegistered + ); + + // Set a mapping from stash to not a validator + DDCValidatorToStashKeys::::insert( + validator_1_stash.clone(), + validator_1_not_controller.clone(), + ); + + assert_noop!( + DdcValidator::set_era_reward_points( + RuntimeOrigin::signed(validator_1_stash.clone()), + era_to_validate, + stakers_points.clone() + ), + ValidatorError::::NotValidatorStash + ); + + assert_ok!(DdcValidator::set_validator_key( + // register validator 1 + RuntimeOrigin::signed(validator_1_controller), + validator_1_stash.clone(), + )); + + // attempting to set era reward points for account, which is not an active CDN node + assert_ok!(DdcValidator::set_era_reward_points( + RuntimeOrigin::signed(validator_1_stash.clone()), + era_to_validate, + fake_stakers_points.clone() + )); + + // rewards points should not be set + assert_eq!( + DdcValidator::reward_points_set_for_node(era_to_validate, not_a_cdn_node), + false + ); + + assert_ok!(DdcValidator::set_era_reward_points( + RuntimeOrigin::signed(validator_1_stash.clone()), + era_to_validate, + stakers_points.clone() + )); + + let reward_points = ddc_staking::pallet::ErasEdgesRewardPointsPerNode::::get( + cdn_node_to_validate.clone(), + ); + + assert_eq!(reward_points.len(), 1); + + // Second run will still pass, but state will not change, as for specified node era points + // were set already + assert_ok!(DdcValidator::set_era_reward_points( + RuntimeOrigin::signed(validator_1_stash.clone()), + era_to_validate, + stakers_points.clone() + )); + + let reward_points_update_attempt = + ddc_staking::pallet::ErasEdgesRewardPointsPerNode::::get( + cdn_node_to_validate.clone(), + ); + + assert_eq!(reward_points_update_attempt.len(), 1); + + assert_eq!( + DdcValidator::reward_points_set_for_node(era_to_validate, cdn_node_to_validate), + true + ); + + assert_eq!(System::events().len(), 1); + let evt = System::events().pop().expect("Event expected").event; + + assert_eq!(evt, crate::Event::EraRewardPoints(era_to_validate, stakers_points).into()); + }) +} + +#[test] +fn charge_payments_content_owners_works_as_expected() { + let mut t = new_test_ext(); + + let era_to_validate: EraIndex = 3; + let validator_1_stash = AccountId::from([ + 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, + 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, + 0xdf, 0x67, + ]); + let validator_1_controller = AccountId::from([0xaa; 32]); + let validator_1_not_controller = AccountId::from([0xdd; 32]); + + let bucket_info = BucketsDetails { bucket_id: 5, amount: 600u128 }; + + t.execute_with(|| { + System::set_block_number(1); + + assert_noop!( + DdcValidator::charge_payments_content_owners( + RuntimeOrigin::signed(validator_1_controller.clone()), + vec![bucket_info.clone()], + ), + ValidatorError::::DDCEraNotSet + ); + + let era_block_number = 20 as u32 * era_to_validate; + System::set_block_number(era_block_number); + Timestamp::set_timestamp( + (DDC_ERA_START_MS + DDC_ERA_DURATION_MS * (era_to_validate as u128 - 1)) as u64, + ); + DdcStaking::on_finalize(era_block_number - 1); + + assert_noop!( + DdcValidator::charge_payments_content_owners( + RuntimeOrigin::signed(validator_1_stash.clone()), + vec![bucket_info.clone()] + ), + ValidatorError::::DDCValidatorKeyNotRegistered + ); + + // Set a mapping from stash to not a validator + DDCValidatorToStashKeys::::insert( + validator_1_stash.clone(), + validator_1_not_controller.clone(), + ); + + assert_noop!( + DdcValidator::charge_payments_content_owners( + RuntimeOrigin::signed(validator_1_stash.clone()), + vec![bucket_info.clone()] + ), + ValidatorError::::NotValidatorStash + ); + + assert_ok!(DdcValidator::set_validator_key( + // register validator 1 + RuntimeOrigin::signed(validator_1_controller.clone()), + validator_1_stash.clone(), + )); + + assert_noop!( + DdcValidator::charge_payments_content_owners( + RuntimeOrigin::signed(validator_1_stash.clone()), + vec![bucket_info.clone()] + ), + ValidatorError::::PricingNotSet + ); + + ddc_staking::Pricing::::set(Some(1)); // set CERE token per byte / reward + + // No buckets were created at this point + assert_noop!( + DdcValidator::charge_payments_content_owners( + RuntimeOrigin::signed(validator_1_stash.clone()), + vec![bucket_info.clone()] + ), + AccountsError::::BucketDoesNotExist + ); + + // Create buckets + for range in 1..6 { + assert_ok!(ddc_accounts::Pallet::::create_bucket( + RuntimeOrigin::signed(validator_1_stash.clone()), + true, + range + )); + } + + // Account to charge payments from is not created + assert_noop!( + DdcValidator::charge_payments_content_owners( + RuntimeOrigin::signed(validator_1_stash.clone()), + vec![bucket_info.clone()] + ), + AccountsError::::NotController + ); + + // Deposit funds for account + assert_ok!(ddc_accounts::Pallet::::deposit( + RuntimeOrigin::signed(validator_1_stash.clone()), + validator_1_stash.clone(), + 1_000, + )); + + assert_ok!(DdcValidator::charge_payments_content_owners( + RuntimeOrigin::signed(validator_1_stash.clone()), + vec![bucket_info.clone()] + )); + + // Should not be able to charge account twice by the same validator during one era + assert_noop!( + DdcValidator::charge_payments_content_owners( + RuntimeOrigin::signed(validator_1_stash.clone()), + vec![bucket_info.clone()] + ), + ValidatorError::::ContentOwnersDoubleSpend + ); + + let last_evt = System::events().pop().expect("Event expected").event; + assert_eq!(last_evt, ddc_accounts::Event::Charged(bucket_info.amount).into()); + }) +} + +#[test] +fn set_validator_key_works_as_expected() { + let mut t = new_test_ext(); + + let validator_1_stash = AccountId::from([ + 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, + 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, + 0xdf, 0x67, + ]); + let validator_1_controller: AccountId32 = AccountId::from([0xaa; 32]); + + t.execute_with(|| { + assert_noop!( + DdcValidator::set_validator_key( + RuntimeOrigin::signed(validator_1_stash.clone()), + validator_1_stash.clone(), + ), + ValidatorError::::NotController + ); + + assert_ok!(DdcValidator::set_validator_key( + RuntimeOrigin::signed(validator_1_controller.clone()), + validator_1_stash.clone(), + )); + + staking::Validators::::remove(validator_1_stash.clone()); + + // If stash is not a validator anymore, action will fail + assert_noop!( + DdcValidator::set_validator_key( + RuntimeOrigin::signed(validator_1_controller), + validator_1_stash, + ), + ValidatorError::::NotValidatorStash + ); + }) +} From b45053d2ff9e2c4bb169312f9bbee7a67b44ae7c Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 4 Sep 2023 11:56:55 +0600 Subject: [PATCH 310/583] Remove toolchain argument from cargo fmt commands --- .github/workflows/check.yaml | 2 +- .vscode/settings.json | 5 +---- scripts/pre-commit.sh | 4 ++-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 1e6a57960..b4b77700e 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -36,7 +36,7 @@ jobs: - name: Check Format run: | - cargo +nightly fmt -- --check + cargo fmt -- --check - name: Check Build run: | diff --git a/.vscode/settings.json b/.vscode/settings.json index 003fc3624..0196fd738 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,8 +2,5 @@ "[rust]": { "editor.defaultFormatter": "rust-lang.rust-analyzer", "editor.formatOnSave": true - }, - "rust-analyzer.rustfmt.extraArgs": [ - "+nightly" - ] + } } \ No newline at end of file diff --git a/scripts/pre-commit.sh b/scripts/pre-commit.sh index d84399d28..4106624b8 100755 --- a/scripts/pre-commit.sh +++ b/scripts/pre-commit.sh @@ -1,8 +1,8 @@ #!/bin/sh # Prevent committing badly formatted code -cargo +nightly fmt -- --check +cargo fmt -- --check if [ $? -ne 0 ]; then - echo "Run \`cargo +nightly fmt\` to fix formatting issues before committing." + echo "Run \`cargo fmt\` to fix formatting issues before committing." exit 1 fi From c1ab06a630d418f6e6dc9d705245d66e86798010 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 4 Sep 2023 10:42:27 +0200 Subject: [PATCH 311/583] resolve comments --- pallets/ddc-validator/src/lib.rs | 53 ++++++++++++++---------------- pallets/ddc-validator/src/tests.rs | 5 ++- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 7eb36db1d..a4a5fd7e5 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -922,16 +922,15 @@ pub mod pallet { } }); - for (acc, res) in &tx_res { - match res { - Ok(()) => - log::debug!("[{:?}]: submit transaction success.", acc.id), - Err(e) => log::debug!( - "[{:?}]: submit transaction failure. Reason: {:?}", - acc.id, - e - ), - } + let (acc, res) = &tx_res.unwrap(); + + match res { + Ok(()) => log::debug!("[{:?}]: submit transaction success.", acc.id), + Err(e) => log::debug!( + "[{:?}]: submit transaction failure. Reason: {:?}", + acc.id, + e + ), } let final_res = dac::get_final_decision(validations_res); @@ -945,16 +944,15 @@ pub mod pallet { validation_decision: final_res.clone(), }); - for (acc, res) in &tx_res { - match res { - Ok(()) => - log::debug!("[{:?}]: submit transaction success.", acc.id), - Err(e) => log::debug!( - "[{:?}]: submit transaction failure. Reason: {:?}", - acc.id, - e - ), - } + let (acc, res) = &tx_res.unwrap(); + + match res { + Ok(()) => log::debug!("[{:?}]: submit transaction success.", acc.id), + Err(e) => log::debug!( + "[{:?}]: submit transaction failure. Reason: {:?}", + acc.id, + e + ), } cdn_nodes_reward_points.push(( @@ -974,15 +972,12 @@ pub mod pallet { stakers_points: cdn_nodes_reward_points.clone(), }); - for (acc, res) in &tx_res { - match res { - Ok(()) => log::debug!("[{:?}]: submit transaction success.", acc.id), - Err(e) => log::debug!( - "[{:?}]: submit transaction failure. Reason: {:?}", - acc.id, - e - ), - } + let (acc, res) = &tx_res.unwrap(); + + match res { + Ok(()) => log::debug!("[{:?}]: submit transaction success.", acc.id), + Err(e) => + log::debug!("[{:?}]: submit transaction failure. Reason: {:?}", acc.id, e), } } diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index a2bb9963a..c2c470056 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -235,7 +235,10 @@ fn send_signal_works_as_expected() { t.execute_with(|| { assert_eq!(DdcValidator::signal(), None); assert_ok!(DdcValidator::send_signal(RuntimeOrigin::signed(validator_controller))); - assert_eq!(DdcValidator::signal().unwrap(), true); + assert_eq!(DdcValidator::signal(), Some(true)); + DdcValidator::on_initialize(2); + System::set_block_number(2); + assert_eq!(DdcValidator::signal(), Some(false)); }) } From cefd06c5a25722b198f3228f8201f67236e9eaff Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 4 Sep 2023 15:32:20 +0200 Subject: [PATCH 312/583] fix match for tx_res --- pallets/ddc-validator/src/lib.rs | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index a4a5fd7e5..afe90a719 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -922,15 +922,15 @@ pub mod pallet { } }); - let (acc, res) = &tx_res.unwrap(); - - match res { - Ok(()) => log::debug!("[{:?}]: submit transaction success.", acc.id), - Err(e) => log::debug!( + match tx_res { + Some((acc, Ok(()))) => + log::debug!("[{:?}]: submit transaction success.", acc.id), + Some((acc, Err(e))) => log::debug!( "[{:?}]: submit transaction failure. Reason: {:?}", acc.id, e ), + None => log::debug!("submit transaction failure."), } let final_res = dac::get_final_decision(validations_res); @@ -944,15 +944,15 @@ pub mod pallet { validation_decision: final_res.clone(), }); - let (acc, res) = &tx_res.unwrap(); - - match res { - Ok(()) => log::debug!("[{:?}]: submit transaction success.", acc.id), - Err(e) => log::debug!( + match tx_res { + Some((acc, Ok(()))) => + log::debug!("[{:?}]: submit transaction success.", acc.id), + Some((acc, Err(e))) => log::debug!( "[{:?}]: submit transaction failure. Reason: {:?}", acc.id, e ), + None => log::debug!("submit transaction failure."), } cdn_nodes_reward_points.push(( @@ -972,12 +972,12 @@ pub mod pallet { stakers_points: cdn_nodes_reward_points.clone(), }); - let (acc, res) = &tx_res.unwrap(); - - match res { - Ok(()) => log::debug!("[{:?}]: submit transaction success.", acc.id), - Err(e) => + match tx_res { + Some((acc, Ok(()))) => + log::debug!("[{:?}]: submit transaction success.", acc.id), + Some((acc, Err(e))) => log::debug!("[{:?}]: submit transaction failure. Reason: {:?}", acc.id, e), + None => log::debug!("submit transaction failure."), } } From bd520f4a29a895db1f1debb931a94512e94fa2fc Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 6 Sep 2023 18:12:22 +0600 Subject: [PATCH 313/583] Fix runtime loading from file for cere-dev chains --- cli/src/command.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cli/src/command.rs b/cli/src/command.rs index 0c86611fb..d5fb49bea 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -43,11 +43,14 @@ impl SubstrateCli for Cli { "local" => Box::new(cere_service::chain_spec::cere_dev_local_testnet_config()?), path => { let path = std::path::PathBuf::from(path); + let chain_spec = + Box::new(cere_service::CereChainSpec::from_json_file(path.clone())?) + as Box; - if self.run.force_cere_dev { + if self.run.force_cere_dev || chain_spec.is_cere_dev() { Box::new(cere_service::CereDevChainSpec::from_json_file(path)?) } else { - Box::new(cere_service::CereChainSpec::from_json_file(path)?) + chain_spec } }, }) From 6a3870cdb901c5b169345c02c7833d8f64f044a8 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 4 Sep 2023 17:38:30 +0600 Subject: [PATCH 314/583] Basic zombienet config with two nodes --- zombienet/0000-block-building/block-building.toml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 zombienet/0000-block-building/block-building.toml diff --git a/zombienet/0000-block-building/block-building.toml b/zombienet/0000-block-building/block-building.toml new file mode 100644 index 000000000..b9d662117 --- /dev/null +++ b/zombienet/0000-block-building/block-building.toml @@ -0,0 +1,9 @@ +[relaychain] +default_command = "./target/release/cere" +chain = "local" + + [[relaychain.nodes]] + name = "alice" + + [[relaychain.nodes]] + name = "bob" From c083f3b3a4fefd4884b9d3756b3563d2cbab94b8 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 4 Sep 2023 17:39:40 +0600 Subject: [PATCH 315/583] Zombienet block building and balance transfer test --- .../0000-block-building/block-building.zndsl | 17 ++++++ .../transaction-gets-finalized.js | 59 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 zombienet/0000-block-building/block-building.zndsl create mode 100644 zombienet/0000-block-building/transaction-gets-finalized.js diff --git a/zombienet/0000-block-building/block-building.zndsl b/zombienet/0000-block-building/block-building.zndsl new file mode 100644 index 000000000..7bed0649f --- /dev/null +++ b/zombienet/0000-block-building/block-building.zndsl @@ -0,0 +1,17 @@ +Description: Block building +Network: ./block-building.toml +Creds: config + +alice: reports node_roles is 4 +bob: reports node_roles is 4 + +alice: reports peers count is at least 1 +bob: reports peers count is at least 1 + +alice: reports block height is at least 5 within 30 seconds +bob: reports block height is at least 5 within 30 seconds + +alice: count of log lines containing "error" is 0 within 2 seconds +bob: count of log lines containing "error" is 0 within 2 seconds + +alice: js-script ./transaction-gets-finalized.js within 30 seconds diff --git a/zombienet/0000-block-building/transaction-gets-finalized.js b/zombienet/0000-block-building/transaction-gets-finalized.js new file mode 100644 index 000000000..2533ef8b8 --- /dev/null +++ b/zombienet/0000-block-building/transaction-gets-finalized.js @@ -0,0 +1,59 @@ +// based on: https://github.com/paritytech/polkadot-sdk/blob/91deee7a1dba52e5e73d1a97d9fd5b8ad1e916a4/substrate/zombienet/0000-block-building/transaction-gets-finalized.js + +const assert = require('assert'); + +async function run(nodeName, networkInfo) { + const { wsUri, userDefinedTypes } = networkInfo.nodesByName[nodeName]; + const api = await zombie.connect(wsUri, userDefinedTypes); + + // Construct the keyring after the API (crypto has an async init) + const keyring = new zombie.Keyring({ type: 'sr25519' }); + + // Add Alice to our keyring with a hard-derivation path (empty phrase, so uses dev) + const alice = keyring.addFromUri('//Alice'); + const bob = '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty'; + + // Create a extrinsic, transferring 10^10 units to Bob + const transfer = api.tx.balances.transfer(bob, 10n ** 10n); + + let transaction_success_event = false; + try { + await new Promise(async (resolve, reject) => { + const unsubscribe = await transfer + .signAndSend(alice, { nonce: -1 }, ({ events = [], status }) => { + console.log('Transaction status:', status.type); + + if (status.isInBlock) { + console.log('Included at block hash', status.asInBlock.toHex()); + console.log('Events:'); + + events.forEach(({ event: { data, method, section }, phase }) => { + console.log('\t', phase.toString(), `: ${section}.${method}`, data.toString()); + + if (section == 'system' && method == 'ExtrinsicSuccess') { + transaction_success_event = true; + } + }); + } else if (status.isFinalized) { + console.log('Finalized block hash', status.asFinalized.toHex()); + unsubscribe(); + if (transaction_success_event) { + resolve(); + } else { + reject('ExtrinsicSuccess has not been seen'); + } + } else if (status.isError) { + unsubscribe(); + reject('Transaction status.isError'); + } + + }); + }); + } catch (error) { + assert.fail('Transfer promise failed, error: ' + error); + } + + assert.ok('test passed'); +} + +module.exports = { run } From 10d21bf45c609de6a81f43afce220fa671c32a6a Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 7 Sep 2023 12:54:58 +0600 Subject: [PATCH 316/583] Zombienet config for DDC validation development --- .../0001-ddc-validation/ddc-validation.toml | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 zombienet/0001-ddc-validation/ddc-validation.toml diff --git a/zombienet/0001-ddc-validation/ddc-validation.toml b/zombienet/0001-ddc-validation/ddc-validation.toml new file mode 100644 index 000000000..6a3fb41e2 --- /dev/null +++ b/zombienet/0001-ddc-validation/ddc-validation.toml @@ -0,0 +1,23 @@ +[relaychain] +default_command = "./target/release/cere" +default_args = ["--enable-ddc-validation"] +chain = "local" + + [[relaychain.nodes]] + name = "alice" + + [[relaychain.nodes]] + name = "bob" + + [[relaychain.nodes]] + name = "charlie" + + [[relaychain.nodes]] + name = "dave" + + [[relaychain.nodes]] + name = "eve" + + [[relaychain.nodes]] + name = "ferdie" + validator = false From c1fbc69d7cf6a6deb1e9d115824516f578fb9b88 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 7 Sep 2023 14:10:57 +0600 Subject: [PATCH 317/583] Add `zombienet` section to the README.md --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index f2493a607..951ac8f42 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,28 @@ Start Bob's node: > - Alice//stash > - Bob//stash +### Zombienet + +Zombienet is a cli tool to easily spawn ephemeral networks and perform tests against them. Its installation and usage guide is available [here](https://github.com/paritytech/zombienet#usage). + +The following scenarios expect the node binary available at `./target/release/cere`. + +#### Test block building + +Spawn 2 nodes network and test if it produces blocks and finalized transaction. + +```console +zombienet -p native test zombienet/0000-block-building/block-building.zndsl +``` + +#### Spawn 5 DDC validation nodes + +The following command spawns 5 validator nodes with DDC validation enabled as well as 1 non-validator node to check it is not affected. + +```console +zombienet -p native test zombienet/0001-ddc-validation/ddc-validation.toml +``` + ### Runtimes The node supports 2 runtimes. From c4e89179361cbccc77b7e550ac17da585c9a7172 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 7 Sep 2023 14:24:59 +0600 Subject: [PATCH 318/583] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index db17d69ad..4e09b33f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [D] New `pallet-ddc-validator` which implements DDC CDN nodes validation and rewarding. You can enable DDC validation providing `--enable-ddc-validation` argument. It will only work on the nodes with validation and offchain workers enabled as well. - [D] Several calls for `pallet-ddc-staking` to distribute rewards. - [D] DDC cluster managers access control list in `pallet-ddc-staking` managed by governance. +- [Zombienet](https://github.com/paritytech/zombienet) configurations to test block building and spawn a network for DDC validation debugging. ### Changed From ab6ce4fa86e7d27a5aae43bb0dd617447ae115b8 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 8 Sep 2023 18:50:44 +0600 Subject: [PATCH 319/583] Add DAC DataModel URL CLI parameter --- cli/src/cli.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cli/src/cli.rs b/cli/src/cli.rs index b60cea5b2..aeae79cff 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -18,6 +18,10 @@ pub struct RunCmd { #[clap(long)] pub enable_ddc_validation: bool, + /// DAC DataModel HTTP endpoint to retrieve DDC activity data for validation. + #[clap(long)] + pub dac_url: String, + /// Force using Cere Dev runtime. #[clap(long = "force-cere-dev")] pub force_cere_dev: bool, From 2dc6cfe11f833d1b4520aed44684a183a05aca7b Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 8 Sep 2023 18:52:13 +0600 Subject: [PATCH 320/583] Write provided DAC URL to the offchain storage --- cli/src/command.rs | 1 + node/service/src/lib.rs | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/cli/src/command.rs b/cli/src/command.rs index d5fb49bea..9865ccf85 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -249,6 +249,7 @@ pub fn run() -> sc_cli::Result<()> { config, cli.run.no_hardware_benchmarks, cli.run.enable_ddc_validation, + cli.run.dac_url, ) .map(|full| full.task_manager) .map_err(Error::Service) diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 3f6ffa118..692ed9598 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -271,6 +271,7 @@ pub fn build_full( config: Configuration, disable_hardware_benchmarks: bool, enable_ddc_validation: bool, + dac_url: String, ) -> Result, ServiceError> { #[cfg(feature = "cere-dev-native")] if config.chain_spec.is_cere_dev() { @@ -278,6 +279,7 @@ pub fn build_full( config, disable_hardware_benchmarks, enable_ddc_validation, + dac_url, |_, _| (), ) .map(|full| full.with_client(Client::CereDev)) @@ -289,6 +291,7 @@ pub fn build_full( config, disable_hardware_benchmarks, enable_ddc_validation, + dac_url, |_, _| (), ) .map(|full| full.with_client(Client::Cere)) @@ -323,6 +326,7 @@ pub fn new_full( mut config: Configuration, disable_hardware_benchmarks: bool, enable_ddc_validation: bool, + dac_url: String, with_startup_data: impl FnOnce( &sc_consensus_babe::BabeBlockImport< Block, @@ -352,15 +356,17 @@ where let basics = new_partial_basics::(&config)?; - basics + let mut offchain_storage = basics .backend .offchain_storage() - .expect("no off-chain storage, DDC validation is not possible") - .set( - sp_core::offchain::STORAGE_PREFIX, - b"enable-ddc-validation", - if enable_ddc_validation { &[1] } else { &[0] }, - ); + .expect("no off-chain storage, DDC validation is not possible"); + + offchain_storage.set( + sp_core::offchain::STORAGE_PREFIX, + b"enable-ddc-validation", + if enable_ddc_validation { &[1] } else { &[0] }, + ); + offchain_storage.set(sp_core::offchain::STORAGE_PREFIX, b"dac-url", dac_url.as_bytes()); let sc_service::PartialComponents { client, From 65800b476313b9934ac48af92c0559e9d26bef18 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 8 Sep 2023 18:54:42 +0600 Subject: [PATCH 321/583] Update key where the validation reads DAC URL --- pallets/ddc-validator/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 6dbf95561..473695839 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -83,7 +83,7 @@ pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); /// Webdis in experimental cluster connected to Redis in dev. pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://webdis:7379"; // pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; -pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; +pub const DATA_PROVIDER_URL_KEY: &[u8; 7] = b"dac-url"; pub const QUORUM_SIZE: usize = 1; #[derive(Debug)] From f9b04c79131cde93ba98f22bf5a8f43c92a420c0 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 8 Sep 2023 18:57:44 +0600 Subject: [PATCH 322/583] Pass DAC URL to ddc-validation zombienet --- zombienet/0001-ddc-validation/ddc-validation.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zombienet/0001-ddc-validation/ddc-validation.toml b/zombienet/0001-ddc-validation/ddc-validation.toml index 6a3fb41e2..64b4111ed 100644 --- a/zombienet/0001-ddc-validation/ddc-validation.toml +++ b/zombienet/0001-ddc-validation/ddc-validation.toml @@ -1,6 +1,6 @@ [relaychain] default_command = "./target/release/cere" -default_args = ["--enable-ddc-validation"] +default_args = ["--enable-ddc-validation --dac-url {{DAC_URL}}"] chain = "local" [[relaychain.nodes]] From fd6b815d227874120a9b7fc1e165f3774b4a19eb Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 8 Sep 2023 19:01:23 +0600 Subject: [PATCH 323/583] Add DAC URL to zombienet usage guide --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 951ac8f42..07d0962c9 100644 --- a/README.md +++ b/README.md @@ -133,9 +133,10 @@ zombienet -p native test zombienet/0000-block-building/block-building.zndsl #### Spawn 5 DDC validation nodes -The following command spawns 5 validator nodes with DDC validation enabled as well as 1 non-validator node to check it is not affected. +The following command spawns 5 validator nodes with DDC validation enabled as well as 1 non-validator node to check it is not affected. Set `DAC_URL` environment variable with an address to [webdis](https://webd.is/) which will proxy validator's requests for DDC activity data to DAC DataModel Redis. ```console +export DAC_URL=http://localhost:7379/ zombienet -p native test zombienet/0001-ddc-validation/ddc-validation.toml ``` From 50fbc4c1ab0333bdd2188f9f1761222230a43042 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 8 Sep 2023 19:03:24 +0600 Subject: [PATCH 324/583] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e09b33f0..85f6b0c20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- [D] New `pallet-ddc-validator` which implements DDC CDN nodes validation and rewarding. You can enable DDC validation providing `--enable-ddc-validation` argument. It will only work on the nodes with validation and offchain workers enabled as well. +- [D] New `pallet-ddc-validator` which implements DDC CDN nodes validation and rewarding. You can enable DDC validation providing `--enable-ddc-validation` argument and `--dac-url` argument to specify DAC endpoint. It will only work on the nodes with validation and offchain workers enabled as well. - [D] Several calls for `pallet-ddc-staking` to distribute rewards. - [D] DDC cluster managers access control list in `pallet-ddc-staking` managed by governance. - [Zombienet](https://github.com/paritytech/zombienet) configurations to test block building and spawn a network for DDC validation debugging. From 9201b827bedfa5121255a7903c6dadd160eab0b5 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 19 Sep 2023 10:52:44 +0200 Subject: [PATCH 325/583] account only for read logs/acks during validation --- pallets/ddc-validator/src/dac.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index a4c81320f..5eee856e2 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -216,10 +216,13 @@ pub fn get_acknowledged_bytes_bucket<'a>( let mut total_bytes_received = 0u64; let bucket_id = file_request.bucket_id; for (_, chunk) in &file_request.chunks { - if let Some(ack) = &chunk.ack { - total_bytes_received += ack.bytes_received; - } else { - total_bytes_received += get_proved_delivered_bytes(chunk, &ack_timestamps); + // Only check reads + if chunk.log.log_type == 1u64 { + if let Some(ack) = &chunk.ack { + total_bytes_received += ack.bytes_received; + } else { + total_bytes_received += get_proved_delivered_bytes(chunk, &ack_timestamps); + } } } acknowledged_bytes_by_bucket.push((bucket_id, total_bytes_received)); From dffc98600b579bee5349d57a45d132537ec9dc89 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 21 Sep 2023 13:54:42 +0600 Subject: [PATCH 326/583] Require all or none of DAC-related CLI parameters --- cli/src/cli.rs | 6 +++--- node/service/src/lib.rs | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/cli/src/cli.rs b/cli/src/cli.rs index aeae79cff..c904f01ea 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -15,12 +15,12 @@ pub struct RunCmd { /// Enable DDC validation (disabled by default). Works only on validator nodes with enabled /// offchain workers. - #[clap(long)] + #[clap(long, requires = "dac-url")] pub enable_ddc_validation: bool, /// DAC DataModel HTTP endpoint to retrieve DDC activity data for validation. - #[clap(long)] - pub dac_url: String, + #[clap(long, requires = "enable-ddc-validation")] + pub dac_url: Option, /// Force using Cere Dev runtime. #[clap(long = "force-cere-dev")] diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 692ed9598..6988b5641 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -271,7 +271,7 @@ pub fn build_full( config: Configuration, disable_hardware_benchmarks: bool, enable_ddc_validation: bool, - dac_url: String, + dac_url: Option, ) -> Result, ServiceError> { #[cfg(feature = "cere-dev-native")] if config.chain_spec.is_cere_dev() { @@ -326,7 +326,7 @@ pub fn new_full( mut config: Configuration, disable_hardware_benchmarks: bool, enable_ddc_validation: bool, - dac_url: String, + dac_url: Option, with_startup_data: impl FnOnce( &sc_consensus_babe::BabeBlockImport< Block, @@ -366,7 +366,9 @@ where b"enable-ddc-validation", if enable_ddc_validation { &[1] } else { &[0] }, ); - offchain_storage.set(sp_core::offchain::STORAGE_PREFIX, b"dac-url", dac_url.as_bytes()); + if let Some(dac_url) = dac_url { + offchain_storage.set(sp_core::offchain::STORAGE_PREFIX, b"dac-url", dac_url.as_bytes()); + }; let sc_service::PartialComponents { client, From d9437af43e7c474f15403c9e44b48bbe9d1e9cf4 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 21 Sep 2023 10:43:49 +0200 Subject: [PATCH 327/583] fix redundant event deposited for set_era_reward_points; fix not working last_validated_era local storage key --- pallets/ddc-validator/src/lib.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 6dbf95561..f3fdc5233 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -73,6 +73,8 @@ type ResultStr = Result; /// Offchain local storage key that holds the last era in which the validator completed its /// assignment. const LAST_VALIDATED_ERA_KEY: &[u8; 40] = b"pallet-ddc-validator::last_validated_era"; +/// Offchain local storage that holds the validation lock +const VALIDATION_LOCK: &[u8; 40] = b"pallet-ddc-validator::validation_lock"; /// Local storage key that holds the flag to enable DDC validation. Set it to true (0x01) to enable /// DDC validation, set it to false (0x00) or delete the key to disable it. @@ -344,8 +346,7 @@ pub mod pallet { let mut should_validate_because_new_era = true; - let mut validation_lock = - StorageLock::::new(LAST_VALIDATED_ERA_KEY); + let mut validation_lock = StorageLock::::new(VALIDATION_LOCK); // Skip if the validation is already in progress. if validation_lock.try_lock().is_err() { @@ -382,7 +383,6 @@ pub mod pallet { log::warn!("🔎 DDC validation failed. {}", e); return } - last_validated_era_storage.set(¤t_ddc_era); log::info!("🔎 DDC validation complete for {} era.", current_ddc_era); } @@ -478,6 +478,8 @@ pub mod pallet { Error::::NotValidatorStash ); + let mut rewards_counter = 0; + >::mutate(era, |era_rewards| { for (staker, points) in stakers_points.clone().into_iter() { if !Self::reward_points_set_for_node(era, &staker) { @@ -494,12 +496,15 @@ pub mod pallet { }, ); RewardPointsSetForNode::::insert(era, staker, true); + rewards_counter += 1; } } } }); - Self::deposit_event(Event::::EraRewardPoints(era, stakers_points)); + if rewards_counter > 0 { + Self::deposit_event(Event::::EraRewardPoints(era, stakers_points)); + } Ok(()) } From f7f3ed3ae02ae43e17f8679e16bc8c6cf8561846 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 21 Sep 2023 15:36:28 +0600 Subject: [PATCH 328/583] Add URL validator to DAC URL CLI parameter --- Cargo.lock | 5 +++-- cli/Cargo.toml | 1 + cli/src/cli.rs | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3a7808820..34121abb6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -742,6 +742,7 @@ dependencies = [ "sc-service", "substrate-build-script-utils", "try-runtime-cli", + "url", ] [[package]] @@ -9639,9 +9640,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna 0.4.0", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 460371d3c..77f4d290d 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -17,6 +17,7 @@ sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrat sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } try-runtime-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true , branch = "polkadot-v0.9.30" } +url = "2.4.1" # Local cere-service = { path = "../node/service", default-features = false, optional = true } diff --git a/cli/src/cli.rs b/cli/src/cli.rs index c904f01ea..880033ecf 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -19,7 +19,7 @@ pub struct RunCmd { pub enable_ddc_validation: bool, /// DAC DataModel HTTP endpoint to retrieve DDC activity data for validation. - #[clap(long, requires = "enable-ddc-validation")] + #[clap(long, requires = "enable-ddc-validation", validator = url::Url::parse)] pub dac_url: Option, /// Force using Cere Dev runtime. From 48819073156202697a62c8385d56075ae0dd3fda Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 21 Sep 2023 17:22:21 +0600 Subject: [PATCH 329/583] Camel case name for `ddc-accounts` pallet ID --- runtime/cere-dev/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 38741473a..6a26d5836 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1329,19 +1329,19 @@ impl pallet_ddc_staking::Config for Runtime { type DefaultStorageBondSize = DefaultStorageBondSize; type DefaultStorageChillDelay = DefaultStorageChillDelay; type RuntimeEvent = RuntimeEvent; - type StakersPayoutSource = Ddc_Accounts_Pallet_Id; + type StakersPayoutSource = DdcAccountsPalletId; type UnixTime = Timestamp; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; } parameter_types! { - pub const Ddc_Accounts_Pallet_Id: PalletId = PalletId(*b"accounts"); // DDC maintainer's stake + pub const DdcAccountsPalletId: PalletId = PalletId(*b"accounts"); // DDC maintainer's stake } impl pallet_ddc_accounts::Config for Runtime { type BondingDuration = BondingDuration; type Currency = Balances; - type PalletId = Ddc_Accounts_Pallet_Id; + type PalletId = DdcAccountsPalletId; type RuntimeEvent = RuntimeEvent; } From b4f0046c666096075820b8dd4f7263a0b5ff3c3d Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 21 Sep 2023 16:37:59 +0200 Subject: [PATCH 330/583] update impementation accroding to comments #1 --- pallets/ddc-validator/src/dac.rs | 16 +++++++++------- pallets/ddc-validator/src/lib.rs | 22 +++++++++++++++++++++- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index 5eee856e2..8800f64af 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -1,6 +1,6 @@ //! A module with Data Activity Capture (DAC) interaction. -use crate::{utils, DacTotalAggregates, ValidationDecision}; +use crate::{utils, DacTotalAggregates, LogType, ValidationDecision}; use alloc::string::String; // ToDo: remove String usage use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use codec::{Decode, Encode}; @@ -217,12 +217,14 @@ pub fn get_acknowledged_bytes_bucket<'a>( let bucket_id = file_request.bucket_id; for (_, chunk) in &file_request.chunks { // Only check reads - if chunk.log.log_type == 1u64 { - if let Some(ack) = &chunk.ack { - total_bytes_received += ack.bytes_received; - } else { - total_bytes_received += get_proved_delivered_bytes(chunk, &ack_timestamps); - } + match chunk.log.log_type.try_into() { + Ok(LogType::Read) => + if let Some(ack) = &chunk.ack { + total_bytes_received += ack.bytes_received; + } else { + total_bytes_received += get_proved_delivered_bytes(chunk, &ack_timestamps); + }, + _ => (), } } acknowledged_bytes_by_bucket.push((bucket_id, total_bytes_received)); diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index f3fdc5233..120772502 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -74,7 +74,7 @@ type ResultStr = Result; /// assignment. const LAST_VALIDATED_ERA_KEY: &[u8; 40] = b"pallet-ddc-validator::last_validated_era"; /// Offchain local storage that holds the validation lock -const VALIDATION_LOCK: &[u8; 40] = b"pallet-ddc-validator::validation_lock"; +const VALIDATION_LOCK: &[u8; 37] = b"pallet-ddc-validator::validation_lock"; /// Local storage key that holds the flag to enable DDC validation. Set it to true (0x01) to enable /// DDC validation, set it to false (0x00) or delete the key to disable it. @@ -88,6 +88,26 @@ pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://webdis:7379"; pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url"; pub const QUORUM_SIZE: usize = 1; +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] +pub enum LogType { + Write = 1, + Read = 2, + Query = 3, +} + +impl TryFrom for LogType { + type Error = &'static str; + + fn try_from(v: u64) -> Result { + match v { + x if x == LogType::Write as u64 => Ok(LogType::Write), + x if x == LogType::Read as u64 => Ok(LogType::Read), + x if x == LogType::Query as u64 => Ok(LogType::Query), + _ => Err("Invalid value to for log type"), + } + } +} + #[derive(Debug)] pub enum AssignmentError { NoValidators, From c9e99dae686bdaeb8b26e3391ae75521c06c26f7 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 21 Sep 2023 16:42:46 +0200 Subject: [PATCH 331/583] fix logtype enum --- pallets/ddc-validator/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 120772502..d33277dab 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -90,8 +90,8 @@ pub const QUORUM_SIZE: usize = 1; #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub enum LogType { - Write = 1, - Read = 2, + Read = 1, + Write = 2, Query = 3, } From 83016cf992829e66d201c4caef6804031a44b73a Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 22 Sep 2023 18:31:53 +0600 Subject: [PATCH 332/583] Launch `check` workflow on push to all branches --- .github/workflows/check.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index b4b77700e..88fc4b76e 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -4,7 +4,7 @@ name: Check Set-Up & Build on: # Triggers the workflow on push or pull request events but only for the master branch push: - branches: [ master ] + branches: [ '**' ] pull_request: branches: [ master ] From 0ec90561dcbadb177c0c3035cea121c61543d6a1 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 22 Sep 2023 18:32:49 +0600 Subject: [PATCH 333/583] Disable check workflow on a pull request to master --- .github/workflows/check.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 88fc4b76e..f170e84c4 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -5,8 +5,6 @@ on: # Triggers the workflow on push or pull request events but only for the master branch push: branches: [ '**' ] - pull_request: - branches: [ master ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: From 1d11dc827135a33cf3503787c62ae6ebbb4f1675 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 22 Sep 2023 18:37:05 +0600 Subject: [PATCH 334/583] Run `check.yaml` workflow on `ubuntu-22.04` --- .github/workflows/check.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index f170e84c4..88876a208 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -13,7 +13,7 @@ on: jobs: check: # The type of runner that the job will run on - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 # Steps represent a sequence of tasks that will be executed as part of the job steps: From 754d0308ba8169a67402431c253477175c788598 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 22 Sep 2023 18:38:03 +0600 Subject: [PATCH 335/583] Update actions/checkout to v4 --- .github/workflows/check.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 88876a208..5874103dc 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -18,7 +18,7 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set-Up run: sudo apt install -y git clang curl libssl-dev llvm libudev-dev From edd3b959744d1075c87aa684ed4e5c42850da9d5 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 22 Sep 2023 18:39:19 +0600 Subject: [PATCH 336/583] Simplify Rust setup for `check.yaml` workflow --- .github/workflows/check.yaml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 5874103dc..95fcab1ad 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -23,14 +23,10 @@ jobs: - name: Set-Up run: sudo apt install -y git clang curl libssl-dev llvm libudev-dev - - name: Install Rustup + - name: Install Rust run: | - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y - source ~/.cargo/env - rustup default stable - rustup update nightly - rustup update stable - rustup component add rustfmt --toolchain nightly + rustup update stable --no-self-update + rustup target add wasm32-unknown-unknown - name: Check Format run: | From 404c2d65877b0e489317482cc99fb4b965ff7153 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 22 Sep 2023 18:41:02 +0600 Subject: [PATCH 337/583] Use build cache in `check.yaml` workflow --- .github/workflows/check.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 95fcab1ad..b43e4c05c 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -32,6 +32,9 @@ jobs: run: | cargo fmt -- --check + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + - name: Check Build run: | SKIP_WASM_BUILD=1 cargo check --release From 56b5e5e168892d6215001af7dde2e61b614d08ec Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 22 Sep 2023 17:09:13 +0200 Subject: [PATCH 338/583] fix tests and naming --- pallets/ddc-validator/src/dac.rs | 4 ++-- pallets/ddc-validator/src/lib.rs | 12 ++++++------ pallets/ddc-validator/src/tests.rs | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index 8800f64af..b9c34e5dc 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -1,6 +1,6 @@ //! A module with Data Activity Capture (DAC) interaction. -use crate::{utils, DacTotalAggregates, LogType, ValidationDecision}; +use crate::{opCode, utils, DacTotalAggregates, ValidationDecision}; use alloc::string::String; // ToDo: remove String usage use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use codec::{Decode, Encode}; @@ -218,7 +218,7 @@ pub fn get_acknowledged_bytes_bucket<'a>( for (_, chunk) in &file_request.chunks { // Only check reads match chunk.log.log_type.try_into() { - Ok(LogType::Read) => + Ok(opCode::Read) => if let Some(ack) = &chunk.ack { total_bytes_received += ack.bytes_received; } else { diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index d33277dab..15dfb6c2a 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -89,20 +89,20 @@ pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url" pub const QUORUM_SIZE: usize = 1; #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub enum LogType { +pub enum opCode { Read = 1, Write = 2, - Query = 3, + Search = 3, } -impl TryFrom for LogType { +impl TryFrom for opCode { type Error = &'static str; fn try_from(v: u64) -> Result { match v { - x if x == LogType::Write as u64 => Ok(LogType::Write), - x if x == LogType::Read as u64 => Ok(LogType::Read), - x if x == LogType::Query as u64 => Ok(LogType::Query), + x if x == opCode::Write as u64 => Ok(opCode::Write), + x if x == opCode::Read as u64 => Ok(opCode::Read), + x if x == opCode::Query as u64 => Ok(opCode::Query), _ => Err("Invalid value to for log type"), } } diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index b728f0fd1..d7e0b7bd8 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -164,7 +164,7 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { let tx = Extrinsic::decode(&mut &*tx).unwrap(); assert!(tx.signature.is_some()); - let bucket_info = BucketsDetails { bucket_id: 5, amount: 600u128 }; + let bucket_info = BucketsDetails { bucket_id: 5, amount: 400u128 }; assert_eq!( tx.call, From ed9f2e20b5f92bf98870be28b0da29bc17d81318 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 22 Sep 2023 18:12:49 +0200 Subject: [PATCH 339/583] fix bug --- pallets/ddc-validator/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 15dfb6c2a..77070736e 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -102,7 +102,7 @@ impl TryFrom for opCode { match v { x if x == opCode::Write as u64 => Ok(opCode::Write), x if x == opCode::Read as u64 => Ok(opCode::Read), - x if x == opCode::Query as u64 => Ok(opCode::Query), + x if x == opCode::Search as u64 => Ok(opCode::Search), _ => Err("Invalid value to for log type"), } } From 098aa011f5e2c5c24a2474ad815076b60fbde533 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 25 Sep 2023 12:02:45 +0600 Subject: [PATCH 340/583] Update linux dependencies setup list --- .github/workflows/check.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index b43e4c05c..db63d8d96 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -20,8 +20,8 @@ jobs: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v4 - - name: Set-Up - run: sudo apt install -y git clang curl libssl-dev llvm libudev-dev + - name: Install linux dependencies + run: sudo apt install -y clang libssl-dev llvm libudev-dev protobuf-compiler - name: Install Rust run: | From ef9e2ec755492a9cd6910d9f53395333cd9ff991 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 25 Sep 2023 11:06:43 +0200 Subject: [PATCH 341/583] fix formatting --- pallets/ddc-validator/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 77070736e..a69c66db7 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -95,7 +95,7 @@ pub enum opCode { Search = 3, } -impl TryFrom for opCode { +impl TryFrom for OpCode { type Error = &'static str; fn try_from(v: u64) -> Result { From 5f5b07cebb7666e3aef0f910b99f8d6b856708c4 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 25 Sep 2023 12:30:59 +0200 Subject: [PATCH 342/583] fix formatting --- pallets/ddc-validator/src/dac.rs | 4 ++-- pallets/ddc-validator/src/lib.rs | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index b9c34e5dc..024a5adf6 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -1,6 +1,6 @@ //! A module with Data Activity Capture (DAC) interaction. -use crate::{opCode, utils, DacTotalAggregates, ValidationDecision}; +use crate::{utils, DacTotalAggregates, OpCode, ValidationDecision}; use alloc::string::String; // ToDo: remove String usage use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; use codec::{Decode, Encode}; @@ -218,7 +218,7 @@ pub fn get_acknowledged_bytes_bucket<'a>( for (_, chunk) in &file_request.chunks { // Only check reads match chunk.log.log_type.try_into() { - Ok(opCode::Read) => + Ok(OpCode::Read) => if let Some(ack) = &chunk.ack { total_bytes_received += ack.bytes_received; } else { diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index a69c66db7..b7a5a9c4d 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -89,7 +89,7 @@ pub const DATA_PROVIDER_URL_KEY: &[u8; 32] = b"ddc-validator::data-provider-url" pub const QUORUM_SIZE: usize = 1; #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub enum opCode { +pub enum OpCode { Read = 1, Write = 2, Search = 3, @@ -100,9 +100,9 @@ impl TryFrom for OpCode { fn try_from(v: u64) -> Result { match v { - x if x == opCode::Write as u64 => Ok(opCode::Write), - x if x == opCode::Read as u64 => Ok(opCode::Read), - x if x == opCode::Search as u64 => Ok(opCode::Search), + x if x == OpCode::Write as u64 => Ok(OpCode::Write), + x if x == OpCode::Read as u64 => Ok(OpCode::Read), + x if x == OpCode::Search as u64 => Ok(OpCode::Search), _ => Err("Invalid value to for log type"), } } From f82a304a7d56b59729ffffc72b20615fe5cd584b Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 26 Sep 2023 07:33:47 +0200 Subject: [PATCH 343/583] only consider read chunks to form validation decision --- pallets/ddc-validator/src/dac.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index 024a5adf6..c23b98588 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -240,12 +240,17 @@ pub fn get_served_bytes_sum(file_requests: &Requests) -> (u64, u64) { for (_, file_request) in file_requests { for (_, chunk) in &file_request.chunks { - total_bytes_sent += chunk.log.bytes_sent; + match chunk.log.log_type.try_into() { + Ok(OpCode::Read) => { + total_bytes_sent += chunk.log.bytes_sent; - if let Some(ack) = &chunk.ack { - total_bytes_received += ack.bytes_received; - } else { - total_bytes_received += get_proved_delivered_bytes(chunk, &ack_timestamps); + if let Some(ack) = &chunk.ack { + total_bytes_received += ack.bytes_received; + } else { + total_bytes_received += get_proved_delivered_bytes(chunk, &ack_timestamps); + } + }, + _ => (), } } } From 98fa85d8600237692856259c5d4b7f744b8f4886 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 26 Sep 2023 09:16:59 +0200 Subject: [PATCH 344/583] update expected validation results for tests --- .../ddc-validator/src/mock-data/set-1/validation-decision.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json b/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json index d4509acb7..de8eec3a7 100644 --- a/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json +++ b/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json @@ -1 +1 @@ -{"edge":"0101010101010101010101010101010101010101010101010101010101010101","result":true,"payload":[56, 47, 100, 81, 135, 215, 168, 111, 55, 82, 203, 118, 238, 69, 174, 209, 232, 241, 187, 128, 231, 237, 139, 193, 162, 162, 91, 11, 169, 209, 27, 55],"totals":{"received":600,"sent":600,"failed_by_client":0,"failure_rate":0}} \ No newline at end of file +{"edge":"0101010101010101010101010101010101010101010101010101010101010101","result":true,"payload":[56, 47, 100, 81, 135, 215, 168, 111, 55, 82, 203, 118, 238, 69, 174, 209, 232, 241, 187, 128, 231, 237, 139, 193, 162, 162, 91, 11, 169, 209, 27, 55],"totals":{"received":400,"sent":400,"failed_by_client":0,"failure_rate":0}} \ No newline at end of file From 5e3b0790525aebc1cd8d883d1231de16af95850e Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Mon, 25 Sep 2023 17:58:29 +0200 Subject: [PATCH 345/583] Update gov related constants --- node/service/src/chain_spec.rs | 2 +- runtime/cere-dev/src/lib.rs | 8 ++++---- runtime/cere/src/lib.rs | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index 2588a9a3d..412649e65 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -160,7 +160,7 @@ pub fn cere_dev_genesis( let num_endowed_accounts = endowed_accounts.len(); - const ENDOWMENT: Balance = 10_000_000 * TEST_UNITS; + const ENDOWMENT: Balance = 10_000_000_000 * TEST_UNITS; const STASH: Balance = ENDOWMENT / 1000; cere_dev::GenesisConfig { diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 6a26d5836..848e96ddc 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -800,11 +800,11 @@ impl pallet_collective::Config for Runtime { } parameter_types! { - pub const CandidacyBond: Balance = 100 * DOLLARS; + pub const CandidacyBond: Balance = 500_000_000 * DOLLARS; // 1 storage item created, key size is 32 bytes, value size is 16+16. pub const VotingBondBase: Balance = deposit(1, 64); pub const VotingBondFactor: Balance = 1 * DOLLARS; - pub const TermDuration: BlockNumber = 7 * DAYS; + pub const TermDuration: BlockNumber = 182 * DAYS; pub const DesiredMembers: u32 = 13; pub const DesiredRunnersUp: u32 = 20; pub const ElectionsPhragmenPalletId: LockIdentifier = *b"phrelect"; @@ -879,8 +879,8 @@ parameter_types! { pub const Burn: Permill = Permill::from_percent(0); pub const TipCountdown: BlockNumber = 1 * DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); - pub const TipReportDepositBase: Balance = 1 * DOLLARS; - pub const DataDepositPerByte: Balance = 1 * CENTS; + pub const TipReportDepositBase: Balance = 5_000_000 * DOLLARS; + pub const DataDepositPerByte: Balance = 1 * DOLLARS; pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub const MaximumReasonLength: u32 = 16384; pub const MaxApprovals: u32 = 100; diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 851bad201..dc19d78f1 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -798,11 +798,11 @@ impl pallet_collective::Config for Runtime { } parameter_types! { - pub const CandidacyBond: Balance = 100 * DOLLARS; + pub const CandidacyBond: Balance = 500_000_000 * DOLLARS; // 1 storage item created, key size is 32 bytes, value size is 16+16. pub const VotingBondBase: Balance = deposit(1, 64); pub const VotingBondFactor: Balance = 1 * DOLLARS; - pub const TermDuration: BlockNumber = 7 * DAYS; + pub const TermDuration: BlockNumber = 182 * DAYS; pub const DesiredMembers: u32 = 13; pub const DesiredRunnersUp: u32 = 20; pub const ElectionsPhragmenPalletId: LockIdentifier = *b"phrelect"; @@ -877,8 +877,8 @@ parameter_types! { pub const Burn: Permill = Permill::from_percent(0); pub const TipCountdown: BlockNumber = 1 * DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); - pub const TipReportDepositBase: Balance = 1 * DOLLARS; - pub const DataDepositPerByte: Balance = 1 * CENTS; + pub const TipReportDepositBase: Balance = 5_000_000 * DOLLARS; + pub const DataDepositPerByte: Balance = 1 * DOLLARS; pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub const MaximumReasonLength: u32 = 16384; pub const MaxApprovals: u32 = 100; From fa3c2be768380dfec54bf6b63fae423287306f7a Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 26 Sep 2023 11:05:28 +0200 Subject: [PATCH 346/583] Increase minimal proposal deposit --- runtime/cere-dev/src/lib.rs | 2 +- runtime/cere/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 848e96ddc..7ae0c2675 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -724,7 +724,7 @@ parameter_types! { pub const LaunchPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; pub const VotingPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; pub const FastTrackVotingPeriod: BlockNumber = 3 * 60 * MINUTES; - pub const MinimumDeposit: Balance = 5000 * DOLLARS; + pub const MinimumDeposit: Balance = 5_000_000 * DOLLARS; pub const EnactmentPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; pub const CooloffPeriod: BlockNumber = 7 * 24 * 60 * MINUTES; pub const MaxProposals: u32 = 100; diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index dc19d78f1..3b884d962 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -722,7 +722,7 @@ parameter_types! { pub const LaunchPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; pub const VotingPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; pub const FastTrackVotingPeriod: BlockNumber = 3 * 60 * MINUTES; - pub const MinimumDeposit: Balance = 5000 * DOLLARS; + pub const MinimumDeposit: Balance = 5_000_000 * DOLLARS; pub const EnactmentPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; pub const CooloffPeriod: BlockNumber = 7 * 24 * 60 * MINUTES; pub const MaxProposals: u32 = 100; From 1dc84a6abc36c40622f12c99a0668dd509b5b69a Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Wed, 27 Sep 2023 11:20:35 +0200 Subject: [PATCH 347/583] Update treasury and bounties proposal minimal bond --- runtime/cere-dev/src/lib.rs | 4 ++-- runtime/cere/src/lib.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 7ae0c2675..00ea9aed4 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -874,7 +874,7 @@ impl pallet_membership::Config for Runtime { parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); - pub const ProposalBondMinimum: Balance = 100 * DOLLARS; + pub const ProposalBondMinimum: Balance = 5_000_000 * DOLLARS; pub const SpendPeriod: BlockNumber = 1 * DAYS; pub const Burn: Permill = Permill::from_percent(0); pub const TipCountdown: BlockNumber = 1 * DAYS; @@ -914,7 +914,7 @@ impl pallet_treasury::Config for Runtime { parameter_types! { pub const BountyCuratorDeposit: Permill = Permill::from_percent(50); pub const BountyValueMinimum: Balance = 10 * DOLLARS; - pub const BountyDepositBase: Balance = 1 * DOLLARS; + pub const BountyDepositBase: Balance = 5_000_000 * DOLLARS; pub const CuratorDepositMultiplier: Permill = Permill::from_percent(50); pub const CuratorDepositMin: Balance = 1 * DOLLARS; pub const CuratorDepositMax: Balance = 100 * DOLLARS; diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 3b884d962..0327cfa1b 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -872,7 +872,7 @@ impl pallet_membership::Config for Runtime { parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); - pub const ProposalBondMinimum: Balance = 100 * DOLLARS; + pub const ProposalBondMinimum: Balance = 5_000_000 * DOLLARS; pub const SpendPeriod: BlockNumber = 1 * DAYS; pub const Burn: Permill = Permill::from_percent(0); pub const TipCountdown: BlockNumber = 1 * DAYS; @@ -912,7 +912,7 @@ impl pallet_treasury::Config for Runtime { parameter_types! { pub const BountyCuratorDeposit: Permill = Permill::from_percent(50); pub const BountyValueMinimum: Balance = 10 * DOLLARS; - pub const BountyDepositBase: Balance = 1 * DOLLARS; + pub const BountyDepositBase: Balance = 5_000_000 * DOLLARS; pub const CuratorDepositMultiplier: Permill = Permill::from_percent(50); pub const CuratorDepositMin: Balance = 1 * DOLLARS; pub const CuratorDepositMax: Balance = 100 * DOLLARS; From 0854e2c436c2c3bca69c42e3c990339452ff0812 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Thu, 28 Sep 2023 13:02:25 +0200 Subject: [PATCH 348/583] Update spec version --- runtime/cere-dev/src/lib.rs | 2 +- runtime/cere/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 00ea9aed4..13752e72f 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -128,7 +128,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: 48003, + spec_version: 48005, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 0327cfa1b..c27c8e8e6 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -125,7 +125,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: 48001, + spec_version: 48005, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, From 4339b5134dfeb25b4f338dec2682db00c281db08 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 29 Sep 2023 23:16:47 +0200 Subject: [PATCH 349/583] feat(pallet-nodes): basic abstractions for nodes are added --- Cargo.lock | 20 +++ Cargo.toml | 1 + pallets/ddc-nodes/Cargo.toml | 36 +++++ pallets/ddc-nodes/src/lib.rs | 259 +++++++++++++++++++++++++++++++++++ runtime/cere-dev/Cargo.toml | 2 + runtime/cere-dev/src/lib.rs | 4 + 6 files changed, 322 insertions(+) create mode 100644 pallets/ddc-nodes/Cargo.toml create mode 100644 pallets/ddc-nodes/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 34121abb6..4984b5c8e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -812,6 +812,7 @@ dependencies = [ "pallet-contracts-rpc-runtime-api", "pallet-ddc-accounts", "pallet-ddc-metrics-offchain-worker", + "pallet-ddc-nodes", "pallet-ddc-staking", "pallet-ddc-validator", "pallet-democracy", @@ -4870,6 +4871,25 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-ddc-nodes" +version = "4.8.1" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", + "sp-tracing", + "substrate-test-utils", +] + [[package]] name = "pallet-ddc-staking" version = "4.8.1" diff --git a/Cargo.toml b/Cargo.toml index 7c63183c3..b7a61035b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,7 @@ members = [ "pallets/ddc-metrics-offchain-worker", "pallets/ddc-validator", "pallets/ddc-accounts", + "pallets/ddc-nodes", ] [profile.release] diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml new file mode 100644 index 000000000..f6999d2c3 --- /dev/null +++ b/pallets/ddc-nodes/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "pallet-ddc-nodes" +version = "4.8.1" +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +log = { version = "0.4.17", default-features = false } +scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } + +[dev-dependencies] +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-support/std", + "frame-system/std", + "frame-benchmarking/std", + "scale-info/std", + "sp-io/std", + "sp-runtime/std", + "sp-staking/std", + "sp-std/std", +] +runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs new file mode 100644 index 000000000..c34aa3f27 --- /dev/null +++ b/pallets/ddc-nodes/src/lib.rs @@ -0,0 +1,259 @@ +//! # DDC Nodes Pallet +//! +//! The DDC Nodes pallet is used to manage nodes in DDC Cluster +//! +//! - [`Config`] +//! - [`Call`] +//! - [`Pallet`] +//! +//! ## GenesisConfig +//! +//! The DDC Nodes pallet depends on the [`GenesisConfig`]. The +//! `GenesisConfig` is optional and allow to set some initial nodes in DDC. + +#![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] + +// #[cfg(feature = "runtime-benchmarks")] +// pub mod benchmarking; +// #[cfg(any(feature = "runtime-benchmarks", test))] +// pub mod testing_utils; + +// #[cfg(test)] +// pub(crate) mod mock; +// #[cfg(test)] +// mod tests; + +// pub mod weights; +// use crate::weights::WeightInfo; + +use codec::{Decode, Encode, HasCompact}; +use frame_support::{pallet_prelude::*, BoundedVec, PalletId}; +use frame_system::pallet_prelude::*; +use scale_info::TypeInfo; +use sp_runtime::RuntimeDebug; +use sp_std::prelude::*; + +pub use pallet::*; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config {} + + // #[pallet::genesis_config] + // pub struct GenesisConfig { + + // } + + // #[cfg(feature = "std")] + // impl Default for GenesisConfig { + // fn default() -> Self { + // GenesisConfig {} + // } + // } + + // #[pallet::genesis_build] + // impl GenesisBuild for GenesisConfig { + // fn build(&self) {} + // } + + // #[pallet::event] + // #[pallet::generate_deposit(pub(crate) fn deposit_event)] + // pub enum Event { + + // } + + // #[pallet::error] + // pub enum Error { + + // } + + /// Map from all (unlocked) "controller" accounts to the info regarding the staking. + #[pallet::storage] + #[pallet::getter(fn storage_nodes)] + pub type StorageNodes = + StorageMap<_, Blake2_128Concat, StorageNodePubKey, StorageNode>; + + #[pallet::storage] + #[pallet::getter(fn cdn_nodes)] + pub type CDNNodes = StorageMap<_, Blake2_128Concat, CDNNodePubKey, CDNNode>; + + type StorageNodePubKey = sp_runtime::AccountId32; + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub struct StorageNode { + key: StorageNodePubKey, + status: u8, + props: StorageProps, + } + + impl StorageNode { + fn from_params(params: StorageParams) -> StorageNode { + StorageNode { + key: params.pub_key, + status: 1, + props: StorageProps { capacity: params.capacity }, + } + } + } + + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub struct StorageProps { + capacity: u32, + } + + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub struct StorageParams { + pub_key: StorageNodePubKey, + capacity: u32, + } + + type CDNNodePubKey = sp_runtime::AccountId32; + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub struct CDNNode { + key: CDNNodePubKey, + status: u8, + props: CDNProps, + } + + impl CDNNode { + fn from_params(params: CDNParams) -> CDNNode { + CDNNode { + key: params.pub_key, + status: 1, + props: CDNProps { url: params.url, location: params.location }, + } + } + } + + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub struct CDNProps { + url: Vec, + location: [u8; 2], + } + + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub struct CDNParams { + pub_key: CDNNodePubKey, + url: Vec, + location: [u8; 2], + } + + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub enum NodeParams { + StorageParams(StorageParams), + CDNParams(CDNParams), + } + + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub enum Node { + Storage(StorageNode), + CDN(CDNNode), + } + + #[derive(Debug, PartialEq)] + pub enum NodePubKey<'a> { + StoragePubKey(&'a StorageNodePubKey), + CDNPubKey(&'a CDNNodePubKey), + } + + #[derive(Debug, PartialEq)] + pub enum NodeProps<'a> { + StorageProps(&'a StorageProps), + CDNProps(&'a CDNProps), + } + + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub enum NodeType { + Storage = 1, + CDN = 2, + } + + pub trait NodeTrait { + fn get_key<'a>(&'a self) -> NodePubKey<'a>; + fn get_props<'a>(&'a self) -> NodeProps<'a>; + } + + impl NodeTrait for StorageNode { + fn get_key<'a>(&'a self) -> NodePubKey<'a> { + NodePubKey::StoragePubKey(&self.key) + } + fn get_props<'a>(&'a self) -> NodeProps<'a> { + NodeProps::StorageProps(&self.props) + } + } + + impl NodeTrait for CDNNode { + fn get_key<'a>(&'a self) -> NodePubKey<'a> { + NodePubKey::CDNPubKey(&self.key) + } + fn get_props<'a>(&'a self) -> NodeProps<'a> { + NodeProps::CDNProps(&self.props) + } + } + + impl NodeTrait for Node { + fn get_key<'a>(&'a self) -> NodePubKey<'a> { + match &self { + Node::Storage(node) => node.get_key(), + Node::CDN(node) => node.get_key(), + } + } + + fn get_props<'a>(&'a self) -> NodeProps<'a> { + match &self { + Node::Storage(node) => node.get_props(), + Node::CDN(node) => node.get_props(), + } + } + } + + impl From for u8 { + fn from(node_type: NodeType) -> Self { + match node_type { + NodeType::Storage => 1, + NodeType::CDN => 2, + } + } + } + + impl TryFrom for NodeType { + type Error = (); + + fn try_from(value: u8) -> Result { + match value { + 1 => Ok(NodeType::Storage), + 2 => Ok(NodeType::CDN), + _ => Err(()), + } + } + } + + #[pallet::call] + impl Pallet { + #[pallet::weight(10_000)] + pub fn create_node(origin: OriginFor, node_params: NodeParams) -> DispatchResult { + let _node_provider = ensure_signed(origin)?; + + match node_params { + NodeParams::StorageParams(storage_params) => { + let storage_node = StorageNode::from_params(storage_params); + StorageNodes::::insert(storage_node.key.clone(), storage_node); + }, + NodeParams::CDNParams(cdn_params) => { + let cdn_node = CDNNode::from_params(cdn_params); + CDNNodes::::insert(cdn_node.key.clone(), cdn_node); + }, + } + + Ok(()) + } + } +} diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 2a23b4c9f..35ac65486 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -104,6 +104,7 @@ pallet-ddc-validator = { version = "0.1.0", default-features = false, path = ".. pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } +pallet-ddc-nodes = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-nodes" } [build-dependencies] substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -185,6 +186,7 @@ std = [ "cere-dev-runtime-constants/std", "pallet-ddc-validator/std", "pallet-ddc-accounts/std", + "pallet-ddc-nodes/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 13752e72f..26c1a1448 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -50,6 +50,7 @@ pub use pallet_cere_ddc; pub use pallet_chainbridge; pub use pallet_ddc_accounts; pub use pallet_ddc_metrics_offchain_worker; +pub use pallet_ddc_nodes; pub use pallet_ddc_staking; use pallet_election_provider_multi_phase::SolutionAccuracyOf; use pallet_grandpa::{ @@ -1361,6 +1362,8 @@ impl pallet_ddc_validator::Config for Runtime { type ValidatorsMax = ValidatorsMax; } +impl pallet_ddc_nodes::Config for Runtime {} + construct_runtime!( pub enum Runtime where Block = Block, @@ -1415,6 +1418,7 @@ construct_runtime!( DdcStaking: pallet_ddc_staking, DdcValidator: pallet_ddc_validator, DdcAccounts: pallet_ddc_accounts, + DdcNode: pallet_ddc_nodes, } ); From 173c96dfe492339c9e24591326842c63339aff1d Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Mon, 2 Oct 2023 16:36:16 +0200 Subject: [PATCH 350/583] refactor: renaming generic node params and props --- pallets/ddc-nodes/src/lib.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index c34aa3f27..cbe57e479 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -91,26 +91,26 @@ pub mod pallet { pub struct StorageNode { key: StorageNodePubKey, status: u8, - props: StorageProps, + props: StorageNodeProps, } impl StorageNode { - fn from_params(params: StorageParams) -> StorageNode { + fn from_params(params: StorageNodeParams) -> StorageNode { StorageNode { key: params.pub_key, status: 1, - props: StorageProps { capacity: params.capacity }, + props: StorageNodeProps { capacity: params.capacity }, } } } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub struct StorageProps { + pub struct StorageNodeProps { capacity: u32, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub struct StorageParams { + pub struct StorageNodeParams { pub_key: StorageNodePubKey, capacity: u32, } @@ -120,27 +120,27 @@ pub mod pallet { pub struct CDNNode { key: CDNNodePubKey, status: u8, - props: CDNProps, + props: CDNNodeProps, } impl CDNNode { - fn from_params(params: CDNParams) -> CDNNode { + fn from_params(params: CDNNodeParams) -> CDNNode { CDNNode { key: params.pub_key, status: 1, - props: CDNProps { url: params.url, location: params.location }, + props: CDNNodeProps { url: params.url, location: params.location }, } } } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub struct CDNProps { + pub struct CDNNodeProps { url: Vec, location: [u8; 2], } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub struct CDNParams { + pub struct CDNNodeParams { pub_key: CDNNodePubKey, url: Vec, location: [u8; 2], @@ -148,8 +148,8 @@ pub mod pallet { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodeParams { - StorageParams(StorageParams), - CDNParams(CDNParams), + StorageParams(StorageNodeParams), + CDNParams(CDNNodeParams), } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] @@ -166,8 +166,8 @@ pub mod pallet { #[derive(Debug, PartialEq)] pub enum NodeProps<'a> { - StorageProps(&'a StorageProps), - CDNProps(&'a CDNProps), + StorageProps(&'a StorageNodeProps), + CDNProps(&'a CDNNodeProps), } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] From 25677d0c0e1215ea7855daabd57f38c2cec56db1 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Mon, 2 Oct 2023 19:09:00 +0200 Subject: [PATCH 351/583] feat: basic clusters pallet --- Cargo.lock | 20 +++++++ Cargo.toml | 1 + pallets/ddc-clusters/Cargo.toml | 37 +++++++++++++ pallets/ddc-clusters/src/lib.rs | 94 +++++++++++++++++++++++++++++++++ pallets/ddc-nodes/src/lib.rs | 83 ++++++++++++++--------------- runtime/cere-dev/Cargo.toml | 1 + runtime/cere-dev/src/lib.rs | 12 ++++- 7 files changed, 203 insertions(+), 45 deletions(-) create mode 100644 pallets/ddc-clusters/Cargo.toml create mode 100644 pallets/ddc-clusters/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 4984b5c8e..d9d6e9b98 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -811,6 +811,7 @@ dependencies = [ "pallet-contracts-primitives", "pallet-contracts-rpc-runtime-api", "pallet-ddc-accounts", + "pallet-ddc-clusters", "pallet-ddc-metrics-offchain-worker", "pallet-ddc-nodes", "pallet-ddc-staking", @@ -4845,6 +4846,25 @@ dependencies = [ "substrate-test-utils", ] +[[package]] +name = "pallet-ddc-clusters" +version = "4.8.1" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", + "sp-tracing", + "substrate-test-utils", +] + [[package]] name = "pallet-ddc-metrics-offchain-worker" version = "4.8.1" diff --git a/Cargo.toml b/Cargo.toml index b7a61035b..9bfa3cfa5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,6 +34,7 @@ members = [ "pallets/ddc-validator", "pallets/ddc-accounts", "pallets/ddc-nodes", + "pallets/ddc-clusters", ] [profile.release] diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml new file mode 100644 index 000000000..a305d15cc --- /dev/null +++ b/pallets/ddc-clusters/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "pallet-ddc-clusters" +version = "4.8.1" +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +log = { version = "0.4.17", default-features = false } +scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } + +[dev-dependencies] +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-support/std", + "frame-system/std", + "frame-benchmarking/std", + "scale-info/std", + "sp-io/std", + "sp-runtime/std", + "sp-staking/std", + "sp-std/std", +] +runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs new file mode 100644 index 000000000..0c61056c4 --- /dev/null +++ b/pallets/ddc-clusters/src/lib.rs @@ -0,0 +1,94 @@ +//! # DDC Nodes Pallet +//! +//! The DDC Clusters pallet is used to manage DDC Clusters +//! +//! - [`Config`] +//! - [`Call`] +//! - [`Pallet`] +//! +//! ## GenesisConfig +//! +//! The DDC Clusters pallet depends on the [`GenesisConfig`]. The +//! `GenesisConfig` is optional and allow to set some initial nodes in DDC. + +#![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] + +use codec::{Decode, Encode}; +use frame_support::pallet_prelude::*; +use frame_system::pallet_prelude::*; +pub use pallet::*; +use scale_info::TypeInfo; +use sp_core::hash::H160; +use sp_runtime::RuntimeDebug; +use sp_std::prelude::*; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + } + + #[pallet::event] + #[pallet::generate_deposit(pub(crate) fn deposit_event)] + pub enum Event { + ClusterCreated(ClusterId), + } + + #[pallet::error] + pub enum Error { + ClusterAlreadyExists, + } + + /// Map from all (unlocked) "controller" accounts to the info regarding the staking. + #[pallet::storage] + #[pallet::getter(fn storage_nodes)] + pub type Clusters = StorageMap<_, Blake2_128Concat, ClusterId, Cluster>; + + type ClusterId = H160; + + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub struct Cluster { + id: ClusterId, + } + + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub struct ClusterParams { + id: ClusterId, + } + + impl Cluster { + fn from_params(params: ClusterParams) -> Cluster { + Cluster { id: params.id } + } + } + + #[pallet::call] + impl Pallet { + #[pallet::weight(10_000)] + pub fn create_cluster( + origin: OriginFor, + cluster_params: ClusterParams, + ) -> DispatchResult { + let _cluster_manager = ensure_signed(origin)?; + + let cluster = Cluster::from_params(cluster_params); + let cluster_id = cluster.id.clone(); + + ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); + + Clusters::::insert(cluster_id.clone(), cluster); + Self::deposit_event(Event::::ClusterCreated(cluster_id)); + + Ok(()) + } + } +} diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index cbe57e479..6c87f6cb3 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -14,21 +14,8 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] -// #[cfg(feature = "runtime-benchmarks")] -// pub mod benchmarking; -// #[cfg(any(feature = "runtime-benchmarks", test))] -// pub mod testing_utils; - -// #[cfg(test)] -// pub(crate) mod mock; -// #[cfg(test)] -// mod tests; - -// pub mod weights; -// use crate::weights::WeightInfo; - -use codec::{Decode, Encode, HasCompact}; -use frame_support::{pallet_prelude::*, BoundedVec, PalletId}; +use codec::{Decode, Encode}; +use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; @@ -46,35 +33,20 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config {} - - // #[pallet::genesis_config] - // pub struct GenesisConfig { - - // } - - // #[cfg(feature = "std")] - // impl Default for GenesisConfig { - // fn default() -> Self { - // GenesisConfig {} - // } - // } - - // #[pallet::genesis_build] - // impl GenesisBuild for GenesisConfig { - // fn build(&self) {} - // } - - // #[pallet::event] - // #[pallet::generate_deposit(pub(crate) fn deposit_event)] - // pub enum Event { - - // } + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + } - // #[pallet::error] - // pub enum Error { + #[pallet::event] + #[pallet::generate_deposit(pub(crate) fn deposit_event)] + pub enum Event { + NodeCreated(NodeType, OwnableNodePubKey), + } - // } + #[pallet::error] + pub enum Error { + NodeAlreadyExists, + } /// Map from all (unlocked) "controller" accounts to the info regarding the staking. #[pallet::storage] @@ -164,6 +136,12 @@ pub mod pallet { CDNPubKey(&'a CDNNodePubKey), } + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub enum OwnableNodePubKey { + StoragePubKey(StorageNodePubKey), + CDNPubKey(CDNNodePubKey), + } + #[derive(Debug, PartialEq)] pub enum NodeProps<'a> { StorageProps(&'a StorageNodeProps), @@ -245,11 +223,30 @@ pub mod pallet { match node_params { NodeParams::StorageParams(storage_params) => { let storage_node = StorageNode::from_params(storage_params); - StorageNodes::::insert(storage_node.key.clone(), storage_node); + let node_key = storage_node.key.clone(); + + ensure!( + !StorageNodes::::contains_key(&node_key), + Error::::NodeAlreadyExists + ); + + StorageNodes::::insert(node_key.clone(), storage_node); + Self::deposit_event(Event::::NodeCreated( + NodeType::Storage, + OwnableNodePubKey::StoragePubKey(node_key), + )); }, NodeParams::CDNParams(cdn_params) => { let cdn_node = CDNNode::from_params(cdn_params); + let node_key = cdn_node.key.clone(); + + ensure!(!CDNNodes::::contains_key(&node_key), Error::::NodeAlreadyExists); + CDNNodes::::insert(cdn_node.key.clone(), cdn_node); + Self::deposit_event(Event::::NodeCreated( + NodeType::CDN, + OwnableNodePubKey::CDNPubKey(node_key), + )); }, } diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 35ac65486..a770756e9 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -105,6 +105,7 @@ pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pal pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } pallet-ddc-nodes = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-nodes" } +pallet-ddc-clusters = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-clusters" } [build-dependencies] substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 26c1a1448..a2bd98d21 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -49,6 +49,7 @@ use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; pub use pallet_cere_ddc; pub use pallet_chainbridge; pub use pallet_ddc_accounts; +pub use pallet_ddc_clusters; pub use pallet_ddc_metrics_offchain_worker; pub use pallet_ddc_nodes; pub use pallet_ddc_staking; @@ -1362,7 +1363,13 @@ impl pallet_ddc_validator::Config for Runtime { type ValidatorsMax = ValidatorsMax; } -impl pallet_ddc_nodes::Config for Runtime {} +impl pallet_ddc_nodes::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} + +impl pallet_ddc_clusters::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} construct_runtime!( pub enum Runtime where @@ -1418,7 +1425,8 @@ construct_runtime!( DdcStaking: pallet_ddc_staking, DdcValidator: pallet_ddc_validator, DdcAccounts: pallet_ddc_accounts, - DdcNode: pallet_ddc_nodes, + DdcNodes: pallet_ddc_nodes, + DdcClusters: pallet_ddc_clusters } ); From af57b0fdaa891f25463867933927597ac3f0986c Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Mon, 2 Oct 2023 21:40:07 +0200 Subject: [PATCH 352/583] feat(pallet-ddc-nodes): using generic Node type in pallet calls --- pallets/ddc-nodes/src/lib.rs | 152 ++++++++++++++++++++--------------- 1 file changed, 85 insertions(+), 67 deletions(-) diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 6c87f6cb3..e2c3c6bdc 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -40,12 +40,13 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { - NodeCreated(NodeType, OwnableNodePubKey), + NodeCreated(NodeType), } #[pallet::error] pub enum Error { NodeAlreadyExists, + InvalidNodeParams, } /// Map from all (unlocked) "controller" accounts to the info regarding the staking. @@ -66,16 +67,6 @@ pub mod pallet { props: StorageNodeProps, } - impl StorageNode { - fn from_params(params: StorageNodeParams) -> StorageNode { - StorageNode { - key: params.pub_key, - status: 1, - props: StorageNodeProps { capacity: params.capacity }, - } - } - } - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNodeProps { capacity: u32, @@ -95,16 +86,6 @@ pub mod pallet { props: CDNNodeProps, } - impl CDNNode { - fn from_params(params: CDNNodeParams) -> CDNNode { - CDNNode { - key: params.pub_key, - status: 1, - props: CDNNodeProps { url: params.url, location: params.location }, - } - } - } - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNodeProps { url: Vec, @@ -118,19 +99,19 @@ pub mod pallet { location: [u8; 2], } - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub enum NodeParams { - StorageParams(StorageNodeParams), - CDNParams(CDNNodeParams), - } - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum Node { Storage(StorageNode), CDN(CDNNode), } - #[derive(Debug, PartialEq)] + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub enum NodeParams { + StorageParams(StorageNodeParams), + CDNParams(CDNNodeParams), + } + + #[derive(Clone, RuntimeDebug, PartialEq)] pub enum NodePubKey<'a> { StoragePubKey(&'a StorageNodePubKey), CDNPubKey(&'a CDNNodePubKey), @@ -142,7 +123,7 @@ pub mod pallet { CDNPubKey(CDNNodePubKey), } - #[derive(Debug, PartialEq)] + #[derive(Clone, RuntimeDebug, PartialEq)] pub enum NodeProps<'a> { StorageProps(&'a StorageNodeProps), CDNProps(&'a CDNNodeProps), @@ -155,42 +136,81 @@ pub mod pallet { } pub trait NodeTrait { - fn get_key<'a>(&'a self) -> NodePubKey<'a>; + fn get_pub_key<'a>(&'a self) -> NodePubKey<'a>; fn get_props<'a>(&'a self) -> NodeProps<'a>; + fn get_type(&self) -> NodeType; + fn from_params(params: NodeParams) -> Result>; } impl NodeTrait for StorageNode { - fn get_key<'a>(&'a self) -> NodePubKey<'a> { + fn get_pub_key<'a>(&'a self) -> NodePubKey<'a> { NodePubKey::StoragePubKey(&self.key) } fn get_props<'a>(&'a self) -> NodeProps<'a> { NodeProps::StorageProps(&self.props) } + fn get_type(&self) -> NodeType { + NodeType::Storage + } + fn from_params(params: NodeParams) -> Result> { + match params { + NodeParams::StorageParams(params) => Ok(Node::Storage(StorageNode { + key: params.pub_key, + status: 1, + props: StorageNodeProps { capacity: params.capacity }, + })), + _ => Err(Error::::NodeAlreadyExists), + } + } } impl NodeTrait for CDNNode { - fn get_key<'a>(&'a self) -> NodePubKey<'a> { + fn get_pub_key<'a>(&'a self) -> NodePubKey<'a> { NodePubKey::CDNPubKey(&self.key) } fn get_props<'a>(&'a self) -> NodeProps<'a> { NodeProps::CDNProps(&self.props) } + fn get_type(&self) -> NodeType { + NodeType::CDN + } + fn from_params(params: NodeParams) -> Result> { + match params { + NodeParams::CDNParams(params) => Ok(Node::CDN(CDNNode { + key: params.pub_key, + status: 1, + props: CDNNodeProps { url: params.url, location: params.location }, + })), + _ => Err(Error::::NodeAlreadyExists), + } + } } impl NodeTrait for Node { - fn get_key<'a>(&'a self) -> NodePubKey<'a> { + fn get_pub_key<'a>(&'a self) -> NodePubKey<'a> { match &self { - Node::Storage(node) => node.get_key(), - Node::CDN(node) => node.get_key(), + Node::Storage(node) => node.get_pub_key(), + Node::CDN(node) => node.get_pub_key(), } } - fn get_props<'a>(&'a self) -> NodeProps<'a> { match &self { Node::Storage(node) => node.get_props(), Node::CDN(node) => node.get_props(), } } + fn get_type(&self) -> NodeType { + match &self { + Node::Storage(node) => node.get_type(), + Node::CDN(node) => node.get_type(), + } + } + fn from_params(params: NodeParams) -> Result> { + match params { + NodeParams::StorageParams(_) => StorageNode::from_params(params), + NodeParams::CDNParams(_) => CDNNode::from_params(params), + } + } } impl From for u8 { @@ -204,7 +224,6 @@ pub mod pallet { impl TryFrom for NodeType { type Error = (); - fn try_from(value: u8) -> Result { match value { 1 => Ok(NodeType::Storage), @@ -214,42 +233,41 @@ pub mod pallet { } } - #[pallet::call] - impl Pallet { - #[pallet::weight(10_000)] - pub fn create_node(origin: OriginFor, node_params: NodeParams) -> DispatchResult { - let _node_provider = ensure_signed(origin)?; - - match node_params { - NodeParams::StorageParams(storage_params) => { - let storage_node = StorageNode::from_params(storage_params); - let node_key = storage_node.key.clone(); - - ensure!( - !StorageNodes::::contains_key(&node_key), - Error::::NodeAlreadyExists - ); + pub trait NodeRepositoryTrait { + fn save(node: Node) -> Result<(), pallet::Error>; + } - StorageNodes::::insert(node_key.clone(), storage_node); - Self::deposit_event(Event::::NodeCreated( - NodeType::Storage, - OwnableNodePubKey::StoragePubKey(node_key), - )); + struct NodeRepository; + impl NodeRepositoryTrait for NodeRepository { + fn save(node: Node) -> Result<(), pallet::Error> { + match node { + Node::Storage(storage_node) => { + if StorageNodes::::contains_key(&storage_node.key) { + return Err(Error::::NodeAlreadyExists) + } + StorageNodes::::insert(storage_node.key.clone(), storage_node); + Ok(()) }, - NodeParams::CDNParams(cdn_params) => { - let cdn_node = CDNNode::from_params(cdn_params); - let node_key = cdn_node.key.clone(); - - ensure!(!CDNNodes::::contains_key(&node_key), Error::::NodeAlreadyExists); - + Node::CDN(cdn_node) => { + if CDNNodes::::contains_key(&cdn_node.key) { + return Err(Error::::NodeAlreadyExists) + } CDNNodes::::insert(cdn_node.key.clone(), cdn_node); - Self::deposit_event(Event::::NodeCreated( - NodeType::CDN, - OwnableNodePubKey::CDNPubKey(node_key), - )); + Ok(()) }, } + } + } + #[pallet::call] + impl Pallet { + #[pallet::weight(10_000)] + pub fn create_node(origin: OriginFor, node_params: NodeParams) -> DispatchResult { + let node_provider = ensure_signed(origin)?; + let node = Node::from_params::(node_params)?; + let node_type = node.get_type(); + NodeRepository::save::(node)?; + Self::deposit_event(Event::::NodeCreated(node_type)); Ok(()) } } From 1d0d3d5d2285e6b8c738eb71c2b2eda468a37733 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Mon, 2 Oct 2023 22:54:44 +0200 Subject: [PATCH 353/583] feat: using ref typse for Node pub key and params --- pallets/ddc-clusters/src/lib.rs | 3 +- pallets/ddc-nodes/src/lib.rs | 82 ++++++++++++++++++--------------- 2 files changed, 47 insertions(+), 38 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 0c61056c4..8ed0f071c 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -48,7 +48,6 @@ pub mod pallet { ClusterAlreadyExists, } - /// Map from all (unlocked) "controller" accounts to the info regarding the staking. #[pallet::storage] #[pallet::getter(fn storage_nodes)] pub type Clusters = StorageMap<_, Blake2_128Concat, ClusterId, Cluster>; @@ -78,7 +77,7 @@ pub mod pallet { origin: OriginFor, cluster_params: ClusterParams, ) -> DispatchResult { - let _cluster_manager = ensure_signed(origin)?; + ensure_signed(origin)?; let cluster = Cluster::from_params(cluster_params); let cluster_id = cluster.id.clone(); diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index e2c3c6bdc..f00ef4cfd 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -40,7 +40,7 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { - NodeCreated(NodeType), + NodeCreated(NodePubKey), } #[pallet::error] @@ -49,7 +49,6 @@ pub mod pallet { InvalidNodeParams, } - /// Map from all (unlocked) "controller" accounts to the info regarding the staking. #[pallet::storage] #[pallet::getter(fn storage_nodes)] pub type StorageNodes = @@ -62,7 +61,7 @@ pub mod pallet { type StorageNodePubKey = sp_runtime::AccountId32; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNode { - key: StorageNodePubKey, + pub_key: StorageNodePubKey, status: u8, props: StorageNodeProps, } @@ -81,7 +80,7 @@ pub mod pallet { type CDNNodePubKey = sp_runtime::AccountId32; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNode { - key: CDNNodePubKey, + pub_key: CDNNodePubKey, status: u8, props: CDNNodeProps, } @@ -111,22 +110,33 @@ pub mod pallet { CDNParams(CDNNodeParams), } - #[derive(Clone, RuntimeDebug, PartialEq)] - pub enum NodePubKey<'a> { - StoragePubKey(&'a StorageNodePubKey), - CDNPubKey(&'a CDNNodePubKey), - } - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub enum OwnableNodePubKey { + pub enum NodePubKey { StoragePubKey(StorageNodePubKey), CDNPubKey(CDNNodePubKey), } #[derive(Clone, RuntimeDebug, PartialEq)] - pub enum NodeProps<'a> { - StorageProps(&'a StorageNodeProps), - CDNProps(&'a CDNNodeProps), + pub enum NodePubKeyRef<'a> { + StoragePubKeyRef(&'a StorageNodePubKey), + CDNPubKeyRef(&'a CDNNodePubKey), + } + + impl<'a> NodePubKeyRef<'a> { + pub fn to_owned(&self) -> NodePubKey { + match &self { + NodePubKeyRef::StoragePubKeyRef(pub_key_ref) => + NodePubKey::StoragePubKey((**pub_key_ref).clone()), + NodePubKeyRef::CDNPubKeyRef(pub_key_ref) => + NodePubKey::CDNPubKey((**pub_key_ref).clone()), + } + } + } + + #[derive(Clone, RuntimeDebug, PartialEq)] + pub enum NodePropsRef<'a> { + StoragePropsRef(&'a StorageNodeProps), + CDNPropsRef(&'a CDNNodeProps), } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] @@ -136,18 +146,18 @@ pub mod pallet { } pub trait NodeTrait { - fn get_pub_key<'a>(&'a self) -> NodePubKey<'a>; - fn get_props<'a>(&'a self) -> NodeProps<'a>; + fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; + fn get_props<'a>(&'a self) -> NodePropsRef<'a>; fn get_type(&self) -> NodeType; fn from_params(params: NodeParams) -> Result>; } impl NodeTrait for StorageNode { - fn get_pub_key<'a>(&'a self) -> NodePubKey<'a> { - NodePubKey::StoragePubKey(&self.key) + fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { + NodePubKeyRef::StoragePubKeyRef(&self.pub_key) } - fn get_props<'a>(&'a self) -> NodeProps<'a> { - NodeProps::StorageProps(&self.props) + fn get_props<'a>(&'a self) -> NodePropsRef<'a> { + NodePropsRef::StoragePropsRef(&self.props) } fn get_type(&self) -> NodeType { NodeType::Storage @@ -155,7 +165,7 @@ pub mod pallet { fn from_params(params: NodeParams) -> Result> { match params { NodeParams::StorageParams(params) => Ok(Node::Storage(StorageNode { - key: params.pub_key, + pub_key: params.pub_key, status: 1, props: StorageNodeProps { capacity: params.capacity }, })), @@ -165,11 +175,11 @@ pub mod pallet { } impl NodeTrait for CDNNode { - fn get_pub_key<'a>(&'a self) -> NodePubKey<'a> { - NodePubKey::CDNPubKey(&self.key) + fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { + NodePubKeyRef::CDNPubKeyRef(&self.pub_key) } - fn get_props<'a>(&'a self) -> NodeProps<'a> { - NodeProps::CDNProps(&self.props) + fn get_props<'a>(&'a self) -> NodePropsRef<'a> { + NodePropsRef::CDNPropsRef(&self.props) } fn get_type(&self) -> NodeType { NodeType::CDN @@ -177,7 +187,7 @@ pub mod pallet { fn from_params(params: NodeParams) -> Result> { match params { NodeParams::CDNParams(params) => Ok(Node::CDN(CDNNode { - key: params.pub_key, + pub_key: params.pub_key, status: 1, props: CDNNodeProps { url: params.url, location: params.location }, })), @@ -187,13 +197,13 @@ pub mod pallet { } impl NodeTrait for Node { - fn get_pub_key<'a>(&'a self) -> NodePubKey<'a> { + fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { match &self { Node::Storage(node) => node.get_pub_key(), Node::CDN(node) => node.get_pub_key(), } } - fn get_props<'a>(&'a self) -> NodeProps<'a> { + fn get_props<'a>(&'a self) -> NodePropsRef<'a> { match &self { Node::Storage(node) => node.get_props(), Node::CDN(node) => node.get_props(), @@ -242,17 +252,17 @@ pub mod pallet { fn save(node: Node) -> Result<(), pallet::Error> { match node { Node::Storage(storage_node) => { - if StorageNodes::::contains_key(&storage_node.key) { + if StorageNodes::::contains_key(&storage_node.pub_key) { return Err(Error::::NodeAlreadyExists) } - StorageNodes::::insert(storage_node.key.clone(), storage_node); + StorageNodes::::insert(storage_node.pub_key.clone(), storage_node); Ok(()) }, Node::CDN(cdn_node) => { - if CDNNodes::::contains_key(&cdn_node.key) { + if CDNNodes::::contains_key(&cdn_node.pub_key) { return Err(Error::::NodeAlreadyExists) } - CDNNodes::::insert(cdn_node.key.clone(), cdn_node); + CDNNodes::::insert(cdn_node.pub_key.clone(), cdn_node); Ok(()) }, } @@ -263,11 +273,11 @@ pub mod pallet { impl Pallet { #[pallet::weight(10_000)] pub fn create_node(origin: OriginFor, node_params: NodeParams) -> DispatchResult { - let node_provider = ensure_signed(origin)?; - let node = Node::from_params::(node_params)?; - let node_type = node.get_type(); + ensure_signed(origin)?; + let node: Node = Node::from_params::(node_params)?; + let node_pub_key = node.get_pub_key().to_owned(); NodeRepository::save::(node)?; - Self::deposit_event(Event::::NodeCreated(node_type)); + Self::deposit_event(Event::::NodeCreated(node_pub_key)); Ok(()) } } From 10dc11b947061579ae5686e651edf2f4dbdacb0c Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Tue, 3 Oct 2023 01:08:57 +0200 Subject: [PATCH 354/583] feat: loose coupling between nodes and clusters pallets to provide access for nodes repository --- Cargo.lock | 1 + pallets/ddc-clusters/Cargo.toml | 1 + pallets/ddc-clusters/src/lib.rs | 15 ++++++++++ pallets/ddc-nodes/src/lib.rs | 51 ++++++++++++++++++++++----------- runtime/cere-dev/src/lib.rs | 1 + 5 files changed, 53 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d9d6e9b98..b7978f71d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4854,6 +4854,7 @@ dependencies = [ "frame-support", "frame-system", "log", + "pallet-ddc-nodes", "parity-scale-codec", "scale-info", "sp-core", diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index a305d15cc..22786b2dd 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -15,6 +15,7 @@ sp-runtime = { version = "6.0.0", default-features = false, git = "https://githu sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } [dev-dependencies] sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 8ed0f071c..80555a113 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -23,6 +23,8 @@ use sp_core::hash::H160; use sp_runtime::RuntimeDebug; use sp_std::prelude::*; +use pallet_ddc_nodes::{NodePubKey, NodeRepository}; + #[frame_support::pallet] pub mod pallet { use super::*; @@ -35,6 +37,7 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config { type RuntimeEvent: From> + IsType<::RuntimeEvent>; + type NodeRepository: NodeRepository; } #[pallet::event] @@ -89,5 +92,17 @@ pub mod pallet { Ok(()) } + + #[pallet::weight(10_000)] + pub fn add_node( + origin: OriginFor, + cluster_id: ClusterId, + node_pub_key: NodePubKey, + ) -> DispatchResult { + ensure_signed(origin)?; + let node = T::NodeRepository::get(node_pub_key)?; + + Ok(()) + } } } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index f00ef4cfd..9c901ca80 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -46,6 +46,7 @@ pub mod pallet { #[pallet::error] pub enum Error { NodeAlreadyExists, + NodeDoesNotExist, InvalidNodeParams, } @@ -245,40 +246,58 @@ pub mod pallet { pub trait NodeRepositoryTrait { fn save(node: Node) -> Result<(), pallet::Error>; + fn get(pub_key: NodePubKey) -> Result>; } - struct NodeRepository; - impl NodeRepositoryTrait for NodeRepository { - fn save(node: Node) -> Result<(), pallet::Error> { + #[pallet::call] + impl Pallet { + #[pallet::weight(10_000)] + pub fn create_node(origin: OriginFor, node_params: NodeParams) -> DispatchResult { + ensure_signed(origin)?; + let node: Node = Node::from_params::(node_params)?; + let node_pub_key = node.get_pub_key().to_owned(); + Self::save(node)?; + Self::deposit_event(Event::::NodeCreated(node_pub_key)); + Ok(()) + } + } + + pub trait NodeRepository { + fn save(node: Node) -> Result<(), &'static str>; + fn get(pub_key: NodePubKey) -> Result; + } + + impl NodeRepository for Pallet { + fn save(node: Node) -> Result<(), &'static str> { match node { Node::Storage(storage_node) => { if StorageNodes::::contains_key(&storage_node.pub_key) { - return Err(Error::::NodeAlreadyExists) + return Err("Node already exists") } StorageNodes::::insert(storage_node.pub_key.clone(), storage_node); Ok(()) }, Node::CDN(cdn_node) => { if CDNNodes::::contains_key(&cdn_node.pub_key) { - return Err(Error::::NodeAlreadyExists) + return Err("Node already exists") } CDNNodes::::insert(cdn_node.pub_key.clone(), cdn_node); Ok(()) }, } } - } - #[pallet::call] - impl Pallet { - #[pallet::weight(10_000)] - pub fn create_node(origin: OriginFor, node_params: NodeParams) -> DispatchResult { - ensure_signed(origin)?; - let node: Node = Node::from_params::(node_params)?; - let node_pub_key = node.get_pub_key().to_owned(); - NodeRepository::save::(node)?; - Self::deposit_event(Event::::NodeCreated(node_pub_key)); - Ok(()) + fn get(node_pub_key: NodePubKey) -> Result { + match node_pub_key { + NodePubKey::StoragePubKey(pub_key) => match StorageNodes::::try_get(pub_key) { + Ok(node) => Ok(Node::Storage(node)), + Err(_) => Err("Node does not exist"), + }, + NodePubKey::CDNPubKey(pub_key) => match CDNNodes::::try_get(pub_key) { + Ok(node) => Ok(Node::CDN(node)), + Err(_) => Err("Node does not exist"), + }, + } } } } diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index a2bd98d21..ff5778e9e 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1369,6 +1369,7 @@ impl pallet_ddc_nodes::Config for Runtime { impl pallet_ddc_clusters::Config for Runtime { type RuntimeEvent = RuntimeEvent; + type NodeRepository = pallet_ddc_nodes::Pallet; } construct_runtime!( From 10719965ac8e722e05b29ec225be5f17786bc278 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Tue, 3 Oct 2023 01:39:57 +0200 Subject: [PATCH 355/583] feat: setting cluster_id for node --- pallets/ddc-clusters/src/lib.rs | 3 ++- pallets/ddc-nodes/Cargo.toml | 1 + pallets/ddc-nodes/src/lib.rs | 36 +++++++++++++++++++++++++-------- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 80555a113..4b46ae5d5 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -100,7 +100,8 @@ pub mod pallet { node_pub_key: NodePubKey, ) -> DispatchResult { ensure_signed(origin)?; - let node = T::NodeRepository::get(node_pub_key)?; + + T::NodeRepository::add_to_cluster(node_pub_key, cluster_id)?; Ok(()) } diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index f6999d2c3..d05d85bf2 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -14,6 +14,7 @@ sp-io = { version = "6.0.0", default-features = false, git = "https://github.com sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } [dev-dependencies] sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 9c901ca80..baf3a2c73 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -18,6 +18,7 @@ use codec::{Decode, Encode}; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; use scale_info::TypeInfo; +use sp_core::hash::H160; use sp_runtime::RuntimeDebug; use sp_std::prelude::*; @@ -59,11 +60,14 @@ pub mod pallet { #[pallet::getter(fn cdn_nodes)] pub type CDNNodes = StorageMap<_, Blake2_128Concat, CDNNodePubKey, CDNNode>; + // todo: add the type to the Config + type ClusterId = H160; + type StorageNodePubKey = sp_runtime::AccountId32; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNode { pub_key: StorageNodePubKey, - status: u8, + cluster_id: Option, props: StorageNodeProps, } @@ -82,7 +86,7 @@ pub mod pallet { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNode { pub_key: CDNNodePubKey, - status: u8, + cluster_id: Option, props: CDNNodeProps, } @@ -167,7 +171,7 @@ pub mod pallet { match params { NodeParams::StorageParams(params) => Ok(Node::Storage(StorageNode { pub_key: params.pub_key, - status: 1, + cluster_id: None, props: StorageNodeProps { capacity: params.capacity }, })), _ => Err(Error::::NodeAlreadyExists), @@ -189,7 +193,7 @@ pub mod pallet { match params { NodeParams::CDNParams(params) => Ok(Node::CDN(CDNNode { pub_key: params.pub_key, - status: 1, + cluster_id: None, props: CDNNodeProps { url: params.url, location: params.location }, })), _ => Err(Error::::NodeAlreadyExists), @@ -245,7 +249,7 @@ pub mod pallet { } pub trait NodeRepositoryTrait { - fn save(node: Node) -> Result<(), pallet::Error>; + fn create(node: Node) -> Result<(), pallet::Error>; fn get(pub_key: NodePubKey) -> Result>; } @@ -256,19 +260,20 @@ pub mod pallet { ensure_signed(origin)?; let node: Node = Node::from_params::(node_params)?; let node_pub_key = node.get_pub_key().to_owned(); - Self::save(node)?; + Self::create(node)?; Self::deposit_event(Event::::NodeCreated(node_pub_key)); Ok(()) } } pub trait NodeRepository { - fn save(node: Node) -> Result<(), &'static str>; + fn create(node: Node) -> Result<(), &'static str>; fn get(pub_key: NodePubKey) -> Result; + fn add_to_cluster(pub_key: NodePubKey, cluster_id: ClusterId) -> Result<(), &'static str>; } impl NodeRepository for Pallet { - fn save(node: Node) -> Result<(), &'static str> { + fn create(node: Node) -> Result<(), &'static str> { match node { Node::Storage(storage_node) => { if StorageNodes::::contains_key(&storage_node.pub_key) { @@ -299,5 +304,20 @@ pub mod pallet { }, } } + + fn add_to_cluster(pub_key: NodePubKey, cluster_id: ClusterId) -> Result<(), &'static str> { + let mut node = Self::get(pub_key)?; + match node { + Node::Storage(mut storage_node) => { + storage_node.cluster_id = Some(cluster_id); + StorageNodes::::insert(storage_node.pub_key.clone(), storage_node); + }, + Node::CDN(mut cdn_node) => { + cdn_node.cluster_id = Some(cluster_id); + CDNNodes::::insert(cdn_node.pub_key.clone(), cdn_node); + }, + } + Ok(()) + } } } From 81f89d5f161e3e17670e16546ed78822ef8f35e2 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Wed, 4 Oct 2023 20:33:36 +0200 Subject: [PATCH 356/583] fix: node type is added to external event --- pallets/ddc-nodes/src/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index baf3a2c73..0717dec4e 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -41,7 +41,7 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { - NodeCreated(NodePubKey), + NodeCreated(NodeType, NodePubKey), } #[pallet::error] @@ -260,8 +260,9 @@ pub mod pallet { ensure_signed(origin)?; let node: Node = Node::from_params::(node_params)?; let node_pub_key = node.get_pub_key().to_owned(); + let node_type = node.get_type(); Self::create(node)?; - Self::deposit_event(Event::::NodeCreated(node_pub_key)); + Self::deposit_event(Event::::NodeCreated(node_type, node_pub_key)); Ok(()) } } From a7a07324e10af8f184458594b1d9d025fac36e6d Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Wed, 4 Oct 2023 21:55:53 +0200 Subject: [PATCH 357/583] fix: using u8 type for node_type field --- pallets/ddc-nodes/src/lib.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 0717dec4e..1a6db5178 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -41,7 +41,7 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { - NodeCreated(NodeType, NodePubKey), + NodeCreated { node_type: u8, node_pub_key: NodePubKey }, } #[pallet::error] @@ -144,12 +144,6 @@ pub mod pallet { CDNPropsRef(&'a CDNNodeProps), } - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub enum NodeType { - Storage = 1, - CDN = 2, - } - pub trait NodeTrait { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; fn get_props<'a>(&'a self) -> NodePropsRef<'a>; @@ -228,6 +222,12 @@ pub mod pallet { } } + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + pub enum NodeType { + Storage = 1, + CDN = 2, + } + impl From for u8 { fn from(node_type: NodeType) -> Self { match node_type { @@ -259,10 +259,13 @@ pub mod pallet { pub fn create_node(origin: OriginFor, node_params: NodeParams) -> DispatchResult { ensure_signed(origin)?; let node: Node = Node::from_params::(node_params)?; - let node_pub_key = node.get_pub_key().to_owned(); let node_type = node.get_type(); + let node_pub_key = node.get_pub_key().to_owned(); Self::create(node)?; - Self::deposit_event(Event::::NodeCreated(node_type, node_pub_key)); + Self::deposit_event(Event::::NodeCreated { + node_type: node_type.into(), + node_pub_key, + }); Ok(()) } } @@ -307,7 +310,7 @@ pub mod pallet { } fn add_to_cluster(pub_key: NodePubKey, cluster_id: ClusterId) -> Result<(), &'static str> { - let mut node = Self::get(pub_key)?; + let node = Self::get(pub_key)?; match node { Node::Storage(mut storage_node) => { storage_node.cluster_id = Some(cluster_id); From 4f9446bb409cdbc38ff892c477dd2847cc2e61a2 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Thu, 5 Oct 2023 02:19:41 +0200 Subject: [PATCH 358/583] refactor: separate modules for nodes --- pallets/ddc-clusters/src/lib.rs | 15 +- pallets/ddc-nodes/src/cdn_node.rs | 53 +++++++ pallets/ddc-nodes/src/lib.rs | 201 ++------------------------ pallets/ddc-nodes/src/node.rs | 110 ++++++++++++++ pallets/ddc-nodes/src/storage_node.rs | 50 +++++++ 5 files changed, 231 insertions(+), 198 deletions(-) create mode 100644 pallets/ddc-nodes/src/cdn_node.rs create mode 100644 pallets/ddc-nodes/src/node.rs create mode 100644 pallets/ddc-nodes/src/storage_node.rs diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 4b46ae5d5..49f7b8222 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -23,7 +23,7 @@ use sp_core::hash::H160; use sp_runtime::RuntimeDebug; use sp_std::prelude::*; -use pallet_ddc_nodes::{NodePubKey, NodeRepository}; +use pallet_ddc_nodes::{NodePubKey, NodeRepository, NodeTrait}; #[frame_support::pallet] pub mod pallet { @@ -43,7 +43,7 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { - ClusterCreated(ClusterId), + ClusterCreated { cluster_id: ClusterId }, } #[pallet::error] @@ -59,17 +59,17 @@ pub mod pallet { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct Cluster { - id: ClusterId, + cluster_id: ClusterId, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct ClusterParams { - id: ClusterId, + cluster_id: ClusterId, } impl Cluster { fn from_params(params: ClusterParams) -> Cluster { - Cluster { id: params.id } + Cluster { cluster_id: params.cluster_id } } } @@ -83,12 +83,12 @@ pub mod pallet { ensure_signed(origin)?; let cluster = Cluster::from_params(cluster_params); - let cluster_id = cluster.id.clone(); + let cluster_id = cluster.cluster_id.clone(); ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); Clusters::::insert(cluster_id.clone(), cluster); - Self::deposit_event(Event::::ClusterCreated(cluster_id)); + Self::deposit_event(Event::::ClusterCreated { cluster_id }); Ok(()) } @@ -101,6 +101,7 @@ pub mod pallet { ) -> DispatchResult { ensure_signed(origin)?; + let node = T::NodeRepository::get(node_pub_key.clone())?; T::NodeRepository::add_to_cluster(node_pub_key, cluster_id)?; Ok(()) diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs new file mode 100644 index 000000000..c32d80b20 --- /dev/null +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -0,0 +1,53 @@ +use crate::{ + node::{Node, NodeParams, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType}, + pallet::Error, + ClusterId, Config, +}; +use codec::{Decode, Encode}; +use scale_info::TypeInfo; +use sp_runtime::RuntimeDebug; +use sp_std::prelude::*; + +pub type CDNNodePubKey = sp_runtime::AccountId32; + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct CDNNode { + pub pub_key: CDNNodePubKey, + pub cluster_id: Option, + pub props: CDNNodeProps, +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct CDNNodeProps { + pub url: Vec, + pub location: [u8; 2], +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct CDNNodeParams { + pub pub_key: CDNNodePubKey, + pub url: Vec, + pub location: [u8; 2], +} + +impl NodeTrait for CDNNode { + fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { + NodePubKeyRef::CDNPubKeyRef(&self.pub_key) + } + fn get_props<'a>(&'a self) -> NodePropsRef<'a> { + NodePropsRef::CDNPropsRef(&self.props) + } + fn get_type(&self) -> NodeType { + NodeType::CDN + } + fn from_params(params: NodeParams) -> Result> { + match params { + NodeParams::CDNParams(params) => Ok(Node::CDN(CDNNode { + pub_key: params.pub_key, + cluster_id: None, + props: CDNNodeProps { url: params.url, location: params.location }, + })), + _ => Err(Error::::NodeAlreadyExists), + } + } +} diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 1a6db5178..482774046 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -23,6 +23,15 @@ use sp_runtime::RuntimeDebug; use sp_std::prelude::*; pub use pallet::*; +mod cdn_node; +mod node; +mod storage_node; + +pub use crate::{ + cdn_node::{CDNNode, CDNNodePubKey}, + node::{Node, NodeParams, NodePubKey, NodeTrait}, + storage_node::{StorageNode, StorageNodePubKey}, +}; #[frame_support::pallet] pub mod pallet { @@ -61,197 +70,7 @@ pub mod pallet { pub type CDNNodes = StorageMap<_, Blake2_128Concat, CDNNodePubKey, CDNNode>; // todo: add the type to the Config - type ClusterId = H160; - - type StorageNodePubKey = sp_runtime::AccountId32; - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub struct StorageNode { - pub_key: StorageNodePubKey, - cluster_id: Option, - props: StorageNodeProps, - } - - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub struct StorageNodeProps { - capacity: u32, - } - - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub struct StorageNodeParams { - pub_key: StorageNodePubKey, - capacity: u32, - } - - type CDNNodePubKey = sp_runtime::AccountId32; - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub struct CDNNode { - pub_key: CDNNodePubKey, - cluster_id: Option, - props: CDNNodeProps, - } - - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub struct CDNNodeProps { - url: Vec, - location: [u8; 2], - } - - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub struct CDNNodeParams { - pub_key: CDNNodePubKey, - url: Vec, - location: [u8; 2], - } - - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub enum Node { - Storage(StorageNode), - CDN(CDNNode), - } - - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub enum NodeParams { - StorageParams(StorageNodeParams), - CDNParams(CDNNodeParams), - } - - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub enum NodePubKey { - StoragePubKey(StorageNodePubKey), - CDNPubKey(CDNNodePubKey), - } - - #[derive(Clone, RuntimeDebug, PartialEq)] - pub enum NodePubKeyRef<'a> { - StoragePubKeyRef(&'a StorageNodePubKey), - CDNPubKeyRef(&'a CDNNodePubKey), - } - - impl<'a> NodePubKeyRef<'a> { - pub fn to_owned(&self) -> NodePubKey { - match &self { - NodePubKeyRef::StoragePubKeyRef(pub_key_ref) => - NodePubKey::StoragePubKey((**pub_key_ref).clone()), - NodePubKeyRef::CDNPubKeyRef(pub_key_ref) => - NodePubKey::CDNPubKey((**pub_key_ref).clone()), - } - } - } - - #[derive(Clone, RuntimeDebug, PartialEq)] - pub enum NodePropsRef<'a> { - StoragePropsRef(&'a StorageNodeProps), - CDNPropsRef(&'a CDNNodeProps), - } - - pub trait NodeTrait { - fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; - fn get_props<'a>(&'a self) -> NodePropsRef<'a>; - fn get_type(&self) -> NodeType; - fn from_params(params: NodeParams) -> Result>; - } - - impl NodeTrait for StorageNode { - fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { - NodePubKeyRef::StoragePubKeyRef(&self.pub_key) - } - fn get_props<'a>(&'a self) -> NodePropsRef<'a> { - NodePropsRef::StoragePropsRef(&self.props) - } - fn get_type(&self) -> NodeType { - NodeType::Storage - } - fn from_params(params: NodeParams) -> Result> { - match params { - NodeParams::StorageParams(params) => Ok(Node::Storage(StorageNode { - pub_key: params.pub_key, - cluster_id: None, - props: StorageNodeProps { capacity: params.capacity }, - })), - _ => Err(Error::::NodeAlreadyExists), - } - } - } - - impl NodeTrait for CDNNode { - fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { - NodePubKeyRef::CDNPubKeyRef(&self.pub_key) - } - fn get_props<'a>(&'a self) -> NodePropsRef<'a> { - NodePropsRef::CDNPropsRef(&self.props) - } - fn get_type(&self) -> NodeType { - NodeType::CDN - } - fn from_params(params: NodeParams) -> Result> { - match params { - NodeParams::CDNParams(params) => Ok(Node::CDN(CDNNode { - pub_key: params.pub_key, - cluster_id: None, - props: CDNNodeProps { url: params.url, location: params.location }, - })), - _ => Err(Error::::NodeAlreadyExists), - } - } - } - - impl NodeTrait for Node { - fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { - match &self { - Node::Storage(node) => node.get_pub_key(), - Node::CDN(node) => node.get_pub_key(), - } - } - fn get_props<'a>(&'a self) -> NodePropsRef<'a> { - match &self { - Node::Storage(node) => node.get_props(), - Node::CDN(node) => node.get_props(), - } - } - fn get_type(&self) -> NodeType { - match &self { - Node::Storage(node) => node.get_type(), - Node::CDN(node) => node.get_type(), - } - } - fn from_params(params: NodeParams) -> Result> { - match params { - NodeParams::StorageParams(_) => StorageNode::from_params(params), - NodeParams::CDNParams(_) => CDNNode::from_params(params), - } - } - } - - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub enum NodeType { - Storage = 1, - CDN = 2, - } - - impl From for u8 { - fn from(node_type: NodeType) -> Self { - match node_type { - NodeType::Storage => 1, - NodeType::CDN => 2, - } - } - } - - impl TryFrom for NodeType { - type Error = (); - fn try_from(value: u8) -> Result { - match value { - 1 => Ok(NodeType::Storage), - 2 => Ok(NodeType::CDN), - _ => Err(()), - } - } - } - - pub trait NodeRepositoryTrait { - fn create(node: Node) -> Result<(), pallet::Error>; - fn get(pub_key: NodePubKey) -> Result>; - } + pub type ClusterId = H160; #[pallet::call] impl Pallet { diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs new file mode 100644 index 000000000..a03a07852 --- /dev/null +++ b/pallets/ddc-nodes/src/node.rs @@ -0,0 +1,110 @@ +use crate::{ + cdn_node::{CDNNode, CDNNodeParams, CDNNodeProps, CDNNodePubKey}, + pallet::Error, + storage_node::{StorageNode, StorageNodeParams, StorageNodeProps, StorageNodePubKey}, + Config, +}; +use codec::{Decode, Encode}; +use scale_info::TypeInfo; +use sp_runtime::RuntimeDebug; + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub enum Node { + Storage(StorageNode), + CDN(CDNNode), +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub enum NodeParams { + StorageParams(StorageNodeParams), + CDNParams(CDNNodeParams), +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub enum NodePubKey { + StoragePubKey(StorageNodePubKey), + CDNPubKey(CDNNodePubKey), +} + +#[derive(Clone, RuntimeDebug, PartialEq)] +pub enum NodePubKeyRef<'a> { + StoragePubKeyRef(&'a StorageNodePubKey), + CDNPubKeyRef(&'a CDNNodePubKey), +} + +impl<'a> NodePubKeyRef<'a> { + pub fn to_owned(&self) -> NodePubKey { + match &self { + NodePubKeyRef::StoragePubKeyRef(pub_key_ref) => + NodePubKey::StoragePubKey((**pub_key_ref).clone()), + NodePubKeyRef::CDNPubKeyRef(pub_key_ref) => + NodePubKey::CDNPubKey((**pub_key_ref).clone()), + } + } +} + +#[derive(Clone, RuntimeDebug, PartialEq)] +pub enum NodePropsRef<'a> { + StoragePropsRef(&'a StorageNodeProps), + CDNPropsRef(&'a CDNNodeProps), +} + +pub trait NodeTrait { + fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; + fn get_props<'a>(&'a self) -> NodePropsRef<'a>; + fn get_type(&self) -> NodeType; + fn from_params(params: NodeParams) -> Result>; +} + +impl NodeTrait for Node { + fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { + match &self { + Node::Storage(node) => node.get_pub_key(), + Node::CDN(node) => node.get_pub_key(), + } + } + fn get_props<'a>(&'a self) -> NodePropsRef<'a> { + match &self { + Node::Storage(node) => node.get_props(), + Node::CDN(node) => node.get_props(), + } + } + fn get_type(&self) -> NodeType { + match &self { + Node::Storage(node) => node.get_type(), + Node::CDN(node) => node.get_type(), + } + } + fn from_params(params: NodeParams) -> Result> { + match params { + NodeParams::StorageParams(_) => StorageNode::from_params(params), + NodeParams::CDNParams(_) => CDNNode::from_params(params), + } + } +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub enum NodeType { + Storage = 1, + CDN = 2, +} + +impl From for u8 { + fn from(node_type: NodeType) -> Self { + match node_type { + NodeType::Storage => 1, + NodeType::CDN => 2, + } + } +} + +impl TryFrom for NodeType { + type Error = (); + fn try_from(value: u8) -> Result { + match value { + 1 => Ok(NodeType::Storage), + 2 => Ok(NodeType::CDN), + _ => Err(()), + } + } +} diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs new file mode 100644 index 000000000..9e9ad4654 --- /dev/null +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -0,0 +1,50 @@ +use crate::{ + node::{Node, NodeParams, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType}, + pallet::Error, + ClusterId, Config, +}; +use codec::{Decode, Encode}; +use scale_info::TypeInfo; +use sp_runtime::RuntimeDebug; + +pub type StorageNodePubKey = sp_runtime::AccountId32; + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct StorageNode { + pub pub_key: StorageNodePubKey, + pub cluster_id: Option, + pub props: StorageNodeProps, +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct StorageNodeProps { + pub capacity: u32, +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct StorageNodeParams { + pub pub_key: StorageNodePubKey, + pub capacity: u32, +} + +impl NodeTrait for StorageNode { + fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { + NodePubKeyRef::StoragePubKeyRef(&self.pub_key) + } + fn get_props<'a>(&'a self) -> NodePropsRef<'a> { + NodePropsRef::StoragePropsRef(&self.props) + } + fn get_type(&self) -> NodeType { + NodeType::Storage + } + fn from_params(params: NodeParams) -> Result> { + match params { + NodeParams::StorageParams(params) => Ok(Node::Storage(StorageNode { + pub_key: params.pub_key, + cluster_id: None, + props: StorageNodeProps { capacity: params.capacity }, + })), + _ => Err(Error::::NodeAlreadyExists), + } + } +} From 79b2574ca36d4a16258c4299b91976e656263aa1 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Sat, 7 Oct 2023 02:05:24 +0200 Subject: [PATCH 359/583] feat: node_provider_id field is added --- pallets/ddc-clusters/src/lib.rs | 2 +- pallets/ddc-nodes/src/cdn_node.rs | 19 +++++++++----- pallets/ddc-nodes/src/lib.rs | 24 +++++++++-------- pallets/ddc-nodes/src/node.rs | 38 ++++++++++++++++++++------- pallets/ddc-nodes/src/storage_node.rs | 19 +++++++++----- 5 files changed, 67 insertions(+), 35 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 49f7b8222..8ced6b1a9 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -37,7 +37,7 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config { type RuntimeEvent: From> + IsType<::RuntimeEvent>; - type NodeRepository: NodeRepository; + type NodeRepository: NodeRepository; } #[pallet::event] diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index c32d80b20..41b9cfca3 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -1,7 +1,7 @@ use crate::{ - node::{Node, NodeParams, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType}, + node::{Node, NodeError, NodeParams, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType}, pallet::Error, - ClusterId, Config, + ClusterId, }; use codec::{Decode, Encode}; use scale_info::TypeInfo; @@ -11,8 +11,9 @@ use sp_std::prelude::*; pub type CDNNodePubKey = sp_runtime::AccountId32; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct CDNNode { +pub struct CDNNode { pub pub_key: CDNNodePubKey, + pub provider_id: ProviderId, pub cluster_id: Option, pub props: CDNNodeProps, } @@ -30,7 +31,7 @@ pub struct CDNNodeParams { pub location: [u8; 2], } -impl NodeTrait for CDNNode { +impl NodeTrait for CDNNode { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { NodePubKeyRef::CDNPubKeyRef(&self.pub_key) } @@ -40,14 +41,18 @@ impl NodeTrait for CDNNode { fn get_type(&self) -> NodeType { NodeType::CDN } - fn from_params(params: NodeParams) -> Result> { + fn from_params( + provider_id: ProviderId, + params: NodeParams, + ) -> Result, NodeError> { match params { - NodeParams::CDNParams(params) => Ok(Node::CDN(CDNNode { + NodeParams::CDNParams(params) => Ok(Node::CDN(CDNNode:: { + provider_id, pub_key: params.pub_key, cluster_id: None, props: CDNNodeProps { url: params.url, location: params.location }, })), - _ => Err(Error::::NodeAlreadyExists), + _ => Err(NodeError::InvalidCDNNodeParams), } } } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 482774046..55f043859 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -29,7 +29,7 @@ mod storage_node; pub use crate::{ cdn_node::{CDNNode, CDNNodePubKey}, - node::{Node, NodeParams, NodePubKey, NodeTrait}, + node::{Node, NodeError, NodeParams, NodePubKey, NodeTrait}, storage_node::{StorageNode, StorageNodePubKey}, }; @@ -63,11 +63,12 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn storage_nodes)] pub type StorageNodes = - StorageMap<_, Blake2_128Concat, StorageNodePubKey, StorageNode>; + StorageMap<_, Blake2_128Concat, StorageNodePubKey, StorageNode>; #[pallet::storage] #[pallet::getter(fn cdn_nodes)] - pub type CDNNodes = StorageMap<_, Blake2_128Concat, CDNNodePubKey, CDNNode>; + pub type CDNNodes = + StorageMap<_, Blake2_128Concat, CDNNodePubKey, CDNNode>; // todo: add the type to the Config pub type ClusterId = H160; @@ -76,8 +77,9 @@ pub mod pallet { impl Pallet { #[pallet::weight(10_000)] pub fn create_node(origin: OriginFor, node_params: NodeParams) -> DispatchResult { - ensure_signed(origin)?; - let node: Node = Node::from_params::(node_params)?; + let provider_id = ensure_signed(origin)?; + let node = Node::::from_params(provider_id, node_params) + .map_err(|e| Into::>::into(NodeError::from(e)))?; let node_type = node.get_type(); let node_pub_key = node.get_pub_key().to_owned(); Self::create(node)?; @@ -89,14 +91,14 @@ pub mod pallet { } } - pub trait NodeRepository { - fn create(node: Node) -> Result<(), &'static str>; - fn get(pub_key: NodePubKey) -> Result; + pub trait NodeRepository { + fn create(node: Node) -> Result<(), &'static str>; + fn get(pub_key: NodePubKey) -> Result, &'static str>; fn add_to_cluster(pub_key: NodePubKey, cluster_id: ClusterId) -> Result<(), &'static str>; } - impl NodeRepository for Pallet { - fn create(node: Node) -> Result<(), &'static str> { + impl NodeRepository for Pallet { + fn create(node: Node) -> Result<(), &'static str> { match node { Node::Storage(storage_node) => { if StorageNodes::::contains_key(&storage_node.pub_key) { @@ -115,7 +117,7 @@ pub mod pallet { } } - fn get(node_pub_key: NodePubKey) -> Result { + fn get(node_pub_key: NodePubKey) -> Result, &'static str> { match node_pub_key { NodePubKey::StoragePubKey(pub_key) => match StorageNodes::::try_get(pub_key) { Ok(node) => Ok(Node::Storage(node)), diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index a03a07852..84d123acf 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -9,9 +9,9 @@ use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub enum Node { - Storage(StorageNode), - CDN(CDNNode), +pub enum Node { + Storage(StorageNode), + CDN(CDNNode), } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] @@ -49,14 +49,17 @@ pub enum NodePropsRef<'a> { CDNPropsRef(&'a CDNNodeProps), } -pub trait NodeTrait { +pub trait NodeTrait { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; fn get_props<'a>(&'a self) -> NodePropsRef<'a>; fn get_type(&self) -> NodeType; - fn from_params(params: NodeParams) -> Result>; + fn from_params( + provider_id: ProviderId, + params: NodeParams, + ) -> Result, NodeError>; } -impl NodeTrait for Node { +impl NodeTrait for Node { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { match &self { Node::Storage(node) => node.get_pub_key(), @@ -75,10 +78,13 @@ impl NodeTrait for Node { Node::CDN(node) => node.get_type(), } } - fn from_params(params: NodeParams) -> Result> { + fn from_params( + provider_id: ProviderId, + params: NodeParams, + ) -> Result, NodeError> { match params { - NodeParams::StorageParams(_) => StorageNode::from_params(params), - NodeParams::CDNParams(_) => CDNNode::from_params(params), + NodeParams::StorageParams(_) => StorageNode::from_params(provider_id, params), + NodeParams::CDNParams(_) => CDNNode::from_params(provider_id, params), } } } @@ -108,3 +114,17 @@ impl TryFrom for NodeType { } } } + +pub enum NodeError { + InvalidStorageNodeParams, + InvalidCDNNodeParams, +} + +impl From for Error { + fn from(error: NodeError) -> Self { + match error { + NodeError::InvalidStorageNodeParams => Error::::InvalidNodeParams, + NodeError::InvalidCDNNodeParams => Error::::InvalidNodeParams, + } + } +} diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 9e9ad4654..1afcb7f31 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,7 +1,7 @@ use crate::{ - node::{Node, NodeParams, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType}, + node::{Node, NodeError, NodeParams, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType}, pallet::Error, - ClusterId, Config, + ClusterId, }; use codec::{Decode, Encode}; use scale_info::TypeInfo; @@ -10,8 +10,9 @@ use sp_runtime::RuntimeDebug; pub type StorageNodePubKey = sp_runtime::AccountId32; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct StorageNode { +pub struct StorageNode { pub pub_key: StorageNodePubKey, + pub provider_id: ProviderId, pub cluster_id: Option, pub props: StorageNodeProps, } @@ -27,7 +28,7 @@ pub struct StorageNodeParams { pub capacity: u32, } -impl NodeTrait for StorageNode { +impl NodeTrait for StorageNode { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { NodePubKeyRef::StoragePubKeyRef(&self.pub_key) } @@ -37,14 +38,18 @@ impl NodeTrait for StorageNode { fn get_type(&self) -> NodeType { NodeType::Storage } - fn from_params(params: NodeParams) -> Result> { + fn from_params( + provider_id: ProviderId, + params: NodeParams, + ) -> Result, NodeError> { match params { - NodeParams::StorageParams(params) => Ok(Node::Storage(StorageNode { + NodeParams::StorageParams(params) => Ok(Node::Storage(StorageNode:: { + provider_id, pub_key: params.pub_key, cluster_id: None, props: StorageNodeProps { capacity: params.capacity }, })), - _ => Err(Error::::NodeAlreadyExists), + _ => Err(NodeError::InvalidStorageNodeParams), } } } From 9962eea0cdaeb64a0c130b848d46284567f0ab82 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Sat, 7 Oct 2023 02:33:56 +0200 Subject: [PATCH 360/583] fix: unused types removed --- pallets/ddc-nodes/src/cdn_node.rs | 5 ++--- pallets/ddc-nodes/src/node.rs | 1 - pallets/ddc-nodes/src/storage_node.rs | 5 ++--- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 41b9cfca3..e14da659a 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -1,14 +1,13 @@ use crate::{ node::{Node, NodeError, NodeParams, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType}, - pallet::Error, ClusterId, }; use codec::{Decode, Encode}; use scale_info::TypeInfo; -use sp_runtime::RuntimeDebug; +use sp_runtime::{AccountId32, RuntimeDebug}; use sp_std::prelude::*; -pub type CDNNodePubKey = sp_runtime::AccountId32; +pub type CDNNodePubKey = AccountId32; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNode { diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 84d123acf..fe2a60f5e 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -2,7 +2,6 @@ use crate::{ cdn_node::{CDNNode, CDNNodeParams, CDNNodeProps, CDNNodePubKey}, pallet::Error, storage_node::{StorageNode, StorageNodeParams, StorageNodeProps, StorageNodePubKey}, - Config, }; use codec::{Decode, Encode}; use scale_info::TypeInfo; diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 1afcb7f31..dea3b8591 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,13 +1,12 @@ use crate::{ node::{Node, NodeError, NodeParams, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType}, - pallet::Error, ClusterId, }; use codec::{Decode, Encode}; use scale_info::TypeInfo; -use sp_runtime::RuntimeDebug; +use sp_runtime::{AccountId32, RuntimeDebug}; -pub type StorageNodePubKey = sp_runtime::AccountId32; +pub type StorageNodePubKey = AccountId32; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNode { From 2bd3f97465dea103116e816290a4a70904fe6de0 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Sat, 7 Oct 2023 03:04:21 +0200 Subject: [PATCH 361/583] feat: getting provider_id --- pallets/ddc-nodes/src/cdn_node.rs | 7 +++++-- pallets/ddc-nodes/src/node.rs | 7 +++++++ pallets/ddc-nodes/src/storage_node.rs | 3 +++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index e14da659a..8bc26e151 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -20,20 +20,23 @@ pub struct CDNNode { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNodeProps { pub url: Vec, - pub location: [u8; 2], + pub location: Vec, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNodeParams { pub pub_key: CDNNodePubKey, pub url: Vec, - pub location: [u8; 2], + pub location: Vec, } impl NodeTrait for CDNNode { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { NodePubKeyRef::CDNPubKeyRef(&self.pub_key) } + fn get_provider_id(&self) -> &ProviderId { + &self.provider_id + } fn get_props<'a>(&'a self) -> NodePropsRef<'a> { NodePropsRef::CDNPropsRef(&self.props) } diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index fe2a60f5e..bc14f9790 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -50,6 +50,7 @@ pub enum NodePropsRef<'a> { pub trait NodeTrait { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; + fn get_provider_id(&self) -> &ProviderId; fn get_props<'a>(&'a self) -> NodePropsRef<'a>; fn get_type(&self) -> NodeType; fn from_params( @@ -65,6 +66,12 @@ impl NodeTrait for Node { Node::CDN(node) => node.get_pub_key(), } } + fn get_provider_id(&self) -> &ProviderId { + match &self { + Node::Storage(node) => node.get_provider_id(), + Node::CDN(node) => node.get_provider_id(), + } + } fn get_props<'a>(&'a self) -> NodePropsRef<'a> { match &self { Node::Storage(node) => node.get_props(), diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index dea3b8591..c0d967c1b 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -31,6 +31,9 @@ impl NodeTrait for StorageNode { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { NodePubKeyRef::StoragePubKeyRef(&self.pub_key) } + fn get_provider_id(&self) -> &ProviderId { + &self.provider_id + } fn get_props<'a>(&'a self) -> NodePropsRef<'a> { NodePropsRef::StoragePropsRef(&self.props) } From 6d48df7fac45fa146a0118c6feb247585b6be372 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Sat, 7 Oct 2023 03:30:31 +0200 Subject: [PATCH 362/583] feat: getting cluster id --- pallets/ddc-nodes/src/cdn_node.rs | 3 +++ pallets/ddc-nodes/src/node.rs | 8 ++++++++ pallets/ddc-nodes/src/storage_node.rs | 3 +++ 3 files changed, 14 insertions(+) diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 8bc26e151..58fd59246 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -40,6 +40,9 @@ impl NodeTrait for CDNNode { fn get_props<'a>(&'a self) -> NodePropsRef<'a> { NodePropsRef::CDNPropsRef(&self.props) } + fn get_cluster_id(&self) -> &Option { + &self.cluster_id + } fn get_type(&self) -> NodeType { NodeType::CDN } diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index bc14f9790..70359dffa 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -2,6 +2,7 @@ use crate::{ cdn_node::{CDNNode, CDNNodeParams, CDNNodeProps, CDNNodePubKey}, pallet::Error, storage_node::{StorageNode, StorageNodeParams, StorageNodeProps, StorageNodePubKey}, + ClusterId, }; use codec::{Decode, Encode}; use scale_info::TypeInfo; @@ -52,6 +53,7 @@ pub trait NodeTrait { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; fn get_provider_id(&self) -> &ProviderId; fn get_props<'a>(&'a self) -> NodePropsRef<'a>; + fn get_cluster_id(&self) -> &Option; fn get_type(&self) -> NodeType; fn from_params( provider_id: ProviderId, @@ -78,6 +80,12 @@ impl NodeTrait for Node { Node::CDN(node) => node.get_props(), } } + fn get_cluster_id(&self) -> &Option { + match &self { + Node::Storage(node) => node.get_cluster_id(), + Node::CDN(node) => node.get_cluster_id(), + } + } fn get_type(&self) -> NodeType { match &self { Node::Storage(node) => node.get_type(), diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index c0d967c1b..6012ce814 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -37,6 +37,9 @@ impl NodeTrait for StorageNode { fn get_props<'a>(&'a self) -> NodePropsRef<'a> { NodePropsRef::StoragePropsRef(&self.props) } + fn get_cluster_id(&self) -> &Option { + &self.cluster_id + } fn get_type(&self) -> NodeType { NodeType::Storage } From dbc0373747c3e4a53638e110d842018d543b737f Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Sat, 7 Oct 2023 04:07:40 +0200 Subject: [PATCH 363/583] feat: updating cluster id for nodes --- pallets/ddc-clusters/src/lib.rs | 5 +++-- pallets/ddc-nodes/src/cdn_node.rs | 3 +++ pallets/ddc-nodes/src/lib.rs | 29 +++++++++++++++------------ pallets/ddc-nodes/src/node.rs | 7 +++++++ pallets/ddc-nodes/src/storage_node.rs | 3 +++ 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 8ced6b1a9..4592d7f8e 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -101,8 +101,9 @@ pub mod pallet { ) -> DispatchResult { ensure_signed(origin)?; - let node = T::NodeRepository::get(node_pub_key.clone())?; - T::NodeRepository::add_to_cluster(node_pub_key, cluster_id)?; + let mut node = T::NodeRepository::get(node_pub_key.clone())?; + node.set_cluster_id(cluster_id); + T::NodeRepository::update(node)?; Ok(()) } diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 58fd59246..d54a80dd9 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -43,6 +43,9 @@ impl NodeTrait for CDNNode { fn get_cluster_id(&self) -> &Option { &self.cluster_id } + fn set_cluster_id(&mut self, cluster_id: ClusterId) { + self.cluster_id = Some(cluster_id); + } fn get_type(&self) -> NodeType { NodeType::CDN } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 55f043859..cebeb452b 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -94,7 +94,7 @@ pub mod pallet { pub trait NodeRepository { fn create(node: Node) -> Result<(), &'static str>; fn get(pub_key: NodePubKey) -> Result, &'static str>; - fn add_to_cluster(pub_key: NodePubKey, cluster_id: ClusterId) -> Result<(), &'static str>; + fn update(node: Node) -> Result<(), &'static str>; } impl NodeRepository for Pallet { @@ -102,14 +102,14 @@ pub mod pallet { match node { Node::Storage(storage_node) => { if StorageNodes::::contains_key(&storage_node.pub_key) { - return Err("Node already exists") + return Err("Storage node already exists") } StorageNodes::::insert(storage_node.pub_key.clone(), storage_node); Ok(()) }, Node::CDN(cdn_node) => { if CDNNodes::::contains_key(&cdn_node.pub_key) { - return Err("Node already exists") + return Err("CDN node already exists") } CDNNodes::::insert(cdn_node.pub_key.clone(), cdn_node); Ok(()) @@ -120,25 +120,28 @@ pub mod pallet { fn get(node_pub_key: NodePubKey) -> Result, &'static str> { match node_pub_key { NodePubKey::StoragePubKey(pub_key) => match StorageNodes::::try_get(pub_key) { - Ok(node) => Ok(Node::Storage(node)), - Err(_) => Err("Node does not exist"), + Ok(storage_node) => Ok(Node::Storage(storage_node)), + Err(_) => Err("Storage node does not exist"), }, NodePubKey::CDNPubKey(pub_key) => match CDNNodes::::try_get(pub_key) { - Ok(node) => Ok(Node::CDN(node)), - Err(_) => Err("Node does not exist"), + Ok(cdn_node) => Ok(Node::CDN(cdn_node)), + Err(_) => Err("CDN node does not exist"), }, } } - fn add_to_cluster(pub_key: NodePubKey, cluster_id: ClusterId) -> Result<(), &'static str> { - let node = Self::get(pub_key)?; + fn update(node: Node) -> Result<(), &'static str> { match node { - Node::Storage(mut storage_node) => { - storage_node.cluster_id = Some(cluster_id); + Node::Storage(storage_node) => { + if !StorageNodes::::contains_key(&storage_node.pub_key) { + return Err("Storage node does not exist") + } StorageNodes::::insert(storage_node.pub_key.clone(), storage_node); }, - Node::CDN(mut cdn_node) => { - cdn_node.cluster_id = Some(cluster_id); + Node::CDN(cdn_node) => { + if !CDNNodes::::contains_key(&cdn_node.pub_key) { + return Err("CDN node does not exist") + } CDNNodes::::insert(cdn_node.pub_key.clone(), cdn_node); }, } diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 70359dffa..40961f8ad 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -54,6 +54,7 @@ pub trait NodeTrait { fn get_provider_id(&self) -> &ProviderId; fn get_props<'a>(&'a self) -> NodePropsRef<'a>; fn get_cluster_id(&self) -> &Option; + fn set_cluster_id(&mut self, cluster_id: ClusterId); fn get_type(&self) -> NodeType; fn from_params( provider_id: ProviderId, @@ -86,6 +87,12 @@ impl NodeTrait for Node { Node::CDN(node) => node.get_cluster_id(), } } + fn set_cluster_id(&mut self, cluster_id: ClusterId) { + match self { + Node::Storage(node) => node.set_cluster_id(cluster_id), + Node::CDN(node) => node.set_cluster_id(cluster_id), + } + } fn get_type(&self) -> NodeType { match &self { Node::Storage(node) => node.get_type(), diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 6012ce814..b03629ef9 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -40,6 +40,9 @@ impl NodeTrait for StorageNode { fn get_cluster_id(&self) -> &Option { &self.cluster_id } + fn set_cluster_id(&mut self, cluster_id: ClusterId) { + self.cluster_id = Some(cluster_id); + } fn get_type(&self) -> NodeType { NodeType::Storage } From c1f627ffd37ae0ffac9c94a81d5ee7e892b83112 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 13 Oct 2023 00:36:30 +0200 Subject: [PATCH 364/583] chore: cluster and nodes split to modules --- pallets/ddc-clusters/src/cluster.rs | 61 +++++++++++++++++++++++++++ pallets/ddc-clusters/src/lib.rs | 40 ++++++------------ pallets/ddc-nodes/src/cdn_node.rs | 27 ++++++++---- pallets/ddc-nodes/src/lib.rs | 4 +- pallets/ddc-nodes/src/node.rs | 4 ++ pallets/ddc-nodes/src/storage_node.rs | 33 ++++++++++----- 6 files changed, 119 insertions(+), 50 deletions(-) create mode 100644 pallets/ddc-clusters/src/cluster.rs diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs new file mode 100644 index 000000000..c81916c74 --- /dev/null +++ b/pallets/ddc-clusters/src/cluster.rs @@ -0,0 +1,61 @@ +use crate::pallet::Error; +use codec::{Decode, Encode}; +use frame_support::{pallet_prelude::*, parameter_types, BoundedVec}; +use scale_info::TypeInfo; +use sp_core::hash::H160; +use sp_std::vec::Vec; + +pub type ClusterId = H160; +parameter_types! { + pub MaxClusterParamsLen: u16 = 2048; +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct Cluster { + pub cluster_id: ClusterId, + pub manager_id: ManagerId, + pub props: ClusterProps, +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct ClusterProps { + // this is a temporal way of storing cluster parameters as a stringified json, + // should be replaced with specific properties for cluster + pub params: BoundedVec, +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct ClusterParams { + pub params: Vec, +} + +impl Cluster { + pub fn from_params( + cluster_id: ClusterId, + manager_id: ManagerId, + cluster_params: ClusterParams, + ) -> Result, ClusterError> { + Ok(Cluster { + cluster_id, + manager_id, + props: ClusterProps { + params: match cluster_params.params.try_into() { + Ok(vec) => vec, + Err(_) => return Err(ClusterError::ClusterParamsExceedsLimit), + }, + }, + }) + } +} + +pub enum ClusterError { + ClusterParamsExceedsLimit, +} + +impl From for Error { + fn from(error: ClusterError) -> Self { + match error { + ClusterError::ClusterParamsExceedsLimit => Error::::ClusterParamsExceedsLimit, + } + } +} diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 4592d7f8e..3aa2dbf30 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -14,16 +14,15 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] -use codec::{Decode, Encode}; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; -pub use pallet::*; -use scale_info::TypeInfo; -use sp_core::hash::H160; -use sp_runtime::RuntimeDebug; +use pallet_ddc_nodes::{NodePubKey, NodeRepository, NodeTrait}; use sp_std::prelude::*; -use pallet_ddc_nodes::{NodePubKey, NodeRepository, NodeTrait}; +pub use pallet::*; +mod cluster; + +pub use crate::cluster::{Cluster, ClusterError, ClusterId, ClusterParams}; #[frame_support::pallet] pub mod pallet { @@ -49,40 +48,25 @@ pub mod pallet { #[pallet::error] pub enum Error { ClusterAlreadyExists, + ClusterParamsExceedsLimit, } #[pallet::storage] #[pallet::getter(fn storage_nodes)] - pub type Clusters = StorageMap<_, Blake2_128Concat, ClusterId, Cluster>; - - type ClusterId = H160; - - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub struct Cluster { - cluster_id: ClusterId, - } - - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] - pub struct ClusterParams { - cluster_id: ClusterId, - } - - impl Cluster { - fn from_params(params: ClusterParams) -> Cluster { - Cluster { cluster_id: params.cluster_id } - } - } + pub type Clusters = + StorageMap<_, Blake2_128Concat, ClusterId, Cluster>; #[pallet::call] impl Pallet { #[pallet::weight(10_000)] pub fn create_cluster( origin: OriginFor, + cluster_id: ClusterId, cluster_params: ClusterParams, ) -> DispatchResult { - ensure_signed(origin)?; - - let cluster = Cluster::from_params(cluster_params); + let manager_id = ensure_signed(origin)?; + let cluster = Cluster::from_params(cluster_id, manager_id, cluster_params) + .map_err(|e| Into::>::into(ClusterError::from(e)))?; let cluster_id = cluster.cluster_id.clone(); ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index d54a80dd9..66fef097f 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -3,11 +3,15 @@ use crate::{ ClusterId, }; use codec::{Decode, Encode}; +use frame_support::{parameter_types, BoundedVec}; use scale_info::TypeInfo; use sp_runtime::{AccountId32, RuntimeDebug}; use sp_std::prelude::*; pub type CDNNodePubKey = AccountId32; +parameter_types! { + pub MaxCDNNodeParamsLen: u16 = 2048; +} #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNode { @@ -19,15 +23,15 @@ pub struct CDNNode { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNodeProps { - pub url: Vec, - pub location: Vec, + // this is a temporal way of storing node parameters as a stringified json, + // should be replaced with specific properties for this type of node once they are defined + pub params: BoundedVec, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNodeParams { pub pub_key: CDNNodePubKey, - pub url: Vec, - pub location: Vec, + pub params: Vec, // should be replaced with specific parameters for this type of node } impl NodeTrait for CDNNode { @@ -51,14 +55,19 @@ impl NodeTrait for CDNNode { } fn from_params( provider_id: ProviderId, - params: NodeParams, + node_params: NodeParams, ) -> Result, NodeError> { - match params { - NodeParams::CDNParams(params) => Ok(Node::CDN(CDNNode:: { + match node_params { + NodeParams::CDNParams(node_params) => Ok(Node::CDN(CDNNode:: { provider_id, - pub_key: params.pub_key, + pub_key: node_params.pub_key, cluster_id: None, - props: CDNNodeProps { url: params.url, location: params.location }, + props: CDNNodeProps { + params: match node_params.params.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::CDNNodeParamsExceedsLimit), + }, + }, })), _ => Err(NodeError::InvalidCDNNodeParams), } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index cebeb452b..6514c3349 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -14,12 +14,9 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] -use codec::{Decode, Encode}; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; -use scale_info::TypeInfo; use sp_core::hash::H160; -use sp_runtime::RuntimeDebug; use sp_std::prelude::*; pub use pallet::*; @@ -58,6 +55,7 @@ pub mod pallet { NodeAlreadyExists, NodeDoesNotExist, InvalidNodeParams, + NodeParamsExceedsLimit, } #[pallet::storage] diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 40961f8ad..19c9d4b50 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -139,6 +139,8 @@ impl TryFrom for NodeType { pub enum NodeError { InvalidStorageNodeParams, InvalidCDNNodeParams, + StorageNodeParamsExceedsLimit, + CDNNodeParamsExceedsLimit, } impl From for Error { @@ -146,6 +148,8 @@ impl From for Error { match error { NodeError::InvalidStorageNodeParams => Error::::InvalidNodeParams, NodeError::InvalidCDNNodeParams => Error::::InvalidNodeParams, + NodeError::StorageNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, + NodeError::CDNNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, } } } diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index b03629ef9..b40a8bade 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -3,10 +3,15 @@ use crate::{ ClusterId, }; use codec::{Decode, Encode}; +use frame_support::{parameter_types, BoundedVec}; use scale_info::TypeInfo; use sp_runtime::{AccountId32, RuntimeDebug}; +use sp_std::prelude::Vec; pub type StorageNodePubKey = AccountId32; +parameter_types! { + pub MaxStorageNodeParamsLen: u16 = 2048; +} #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNode { @@ -18,13 +23,15 @@ pub struct StorageNode { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNodeProps { - pub capacity: u32, + // this is a temporal way of storing node parameters as a stringified json, + // should be replaced with specific properties for this type of node once they are defined + pub params: BoundedVec, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNodeParams { pub pub_key: StorageNodePubKey, - pub capacity: u32, + pub params: Vec, // should be replaced with specific parameters for this type of node } impl NodeTrait for StorageNode { @@ -48,15 +55,21 @@ impl NodeTrait for StorageNode { } fn from_params( provider_id: ProviderId, - params: NodeParams, + node_params: NodeParams, ) -> Result, NodeError> { - match params { - NodeParams::StorageParams(params) => Ok(Node::Storage(StorageNode:: { - provider_id, - pub_key: params.pub_key, - cluster_id: None, - props: StorageNodeProps { capacity: params.capacity }, - })), + match node_params { + NodeParams::StorageParams(node_params) => + Ok(Node::Storage(StorageNode:: { + provider_id, + pub_key: node_params.pub_key, + cluster_id: None, + props: StorageNodeProps { + params: match node_params.params.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::StorageNodeParamsExceedsLimit), + }, + }, + })), _ => Err(NodeError::InvalidStorageNodeParams), } } From 2b3d4158d6e516950598fc5a0a95c807d03f5df6 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 13 Oct 2023 01:46:05 +0200 Subject: [PATCH 365/583] chore: adding error types for node repository --- pallets/ddc-clusters/src/cluster.rs | 2 +- pallets/ddc-clusters/src/lib.rs | 13 +++----- pallets/ddc-nodes/src/cdn_node.rs | 2 +- pallets/ddc-nodes/src/lib.rs | 46 +++++++++++++++++++-------- pallets/ddc-nodes/src/node.rs | 14 +++----- pallets/ddc-nodes/src/storage_node.rs | 2 +- 6 files changed, 44 insertions(+), 35 deletions(-) diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index c81916c74..58144292b 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -30,7 +30,7 @@ pub struct ClusterParams { } impl Cluster { - pub fn from_params( + pub fn new( cluster_id: ClusterId, manager_id: ManagerId, cluster_params: ClusterParams, diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 3aa2dbf30..2ba887c49 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -49,6 +49,7 @@ pub mod pallet { pub enum Error { ClusterAlreadyExists, ClusterParamsExceedsLimit, + AttemptToAddNonExistentNode, } #[pallet::storage] @@ -65,15 +66,12 @@ pub mod pallet { cluster_params: ClusterParams, ) -> DispatchResult { let manager_id = ensure_signed(origin)?; - let cluster = Cluster::from_params(cluster_id, manager_id, cluster_params) + let cluster = Cluster::new(cluster_id, manager_id, cluster_params) .map_err(|e| Into::>::into(ClusterError::from(e)))?; let cluster_id = cluster.cluster_id.clone(); - ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); - Clusters::::insert(cluster_id.clone(), cluster); Self::deposit_event(Event::::ClusterCreated { cluster_id }); - Ok(()) } @@ -84,11 +82,10 @@ pub mod pallet { node_pub_key: NodePubKey, ) -> DispatchResult { ensure_signed(origin)?; - - let mut node = T::NodeRepository::get(node_pub_key.clone())?; + let mut node = T::NodeRepository::get(node_pub_key.clone()) + .map_err(|_| Error::::AttemptToAddNonExistentNode)?; node.set_cluster_id(cluster_id); - T::NodeRepository::update(node)?; - + T::NodeRepository::update(node).map_err(|_| Error::::AttemptToAddNonExistentNode)?; Ok(()) } } diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 66fef097f..395f4e770 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -53,7 +53,7 @@ impl NodeTrait for CDNNode { fn get_type(&self) -> NodeType { NodeType::CDN } - fn from_params( + fn new( provider_id: ProviderId, node_params: NodeParams, ) -> Result, NodeError> { diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 6514c3349..781a5403f 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -76,11 +76,11 @@ pub mod pallet { #[pallet::weight(10_000)] pub fn create_node(origin: OriginFor, node_params: NodeParams) -> DispatchResult { let provider_id = ensure_signed(origin)?; - let node = Node::::from_params(provider_id, node_params) + let node = Node::::new(provider_id, node_params) .map_err(|e| Into::>::into(NodeError::from(e)))?; let node_type = node.get_type(); let node_pub_key = node.get_pub_key().to_owned(); - Self::create(node)?; + Self::create(node).map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; Self::deposit_event(Event::::NodeCreated { node_type: node_type.into(), node_pub_key, @@ -90,24 +90,42 @@ pub mod pallet { } pub trait NodeRepository { - fn create(node: Node) -> Result<(), &'static str>; - fn get(pub_key: NodePubKey) -> Result, &'static str>; - fn update(node: Node) -> Result<(), &'static str>; + fn create(node: Node) -> Result<(), NodeRepositoryError>; + fn get(pub_key: NodePubKey) -> Result, NodeRepositoryError>; + fn update(node: Node) -> Result<(), NodeRepositoryError>; + } + + pub enum NodeRepositoryError { + StorageNodeAlreadyExists, + CDNNodeAlreadyExists, + StorageNodeDoesNotExist, + CDNNodeDoesNotExist, + } + + impl From for Error { + fn from(error: NodeRepositoryError) -> Self { + match error { + NodeRepositoryError::StorageNodeAlreadyExists => Error::::NodeAlreadyExists, + NodeRepositoryError::CDNNodeAlreadyExists => Error::::NodeAlreadyExists, + NodeRepositoryError::StorageNodeDoesNotExist => Error::::NodeDoesNotExist, + NodeRepositoryError::CDNNodeDoesNotExist => Error::::NodeDoesNotExist, + } + } } impl NodeRepository for Pallet { - fn create(node: Node) -> Result<(), &'static str> { + fn create(node: Node) -> Result<(), NodeRepositoryError> { match node { Node::Storage(storage_node) => { if StorageNodes::::contains_key(&storage_node.pub_key) { - return Err("Storage node already exists") + return Err(NodeRepositoryError::StorageNodeAlreadyExists) } StorageNodes::::insert(storage_node.pub_key.clone(), storage_node); Ok(()) }, Node::CDN(cdn_node) => { if CDNNodes::::contains_key(&cdn_node.pub_key) { - return Err("CDN node already exists") + return Err(NodeRepositoryError::CDNNodeAlreadyExists) } CDNNodes::::insert(cdn_node.pub_key.clone(), cdn_node); Ok(()) @@ -115,30 +133,30 @@ pub mod pallet { } } - fn get(node_pub_key: NodePubKey) -> Result, &'static str> { + fn get(node_pub_key: NodePubKey) -> Result, NodeRepositoryError> { match node_pub_key { NodePubKey::StoragePubKey(pub_key) => match StorageNodes::::try_get(pub_key) { Ok(storage_node) => Ok(Node::Storage(storage_node)), - Err(_) => Err("Storage node does not exist"), + Err(_) => Err(NodeRepositoryError::StorageNodeDoesNotExist), }, NodePubKey::CDNPubKey(pub_key) => match CDNNodes::::try_get(pub_key) { Ok(cdn_node) => Ok(Node::CDN(cdn_node)), - Err(_) => Err("CDN node does not exist"), + Err(_) => Err(NodeRepositoryError::CDNNodeDoesNotExist), }, } } - fn update(node: Node) -> Result<(), &'static str> { + fn update(node: Node) -> Result<(), NodeRepositoryError> { match node { Node::Storage(storage_node) => { if !StorageNodes::::contains_key(&storage_node.pub_key) { - return Err("Storage node does not exist") + return Err(NodeRepositoryError::StorageNodeDoesNotExist) } StorageNodes::::insert(storage_node.pub_key.clone(), storage_node); }, Node::CDN(cdn_node) => { if !CDNNodes::::contains_key(&cdn_node.pub_key) { - return Err("CDN node does not exist") + return Err(NodeRepositoryError::CDNNodeDoesNotExist) } CDNNodes::::insert(cdn_node.pub_key.clone(), cdn_node); }, diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 19c9d4b50..6b32cb2c4 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -56,10 +56,7 @@ pub trait NodeTrait { fn get_cluster_id(&self) -> &Option; fn set_cluster_id(&mut self, cluster_id: ClusterId); fn get_type(&self) -> NodeType; - fn from_params( - provider_id: ProviderId, - params: NodeParams, - ) -> Result, NodeError>; + fn new(provider_id: ProviderId, params: NodeParams) -> Result, NodeError>; } impl NodeTrait for Node { @@ -99,13 +96,10 @@ impl NodeTrait for Node { Node::CDN(node) => node.get_type(), } } - fn from_params( - provider_id: ProviderId, - params: NodeParams, - ) -> Result, NodeError> { + fn new(provider_id: ProviderId, params: NodeParams) -> Result, NodeError> { match params { - NodeParams::StorageParams(_) => StorageNode::from_params(provider_id, params), - NodeParams::CDNParams(_) => CDNNode::from_params(provider_id, params), + NodeParams::StorageParams(_) => StorageNode::new(provider_id, params), + NodeParams::CDNParams(_) => CDNNode::new(provider_id, params), } } } diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index b40a8bade..e641d138e 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -53,7 +53,7 @@ impl NodeTrait for StorageNode { fn get_type(&self) -> NodeType { NodeType::Storage } - fn from_params( + fn new( provider_id: ProviderId, node_params: NodeParams, ) -> Result, NodeError> { From 5b9d6540c93472533398ffafe035f2909682ca6c Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 13 Oct 2023 02:01:23 +0200 Subject: [PATCH 366/583] fix: checking cluster existence --- pallets/ddc-clusters/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 2ba887c49..63ee41050 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -48,6 +48,7 @@ pub mod pallet { #[pallet::error] pub enum Error { ClusterAlreadyExists, + ClusterDoesNotExist, ClusterParamsExceedsLimit, AttemptToAddNonExistentNode, } @@ -82,6 +83,7 @@ pub mod pallet { node_pub_key: NodePubKey, ) -> DispatchResult { ensure_signed(origin)?; + ensure!(Clusters::::contains_key(&cluster_id), Error::::ClusterDoesNotExist); let mut node = T::NodeRepository::get(node_pub_key.clone()) .map_err(|_| Error::::AttemptToAddNonExistentNode)?; node.set_cluster_id(cluster_id); From be6ef934e7c29f97e7382b43d9ae436e3c430d5e Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 13 Oct 2023 14:47:23 +0200 Subject: [PATCH 367/583] feat: endpoint for removing a node --- pallets/ddc-nodes/src/cdn_node.rs | 11 ++++++++- pallets/ddc-nodes/src/lib.rs | 35 ++++++++++++++++++++++++++- pallets/ddc-nodes/src/node.rs | 19 ++++++++++++++- pallets/ddc-nodes/src/storage_node.rs | 11 ++++++++- 4 files changed, 72 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 395f4e770..6407f34e0 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -1,5 +1,7 @@ use crate::{ - node::{Node, NodeError, NodeParams, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType}, + node::{ + Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType, + }, ClusterId, }; use codec::{Decode, Encode}; @@ -44,6 +46,13 @@ impl NodeTrait for CDNNode { fn get_props<'a>(&'a self) -> NodePropsRef<'a> { NodePropsRef::CDNPropsRef(&self.props) } + fn set_props<'a>(&mut self, props: NodeProps) -> Result<(), NodeError> { + self.props = match props { + NodeProps::CDNProps(props) => props, + _ => return Err(NodeError::InvalidCDNNodeProps), + }; + Ok(()) + } fn get_cluster_id(&self) -> &Option { &self.cluster_id } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 781a5403f..f4565caff 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -48,6 +48,7 @@ pub mod pallet { #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { NodeCreated { node_type: u8, node_pub_key: NodePubKey }, + NodeRemoved { node_type: u8, node_pub_key: NodePubKey }, } #[pallet::error] @@ -56,6 +57,8 @@ pub mod pallet { NodeDoesNotExist, InvalidNodeParams, NodeParamsExceedsLimit, + OnlyNodeProvider, + NodeIsAssignedToCluster, } #[pallet::storage] @@ -82,8 +85,24 @@ pub mod pallet { let node_pub_key = node.get_pub_key().to_owned(); Self::create(node).map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; Self::deposit_event(Event::::NodeCreated { + node_pub_key, node_type: node_type.into(), + }); + Ok(()) + } + + #[pallet::weight(10_000)] + pub fn remove_node(origin: OriginFor, node_pub_key: NodePubKey) -> DispatchResult { + let provider_id = ensure_signed(origin)?; + let node = Self::get(node_pub_key.clone()) + .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + ensure!(node.get_provider_id() == &provider_id, Error::::OnlyNodeProvider); + ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAssignedToCluster); + Self::remove(node_pub_key.clone()) + .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + Self::deposit_event(Event::::NodeCreated { node_pub_key, + node_type: node.get_type().into(), }); Ok(()) } @@ -91,8 +110,9 @@ pub mod pallet { pub trait NodeRepository { fn create(node: Node) -> Result<(), NodeRepositoryError>; - fn get(pub_key: NodePubKey) -> Result, NodeRepositoryError>; + fn get(node_pub_key: NodePubKey) -> Result, NodeRepositoryError>; fn update(node: Node) -> Result<(), NodeRepositoryError>; + fn remove(node_pub_key: NodePubKey) -> Result<(), NodeRepositoryError>; } pub enum NodeRepositoryError { @@ -163,5 +183,18 @@ pub mod pallet { } Ok(()) } + + fn remove(node_pub_key: NodePubKey) -> Result<(), NodeRepositoryError> { + match node_pub_key { + NodePubKey::StoragePubKey(pub_key) => { + StorageNodes::::remove(pub_key); + Ok(()) + }, + NodePubKey::CDNPubKey(pub_key) => { + CDNNodes::::remove(pub_key); + Ok(()) + }, + } + } } } diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 6b32cb2c4..fc1b530f4 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -20,6 +20,12 @@ pub enum NodeParams { CDNParams(CDNNodeParams), } +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub enum NodeProps { + StorageProps(StorageNodeProps), + CDNProps(CDNNodeProps), +} + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodePubKey { StoragePubKey(StorageNodePubKey), @@ -53,6 +59,7 @@ pub trait NodeTrait { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; fn get_provider_id(&self) -> &ProviderId; fn get_props<'a>(&'a self) -> NodePropsRef<'a>; + fn set_props<'a>(&mut self, props: NodeProps) -> Result<(), NodeError>; fn get_cluster_id(&self) -> &Option; fn set_cluster_id(&mut self, cluster_id: ClusterId); fn get_type(&self) -> NodeType; @@ -78,6 +85,12 @@ impl NodeTrait for Node { Node::CDN(node) => node.get_props(), } } + fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError> { + match self { + Node::Storage(node) => node.set_props(props), + Node::CDN(node) => node.set_props(props), + } + } fn get_cluster_id(&self) -> &Option { match &self { Node::Storage(node) => node.get_cluster_id(), @@ -135,6 +148,8 @@ pub enum NodeError { InvalidCDNNodeParams, StorageNodeParamsExceedsLimit, CDNNodeParamsExceedsLimit, + InvalidCDNNodeProps, + InvalidStorageNodeProps, } impl From for Error { @@ -143,7 +158,9 @@ impl From for Error { NodeError::InvalidStorageNodeParams => Error::::InvalidNodeParams, NodeError::InvalidCDNNodeParams => Error::::InvalidNodeParams, NodeError::StorageNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, - NodeError::CDNNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, + NodeError::CDNNodeParamsExceedsLimit => Error::::InvalidNodeParams, + NodeError::InvalidStorageNodeProps => Error::::InvalidNodeParams, + NodeError::InvalidCDNNodeProps => Error::::InvalidNodeParams, } } } diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index e641d138e..e22d95ccf 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,5 +1,7 @@ use crate::{ - node::{Node, NodeError, NodeParams, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType}, + node::{ + Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType, + }, ClusterId, }; use codec::{Decode, Encode}; @@ -44,6 +46,13 @@ impl NodeTrait for StorageNode { fn get_props<'a>(&'a self) -> NodePropsRef<'a> { NodePropsRef::StoragePropsRef(&self.props) } + fn set_props<'a>(&mut self, props: NodeProps) -> Result<(), NodeError> { + self.props = match props { + NodeProps::StorageProps(props) => props, + _ => return Err(NodeError::InvalidStorageNodeProps), + }; + Ok(()) + } fn get_cluster_id(&self) -> &Option { &self.cluster_id } From 371bbe443d5ad5377a988e21139f807539e2be71 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 13 Oct 2023 15:57:08 +0200 Subject: [PATCH 368/583] feat: endpoint for setting node parameter --- pallets/ddc-nodes/src/cdn_node.rs | 12 +++++++++- pallets/ddc-nodes/src/lib.rs | 32 ++++++++++++++++++++++----- pallets/ddc-nodes/src/node.rs | 11 ++++++++- pallets/ddc-nodes/src/storage_node.rs | 12 +++++++++- 4 files changed, 59 insertions(+), 8 deletions(-) diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 6407f34e0..9d7594bda 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -46,13 +46,23 @@ impl NodeTrait for CDNNode { fn get_props<'a>(&'a self) -> NodePropsRef<'a> { NodePropsRef::CDNPropsRef(&self.props) } - fn set_props<'a>(&mut self, props: NodeProps) -> Result<(), NodeError> { + fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError> { self.props = match props { NodeProps::CDNProps(props) => props, _ => return Err(NodeError::InvalidCDNNodeProps), }; Ok(()) } + fn set_params(&mut self, node_params: NodeParams) -> Result<(), NodeError> { + self.props.params = match node_params { + NodeParams::CDNParams(cdn_params) => match cdn_params.params.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::CDNNodeParamsExceedsLimit), + }, + _ => return Err(NodeError::InvalidCDNNodeParams), + }; + Ok(()) + } fn get_cluster_id(&self) -> &Option { &self.cluster_id } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index f4565caff..207805258 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -49,6 +49,7 @@ pub mod pallet { pub enum Event { NodeCreated { node_type: u8, node_pub_key: NodePubKey }, NodeRemoved { node_type: u8, node_pub_key: NodePubKey }, + NodeParamsChanged { node_type: u8, node_pub_key: NodePubKey }, } #[pallet::error] @@ -78,8 +79,8 @@ pub mod pallet { impl Pallet { #[pallet::weight(10_000)] pub fn create_node(origin: OriginFor, node_params: NodeParams) -> DispatchResult { - let provider_id = ensure_signed(origin)?; - let node = Node::::new(provider_id, node_params) + let caller_id = ensure_signed(origin)?; + let node = Node::::new(caller_id, node_params) .map_err(|e| Into::>::into(NodeError::from(e)))?; let node_type = node.get_type(); let node_pub_key = node.get_pub_key().to_owned(); @@ -93,19 +94,40 @@ pub mod pallet { #[pallet::weight(10_000)] pub fn remove_node(origin: OriginFor, node_pub_key: NodePubKey) -> DispatchResult { - let provider_id = ensure_signed(origin)?; + let caller_id = ensure_signed(origin)?; let node = Self::get(node_pub_key.clone()) .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; - ensure!(node.get_provider_id() == &provider_id, Error::::OnlyNodeProvider); + ensure!(node.get_provider_id() == &caller_id, Error::::OnlyNodeProvider); ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAssignedToCluster); Self::remove(node_pub_key.clone()) .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; - Self::deposit_event(Event::::NodeCreated { + Self::deposit_event(Event::::NodeRemoved { node_pub_key, node_type: node.get_type().into(), }); Ok(()) } + + #[pallet::weight(10_000)] + pub fn set_node_params( + origin: OriginFor, + node_pub_key: NodePubKey, + node_params: NodeParams, + ) -> DispatchResult { + let caller_id = ensure_signed(origin)?; + let mut node = Self::get(node_pub_key.clone()) + .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + ensure!(node.get_provider_id() == &caller_id, Error::::OnlyNodeProvider); + node.set_params(node_params) + .map_err(|e| Into::>::into(NodeError::from(e)))?; + let node_type = node.get_type(); + Self::update(node).map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + Self::deposit_event(Event::::NodeParamsChanged { + node_pub_key, + node_type: node_type.into(), + }); + Ok(()) + } } pub trait NodeRepository { diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index fc1b530f4..85e93e419 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -14,12 +14,14 @@ pub enum Node { CDN(CDNNode), } +// Params fields are always coming from extrinsic input #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodeParams { StorageParams(StorageNodeParams), CDNParams(CDNNodeParams), } +// Props fields may include internal protocol properties #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodeProps { StorageProps(StorageNodeProps), @@ -59,7 +61,8 @@ pub trait NodeTrait { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; fn get_provider_id(&self) -> &ProviderId; fn get_props<'a>(&'a self) -> NodePropsRef<'a>; - fn set_props<'a>(&mut self, props: NodeProps) -> Result<(), NodeError>; + fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError>; + fn set_params(&mut self, props: NodeParams) -> Result<(), NodeError>; fn get_cluster_id(&self) -> &Option; fn set_cluster_id(&mut self, cluster_id: ClusterId); fn get_type(&self) -> NodeType; @@ -91,6 +94,12 @@ impl NodeTrait for Node { Node::CDN(node) => node.set_props(props), } } + fn set_params(&mut self, params: NodeParams) -> Result<(), NodeError> { + match self { + Node::Storage(node) => node.set_params(params), + Node::CDN(node) => node.set_params(params), + } + } fn get_cluster_id(&self) -> &Option { match &self { Node::Storage(node) => node.get_cluster_id(), diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index e22d95ccf..f89f3c113 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -46,13 +46,23 @@ impl NodeTrait for StorageNode { fn get_props<'a>(&'a self) -> NodePropsRef<'a> { NodePropsRef::StoragePropsRef(&self.props) } - fn set_props<'a>(&mut self, props: NodeProps) -> Result<(), NodeError> { + fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError> { self.props = match props { NodeProps::StorageProps(props) => props, _ => return Err(NodeError::InvalidStorageNodeProps), }; Ok(()) } + fn set_params(&mut self, node_params: NodeParams) -> Result<(), NodeError> { + self.props.params = match node_params { + NodeParams::StorageParams(cdn_params) => match cdn_params.params.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::StorageNodeParamsExceedsLimit), + }, + _ => return Err(NodeError::InvalidStorageNodeParams), + }; + Ok(()) + } fn get_cluster_id(&self) -> &Option { &self.cluster_id } From bf678124a14c37ead4cb16b57800ca78376fca9b Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 13 Oct 2023 17:46:19 +0200 Subject: [PATCH 369/583] chore: separate node public key from its parameters --- pallets/ddc-nodes/src/cdn_node.rs | 32 ++++++++++++++----------- pallets/ddc-nodes/src/lib.rs | 33 ++++++++++---------------- pallets/ddc-nodes/src/node.rs | 23 ++++++++++++++---- pallets/ddc-nodes/src/storage_node.rs | 34 +++++++++++++++------------ 4 files changed, 68 insertions(+), 54 deletions(-) diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 9d7594bda..ac4c55f4f 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -1,6 +1,7 @@ use crate::{ node::{ - Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType, + Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKey, NodePubKeyRef, NodeTrait, + NodeType, }, ClusterId, }; @@ -32,7 +33,6 @@ pub struct CDNNodeProps { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNodeParams { - pub pub_key: CDNNodePubKey, pub params: Vec, // should be replaced with specific parameters for this type of node } @@ -73,22 +73,26 @@ impl NodeTrait for CDNNode { NodeType::CDN } fn new( + node_pub_key: NodePubKey, provider_id: ProviderId, node_params: NodeParams, ) -> Result, NodeError> { - match node_params { - NodeParams::CDNParams(node_params) => Ok(Node::CDN(CDNNode:: { - provider_id, - pub_key: node_params.pub_key, - cluster_id: None, - props: CDNNodeProps { - params: match node_params.params.try_into() { - Ok(vec) => vec, - Err(_) => return Err(NodeError::CDNNodeParamsExceedsLimit), + match node_pub_key { + NodePubKey::CDNPubKey(pub_key) => match node_params { + NodeParams::CDNParams(node_params) => Ok(Node::CDN(CDNNode:: { + provider_id, + pub_key, + cluster_id: None, + props: CDNNodeProps { + params: match node_params.params.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::CDNNodeParamsExceedsLimit), + }, }, - }, - })), - _ => Err(NodeError::InvalidCDNNodeParams), + })), + _ => Err(NodeError::InvalidCDNNodeParams), + }, + _ => Err(NodeError::InvalidCDNNodePubKey), } } } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 207805258..7c9fbe2ef 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -47,15 +47,16 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { - NodeCreated { node_type: u8, node_pub_key: NodePubKey }, - NodeRemoved { node_type: u8, node_pub_key: NodePubKey }, - NodeParamsChanged { node_type: u8, node_pub_key: NodePubKey }, + NodeCreated { node_pub_key: NodePubKey }, + NodeRemoved { node_pub_key: NodePubKey }, + NodeParamsChanged { node_pub_key: NodePubKey }, } #[pallet::error] pub enum Error { NodeAlreadyExists, NodeDoesNotExist, + InvalidNodePubKey, InvalidNodeParams, NodeParamsExceedsLimit, OnlyNodeProvider, @@ -78,17 +79,16 @@ pub mod pallet { #[pallet::call] impl Pallet { #[pallet::weight(10_000)] - pub fn create_node(origin: OriginFor, node_params: NodeParams) -> DispatchResult { + pub fn create_node( + origin: OriginFor, + node_pub_key: NodePubKey, + node_params: NodeParams, + ) -> DispatchResult { let caller_id = ensure_signed(origin)?; - let node = Node::::new(caller_id, node_params) + let node = Node::::new(node_pub_key.clone(), caller_id, node_params) .map_err(|e| Into::>::into(NodeError::from(e)))?; - let node_type = node.get_type(); - let node_pub_key = node.get_pub_key().to_owned(); Self::create(node).map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; - Self::deposit_event(Event::::NodeCreated { - node_pub_key, - node_type: node_type.into(), - }); + Self::deposit_event(Event::::NodeCreated { node_pub_key }); Ok(()) } @@ -101,10 +101,7 @@ pub mod pallet { ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAssignedToCluster); Self::remove(node_pub_key.clone()) .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; - Self::deposit_event(Event::::NodeRemoved { - node_pub_key, - node_type: node.get_type().into(), - }); + Self::deposit_event(Event::::NodeRemoved { node_pub_key }); Ok(()) } @@ -120,12 +117,8 @@ pub mod pallet { ensure!(node.get_provider_id() == &caller_id, Error::::OnlyNodeProvider); node.set_params(node_params) .map_err(|e| Into::>::into(NodeError::from(e)))?; - let node_type = node.get_type(); Self::update(node).map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; - Self::deposit_event(Event::::NodeParamsChanged { - node_pub_key, - node_type: node_type.into(), - }); + Self::deposit_event(Event::::NodeParamsChanged { node_pub_key }); Ok(()) } } diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 85e93e419..89b51d16d 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -66,7 +66,11 @@ pub trait NodeTrait { fn get_cluster_id(&self) -> &Option; fn set_cluster_id(&mut self, cluster_id: ClusterId); fn get_type(&self) -> NodeType; - fn new(provider_id: ProviderId, params: NodeParams) -> Result, NodeError>; + fn new( + node_pub_key: NodePubKey, + provider_id: ProviderId, + params: NodeParams, + ) -> Result, NodeError>; } impl NodeTrait for Node { @@ -118,10 +122,15 @@ impl NodeTrait for Node { Node::CDN(node) => node.get_type(), } } - fn new(provider_id: ProviderId, params: NodeParams) -> Result, NodeError> { - match params { - NodeParams::StorageParams(_) => StorageNode::new(provider_id, params), - NodeParams::CDNParams(_) => CDNNode::new(provider_id, params), + fn new( + node_pub_key: NodePubKey, + provider_id: ProviderId, + node_params: NodeParams, + ) -> Result, NodeError> { + match node_pub_key { + NodePubKey::StoragePubKey(_) => + StorageNode::new(node_pub_key, provider_id, node_params), + NodePubKey::CDNPubKey(_) => CDNNode::new(node_pub_key, provider_id, node_params), } } } @@ -153,6 +162,8 @@ impl TryFrom for NodeType { } pub enum NodeError { + InvalidStorageNodePubKey, + InvalidCDNNodePubKey, InvalidStorageNodeParams, InvalidCDNNodeParams, StorageNodeParamsExceedsLimit, @@ -164,6 +175,8 @@ pub enum NodeError { impl From for Error { fn from(error: NodeError) -> Self { match error { + NodeError::InvalidStorageNodePubKey => Error::::InvalidNodePubKey, + NodeError::InvalidCDNNodePubKey => Error::::InvalidNodePubKey, NodeError::InvalidStorageNodeParams => Error::::InvalidNodeParams, NodeError::InvalidCDNNodeParams => Error::::InvalidNodeParams, NodeError::StorageNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index f89f3c113..25de65043 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,6 +1,7 @@ use crate::{ node::{ - Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType, + Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKey, NodePubKeyRef, NodeTrait, + NodeType, }, ClusterId, }; @@ -32,7 +33,6 @@ pub struct StorageNodeProps { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNodeParams { - pub pub_key: StorageNodePubKey, pub params: Vec, // should be replaced with specific parameters for this type of node } @@ -73,23 +73,27 @@ impl NodeTrait for StorageNode { NodeType::Storage } fn new( + node_pub_key: NodePubKey, provider_id: ProviderId, node_params: NodeParams, ) -> Result, NodeError> { - match node_params { - NodeParams::StorageParams(node_params) => - Ok(Node::Storage(StorageNode:: { - provider_id, - pub_key: node_params.pub_key, - cluster_id: None, - props: StorageNodeProps { - params: match node_params.params.try_into() { - Ok(vec) => vec, - Err(_) => return Err(NodeError::StorageNodeParamsExceedsLimit), + match node_pub_key { + NodePubKey::StoragePubKey(pub_key) => match node_params { + NodeParams::StorageParams(node_params) => + Ok(Node::Storage(StorageNode:: { + provider_id, + pub_key, + cluster_id: None, + props: StorageNodeProps { + params: match node_params.params.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::StorageNodeParamsExceedsLimit), + }, }, - }, - })), - _ => Err(NodeError::InvalidStorageNodeParams), + })), + _ => Err(NodeError::InvalidStorageNodeParams), + }, + _ => Err(NodeError::InvalidStorageNodePubKey), } } } From 74b7f83d13fbd42e8734a9681c6f4a1448903d32 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 13 Oct 2023 22:11:12 +0200 Subject: [PATCH 370/583] feat: storing node keys in cluster double-map --- pallets/ddc-clusters/src/lib.rs | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 63ee41050..ec7344223 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -16,10 +16,8 @@ use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; -use pallet_ddc_nodes::{NodePubKey, NodeRepository, NodeTrait}; -use sp_std::prelude::*; - pub use pallet::*; +use pallet_ddc_nodes::{NodePubKey, NodeRepository, NodeTrait}; mod cluster; pub use crate::cluster::{Cluster, ClusterError, ClusterId, ClusterParams}; @@ -43,6 +41,7 @@ pub mod pallet { #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { ClusterCreated { cluster_id: ClusterId }, + ClusterNodeAdded { cluster_id: ClusterId, node_pub_key: NodePubKey }, } #[pallet::error] @@ -51,13 +50,26 @@ pub mod pallet { ClusterDoesNotExist, ClusterParamsExceedsLimit, AttemptToAddNonExistentNode, + NodeIsAlreadyAssigned, } #[pallet::storage] - #[pallet::getter(fn storage_nodes)] + #[pallet::getter(fn clusters)] pub type Clusters = StorageMap<_, Blake2_128Concat, ClusterId, Cluster>; + #[pallet::storage] + #[pallet::getter(fn clusters_nodes)] + pub type ClustersNodes = StorageDoubleMap< + _, + Blake2_128Concat, + ClusterId, + Blake2_128Concat, + NodePubKey, + bool, + ValueQuery, + >; + #[pallet::call] impl Pallet { #[pallet::weight(10_000)] @@ -67,9 +79,8 @@ pub mod pallet { cluster_params: ClusterParams, ) -> DispatchResult { let manager_id = ensure_signed(origin)?; - let cluster = Cluster::new(cluster_id, manager_id, cluster_params) + let cluster = Cluster::new(cluster_id.clone(), manager_id, cluster_params) .map_err(|e| Into::>::into(ClusterError::from(e)))?; - let cluster_id = cluster.cluster_id.clone(); ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); Clusters::::insert(cluster_id.clone(), cluster); Self::deposit_event(Event::::ClusterCreated { cluster_id }); @@ -86,8 +97,16 @@ pub mod pallet { ensure!(Clusters::::contains_key(&cluster_id), Error::::ClusterDoesNotExist); let mut node = T::NodeRepository::get(node_pub_key.clone()) .map_err(|_| Error::::AttemptToAddNonExistentNode)?; - node.set_cluster_id(cluster_id); + ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAlreadyAssigned); + + // todo: check that node is authorized by the 'NodeProviderAuthSC' contract + // todo: check that node provider has a bond for this 'cluster_id' and 'node_pub_key' + + node.set_cluster_id(cluster_id.clone()); T::NodeRepository::update(node).map_err(|_| Error::::AttemptToAddNonExistentNode)?; + ClustersNodes::::insert(cluster_id.clone(), node_pub_key.clone(), true); + Self::deposit_event(Event::::ClusterNodeAdded { cluster_id, node_pub_key }); + Ok(()) } } From 15a790d2fa56a64596863124ab54eace3ad31e50 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 13 Oct 2023 23:36:49 +0200 Subject: [PATCH 371/583] feat: removing node from a cluster --- pallets/ddc-clusters/src/lib.rs | 25 ++++++++++++++++++++++++- pallets/ddc-nodes/src/cdn_node.rs | 4 ++-- pallets/ddc-nodes/src/node.rs | 4 ++-- pallets/ddc-nodes/src/storage_node.rs | 4 ++-- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index ec7344223..033a57cf0 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -42,6 +42,7 @@ pub mod pallet { pub enum Event { ClusterCreated { cluster_id: ClusterId }, ClusterNodeAdded { cluster_id: ClusterId, node_pub_key: NodePubKey }, + ClusterNodeRemoved { cluster_id: ClusterId, node_pub_key: NodePubKey }, } #[pallet::error] @@ -50,7 +51,9 @@ pub mod pallet { ClusterDoesNotExist, ClusterParamsExceedsLimit, AttemptToAddNonExistentNode, + AttemptToRemoveNonExistentNode, NodeIsAlreadyAssigned, + NodeIsNotAssigned, } #[pallet::storage] @@ -102,12 +105,32 @@ pub mod pallet { // todo: check that node is authorized by the 'NodeProviderAuthSC' contract // todo: check that node provider has a bond for this 'cluster_id' and 'node_pub_key' - node.set_cluster_id(cluster_id.clone()); + node.set_cluster_id(Some(cluster_id.clone())); T::NodeRepository::update(node).map_err(|_| Error::::AttemptToAddNonExistentNode)?; ClustersNodes::::insert(cluster_id.clone(), node_pub_key.clone(), true); Self::deposit_event(Event::::ClusterNodeAdded { cluster_id, node_pub_key }); Ok(()) } + + #[pallet::weight(10_000)] + pub fn remove_node( + origin: OriginFor, + cluster_id: ClusterId, + node_pub_key: NodePubKey, + ) -> DispatchResult { + ensure_signed(origin)?; + ensure!(Clusters::::contains_key(&cluster_id), Error::::ClusterDoesNotExist); + let mut node = T::NodeRepository::get(node_pub_key.clone()) + .map_err(|_| Error::::AttemptToRemoveNonExistentNode)?; + ensure!(node.get_cluster_id() == &Some(cluster_id), Error::::NodeIsNotAssigned); + node.set_cluster_id(None); + T::NodeRepository::update(node) + .map_err(|_| Error::::AttemptToRemoveNonExistentNode)?; + ClustersNodes::::remove(cluster_id.clone(), node_pub_key.clone()); + Self::deposit_event(Event::::ClusterNodeRemoved { cluster_id, node_pub_key }); + + Ok(()) + } } } diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index ac4c55f4f..d237d3c5c 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -66,8 +66,8 @@ impl NodeTrait for CDNNode { fn get_cluster_id(&self) -> &Option { &self.cluster_id } - fn set_cluster_id(&mut self, cluster_id: ClusterId) { - self.cluster_id = Some(cluster_id); + fn set_cluster_id(&mut self, cluster_id: Option) { + self.cluster_id = cluster_id; } fn get_type(&self) -> NodeType { NodeType::CDN diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 89b51d16d..bb564fc65 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -64,7 +64,7 @@ pub trait NodeTrait { fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError>; fn set_params(&mut self, props: NodeParams) -> Result<(), NodeError>; fn get_cluster_id(&self) -> &Option; - fn set_cluster_id(&mut self, cluster_id: ClusterId); + fn set_cluster_id(&mut self, cluster_id: Option); fn get_type(&self) -> NodeType; fn new( node_pub_key: NodePubKey, @@ -110,7 +110,7 @@ impl NodeTrait for Node { Node::CDN(node) => node.get_cluster_id(), } } - fn set_cluster_id(&mut self, cluster_id: ClusterId) { + fn set_cluster_id(&mut self, cluster_id: Option) { match self { Node::Storage(node) => node.set_cluster_id(cluster_id), Node::CDN(node) => node.set_cluster_id(cluster_id), diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 25de65043..8276c446a 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -66,8 +66,8 @@ impl NodeTrait for StorageNode { fn get_cluster_id(&self) -> &Option { &self.cluster_id } - fn set_cluster_id(&mut self, cluster_id: ClusterId) { - self.cluster_id = Some(cluster_id); + fn set_cluster_id(&mut self, cluster_id: Option) { + self.cluster_id = cluster_id; } fn get_type(&self) -> NodeType { NodeType::Storage From 8977b2bac48929b30471bfe064f0fdfdd54a012b Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Sat, 14 Oct 2023 00:01:37 +0200 Subject: [PATCH 372/583] feat: setting cluster non-sensetive params --- pallets/ddc-clusters/src/cluster.rs | 36 +++++++++++++++++++++-------- pallets/ddc-clusters/src/lib.rs | 30 ++++++++++++++++++++---- pallets/ddc-nodes/src/lib.rs | 12 +++++----- 3 files changed, 59 insertions(+), 19 deletions(-) diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index 58144292b..ec8ac01e3 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -11,30 +11,33 @@ parameter_types! { } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct Cluster { +pub struct Cluster { pub cluster_id: ClusterId, - pub manager_id: ManagerId, - pub props: ClusterProps, + pub manager_id: AccountId, + pub props: ClusterProps, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct ClusterProps { +pub struct ClusterProps { // this is a temporal way of storing cluster parameters as a stringified json, // should be replaced with specific properties for cluster pub params: BoundedVec, + pub node_provider_auth_contract: AccountId, } +// ClusterParams includes Governance non-sensetive parameters only #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct ClusterParams { +pub struct ClusterParams { pub params: Vec, + pub node_provider_auth_contract: AccountId, } -impl Cluster { +impl Cluster { pub fn new( cluster_id: ClusterId, - manager_id: ManagerId, - cluster_params: ClusterParams, - ) -> Result, ClusterError> { + manager_id: AccountId, + cluster_params: ClusterParams, + ) -> Result, ClusterError> { Ok(Cluster { cluster_id, manager_id, @@ -43,9 +46,24 @@ impl Cluster { Ok(vec) => vec, Err(_) => return Err(ClusterError::ClusterParamsExceedsLimit), }, + node_provider_auth_contract: cluster_params.node_provider_auth_contract, }, }) } + + pub fn set_params( + &mut self, + cluster_params: ClusterParams, + ) -> Result<(), ClusterError> { + self.props = ClusterProps { + params: match cluster_params.params.try_into() { + Ok(vec) => vec, + Err(_) => return Err(ClusterError::ClusterParamsExceedsLimit), + }, + node_provider_auth_contract: cluster_params.node_provider_auth_contract, + }; + Ok(()) + } } pub enum ClusterError { diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 033a57cf0..6ed90d9e3 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -43,6 +43,7 @@ pub mod pallet { ClusterCreated { cluster_id: ClusterId }, ClusterNodeAdded { cluster_id: ClusterId, node_pub_key: NodePubKey }, ClusterNodeRemoved { cluster_id: ClusterId, node_pub_key: NodePubKey }, + ClusterParamsSet { cluster_id: ClusterId }, } #[pallet::error] @@ -54,6 +55,7 @@ pub mod pallet { AttemptToRemoveNonExistentNode, NodeIsAlreadyAssigned, NodeIsNotAssigned, + OnlyClusterManager, } #[pallet::storage] @@ -79,11 +81,11 @@ pub mod pallet { pub fn create_cluster( origin: OriginFor, cluster_id: ClusterId, - cluster_params: ClusterParams, + cluster_params: ClusterParams, ) -> DispatchResult { - let manager_id = ensure_signed(origin)?; - let cluster = Cluster::new(cluster_id.clone(), manager_id, cluster_params) - .map_err(|e| Into::>::into(ClusterError::from(e)))?; + let caller_id = ensure_signed(origin)?; + let cluster = Cluster::new(cluster_id.clone(), caller_id, cluster_params) + .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); Clusters::::insert(cluster_id.clone(), cluster); Self::deposit_event(Event::::ClusterCreated { cluster_id }); @@ -132,5 +134,25 @@ pub mod pallet { Ok(()) } + + // Sets Governance non-sensetive parameters only + #[pallet::weight(10_000)] + pub fn set_cluster_params( + origin: OriginFor, + cluster_id: ClusterId, + cluster_params: ClusterParams, + ) -> DispatchResult { + let caller_id = ensure_signed(origin)?; + let mut cluster = + Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; + ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); + cluster + .set_params(cluster_params) + .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; + Clusters::::insert(cluster_id.clone(), cluster); + Self::deposit_event(Event::::ClusterParamsSet { cluster_id }); + + Ok(()) + } } } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 7c9fbe2ef..c91881bd8 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -48,7 +48,7 @@ pub mod pallet { #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { NodeCreated { node_pub_key: NodePubKey }, - NodeRemoved { node_pub_key: NodePubKey }, + NodeDeleted { node_pub_key: NodePubKey }, NodeParamsChanged { node_pub_key: NodePubKey }, } @@ -93,15 +93,15 @@ pub mod pallet { } #[pallet::weight(10_000)] - pub fn remove_node(origin: OriginFor, node_pub_key: NodePubKey) -> DispatchResult { + pub fn delete_node(origin: OriginFor, node_pub_key: NodePubKey) -> DispatchResult { let caller_id = ensure_signed(origin)?; let node = Self::get(node_pub_key.clone()) .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; ensure!(node.get_provider_id() == &caller_id, Error::::OnlyNodeProvider); ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAssignedToCluster); - Self::remove(node_pub_key.clone()) + Self::delete(node_pub_key.clone()) .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; - Self::deposit_event(Event::::NodeRemoved { node_pub_key }); + Self::deposit_event(Event::::NodeDeleted { node_pub_key }); Ok(()) } @@ -127,7 +127,7 @@ pub mod pallet { fn create(node: Node) -> Result<(), NodeRepositoryError>; fn get(node_pub_key: NodePubKey) -> Result, NodeRepositoryError>; fn update(node: Node) -> Result<(), NodeRepositoryError>; - fn remove(node_pub_key: NodePubKey) -> Result<(), NodeRepositoryError>; + fn delete(node_pub_key: NodePubKey) -> Result<(), NodeRepositoryError>; } pub enum NodeRepositoryError { @@ -199,7 +199,7 @@ pub mod pallet { Ok(()) } - fn remove(node_pub_key: NodePubKey) -> Result<(), NodeRepositoryError> { + fn delete(node_pub_key: NodePubKey) -> Result<(), NodeRepositoryError> { match node_pub_key { NodePubKey::StoragePubKey(pub_key) => { StorageNodes::::remove(pub_key); From 6133a5c53e1ef782024c828751c2a6c64425eadc Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Tue, 17 Oct 2023 00:39:49 +0400 Subject: [PATCH 373/583] fix: checking for cluster manager permissions while adding and removing a node from a cluster --- pallets/ddc-clusters/src/lib.rs | 12 ++++++++---- pallets/ddc-nodes/src/cdn_node.rs | 14 +++++++------- pallets/ddc-nodes/src/node.rs | 22 +++++++++++----------- pallets/ddc-nodes/src/storage_node.rs | 14 +++++++------- 4 files changed, 33 insertions(+), 29 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 6ed90d9e3..894e7e33e 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -98,8 +98,10 @@ pub mod pallet { cluster_id: ClusterId, node_pub_key: NodePubKey, ) -> DispatchResult { - ensure_signed(origin)?; - ensure!(Clusters::::contains_key(&cluster_id), Error::::ClusterDoesNotExist); + let caller_id = ensure_signed(origin)?; + let cluster = + Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; + ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); let mut node = T::NodeRepository::get(node_pub_key.clone()) .map_err(|_| Error::::AttemptToAddNonExistentNode)?; ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAlreadyAssigned); @@ -121,8 +123,10 @@ pub mod pallet { cluster_id: ClusterId, node_pub_key: NodePubKey, ) -> DispatchResult { - ensure_signed(origin)?; - ensure!(Clusters::::contains_key(&cluster_id), Error::::ClusterDoesNotExist); + let caller_id = ensure_signed(origin)?; + let cluster = + Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; + ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); let mut node = T::NodeRepository::get(node_pub_key.clone()) .map_err(|_| Error::::AttemptToRemoveNonExistentNode)?; ensure!(node.get_cluster_id() == &Some(cluster_id), Error::::NodeIsNotAssigned); diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index d237d3c5c..96de56918 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -17,9 +17,9 @@ parameter_types! { } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct CDNNode { +pub struct CDNNode { pub pub_key: CDNNodePubKey, - pub provider_id: ProviderId, + pub provider_id: AccountId, pub cluster_id: Option, pub props: CDNNodeProps, } @@ -36,11 +36,11 @@ pub struct CDNNodeParams { pub params: Vec, // should be replaced with specific parameters for this type of node } -impl NodeTrait for CDNNode { +impl NodeTrait for CDNNode { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { NodePubKeyRef::CDNPubKeyRef(&self.pub_key) } - fn get_provider_id(&self) -> &ProviderId { + fn get_provider_id(&self) -> &AccountId { &self.provider_id } fn get_props<'a>(&'a self) -> NodePropsRef<'a> { @@ -74,12 +74,12 @@ impl NodeTrait for CDNNode { } fn new( node_pub_key: NodePubKey, - provider_id: ProviderId, + provider_id: AccountId, node_params: NodeParams, - ) -> Result, NodeError> { + ) -> Result, NodeError> { match node_pub_key { NodePubKey::CDNPubKey(pub_key) => match node_params { - NodeParams::CDNParams(node_params) => Ok(Node::CDN(CDNNode:: { + NodeParams::CDNParams(node_params) => Ok(Node::CDN(CDNNode:: { provider_id, pub_key, cluster_id: None, diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index bb564fc65..db3cb78b6 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -9,9 +9,9 @@ use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub enum Node { - Storage(StorageNode), - CDN(CDNNode), +pub enum Node { + Storage(StorageNode), + CDN(CDNNode), } // Params fields are always coming from extrinsic input @@ -57,9 +57,9 @@ pub enum NodePropsRef<'a> { CDNPropsRef(&'a CDNNodeProps), } -pub trait NodeTrait { +pub trait NodeTrait { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; - fn get_provider_id(&self) -> &ProviderId; + fn get_provider_id(&self) -> &AccountId; fn get_props<'a>(&'a self) -> NodePropsRef<'a>; fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError>; fn set_params(&mut self, props: NodeParams) -> Result<(), NodeError>; @@ -68,19 +68,19 @@ pub trait NodeTrait { fn get_type(&self) -> NodeType; fn new( node_pub_key: NodePubKey, - provider_id: ProviderId, + provider_id: AccountId, params: NodeParams, - ) -> Result, NodeError>; + ) -> Result, NodeError>; } -impl NodeTrait for Node { +impl NodeTrait for Node { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { match &self { Node::Storage(node) => node.get_pub_key(), Node::CDN(node) => node.get_pub_key(), } } - fn get_provider_id(&self) -> &ProviderId { + fn get_provider_id(&self) -> &AccountId { match &self { Node::Storage(node) => node.get_provider_id(), Node::CDN(node) => node.get_provider_id(), @@ -124,9 +124,9 @@ impl NodeTrait for Node { } fn new( node_pub_key: NodePubKey, - provider_id: ProviderId, + provider_id: AccountId, node_params: NodeParams, - ) -> Result, NodeError> { + ) -> Result, NodeError> { match node_pub_key { NodePubKey::StoragePubKey(_) => StorageNode::new(node_pub_key, provider_id, node_params), diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 8276c446a..74167bdc8 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -17,9 +17,9 @@ parameter_types! { } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct StorageNode { +pub struct StorageNode { pub pub_key: StorageNodePubKey, - pub provider_id: ProviderId, + pub provider_id: AccountId, pub cluster_id: Option, pub props: StorageNodeProps, } @@ -36,11 +36,11 @@ pub struct StorageNodeParams { pub params: Vec, // should be replaced with specific parameters for this type of node } -impl NodeTrait for StorageNode { +impl NodeTrait for StorageNode { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { NodePubKeyRef::StoragePubKeyRef(&self.pub_key) } - fn get_provider_id(&self) -> &ProviderId { + fn get_provider_id(&self) -> &AccountId { &self.provider_id } fn get_props<'a>(&'a self) -> NodePropsRef<'a> { @@ -74,13 +74,13 @@ impl NodeTrait for StorageNode { } fn new( node_pub_key: NodePubKey, - provider_id: ProviderId, + provider_id: AccountId, node_params: NodeParams, - ) -> Result, NodeError> { + ) -> Result, NodeError> { match node_pub_key { NodePubKey::StoragePubKey(pub_key) => match node_params { NodeParams::StorageParams(node_params) => - Ok(Node::Storage(StorageNode:: { + Ok(Node::Storage(StorageNode:: { provider_id, pub_key, cluster_id: None, From a8d31c70a0f9e99f66665f1d651a744fd4b08dbc Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 16 Oct 2023 18:55:58 +0600 Subject: [PATCH 374/583] Add extension contract address field to `Cluster` --- pallets/ddc-clusters/src/cluster.rs | 3 +++ pallets/ddc-clusters/src/lib.rs | 10 ++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index ec8ac01e3..876a9f9c7 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -15,6 +15,7 @@ pub struct Cluster { pub cluster_id: ClusterId, pub manager_id: AccountId, pub props: ClusterProps, + pub extension_smart_contract: AccountId, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] @@ -37,6 +38,7 @@ impl Cluster { cluster_id: ClusterId, manager_id: AccountId, cluster_params: ClusterParams, + extension_smart_contract: AccountId, ) -> Result, ClusterError> { Ok(Cluster { cluster_id, @@ -48,6 +50,7 @@ impl Cluster { }, node_provider_auth_contract: cluster_params.node_provider_auth_contract, }, + extension_smart_contract, }) } diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 894e7e33e..16c27921b 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -82,10 +82,16 @@ pub mod pallet { origin: OriginFor, cluster_id: ClusterId, cluster_params: ClusterParams, + extension_smart_contract: T::AccountId, ) -> DispatchResult { let caller_id = ensure_signed(origin)?; - let cluster = Cluster::new(cluster_id.clone(), caller_id, cluster_params) - .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; + let cluster = Cluster::new( + cluster_id.clone(), + caller_id, + cluster_params, + extension_smart_contract, + ) + .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); Clusters::::insert(cluster_id.clone(), cluster); Self::deposit_event(Event::::ClusterCreated { cluster_id }); From e8f97a2b57ff1d4d202d1074cf86ad3ccfbd5e00 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 16 Oct 2023 18:59:00 +0600 Subject: [PATCH 375/583] Add ddc-nodes tight coupling with contracts pallet --- Cargo.lock | 1 + pallets/ddc-clusters/Cargo.toml | 2 ++ pallets/ddc-clusters/src/lib.rs | 8 ++++++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b7978f71d..9a0c99ad5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4854,6 +4854,7 @@ dependencies = [ "frame-support", "frame-system", "log", + "pallet-contracts", "pallet-ddc-nodes", "parity-scale-codec", "scale-info", diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index 22786b2dd..4a7c75661 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -15,6 +15,7 @@ sp-runtime = { version = "6.0.0", default-features = false, git = "https://githu sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } [dev-dependencies] @@ -29,6 +30,7 @@ std = [ "frame-support/std", "frame-system/std", "frame-benchmarking/std", + "pallet-contracts/std", "scale-info/std", "sp-io/std", "sp-runtime/std", diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 16c27921b..4cf8fd9d7 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -25,6 +25,7 @@ pub use crate::cluster::{Cluster, ClusterError, ClusterId, ClusterParams}; #[frame_support::pallet] pub mod pallet { use super::*; + use pallet_contracts::chain_extension::UncheckedFrom; #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] @@ -32,7 +33,7 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config { + pub trait Config: frame_system::Config + pallet_contracts::Config { type RuntimeEvent: From> + IsType<::RuntimeEvent>; type NodeRepository: NodeRepository; } @@ -76,7 +77,10 @@ pub mod pallet { >; #[pallet::call] - impl Pallet { + impl Pallet + where + T::AccountId: UncheckedFrom + AsRef<[u8]>, + { #[pallet::weight(10_000)] pub fn create_cluster( origin: OriginFor, From 32c861e594660fe108d387248337e0168fe430fc Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 9 Oct 2023 12:15:51 +0600 Subject: [PATCH 376/583] Typo fix --- pallets/ddc-staking/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index fa05a1ade..5dc48372c 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -271,7 +271,7 @@ pub mod pallet { pub type Edges = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; /// The map of (wannabe) storage network participants stash keys to the DDC cluster ID they wish - /// to participate into.. + /// to participate into. #[pallet::storage] #[pallet::getter(fn storages)] pub type Storages = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; From 05bdb54cf3dd135158968655d0e907787ce56b16 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 10 Oct 2023 12:28:53 +0600 Subject: [PATCH 377/583] Add storage item for DDC node ID to stash linking --- pallets/ddc-staking/src/lib.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 5dc48372c..145241510 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -334,6 +334,11 @@ pub mod pallet { #[pallet::getter(fn cluster_managers)] pub type ClusterManagers = StorageValue<_, Vec, ValueQuery>; + /// Map from DDC node ID to the node operator stash account. + #[pallet::storage] + #[pallet::getter(fn nodes)] + pub type Nodes = StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; + #[pallet::genesis_config] pub struct GenesisConfig { pub edges: Vec<(T::AccountId, T::AccountId, BalanceOf, ClusterId)>, From c454debda5f058dc0aa0de375cd0e79936a22c8b Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 10 Oct 2023 12:33:35 +0600 Subject: [PATCH 378/583] Add `node` parameter to `bond` extrinsic --- pallets/ddc-staking/src/lib.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 145241510..8d3fd843e 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -505,6 +505,7 @@ pub mod pallet { pub fn bond( origin: OriginFor, controller: ::Source, + node: ::Source, #[pallet::compact] value: BalanceOf, ) -> DispatchResult { let stash = ensure_signed(origin)?; @@ -524,8 +525,17 @@ pub mod pallet { Err(Error::::InsufficientBond)? } + let node = T::Lookup::lookup(node)?; + + // Reject a bond with a known DDC node. + if Nodes::::contains_key(&node) { + Err(Error::::AlreadyPaired)? + } + frame_system::Pallet::::inc_consumers(&stash).map_err(|_| Error::::BadState)?; + Nodes::::insert(&node, &stash); + // You're auto-bonded forever, here. We might improve this by only bonding when // you actually store/serve and remove once you unbond __everything__. >::insert(&stash, &controller); From 80fcf78db83626797d38643c33e7a923e1ea2d07 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 10 Oct 2023 12:34:45 +0600 Subject: [PATCH 379/583] Update `AlreadyPaired` error docstring --- pallets/ddc-staking/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 8d3fd843e..a9f7cf28c 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -447,7 +447,7 @@ pub mod pallet { NotStash, /// Stash is already bonded. AlreadyBonded, - /// Controller is already paired. + /// Controller or node is already paired. AlreadyPaired, /// Cannot have a storage network or CDN participant, with the size less than defined by /// governance (see `BondSize`). If unbonding is the intention, `chill` first to remove From ec3d4273731a5e4b70b86906f468e3a9d43b8af4 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 10 Oct 2023 12:35:23 +0600 Subject: [PATCH 380/583] Add DDC node removal together with its stash --- pallets/ddc-staking/src/lib.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index a9f7cf28c..4e10301b8 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -1036,6 +1036,10 @@ pub mod pallet { >::remove(stash); >::remove(&controller); + if let Some((node, _)) = >::iter().find(|(_, v)| v == stash) { + >::remove(node); + } + Self::do_remove_storage(stash); Self::do_remove_edge(stash); From ff7067d21a56c063e78a1d50f5c983a574d4c914 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 10 Oct 2023 12:36:37 +0600 Subject: [PATCH 381/583] Add DDC node ID setter extrinsic --- pallets/ddc-staking/src/lib.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 4e10301b8..890d9c641 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -921,6 +921,29 @@ pub mod pallet { Ok(()) } + + /// (Re-)set the node operator stash account of a DDC node. + /// + /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. + #[pallet::weight(10_000)] + pub fn set_node( + origin: OriginFor, + node: ::Source, + ) -> DispatchResult { + let stash = ensure_signed(origin)?; + + let node = T::Lookup::lookup(node)?; + + if let Some(existing_node_stash) = Nodes::::get(&node) { + if existing_node_stash != stash { + Err(Error::::AlreadyPaired)? + } + } + + >::insert(node, stash); + + Ok(()) + } } impl Pallet { From f355c02d9f3c7ae5d22015b2f3b698f1545af8dd Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 10 Oct 2023 12:37:10 +0600 Subject: [PATCH 382/583] Accept DDC node ID in genesis config --- pallets/ddc-staking/src/lib.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 890d9c641..dd053381d 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -341,8 +341,8 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { - pub edges: Vec<(T::AccountId, T::AccountId, BalanceOf, ClusterId)>, - pub storages: Vec<(T::AccountId, T::AccountId, BalanceOf, ClusterId)>, + pub edges: Vec<(T::AccountId, T::AccountId, T::AccountId, BalanceOf, ClusterId)>, + pub storages: Vec<(T::AccountId, T::AccountId, T::AccountId, BalanceOf, ClusterId)>, pub settings: Vec<(ClusterId, BalanceOf, EraIndex, BalanceOf, EraIndex)>, } @@ -381,7 +381,7 @@ pub mod pallet { } // Add initial CDN participants - for &(ref stash, ref controller, balance, cluster) in &self.edges { + for &(ref stash, ref controller, ref node, balance, cluster) in &self.edges { assert!( T::Currency::free_balance(&stash) >= balance, "Stash do not have enough balance to participate in CDN." @@ -389,6 +389,7 @@ pub mod pallet { assert_ok!(Pallet::::bond( T::RuntimeOrigin::from(Some(stash.clone()).into()), T::Lookup::unlookup(controller.clone()), + T::Lookup::unlookup(node.clone()), balance, )); assert_ok!(Pallet::::serve( @@ -398,7 +399,7 @@ pub mod pallet { } // Add initial storage network participants - for &(ref stash, ref controller, balance, cluster) in &self.storages { + for &(ref stash, ref controller, ref node, balance, cluster) in &self.storages { assert!( T::Currency::free_balance(&stash) >= balance, "Stash do not have enough balance to participate in storage network." @@ -406,6 +407,7 @@ pub mod pallet { assert_ok!(Pallet::::bond( T::RuntimeOrigin::from(Some(stash.clone()).into()), T::Lookup::unlookup(controller.clone()), + T::Lookup::unlookup(node.clone()), balance, )); assert_ok!(Pallet::::store( From f6842af8b300ddac2c121cf22767e9f66bbabf55 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 10 Oct 2023 12:38:15 +0600 Subject: [PATCH 383/583] Add DDC node ID in existing benchmarks and tests --- pallets/ddc-staking/src/benchmarking.rs | 17 ++++++++------ pallets/ddc-staking/src/mock.rs | 12 +++++----- pallets/ddc-staking/src/testing_utils.rs | 30 +++++++++++++++++------- pallets/ddc-staking/src/tests.rs | 9 +++---- pallets/ddc-validator/src/mock.rs | 8 ++++++- 5 files changed, 50 insertions(+), 26 deletions(-) diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index e7a35e87f..25d7ae33a 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -21,19 +21,22 @@ benchmarks! { let controller = create_funded_user::("controller", USER_SEED, 100); let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); + let node = create_funded_user::("node", USER_SEED, 100); + let node_lookup: ::Source = T::Lookup::unlookup(node.clone()); let amount = T::Currency::minimum_balance() * 10u32.into(); whitelist_account!(stash); - }: _(RawOrigin::Signed(stash.clone()), controller_lookup, amount) + }: _(RawOrigin::Signed(stash.clone()), controller_lookup, node_lookup, amount) verify { assert!(Bonded::::contains_key(stash)); assert!(Ledger::::contains_key(controller)); + assert!(Nodes::::contains_key(node)); } unbond { // clean up any existing state. clear_storages_and_edges::(); - let (stash, controller) = create_stash_controller::(0, 100)?; + let (stash, controller, _) = create_stash_controller_node::(0, 100)?; let ledger = Ledger::::get(&controller).ok_or("ledger not created before")?; let original_bonded: BalanceOf = ledger.active; let amount = T::Currency::minimum_balance() * 5u32.into(); // Half of total @@ -47,7 +50,7 @@ benchmarks! { } withdraw_unbonded { - let (stash, controller) = create_stash_controller::(0, 100)?; + let (stash, controller, _) = create_stash_controller_node::(0, 100)?; let amount = T::Currency::minimum_balance() * 5u32.into(); // Half of total DdcStaking::::unbond(RawOrigin::Signed(controller.clone()).into(), amount)?; CurrentEra::::put(EraIndex::max_value()); @@ -62,7 +65,7 @@ benchmarks! { } store { - let (stash, controller) = create_stash_controller_with_balance::(0, T::DefaultStorageBondSize::get())?; + let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultStorageBondSize::get())?; whitelist_account!(controller); }: _(RawOrigin::Signed(controller), 1) @@ -71,7 +74,7 @@ benchmarks! { } serve { - let (stash, controller) = create_stash_controller_with_balance::(0, T::DefaultEdgeBondSize::get())?; + let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultEdgeBondSize::get())?; whitelist_account!(controller); }: _(RawOrigin::Signed(controller), 1) @@ -83,7 +86,7 @@ benchmarks! { // clean up any existing state. clear_storages_and_edges::(); - let (edge_stash, edge_controller) = create_stash_controller_with_balance::(0, T::DefaultEdgeBondSize::get())?; + let (edge_stash, edge_controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultEdgeBondSize::get())?; DdcStaking::::serve(RawOrigin::Signed(edge_controller.clone()).into(), 1)?; assert!(Edges::::contains_key(&edge_stash)); CurrentEra::::put(1); @@ -97,7 +100,7 @@ benchmarks! { } set_controller { - let (stash, _) = create_stash_controller::(USER_SEED, 100)?; + let (stash, _, _) = create_stash_controller_node::(USER_SEED, 100)?; let new_controller = create_funded_user::("new_controller", USER_SEED, 100); let new_controller_lookup = T::Lookup::unlookup(new_controller.clone()); whitelist_account!(stash); diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index c82675b73..3d0dae597 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -195,17 +195,17 @@ impl ExtBuilder { let mut edges = vec![]; if self.has_edges { edges = vec![ - // (stash, controller, stake, cluster) - (11, 10, 100, 1), - (21, 20, 100, 1), + // (stash, controller, node, stake, cluster) + (11, 10, 12, 100, 1), + (21, 20, 22, 100, 1), ]; } let mut storages = vec![]; if self.has_storages { storages = vec![ - // (stash, controller, stake, cluster) - (31, 30, 100, 1), - (41, 40, 100, 1), + // (stash, controller, node, stake, cluster) + (31, 30, 32, 100, 1), + (41, 40, 42, 100, 1), ]; } diff --git a/pallets/ddc-staking/src/testing_utils.rs b/pallets/ddc-staking/src/testing_utils.rs index 6d31a4749..4898d7313 100644 --- a/pallets/ddc-staking/src/testing_utils.rs +++ b/pallets/ddc-staking/src/testing_utils.rs @@ -43,29 +43,43 @@ pub fn create_funded_user_with_balance( } /// Create a stash and controller pair. -pub fn create_stash_controller( +pub fn create_stash_controller_node( n: u32, balance_factor: u32, -) -> Result<(T::AccountId, T::AccountId), &'static str> { +) -> Result<(T::AccountId, 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 node = create_funded_user::("node", n, balance_factor); + let node_lookup: ::Source = T::Lookup::unlookup(node.clone()); let amount = T::Currency::minimum_balance() * (balance_factor / 10).max(1).into(); - DdcStaking::::bond(RawOrigin::Signed(stash.clone()).into(), controller_lookup, amount)?; - return Ok((stash, controller)) + DdcStaking::::bond( + RawOrigin::Signed(stash.clone()).into(), + controller_lookup, + node_lookup, + amount, + )?; + return Ok((stash, controller, node)) } /// Create a stash and controller pair with fixed balance. -pub fn create_stash_controller_with_balance( +pub fn create_stash_controller_node_with_balance( n: u32, balance: crate::BalanceOf, -) -> Result<(T::AccountId, T::AccountId), &'static str> { +) -> Result<(T::AccountId, T::AccountId, T::AccountId), &'static str> { let stash = create_funded_user_with_balance::("stash", n, balance); let controller = create_funded_user_with_balance::("controller", n, balance); let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); + let node = create_funded_user_with_balance::("node", n, balance); + let node_lookup: ::Source = T::Lookup::unlookup(node.clone()); - DdcStaking::::bond(RawOrigin::Signed(stash.clone()).into(), controller_lookup, balance)?; - Ok((stash, controller)) + DdcStaking::::bond( + RawOrigin::Signed(stash.clone()).into(), + controller_lookup, + node_lookup, + balance, + )?; + Ok((stash, controller, node)) } diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index 6d024cf64..17fe47caa 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -109,12 +109,12 @@ fn staking_should_work() { let _ = Balances::make_free_balance_be(&i, 2000); } - // Add new CDN participant, account 3 controlled by 4. - assert_ok!(DdcStaking::bond(RuntimeOrigin::signed(3), 4, 1500)); + // Add new CDN participant, account 3 controlled by 4 with node 5. + assert_ok!(DdcStaking::bond(RuntimeOrigin::signed(3), 4, 5, 1500)); assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), 1)); - // Account 4 controls the stash from account 3, which is 1500 units and 3 is a CDN - // participant. + // Account 4 controls the stash from account 3, which is 1500 units, 3 is a CDN + // participant, 5 is a DDC node. assert_eq!(DdcStaking::bonded(&3), Some(4)); assert_eq!( DdcStaking::ledger(&4), @@ -127,6 +127,7 @@ fn staking_should_work() { }) ); assert_eq!(DdcStaking::edges(3), Some(1)); + assert_eq!(DdcStaking::nodes(5), Some(3)); // Set `CurrentEra`. Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index 00497301c..c358aaab1 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -366,7 +366,13 @@ pub fn new_test_ext() -> sp_io::TestExternalities { let _ = pallet_staking::GenesisConfig:: { stakers, ..Default::default() } .assimilate_storage(&mut storage); - let edges = vec![(AccountId::from([0x1; 32]), AccountId::from([0x11; 32]), 100, 1)]; + let edges = vec![( + AccountId::from([0x1; 32]), + AccountId::from([0x11; 32]), + AccountId::from([0x21; 32]), + 100, + 1, + )]; let storages = vec![]; let _ = pallet_ddc_staking::GenesisConfig:: { edges, storages, ..Default::default() } .assimilate_storage(&mut storage); From 017dd3835006068842f21d31b0d490bba4442b2a Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 10 Oct 2023 12:38:59 +0600 Subject: [PATCH 384/583] Add DDC node ID setter benchmark --- pallets/ddc-staking/src/benchmarking.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index 25d7ae33a..70dde5733 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -109,6 +109,16 @@ benchmarks! { assert!(Ledger::::contains_key(&new_controller)); } + set_node { + let (stash, _, _) = create_stash_controller_node::(USER_SEED, 100)?; + let new_node = create_funded_user::("new_node", USER_SEED, 100); + let new_node_lookup = T::Lookup::unlookup(new_node.clone()); + whitelist_account!(stash); + }: _(RawOrigin::Signed(stash), new_node_lookup) + verify { + assert!(Nodes::::contains_key(&new_node)); + } + allow_cluster_manager { let new_cluster_manager = create_funded_user::("cluster_manager", USER_SEED, 100); let new_cluster_manager_lookup = T::Lookup::unlookup(new_cluster_manager.clone()); From 9633839dec88d0add22199553c453777b79d9fa1 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 10 Oct 2023 12:58:36 +0600 Subject: [PATCH 385/583] Generate weights for `bond` and `set_node` --- pallets/ddc-staking/src/weights.rs | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/pallets/ddc-staking/src/weights.rs b/pallets/ddc-staking/src/weights.rs index acb858060..3b69615ab 100644 --- a/pallets/ddc-staking/src/weights.rs +++ b/pallets/ddc-staking/src/weights.rs @@ -1,7 +1,7 @@ //! Autogenerated weights for pallet_ddc_staking //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-09-01, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-10-10, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! HOSTNAME: `e14`, CPU: `11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 @@ -35,6 +35,7 @@ pub trait WeightInfo { fn serve() -> Weight; fn chill() -> Weight; fn set_controller() -> Weight; + fn set_node() -> Weight; fn allow_cluster_manager() -> Weight; fn disallow_cluster_manager() -> Weight; } @@ -44,11 +45,12 @@ pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:1 w:1) + // Storage: DdcStaking Nodes (r:1 w:1) // Storage: Balances Locks (r:1 w:1) fn bond() -> Weight { - Weight::from_ref_time(49_113_000 as u64) - .saturating_add(T::DbWeight::get().reads(3 as u64)) - .saturating_add(T::DbWeight::get().writes(3 as u64)) + Weight::from_ref_time(55_007_000 as u64) + .saturating_add(T::DbWeight::get().reads(4 as u64)) + .saturating_add(T::DbWeight::get().writes(4 as u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking Edges (r:1 w:0) @@ -105,6 +107,12 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().reads(3 as u64)) .saturating_add(T::DbWeight::get().writes(3 as u64)) } + // Storage: DdcStaking Nodes (r:1 w:1) + fn set_node() -> Weight { + Weight::from_ref_time(21_779_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } // Storage: DdcStaking ClusterManagers (r:1 w:1) fn allow_cluster_manager() -> Weight { Weight::from_ref_time(11_727_000 as u64) @@ -123,11 +131,12 @@ impl WeightInfo for SubstrateWeight { impl WeightInfo for () { // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:1 w:1) + // Storage: DdcStaking Nodes (r:1 w:1) // Storage: Balances Locks (r:1 w:1) fn bond() -> Weight { - Weight::from_ref_time(49_113_000 as u64) - .saturating_add(RocksDbWeight::get().reads(3 as u64)) - .saturating_add(RocksDbWeight::get().writes(3 as u64)) + Weight::from_ref_time(55_007_000 as u64) + .saturating_add(RocksDbWeight::get().reads(4 as u64)) + .saturating_add(RocksDbWeight::get().writes(4 as u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking Edges (r:1 w:0) @@ -184,6 +193,12 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(3 as u64)) .saturating_add(RocksDbWeight::get().writes(3 as u64)) } + // Storage: DdcStaking Nodes (r:1 w:1) + fn set_node() -> Weight { + Weight::from_ref_time(21_779_000 as u64) + .saturating_add(RocksDbWeight::get().reads(1 as u64)) + .saturating_add(RocksDbWeight::get().writes(1 as u64)) + } // Storage: DdcStaking ClusterManagers (r:1 w:1) fn allow_cluster_manager() -> Weight { Weight::from_ref_time(11_727_000 as u64) From 5cad2ca9e4d16569e24b4ad336678fc9447b61c5 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 10 Oct 2023 14:01:36 +0600 Subject: [PATCH 386/583] Use generated weight for the `set_node` extrinsic --- pallets/ddc-staking/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index dd053381d..669571b97 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -927,7 +927,7 @@ pub mod pallet { /// (Re-)set the node operator stash account of a DDC node. /// /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::set_node())] pub fn set_node( origin: OriginFor, node: ::Source, From 8893743603cdd82cd9d10ae7911a57e3345689cf Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 11 Oct 2023 12:54:05 +0600 Subject: [PATCH 387/583] Set rewards for stash account instead of DDC node --- pallets/ddc-validator/src/lib.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 117eefe73..8c86cace9 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -991,7 +991,14 @@ pub mod pallet { let tx_res = signer.send_signed_transaction(|_account| Call::set_era_reward_points { era: current_ddc_era - 1, - stakers_points: cdn_nodes_reward_points.clone(), + // Vec<(ddc_node_account), reward) -> Vec<(stash_account, reward)> + stakers_points: cdn_nodes_reward_points + .iter() + .filter_map(|(node_acc, reward)| { + ddc_staking::pallet::Pallet::::nodes(node_acc) + .and_then(|stash_acc| Some((stash_acc, *reward))) + }) + .collect::>(), }); match tx_res { From e496de3b372d9f41660865a80c75579f22c544dc Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 12 Oct 2023 14:39:34 +0600 Subject: [PATCH 388/583] Request DAC data by the edge node account --- pallets/ddc-validator/src/lib.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 8c86cace9..593c344d3 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -812,13 +812,20 @@ pub mod pallet { for assigned_edge in assigned_edges.iter() { log::debug!("assigned edge: {:?}", assigned_edge); + let Some((node, _)) = >::iter().find(|(n, s)| assigned_edge == s) else { + log::debug!("no known node for: {:?}", assigned_edge); + continue; + }; + + log::debug!("assigned edge node: {:?}", assigned_edge); + // form url for each node let edge_url = format!( "{}{}{}/$.{}", data_url, "ddc:dac:aggregation:nodes:", current_ddc_era - 1, - utils::account_to_string::(assigned_edge.clone()) + utils::account_to_string::(node) ); log::debug!("edge url: {:?}", edge_url); From c21ce5016d09e25a81df5cd0e73b4d97bf48982d Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 12 Oct 2023 14:40:06 +0600 Subject: [PATCH 389/583] Set reward points by the edge stash account --- pallets/ddc-validator/src/lib.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 593c344d3..5d3b91005 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -998,14 +998,7 @@ pub mod pallet { let tx_res = signer.send_signed_transaction(|_account| Call::set_era_reward_points { era: current_ddc_era - 1, - // Vec<(ddc_node_account), reward) -> Vec<(stash_account, reward)> - stakers_points: cdn_nodes_reward_points - .iter() - .filter_map(|(node_acc, reward)| { - ddc_staking::pallet::Pallet::::nodes(node_acc) - .and_then(|stash_acc| Some((stash_acc, *reward))) - }) - .collect::>(), + stakers_points: cdn_nodes_reward_points.clone(), }); match tx_res { From fc2760b0c260e03540b56880fe1865fc0b4fcfb4 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 12 Oct 2023 14:41:03 +0600 Subject: [PATCH 390/583] Fix ddc-validation test regression --- pallets/ddc-validator/src/mock.rs | 2 ++ pallets/ddc-validator/src/tests.rs | 17 ++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index c358aaab1..92b3f3b26 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -317,6 +317,8 @@ pub fn new_test_ext() -> sp_io::TestExternalities { (AccountId::from([0x1; 32]), 1000), // edge controller (AccountId::from([0x11; 32]), 1000), + // edge node + (AccountId::from([0x21; 32]), 1000), // validator1 stash; has to be equal to the OCW key in the current implementation ( AccountId::from([ diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index fedd3f713..5c8056efd 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -38,8 +38,11 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { t.register_extension(TransactionPoolExt::new(pool)); let era_to_validate: EraIndex = 3; - let cdn_node_to_validate = AccountId::from([0x1; 32]); - let cdn_node_to_validate_str = utils::account_to_string::(cdn_node_to_validate.clone()); + let edge_stash_to_validate = AccountId::from([0x1; 32]); + let edge_stash_to_validate_str = + utils::account_to_string::(edge_stash_to_validate.clone()); + let edge_node_to_validate = AccountId::from([0x21; 32]); + let edge_node_to_validate_str = utils::account_to_string::(edge_node_to_validate.clone()); let validator_1_stash = AccountId::from([ 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, @@ -67,7 +70,7 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { expect_request( &format!( "{}/JSON.GET/ddc:dac:aggregation:nodes:{}/$.{}", - DEFAULT_DATA_PROVIDER_URL, era_to_validate, cdn_node_to_validate_str + DEFAULT_DATA_PROVIDER_URL, era_to_validate, edge_node_to_validate_str ), include_bytes!("./mock-data/set-1/aggregated-node-data-for-era.json"), ); @@ -116,7 +119,7 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { "{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{}", DEFAULT_DATA_PROVIDER_URL, OCW_PUB_KEY_STR, - cdn_node_to_validate_str, + edge_stash_to_validate_str, era_to_validate, url_encoded_result_json, ), @@ -195,9 +198,9 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { tx.call, crate::mock::RuntimeCall::DdcValidator(crate::Call::set_validation_decision { era: era_to_validate, - cdn_node: cdn_node_to_validate.clone(), + cdn_node: edge_stash_to_validate.clone(), validation_decision: ValidationDecision { - edge: cdn_node_to_validate_str, + edge: edge_stash_to_validate_str, result: true, payload: utils::hash(&serialized_decisions), totals: DacTotalAggregates { @@ -213,7 +216,7 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { let tx = transactions.pop().unwrap(); let tx = Extrinsic::decode(&mut &*tx).unwrap(); - let stakers_points = vec![(cdn_node_to_validate, common_decision.totals.sent)]; + let stakers_points = vec![(edge_stash_to_validate, common_decision.totals.sent)]; assert!(tx.signature.is_some()); assert_eq!( From ca4ac50c906e42b51b3ea18d763c5a0a7fe6306c Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 17 Oct 2023 12:55:00 +0600 Subject: [PATCH 391/583] Require idle state to change staking node account --- pallets/ddc-staking/src/lib.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 669571b97..2a5d4f1ad 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -924,7 +924,7 @@ pub mod pallet { Ok(()) } - /// (Re-)set the node operator stash account of a DDC node. + /// (Re-)set the DDC node of a node operator stash account. Requires to chill first. /// /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. #[pallet::weight(T::WeightInfo::set_node())] @@ -942,6 +942,10 @@ pub mod pallet { } } + // Ensure only one node per stash during the DDC era. + ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); + ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); + >::insert(node, stash); Ok(()) From fdc984227bc91a82b53dcf32fcf3e0689eed4370 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 17 Oct 2023 12:56:56 +0600 Subject: [PATCH 392/583] Rename `set_node` extrinsic parameter --- pallets/ddc-staking/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 2a5d4f1ad..b54dbc1a6 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -930,13 +930,13 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::set_node())] pub fn set_node( origin: OriginFor, - node: ::Source, + new_node: ::Source, ) -> DispatchResult { let stash = ensure_signed(origin)?; - let node = T::Lookup::lookup(node)?; + let new_node = T::Lookup::lookup(new_node)?; - if let Some(existing_node_stash) = Nodes::::get(&node) { + if let Some(existing_node_stash) = Nodes::::get(&new_node) { if existing_node_stash != stash { Err(Error::::AlreadyPaired)? } @@ -946,7 +946,7 @@ pub mod pallet { ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); - >::insert(node, stash); + >::insert(new_node, stash); Ok(()) } From bd5e67ff63b8c75acdbb4eaa8846cc00b5a616e6 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 17 Oct 2023 15:16:05 +0600 Subject: [PATCH 393/583] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85f6b0c20..b5d85401c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [D] New `pallet-ddc-validator` which implements DDC CDN nodes validation and rewarding. You can enable DDC validation providing `--enable-ddc-validation` argument and `--dac-url` argument to specify DAC endpoint. It will only work on the nodes with validation and offchain workers enabled as well. - [D] Several calls for `pallet-ddc-staking` to distribute rewards. +- [D] Third kind of account in DDC Staking for DDC nodes (along with stash and controller). - [D] DDC cluster managers access control list in `pallet-ddc-staking` managed by governance. - [Zombienet](https://github.com/paritytech/zombienet) configurations to test block building and spawn a network for DDC validation debugging. From c5b9daeb94f69fe4291e850dba99105746bc315d Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 17 Oct 2023 15:17:39 +0600 Subject: [PATCH 394/583] Bump devnet `spec_version` --- runtime/cere-dev/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index ff5778e9e..3a9719d7c 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -130,7 +130,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: 48005, + spec_version: 48006, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, From cf45ef1a43f959be48893f58fbed727e8e3a6503 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 17 Oct 2023 12:16:39 +0600 Subject: [PATCH 395/583] Add node auth check to `add_node` extrinsic --- pallets/ddc-clusters/src/lib.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 4cf8fd9d7..2f52e3c3c 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -57,6 +57,7 @@ pub mod pallet { NodeIsAlreadyAssigned, NodeIsNotAssigned, OnlyClusterManager, + NotAuthorized, } #[pallet::storage] @@ -116,7 +117,21 @@ pub mod pallet { .map_err(|_| Error::::AttemptToAddNonExistentNode)?; ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAlreadyAssigned); - // todo: check that node is authorized by the 'NodeProviderAuthSC' contract + let is_authorized: bool = pallet_contracts::Pallet::::bare_call( + caller_id, + cluster.extension_smart_contract, + Default::default(), + Default::default(), + None, + Vec::from([0x96, 0xb0, 0x45, 0x3e]), // blake2("is_authorized"), https://use.ink/basics/selectors#selector-calculation + false, + ) + .result? + .data + .first() + .is_some_and(|x| *x == 1); + ensure!(is_authorized, Error::::NotAuthorized); + // todo: check that node provider has a bond for this 'cluster_id' and 'node_pub_key' node.set_cluster_id(Some(cluster_id.clone())); From 19ffa9ce5fa1d3ac050446e26c7eed711430e72a Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 17 Oct 2023 12:18:18 +0600 Subject: [PATCH 396/583] Allow `is_some_and` feature --- pallets/ddc-clusters/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 2f52e3c3c..df1d2d565 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -13,6 +13,7 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] +#![feature(is_some_and)] // ToDo: delete at rustc > 1.70 use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; From 63ce71900abde9ee444df0fee50fa78303c26df3 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 17 Oct 2023 15:53:15 +0600 Subject: [PATCH 397/583] Use `Vec` from `sp_std` prelude --- pallets/ddc-clusters/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index df1d2d565..4f6cf2b05 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -19,6 +19,7 @@ use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; pub use pallet::*; use pallet_ddc_nodes::{NodePubKey, NodeRepository, NodeTrait}; +use sp_std::prelude::*; mod cluster; pub use crate::cluster::{Cluster, ClusterError, ClusterId, ClusterParams}; From f03966e3e3c8b82331a8de113c2275606b6f49cb Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 18 Oct 2023 11:08:32 +0600 Subject: [PATCH 398/583] Remove extension contract addr field duplicate --- pallets/ddc-clusters/src/cluster.rs | 3 --- pallets/ddc-clusters/src/lib.rs | 12 +++--------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index 876a9f9c7..ec8ac01e3 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -15,7 +15,6 @@ pub struct Cluster { pub cluster_id: ClusterId, pub manager_id: AccountId, pub props: ClusterProps, - pub extension_smart_contract: AccountId, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] @@ -38,7 +37,6 @@ impl Cluster { cluster_id: ClusterId, manager_id: AccountId, cluster_params: ClusterParams, - extension_smart_contract: AccountId, ) -> Result, ClusterError> { Ok(Cluster { cluster_id, @@ -50,7 +48,6 @@ impl Cluster { }, node_provider_auth_contract: cluster_params.node_provider_auth_contract, }, - extension_smart_contract, }) } diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 4f6cf2b05..90827e33f 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -89,16 +89,10 @@ pub mod pallet { origin: OriginFor, cluster_id: ClusterId, cluster_params: ClusterParams, - extension_smart_contract: T::AccountId, ) -> DispatchResult { let caller_id = ensure_signed(origin)?; - let cluster = Cluster::new( - cluster_id.clone(), - caller_id, - cluster_params, - extension_smart_contract, - ) - .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; + let cluster = Cluster::new(cluster_id.clone(), caller_id, cluster_params) + .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); Clusters::::insert(cluster_id.clone(), cluster); Self::deposit_event(Event::::ClusterCreated { cluster_id }); @@ -121,7 +115,7 @@ pub mod pallet { let is_authorized: bool = pallet_contracts::Pallet::::bare_call( caller_id, - cluster.extension_smart_contract, + cluster.props.node_provider_auth_contract, Default::default(), Default::default(), None, From 5db2dbec83af97efd189cc4ee4d93df98eab5d14 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 18 Oct 2023 17:46:38 +0600 Subject: [PATCH 399/583] A const for the contract auth message selector --- pallets/ddc-clusters/src/lib.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 90827e33f..edc98608c 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -24,6 +24,11 @@ mod cluster; pub use crate::cluster::{Cluster, ClusterError, ClusterId, ClusterParams}; +/// ink! 4.x selector for the "is_authorized" message, equals to the first four bytes of the +/// blake2("is_authorized"). See also: https://use.ink/basics/selectors#selector-calculation/, +/// https://use.ink/macros-attributes/selector/. +const INK_SELECTOR_IS_AUTHORIZED: [u8; 4] = [0x96, 0xb0, 0x45, 0x3e]; + #[frame_support::pallet] pub mod pallet { use super::*; @@ -119,7 +124,7 @@ pub mod pallet { Default::default(), Default::default(), None, - Vec::from([0x96, 0xb0, 0x45, 0x3e]), // blake2("is_authorized"), https://use.ink/basics/selectors#selector-calculation + Vec::from(INK_SELECTOR_IS_AUTHORIZED), false, ) .result? From 1bd756e19fe31b1a5d6662ba83458c1e74ad73b0 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 19 Oct 2023 17:32:28 +0600 Subject: [PATCH 400/583] Set cluster extension contract call gas limit --- pallets/ddc-clusters/src/lib.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index edc98608c..6e8a26a04 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -29,6 +29,10 @@ pub use crate::cluster::{Cluster, ClusterError, ClusterId, ClusterParams}; /// https://use.ink/macros-attributes/selector/. const INK_SELECTOR_IS_AUTHORIZED: [u8; 4] = [0x96, 0xb0, 0x45, 0x3e]; +/// The maximum amount of weight that the cluster extension contract call is allowed to consume. +/// See also https://github.com/paritytech/substrate/blob/a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d/frame/contracts/rpc/src/lib.rs#L63. +const EXTENSION_CALL_GAS_LIMIT: Weight = Weight::from_ref_time(5_000_000_000_000); + #[frame_support::pallet] pub mod pallet { use super::*; @@ -122,7 +126,7 @@ pub mod pallet { caller_id, cluster.props.node_provider_auth_contract, Default::default(), - Default::default(), + EXTENSION_CALL_GAS_LIMIT, None, Vec::from(INK_SELECTOR_IS_AUTHORIZED), false, From c8e0c8f65ad0b2d331c6d711ea435e6fd2b11207 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 18 Oct 2023 14:02:47 +0600 Subject: [PATCH 401/583] Add ddc-nodes tight coupling with ddc-staking --- Cargo.lock | 1 + pallets/ddc-clusters/Cargo.toml | 2 ++ pallets/ddc-clusters/src/lib.rs | 4 +++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 9a0c99ad5..9c993136e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4856,6 +4856,7 @@ dependencies = [ "log", "pallet-contracts", "pallet-ddc-nodes", + "pallet-ddc-staking", "parity-scale-codec", "scale-info", "sp-core", diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index 4a7c75661..c28f38795 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -17,6 +17,7 @@ sp-std = { version = "4.0.0-dev", default-features = false, git = "https://githu sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } +pallet-ddc-staking = { version = "4.8.1", default-features = false, path = "../ddc-staking" } [dev-dependencies] sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -31,6 +32,7 @@ std = [ "frame-system/std", "frame-benchmarking/std", "pallet-contracts/std", + "pallet-ddc-staking/std", "scale-info/std", "sp-io/std", "sp-runtime/std", diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 6e8a26a04..84daec2fe 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -44,7 +44,9 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config + pallet_contracts::Config { + pub trait Config: + frame_system::Config + pallet_contracts::Config + pallet_ddc_staking::Config + { type RuntimeEvent: From> + IsType<::RuntimeEvent>; type NodeRepository: NodeRepository; } From 766adfd377b5fbc3702e012504081d40ccd46941 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 18 Oct 2023 14:04:26 +0600 Subject: [PATCH 402/583] Add DDC stake check to `add_node` extrinsic --- pallets/ddc-clusters/src/lib.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 84daec2fe..071daeda8 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -71,6 +71,7 @@ pub mod pallet { NodeIsNotAssigned, OnlyClusterManager, NotAuthorized, + NoStake, } #[pallet::storage] @@ -139,7 +140,16 @@ pub mod pallet { .is_some_and(|x| *x == 1); ensure!(is_authorized, Error::::NotAuthorized); - // todo: check that node provider has a bond for this 'cluster_id' and 'node_pub_key' + let node_provider_stash = + >::nodes(&node_pub_key).ok_or(Error::::NoStake)?; + let maybe_edge_in_cluster = + >::edges(&node_provider_stash); + let maybe_storage_in_cluster = + >::storages(&node_provider_stash); + let has_stake = maybe_edge_in_cluster + .or(maybe_storage_in_cluster) + .is_some_and(|staking_cluster| staking_cluster == cluster_id); + ensure!(has_stake, Error::::NoStake); node.set_cluster_id(Some(cluster_id.clone())); T::NodeRepository::update(node).map_err(|_| Error::::AttemptToAddNonExistentNode)?; From a83df2ea868b5cfd2a3213a30f432359405a26c3 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 19 Oct 2023 11:46:40 +0600 Subject: [PATCH 403/583] New `ddc-primitives` crate with basic DDC entities --- Cargo.lock | 10 ++++++++++ Cargo.toml | 1 + primitives/Cargo.toml | 23 +++++++++++++++++++++++ primitives/src/lib.rs | 21 +++++++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 primitives/Cargo.toml create mode 100644 primitives/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 9c993136e..e38563b7c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1607,6 +1607,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ddc-primitives" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", +] + [[package]] name = "der" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index 9bfa3cfa5..835a9919a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ members = [ "pallets/ddc-accounts", "pallets/ddc-nodes", "pallets/ddc-clusters", + "primitives", ] [profile.release] diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml new file mode 100644 index 000000000..178800a4b --- /dev/null +++ b/primitives/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "ddc-primitives" +version = "0.1.0" +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +serde = { version = "1.0.136", default-features = false, features = [ "derive" ], optional = true } + +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } + +[features] +default = ["std"] +std = [ + "codec/std", + "scale-info/std", + "serde", + "sp-core/std", + "sp-runtime/std", +] +runtime-benchmarks = [] diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs new file mode 100644 index 000000000..de23aa1fd --- /dev/null +++ b/primitives/src/lib.rs @@ -0,0 +1,21 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +use codec::{Decode, Encode}; +use scale_info::TypeInfo; +#[cfg(feature = "std")] +use serde::{Deserialize, Serialize}; + +use sp_core::hash::H160; +use sp_runtime::{AccountId32, RuntimeDebug}; + +pub type ClusterId = H160; + +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub enum NodePubKey { + StoragePubKey(StorageNodePubKey), + CDNPubKey(CDNNodePubKey), +} + +pub type StorageNodePubKey = AccountId32; +pub type CDNNodePubKey = AccountId32; From 9d165309d626fd4301f3b53c7f33cdec6ad9d0f8 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 20 Oct 2023 14:21:16 +0600 Subject: [PATCH 404/583] Add `pallet-ddc-clusters` to cere-dev std feature --- runtime/cere-dev/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index a770756e9..71b9c5112 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -188,6 +188,7 @@ std = [ "pallet-ddc-validator/std", "pallet-ddc-accounts/std", "pallet-ddc-nodes/std", + "pallet-ddc-clusters/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", From 0f2cb2c6da33db15470ed3382ebee65a0c520aef Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 20 Oct 2023 16:06:03 +0600 Subject: [PATCH 405/583] Use `ddc-primitives` in `ddc-staking` --- pallets/ddc-staking/Cargo.toml | 2 ++ pallets/ddc-staking/src/lib.rs | 24 ++++++++---------------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/pallets/ddc-staking/Cargo.toml b/pallets/ddc-staking/Cargo.toml index f6c3b69eb..572a2fd25 100644 --- a/pallets/ddc-staking/Cargo.toml +++ b/pallets/ddc-staking/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -26,6 +27,7 @@ substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/parity default = ["std"] std = [ "codec/std", + "ddc-primitives/std", "frame-support/std", "frame-system/std", "frame-benchmarking/std", diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index b54dbc1a6..8c394a500 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -28,6 +28,7 @@ pub mod weights; use crate::weights::WeightInfo; use codec::{Decode, Encode, HasCompact}; +use ddc_primitives::{ClusterId, NodePubKey}; use frame_support::{ assert_ok, pallet_prelude::*, @@ -66,8 +67,6 @@ pub type RewardPoint = u64; pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; -pub type ClusterId = u32; - parameter_types! { /// A limit to the number of pending unlocks an account may have in parallel. pub MaxUnlockingChunks: u32 = 32; @@ -337,12 +336,12 @@ pub mod pallet { /// Map from DDC node ID to the node operator stash account. #[pallet::storage] #[pallet::getter(fn nodes)] - pub type Nodes = StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; + pub type Nodes = StorageMap<_, Twox64Concat, NodePubKey, T::AccountId>; #[pallet::genesis_config] pub struct GenesisConfig { - pub edges: Vec<(T::AccountId, T::AccountId, T::AccountId, BalanceOf, ClusterId)>, - pub storages: Vec<(T::AccountId, T::AccountId, T::AccountId, BalanceOf, ClusterId)>, + pub edges: Vec<(T::AccountId, T::AccountId, NodePubKey, BalanceOf, ClusterId)>, + pub storages: Vec<(T::AccountId, T::AccountId, NodePubKey, BalanceOf, ClusterId)>, pub settings: Vec<(ClusterId, BalanceOf, EraIndex, BalanceOf, EraIndex)>, } @@ -389,7 +388,7 @@ pub mod pallet { assert_ok!(Pallet::::bond( T::RuntimeOrigin::from(Some(stash.clone()).into()), T::Lookup::unlookup(controller.clone()), - T::Lookup::unlookup(node.clone()), + node.clone(), balance, )); assert_ok!(Pallet::::serve( @@ -407,7 +406,7 @@ pub mod pallet { assert_ok!(Pallet::::bond( T::RuntimeOrigin::from(Some(stash.clone()).into()), T::Lookup::unlookup(controller.clone()), - T::Lookup::unlookup(node.clone()), + node.clone(), balance, )); assert_ok!(Pallet::::store( @@ -507,7 +506,7 @@ pub mod pallet { pub fn bond( origin: OriginFor, controller: ::Source, - node: ::Source, + node: NodePubKey, #[pallet::compact] value: BalanceOf, ) -> DispatchResult { let stash = ensure_signed(origin)?; @@ -527,8 +526,6 @@ pub mod pallet { Err(Error::::InsufficientBond)? } - let node = T::Lookup::lookup(node)?; - // Reject a bond with a known DDC node. if Nodes::::contains_key(&node) { Err(Error::::AlreadyPaired)? @@ -928,14 +925,9 @@ pub mod pallet { /// /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. #[pallet::weight(T::WeightInfo::set_node())] - pub fn set_node( - origin: OriginFor, - new_node: ::Source, - ) -> DispatchResult { + pub fn set_node(origin: OriginFor, new_node: NodePubKey) -> DispatchResult { let stash = ensure_signed(origin)?; - let new_node = T::Lookup::lookup(new_node)?; - if let Some(existing_node_stash) = Nodes::::get(&new_node) { if existing_node_stash != stash { Err(Error::::AlreadyPaired)? From e45745b6071d9a0d12266a6741c234b39c828ca0 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 20 Oct 2023 16:06:50 +0600 Subject: [PATCH 406/583] Fix node key conversion to string --- pallets/ddc-validator/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 5d3b91005..e7dd27dc2 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -825,7 +825,7 @@ pub mod pallet { data_url, "ddc:dac:aggregation:nodes:", current_ddc_era - 1, - utils::account_to_string::(node) + array_bytes::bytes2hex("", node.encode()), ); log::debug!("edge url: {:?}", edge_url); From e03cc25acc138b6ffe012eb3e02ae5d1bb572c76 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 20 Oct 2023 16:12:50 +0600 Subject: [PATCH 407/583] Minor fixes suggested by warnings --- pallets/ddc-validator/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index e7dd27dc2..ac0bfe531 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -485,7 +485,6 @@ pub mod pallet { stakers_points: Vec<(T::AccountId, u64)>, ) -> DispatchResult { let ddc_valitor_key = ensure_signed(origin)?; - let mut rewards_counter = 0; ensure!( DDCValidatorToStashKeys::::contains_key(&ddc_valitor_key), @@ -812,7 +811,7 @@ pub mod pallet { for assigned_edge in assigned_edges.iter() { log::debug!("assigned edge: {:?}", assigned_edge); - let Some((node, _)) = >::iter().find(|(n, s)| assigned_edge == s) else { + let Some((node, _)) = >::iter().find(|(_, s)| assigned_edge == s) else { log::debug!("no known node for: {:?}", assigned_edge); continue; }; From 1f5ea74632b5d79006f85ff2ba287c7588e2caf9 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 20 Oct 2023 16:21:07 +0600 Subject: [PATCH 408/583] Use `ddc-primitives` in `ddc-nodes` --- pallets/ddc-nodes/Cargo.toml | 3 +++ pallets/ddc-nodes/src/cdn_node.rs | 12 ++++-------- pallets/ddc-nodes/src/lib.rs | 11 ++++------- pallets/ddc-nodes/src/node.rs | 11 +++-------- pallets/ddc-nodes/src/storage_node.rs | 12 ++++-------- 5 files changed, 18 insertions(+), 31 deletions(-) diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index d05d85bf2..607ab47fa 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -25,6 +26,7 @@ substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/parity default = ["std"] std = [ "codec/std", + "ddc-primitives/std", "frame-support/std", "frame-system/std", "frame-benchmarking/std", @@ -33,5 +35,6 @@ std = [ "sp-runtime/std", "sp-staking/std", "sp-std/std", + "sp-core/std", ] runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 96de56918..2bf763e44 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -1,17 +1,13 @@ -use crate::{ - node::{ - Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKey, NodePubKeyRef, NodeTrait, - NodeType, - }, - ClusterId, +use crate::node::{ + Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType, }; use codec::{Decode, Encode}; +use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey}; use frame_support::{parameter_types, BoundedVec}; use scale_info::TypeInfo; -use sp_runtime::{AccountId32, RuntimeDebug}; +use sp_runtime::RuntimeDebug; use sp_std::prelude::*; -pub type CDNNodePubKey = AccountId32; parameter_types! { pub MaxCDNNodeParamsLen: u16 = 2048; } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index c91881bd8..a6ff1b3d4 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -14,9 +14,9 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] +use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey, StorageNodePubKey}; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; -use sp_core::hash::H160; use sp_std::prelude::*; pub use pallet::*; @@ -25,9 +25,9 @@ mod node; mod storage_node; pub use crate::{ - cdn_node::{CDNNode, CDNNodePubKey}, - node::{Node, NodeError, NodeParams, NodePubKey, NodeTrait}, - storage_node::{StorageNode, StorageNodePubKey}, + cdn_node::CDNNode, + node::{Node, NodeError, NodeParams, NodeTrait}, + storage_node::StorageNode, }; #[frame_support::pallet] @@ -73,9 +73,6 @@ pub mod pallet { pub type CDNNodes = StorageMap<_, Blake2_128Concat, CDNNodePubKey, CDNNode>; - // todo: add the type to the Config - pub type ClusterId = H160; - #[pallet::call] impl Pallet { #[pallet::weight(10_000)] diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index db3cb78b6..e571cfe85 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -1,10 +1,11 @@ use crate::{ - cdn_node::{CDNNode, CDNNodeParams, CDNNodeProps, CDNNodePubKey}, + cdn_node::{CDNNode, CDNNodeParams, CDNNodeProps}, pallet::Error, - storage_node::{StorageNode, StorageNodeParams, StorageNodeProps, StorageNodePubKey}, + storage_node::{StorageNode, StorageNodeParams, StorageNodeProps}, ClusterId, }; use codec::{Decode, Encode}; +use ddc_primitives::{CDNNodePubKey, NodePubKey, StorageNodePubKey}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; @@ -28,12 +29,6 @@ pub enum NodeProps { CDNProps(CDNNodeProps), } -#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub enum NodePubKey { - StoragePubKey(StorageNodePubKey), - CDNPubKey(CDNNodePubKey), -} - #[derive(Clone, RuntimeDebug, PartialEq)] pub enum NodePubKeyRef<'a> { StoragePubKeyRef(&'a StorageNodePubKey), diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 74167bdc8..92b867391 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,17 +1,13 @@ -use crate::{ - node::{ - Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKey, NodePubKeyRef, NodeTrait, - NodeType, - }, - ClusterId, +use crate::node::{ + Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType, }; use codec::{Decode, Encode}; +use ddc_primitives::{ClusterId, NodePubKey, StorageNodePubKey}; use frame_support::{parameter_types, BoundedVec}; use scale_info::TypeInfo; -use sp_runtime::{AccountId32, RuntimeDebug}; +use sp_runtime::RuntimeDebug; use sp_std::prelude::Vec; -pub type StorageNodePubKey = AccountId32; parameter_types! { pub MaxStorageNodeParamsLen: u16 = 2048; } From 9a871e5eb6df084d457db74239dd4b9c1707ac83 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 20 Oct 2023 16:22:46 +0600 Subject: [PATCH 409/583] Use `ddc-primitives` in `ddc-clusters` --- pallets/ddc-clusters/Cargo.toml | 2 ++ pallets/ddc-clusters/src/cluster.rs | 3 +-- pallets/ddc-clusters/src/lib.rs | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index c28f38795..4810f9b16 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -28,6 +29,7 @@ substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/parity default = ["std"] std = [ "codec/std", + "ddc-primitives/std", "frame-support/std", "frame-system/std", "frame-benchmarking/std", diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index ec8ac01e3..862c42ddf 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -1,11 +1,10 @@ use crate::pallet::Error; use codec::{Decode, Encode}; +use ddc_primitives::ClusterId; use frame_support::{pallet_prelude::*, parameter_types, BoundedVec}; use scale_info::TypeInfo; -use sp_core::hash::H160; use sp_std::vec::Vec; -pub type ClusterId = H160; parameter_types! { pub MaxClusterParamsLen: u16 = 2048; } diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 071daeda8..e4131c0fe 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -15,14 +15,15 @@ #![recursion_limit = "256"] #![feature(is_some_and)] // ToDo: delete at rustc > 1.70 +use ddc_primitives::{ClusterId, NodePubKey}; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; pub use pallet::*; -use pallet_ddc_nodes::{NodePubKey, NodeRepository, NodeTrait}; +use pallet_ddc_nodes::{NodeRepository, NodeTrait}; use sp_std::prelude::*; mod cluster; -pub use crate::cluster::{Cluster, ClusterError, ClusterId, ClusterParams}; +pub use crate::cluster::{Cluster, ClusterError, ClusterParams}; /// ink! 4.x selector for the "is_authorized" message, equals to the first four bytes of the /// blake2("is_authorized"). See also: https://use.ink/basics/selectors#selector-calculation/, From 1eab176b4dc9b1d97cc63a4e70a0c8eb4c27d24b Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 20 Oct 2023 16:23:05 +0600 Subject: [PATCH 410/583] Add missing std feature dependencies --- pallets/ddc-clusters/Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index 4810f9b16..a7ed43bdf 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -34,8 +34,10 @@ std = [ "frame-system/std", "frame-benchmarking/std", "pallet-contracts/std", + "pallet-ddc-nodes/std", "pallet-ddc-staking/std", "scale-info/std", + "sp-core/std", "sp-io/std", "sp-runtime/std", "sp-staking/std", From 2353b153a6802febbca1c94605f48084e21fc377 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 20 Oct 2023 16:24:34 +0600 Subject: [PATCH 411/583] Update `Cargo.lock` --- Cargo.lock | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index e38563b7c..9fcf86474 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1613,6 +1613,7 @@ version = "0.1.0" dependencies = [ "parity-scale-codec", "scale-info", + "serde", "sp-core", "sp-runtime", ] @@ -4860,6 +4861,7 @@ dependencies = [ name = "pallet-ddc-clusters" version = "4.8.1" dependencies = [ + "ddc-primitives", "frame-benchmarking", "frame-support", "frame-system", @@ -4908,6 +4910,7 @@ dependencies = [ name = "pallet-ddc-nodes" version = "4.8.1" dependencies = [ + "ddc-primitives", "frame-benchmarking", "frame-support", "frame-system", @@ -4927,6 +4930,7 @@ dependencies = [ name = "pallet-ddc-staking" version = "4.8.1" dependencies = [ + "ddc-primitives", "frame-benchmarking", "frame-support", "frame-system", From 095533e778816971153af9624da51f40c43f4c7b Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 20 Oct 2023 16:37:52 +0600 Subject: [PATCH 412/583] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5d85401c..975dd715d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [D] Third kind of account in DDC Staking for DDC nodes (along with stash and controller). - [D] DDC cluster managers access control list in `pallet-ddc-staking` managed by governance. - [Zombienet](https://github.com/paritytech/zombienet) configurations to test block building and spawn a network for DDC validation debugging. +- New `ddc-primitives` crate with DDC common types definition ### Changed From 23f99b5d312275a93fbd5220d1bfe1ec32171f6c Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 20 Oct 2023 16:39:32 +0600 Subject: [PATCH 413/583] Bump `cere-dev` runtime `spec_version` --- runtime/cere-dev/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 3a9719d7c..d71e17e5c 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -130,7 +130,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: 48006, + spec_version: 48007, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, From 88181a7ecb37244072885f4679049be20568c562 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 20 Oct 2023 18:45:49 +0600 Subject: [PATCH 414/583] Fix `runtime-benchmarks` build and tests --- Cargo.lock | 1 + pallets/ddc-staking/src/benchmarking.rs | 19 ++++++------- pallets/ddc-staking/src/lib.rs | 2 +- pallets/ddc-staking/src/mock.rs | 33 +++++++++++++++++++--- pallets/ddc-staking/src/testing_utils.rs | 15 +++++----- pallets/ddc-staking/src/tests.rs | 35 +++++++++++++++--------- pallets/ddc-validator/Cargo.toml | 1 + pallets/ddc-validator/src/mock.rs | 7 ++--- pallets/ddc-validator/src/tests.rs | 5 ++-- 9 files changed, 76 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9fcf86474..669a99063 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4955,6 +4955,7 @@ dependencies = [ "alt_serde", "array-bytes 6.1.0", "base64 0.21.2", + "ddc-primitives", "frame-election-provider-support", "frame-support", "frame-system", diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index 70dde5733..f5454fc99 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -2,6 +2,7 @@ use super::*; use crate::Pallet as DdcStaking; +use ddc_primitives::CDNNodePubKey; use testing_utils::*; use frame_support::traits::{Currency, Get}; @@ -21,11 +22,10 @@ benchmarks! { let controller = create_funded_user::("controller", USER_SEED, 100); let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); - let node = create_funded_user::("node", USER_SEED, 100); - let node_lookup: ::Source = T::Lookup::unlookup(node.clone()); + let node = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); let amount = T::Currency::minimum_balance() * 10u32.into(); whitelist_account!(stash); - }: _(RawOrigin::Signed(stash.clone()), controller_lookup, node_lookup, amount) + }: _(RawOrigin::Signed(stash.clone()), controller_lookup, node.clone(), amount) verify { assert!(Bonded::::contains_key(stash)); assert!(Ledger::::contains_key(controller)); @@ -68,7 +68,7 @@ benchmarks! { let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultStorageBondSize::get())?; whitelist_account!(controller); - }: _(RawOrigin::Signed(controller), 1) + }: _(RawOrigin::Signed(controller), ClusterId::from([1; 20])) verify { assert!(Storages::::contains_key(&stash)); } @@ -77,7 +77,7 @@ benchmarks! { let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultEdgeBondSize::get())?; whitelist_account!(controller); - }: _(RawOrigin::Signed(controller), 1) + }: _(RawOrigin::Signed(controller), ClusterId::from([1; 20])) verify { assert!(Edges::::contains_key(&stash)); } @@ -87,11 +87,11 @@ benchmarks! { clear_storages_and_edges::(); let (edge_stash, edge_controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultEdgeBondSize::get())?; - DdcStaking::::serve(RawOrigin::Signed(edge_controller.clone()).into(), 1)?; + DdcStaking::::serve(RawOrigin::Signed(edge_controller.clone()).into(), ClusterId::from([1; 20]))?; assert!(Edges::::contains_key(&edge_stash)); CurrentEra::::put(1); DdcStaking::::chill(RawOrigin::Signed(edge_controller.clone()).into())?; - CurrentEra::::put(1 + Settings::::get(1).edge_chill_delay); + CurrentEra::::put(1 + Settings::::get(ClusterId::from([1; 20])).edge_chill_delay); whitelist_account!(edge_controller); }: _(RawOrigin::Signed(edge_controller)) @@ -111,10 +111,9 @@ benchmarks! { set_node { let (stash, _, _) = create_stash_controller_node::(USER_SEED, 100)?; - let new_node = create_funded_user::("new_node", USER_SEED, 100); - let new_node_lookup = T::Lookup::unlookup(new_node.clone()); + let new_node = NodePubKey::CDNPubKey(CDNNodePubKey::new([1; 32])); whitelist_account!(stash); - }: _(RawOrigin::Signed(stash), new_node_lookup) + }: _(RawOrigin::Signed(stash), new_node.clone()) verify { assert!(Nodes::::contains_key(&new_node)); } diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 8c394a500..c349b3271 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -28,7 +28,7 @@ pub mod weights; use crate::weights::WeightInfo; use codec::{Decode, Encode, HasCompact}; -use ddc_primitives::{ClusterId, NodePubKey}; +pub use ddc_primitives::{ClusterId, NodePubKey}; use frame_support::{ assert_ok, pallet_prelude::*, diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 3d0dae597..48d046fb6 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -3,6 +3,7 @@ #![allow(dead_code)] use crate::{self as pallet_ddc_staking, *}; +use ddc_primitives::{CDNNodePubKey, StorageNodePubKey}; use frame_support::{ construct_runtime, traits::{ConstU32, ConstU64, Everything, GenesisBuild}, @@ -196,16 +197,40 @@ impl ExtBuilder { if self.has_edges { edges = vec![ // (stash, controller, node, stake, cluster) - (11, 10, 12, 100, 1), - (21, 20, 22, 100, 1), + ( + 11, + 10, + NodePubKey::CDNPubKey(CDNNodePubKey::new([12; 32])), + 100, + ClusterId::from([1; 20]), + ), + ( + 21, + 20, + NodePubKey::CDNPubKey(CDNNodePubKey::new([22; 32])), + 100, + ClusterId::from([1; 20]), + ), ]; } let mut storages = vec![]; if self.has_storages { storages = vec![ // (stash, controller, node, stake, cluster) - (31, 30, 32, 100, 1), - (41, 40, 42, 100, 1), + ( + 31, + 30, + NodePubKey::StoragePubKey(StorageNodePubKey::new([32; 32])), + 100, + ClusterId::from([1; 20]), + ), + ( + 41, + 40, + NodePubKey::StoragePubKey(StorageNodePubKey::new([42; 32])), + 100, + ClusterId::from([1; 20]), + ), ]; } diff --git a/pallets/ddc-staking/src/testing_utils.rs b/pallets/ddc-staking/src/testing_utils.rs index 4898d7313..74e61221c 100644 --- a/pallets/ddc-staking/src/testing_utils.rs +++ b/pallets/ddc-staking/src/testing_utils.rs @@ -1,6 +1,7 @@ //! Testing utils for ddc-staking. use crate::{Pallet as DdcStaking, *}; +use ddc_primitives::CDNNodePubKey; use frame_benchmarking::account; use frame_system::RawOrigin; @@ -46,18 +47,17 @@ pub fn create_funded_user_with_balance( pub fn create_stash_controller_node( n: u32, balance_factor: u32, -) -> Result<(T::AccountId, T::AccountId, T::AccountId), &'static str> { +) -> Result<(T::AccountId, T::AccountId, NodePubKey), &'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 node = create_funded_user::("node", n, balance_factor); - let node_lookup: ::Source = T::Lookup::unlookup(node.clone()); + let node = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); let amount = T::Currency::minimum_balance() * (balance_factor / 10).max(1).into(); DdcStaking::::bond( RawOrigin::Signed(stash.clone()).into(), controller_lookup, - node_lookup, + node.clone(), amount, )?; return Ok((stash, controller, node)) @@ -67,18 +67,17 @@ pub fn create_stash_controller_node( pub fn create_stash_controller_node_with_balance( n: u32, balance: crate::BalanceOf, -) -> Result<(T::AccountId, T::AccountId, T::AccountId), &'static str> { +) -> Result<(T::AccountId, T::AccountId, NodePubKey), &'static str> { let stash = create_funded_user_with_balance::("stash", n, balance); let controller = create_funded_user_with_balance::("controller", n, balance); let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); - let node = create_funded_user_with_balance::("node", n, balance); - let node_lookup: ::Source = T::Lookup::unlookup(node.clone()); + let node = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); DdcStaking::::bond( RawOrigin::Signed(stash.clone()).into(), controller_lookup, - node_lookup, + node.clone(), balance, )?; Ok((stash, controller, node)) diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index 17fe47caa..2af19cce0 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -1,6 +1,7 @@ //! Tests for the module. use super::{mock::*, *}; +use ddc_primitives::CDNNodePubKey; use frame_support::{ assert_noop, assert_ok, assert_storage_noop, error::BadOrigin, traits::ReservableCurrency, }; @@ -15,7 +16,7 @@ fn set_settings_works() { // setting works assert_ok!(DdcStaking::set_settings( RuntimeOrigin::root(), - 1, + ClusterId::from([1; 20]), Some(ClusterSettings { edge_bond_size: 10, edge_chill_delay: 2, @@ -23,15 +24,15 @@ fn set_settings_works() { storage_chill_delay: 2, }), )); - let settings = DdcStaking::settings(1); + let settings = DdcStaking::settings(ClusterId::from([1; 20])); assert_eq!(settings.edge_bond_size, 10); assert_eq!(settings.edge_chill_delay, 2); assert_eq!(settings.storage_bond_size, 10); assert_eq!(settings.storage_chill_delay, 2); // removing works - assert_ok!(DdcStaking::set_settings(RuntimeOrigin::root(), 1, None)); - let settings = DdcStaking::settings(1); + assert_ok!(DdcStaking::set_settings(RuntimeOrigin::root(), ClusterId::from([1; 20]), None)); + let settings = DdcStaking::settings(ClusterId::from([1; 20])); let default_settings: ClusterSettings = Default::default(); assert_eq!(settings.edge_bond_size, default_settings.edge_bond_size); assert_eq!(settings.edge_chill_delay, default_settings.edge_chill_delay); @@ -77,7 +78,7 @@ fn basic_setup_works() { assert_eq!(DdcStaking::ledger(&1), None); // Cluster 1 settings are default - assert_eq!(DdcStaking::settings(1), Default::default()); + assert_eq!(DdcStaking::settings(ClusterId::from([1; 20])), Default::default()); }); } @@ -95,9 +96,12 @@ fn change_controller_works() { assert_eq!(DdcStaking::bonded(&11), Some(3)); // 10 is no longer in control. - assert_noop!(DdcStaking::serve(RuntimeOrigin::signed(10), 1), Error::::NotController); + assert_noop!( + DdcStaking::serve(RuntimeOrigin::signed(10), ClusterId::from([1; 20])), + Error::::NotController + ); // 3 is a new controller. - assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(3), 1)); + assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(3), ClusterId::from([1; 20]))); }) } @@ -110,8 +114,13 @@ fn staking_should_work() { } // Add new CDN participant, account 3 controlled by 4 with node 5. - assert_ok!(DdcStaking::bond(RuntimeOrigin::signed(3), 4, 5, 1500)); - assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), 1)); + assert_ok!(DdcStaking::bond( + RuntimeOrigin::signed(3), + 4, + NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + 1500 + )); + assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), ClusterId::from([0; 20]))); // Account 4 controls the stash from account 3, which is 1500 units, 3 is a CDN // participant, 5 is a DDC node. @@ -126,8 +135,8 @@ fn staking_should_work() { unlocking: Default::default(), }) ); - assert_eq!(DdcStaking::edges(3), Some(1)); - assert_eq!(DdcStaking::nodes(5), Some(3)); + assert_eq!(DdcStaking::edges(3), Some(ClusterId::from([0; 20]))); + assert_eq!(DdcStaking::nodes(NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32]))), Some(3)); // Set `CurrentEra`. Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); @@ -137,8 +146,8 @@ fn staking_should_work() { assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); // Removal is scheduled, stashed value of 4 is still lock. - let chilling = - DdcStaking::current_era().unwrap() + DdcStaking::settings(1).edge_chill_delay; + let chilling = DdcStaking::current_era().unwrap() + + DdcStaking::settings(ClusterId::from([0; 20])).edge_chill_delay; assert_eq!( DdcStaking::ledger(&4), Some(StakingLedger { diff --git a/pallets/ddc-validator/Cargo.toml b/pallets/ddc-validator/Cargo.toml index 886e6cfa6..d1ceeec47 100644 --- a/pallets/ddc-validator/Cargo.toml +++ b/pallets/ddc-validator/Cargo.toml @@ -33,6 +33,7 @@ pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/ pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-staking-reward-curve = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +ddc-primitives = { version = "0.1.0", path = "../../primitives" } [features] default = ["std"] diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index 92b3f3b26..085469277 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -1,4 +1,5 @@ use crate::{self as pallet_ddc_validator, *}; +use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey}; use frame_election_provider_support::{onchain, SequentialPhragmen}; use frame_support::{ parameter_types, @@ -317,8 +318,6 @@ pub fn new_test_ext() -> sp_io::TestExternalities { (AccountId::from([0x1; 32]), 1000), // edge controller (AccountId::from([0x11; 32]), 1000), - // edge node - (AccountId::from([0x21; 32]), 1000), // validator1 stash; has to be equal to the OCW key in the current implementation ( AccountId::from([ @@ -371,9 +370,9 @@ pub fn new_test_ext() -> sp_io::TestExternalities { let edges = vec![( AccountId::from([0x1; 32]), AccountId::from([0x11; 32]), - AccountId::from([0x21; 32]), + NodePubKey::CDNPubKey(CDNNodePubKey::new([0x21; 32])), 100, - 1, + ClusterId::from([1; 20]), )]; let storages = vec![]; let _ = pallet_ddc_staking::GenesisConfig:: { edges, storages, ..Default::default() } diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index 5c8056efd..fc537b88a 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -6,6 +6,7 @@ use crate::{ Error as ValidatorError, }; use codec::Decode; +use ddc_primitives::{CDNNodePubKey, NodePubKey}; use frame_support::{assert_noop, assert_ok}; use pallet_ddc_accounts::{BucketsDetails, Error as AccountsError}; use pallet_ddc_staking::{DDC_ERA_DURATION_MS, DDC_ERA_START_MS}; @@ -41,8 +42,8 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { let edge_stash_to_validate = AccountId::from([0x1; 32]); let edge_stash_to_validate_str = utils::account_to_string::(edge_stash_to_validate.clone()); - let edge_node_to_validate = AccountId::from([0x21; 32]); - let edge_node_to_validate_str = utils::account_to_string::(edge_node_to_validate.clone()); + let edge_node_to_validate = NodePubKey::CDNPubKey(CDNNodePubKey::new([0x21; 32])); + let edge_node_to_validate_str = array_bytes::bytes2hex("", edge_node_to_validate.encode()); let validator_1_stash = AccountId::from([ 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, From 9c14359de2ffaa639dfaa0c97b8ee1d566c08eb9 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 21 Sep 2023 18:26:15 +0600 Subject: [PATCH 415/583] Add `clippy` component to the toolchain file --- rust-toolchain.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 9bcb924a2..bcf909e27 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] channel = "nightly-2022-10-09" -components = [ "rustfmt" ] +components = [ "clippy", "rustfmt" ] targets = [ "wasm32-unknown-unknown" ] From 1ecc0061eb135add403bc67ba6ae6e2d5bbeb8ce Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 23 Oct 2023 16:57:58 +0600 Subject: [PATCH 416/583] Add clippy config --- .cargo/config.toml | 31 +++++++++++++++++++++++++++++++ .gitignore | 3 ++- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 .cargo/config.toml diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 000000000..fc82ca587 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,31 @@ +# An auto defined `clippy` feature was introduced, +# but it was found to clash with user defined features, +# so was renamed to `cargo-clippy`. +# +# If you want standard clippy run: +# RUSTFLAGS= cargo clippy +[target.'cfg(feature = "cargo-clippy")'] +rustflags = [ + "-Aclippy::all", + "-Dclippy::correctness", + "-Aclippy::if-same-then-else", + "-Aclippy::clone-double-ref", + "-Dclippy::complexity", + "-Aclippy::zero-prefixed-literal", # 00_1000_000 + "-Aclippy::type_complexity", # raison d'etre + "-Aclippy::nonminimal-bool", # maybe + "-Aclippy::borrowed-box", # Reasonable to fix this one + "-Aclippy::too-many-arguments", # (Turning this on would lead to) + "-Aclippy::unnecessary_cast", # Types may change + "-Aclippy::identity-op", # One case where we do 0 + + "-Aclippy::useless_conversion", # Types may change + "-Aclippy::unit_arg", # styalistic. + "-Aclippy::option-map-unit-fn", # styalistic + "-Aclippy::bind_instead_of_map", # styalistic + "-Aclippy::erasing_op", # E.g. 0 * DOLLARS + "-Aclippy::eq_op", # In tests we test equality. + "-Aclippy::while_immutable_condition", # false positives + "-Aclippy::needless_option_as_deref", # false positives + "-Aclippy::derivable_impls", # false positives + "-Aclippy::stable_sort_primitive", # prefer stable sort +] diff --git a/.gitignore b/.gitignore index 90db35e94..6dd97a7f6 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,8 @@ .DS_Store # The cache for docker container dependency -.cargo +.cargo/** +!/.cargo/config.toml # The cache for chain data in container .local From eb16c8a355be2eede612f384e951df5a0ed85ccc Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 23 Oct 2023 12:30:18 +0600 Subject: [PATCH 417/583] Disable clippy linter in legacy pallets --- pallets/chainbridge/src/lib.rs | 1 + pallets/ddc-metrics-offchain-worker/src/lib.rs | 2 +- pallets/ddc/src/lib.rs | 1 + pallets/erc20/src/lib.rs | 1 + pallets/erc721/src/lib.rs | 1 + 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pallets/chainbridge/src/lib.rs b/pallets/chainbridge/src/lib.rs index 1e48b4a7d..562b54566 100644 --- a/pallets/chainbridge/src/lib.rs +++ b/pallets/chainbridge/src/lib.rs @@ -1,3 +1,4 @@ +#![allow(clippy::all)] // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] diff --git a/pallets/ddc-metrics-offchain-worker/src/lib.rs b/pallets/ddc-metrics-offchain-worker/src/lib.rs index 991fdabb2..7f68798ab 100644 --- a/pallets/ddc-metrics-offchain-worker/src/lib.rs +++ b/pallets/ddc-metrics-offchain-worker/src/lib.rs @@ -1,7 +1,7 @@ // Offchain worker for DDC metrics. // // Inspired from https://github.com/paritytech/substrate/tree/master/frame/example-offchain-worker - +#![allow(clippy::all)] #![cfg_attr(not(feature = "std"), no_std)] #[cfg(test)] diff --git a/pallets/ddc/src/lib.rs b/pallets/ddc/src/lib.rs index e1d572af6..8308b880c 100644 --- a/pallets/ddc/src/lib.rs +++ b/pallets/ddc/src/lib.rs @@ -1,3 +1,4 @@ +#![allow(clippy::all)] #![cfg_attr(not(feature = "std"), no_std)] use frame_support::{ diff --git a/pallets/erc20/src/lib.rs b/pallets/erc20/src/lib.rs index a9474ae2f..e025c5177 100644 --- a/pallets/erc20/src/lib.rs +++ b/pallets/erc20/src/lib.rs @@ -1,3 +1,4 @@ +#![allow(clippy::all)] // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] diff --git a/pallets/erc721/src/lib.rs b/pallets/erc721/src/lib.rs index c5b7244d7..7d93c96f9 100644 --- a/pallets/erc721/src/lib.rs +++ b/pallets/erc721/src/lib.rs @@ -1,3 +1,4 @@ +#![allow(clippy::all)] // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] From 9f20c59ae3bfeb3785961ab4864466659af77ba3 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 23 Oct 2023 15:52:40 +0600 Subject: [PATCH 418/583] Suppress `clippy::needless_lifetimes` in ddc-nodes --- pallets/ddc-nodes/src/cdn_node.rs | 2 ++ pallets/ddc-nodes/src/node.rs | 2 ++ pallets/ddc-nodes/src/storage_node.rs | 2 ++ 3 files changed, 6 insertions(+) diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 2bf763e44..fe499717b 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -1,3 +1,5 @@ +#![allow(clippy::needless_lifetimes)] // ToDo + use crate::node::{ Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType, }; diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index e571cfe85..4b48d4054 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -1,3 +1,5 @@ +#![allow(clippy::needless_lifetimes)] // ToDo + use crate::{ cdn_node::{CDNNode, CDNNodeParams, CDNNodeProps}, pallet::Error, diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 92b867391..d9cd253d1 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,3 +1,5 @@ +#![allow(clippy::needless_lifetimes)] // ToDo + use crate::node::{ Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType, }; From b21c61bc851af28c188297f72d1e048cff6d27d5 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 21 Sep 2023 18:35:21 +0600 Subject: [PATCH 419/583] Apply `cargo clippy --fix --all` --- cli/src/command.rs | 10 +- node/service/src/lib.rs | 10 +- pallets/chainbridge/src/lib.rs | 20 +-- pallets/chainbridge/src/mock.rs | 2 +- pallets/chainbridge/src/tests.rs | 76 +++++------ pallets/ddc-accounts/src/lib.rs | 4 +- pallets/ddc-clusters/src/lib.rs | 24 ++-- .../ddc-metrics-offchain-worker/src/lib.rs | 20 +-- .../src/tests/mod.rs | 8 +- pallets/ddc-nodes/src/lib.rs | 14 +- pallets/ddc-staking/src/lib.rs | 20 +-- pallets/ddc-staking/src/mock.rs | 2 +- pallets/ddc-staking/src/testing_utils.rs | 2 +- pallets/ddc-staking/src/weights.rs | 120 +++++++++--------- pallets/ddc-validator/src/dac.rs | 26 ++-- pallets/ddc-validator/src/lib.rs | 45 +++---- pallets/ddc-validator/src/shm.rs | 8 +- pallets/ddc-validator/src/tests.rs | 6 +- pallets/ddc-validator/src/utils.rs | 4 +- pallets/ddc/src/lib.rs | 6 +- pallets/erc20/src/lib.rs | 6 +- pallets/erc721/src/lib.rs | 10 +- pallets/erc721/src/tests.rs | 16 +-- runtime/cere-dev/src/impls.rs | 16 +-- runtime/cere-dev/src/lib.rs | 28 ++-- runtime/cere/src/impls.rs | 16 +-- runtime/cere/src/lib.rs | 28 ++-- 27 files changed, 269 insertions(+), 278 deletions(-) diff --git a/cli/src/command.rs b/cli/src/command.rs index 9865ccf85..665ba9d31 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -67,7 +67,7 @@ impl SubstrateCli for Cli { #[cfg(feature = "cere-native")] { - return &cere_service::cere_runtime::VERSION + &cere_service::cere_runtime::VERSION } #[cfg(not(feature = "cere-native"))] @@ -161,17 +161,17 @@ pub fn run() -> sc_cli::Result<()> { #[cfg(feature = "cere-dev-native")] if chain_spec.is_cere_dev() { - return Ok(runner.sync_run(|config| { + return runner.sync_run(|config| { cmd.run::(config) - })?) + }) } // else we assume it is Cere #[cfg(feature = "cere-native")] { - return Ok(runner.sync_run(|config| { + runner.sync_run(|config| { cmd.run::(config) - })?) + }) } #[cfg(not(feature = "cere-native"))] diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 6988b5641..68e5386a6 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -88,7 +88,7 @@ where let (client, backend, keystore_container, task_manager) = sc_service::new_full_parts::( - &config, + config, telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()), executor, )?; @@ -287,7 +287,7 @@ pub fn build_full( #[cfg(feature = "cere-native")] { - return new_full::( + new_full::( config, disable_hardware_benchmarks, enable_ddc_validation, @@ -347,7 +347,7 @@ where { let hwbench = if !disable_hardware_benchmarks { config.database.path().map(|database_path| { - let _ = std::fs::create_dir_all(&database_path); + let _ = std::fs::create_dir_all(database_path); sc_sysinfo::gather_hwbench(Some(database_path)) }) } else { @@ -461,7 +461,7 @@ where let proposer = sc_basic_authorship::ProposerFactory::new( task_manager.spawn_handle(), client.clone(), - transaction_pool.clone(), + transaction_pool, prometheus_registry.as_ref(), telemetry.as_ref().map(|x| x.handle()), ); @@ -646,7 +646,7 @@ pub fn new_chain_ops( #[cfg(feature = "cere-native")] { - return chain_ops!(config; cere_runtime, CereExecutorDispatch, Cere) + chain_ops!(config; cere_runtime, CereExecutorDispatch, Cere) } #[cfg(not(feature = "cere-native"))] diff --git a/pallets/chainbridge/src/lib.rs b/pallets/chainbridge/src/lib.rs index 562b54566..9972be688 100644 --- a/pallets/chainbridge/src/lib.rs +++ b/pallets/chainbridge/src/lib.rs @@ -37,7 +37,7 @@ pub fn derive_resource_id(chain: u8, id: &[u8]) -> ResourceId { for i in 0..range { r_id[30 - i] = id[range - 1 - i]; // Ensure left padding for eth compatibility } - return r_id + r_id } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, scale_info::TypeInfo)] @@ -77,7 +77,7 @@ impl ProposalVotes { /// Returns true if `who` has voted for or against the proposal fn has_voted(&self, who: &A) -> bool { - self.votes_for.contains(&who) || self.votes_against.contains(&who) + self.votes_for.contains(who) || self.votes_against.contains(who) } /// Return true if the expiry time has been reached @@ -295,7 +295,7 @@ decl_module! { /// # /// - weight of proposed call, regardless of whether execution is performed /// # - #[weight = (call.get_dispatch_info().weight + Weight::from_ref_time(195_000_000 as u64), call.get_dispatch_info().class, Pays::Yes)] + #[weight = (call.get_dispatch_info().weight + Weight::from_ref_time(195_000_000_u64), call.get_dispatch_info().class, Pays::Yes)] pub fn acknowledge_proposal(origin, nonce: DepositNonce, src_id: ChainId, r_id: ResourceId, call: Box<::Proposal>) -> DispatchResult { let who = ensure_signed(origin)?; ensure!(Self::is_relayer(&who), Error::::MustBeRelayer); @@ -328,7 +328,7 @@ decl_module! { /// # /// - weight of proposed call, regardless of whether execution is performed /// # - #[weight = (prop.get_dispatch_info().weight + Weight::from_ref_time(195_000_000 as u64), prop.get_dispatch_info().class, Pays::Yes)] + #[weight = (prop.get_dispatch_info().weight + Weight::from_ref_time(195_000_000_u64), prop.get_dispatch_info().class, Pays::Yes)] pub fn eval_vote_state(origin, nonce: DepositNonce, src_id: ChainId, prop: Box<::Proposal>) -> DispatchResult { ensure_signed(origin)?; @@ -358,12 +358,12 @@ impl Module { /// Asserts if a resource is registered pub fn resource_exists(id: ResourceId) -> bool { - return Self::resources(id) != None + Self::resources(id).is_some() } /// Checks if a chain exists as a whitelisted destination pub fn chain_whitelisted(id: ChainId) -> bool { - return Self::chains(id) != None + Self::chains(id).is_some() } /// Increments the deposit nonce for the specified chain ID @@ -401,7 +401,7 @@ impl Module { ensure!(id != T::ChainId::get(), Error::::InvalidChainId); // Cannot whitelist with an existing entry ensure!(!Self::chain_whitelisted(id), Error::::ChainAlreadyWhitelisted); - ::insert(&id, 0); + ::insert(id, 0); Self::deposit_event(RawEvent::ChainWhitelisted(id)); Ok(()) } @@ -452,13 +452,13 @@ impl Module { if in_favour { votes.votes_for.push(who.clone()); - Self::deposit_event(RawEvent::VoteFor(src_id, nonce, who.clone())); + Self::deposit_event(RawEvent::VoteFor(src_id, nonce, who)); } else { votes.votes_against.push(who.clone()); - Self::deposit_event(RawEvent::VoteAgainst(src_id, nonce, who.clone())); + Self::deposit_event(RawEvent::VoteAgainst(src_id, nonce, who)); } - >::insert(src_id, (nonce, prop.clone()), votes.clone()); + >::insert(src_id, (nonce, prop), votes.clone()); Ok(()) } diff --git a/pallets/chainbridge/src/mock.rs b/pallets/chainbridge/src/mock.rs index 5e22f6e92..2a3fd20b5 100644 --- a/pallets/chainbridge/src/mock.rs +++ b/pallets/chainbridge/src/mock.rs @@ -152,6 +152,6 @@ pub fn assert_events(mut expected: Vec) { for evt in expected { let next = actual.pop().expect("event expected"); - assert_eq!(next, evt.into(), "Events don't match (actual,expected)"); + assert_eq!(next, evt, "Events don't match (actual,expected)"); } } diff --git a/pallets/chainbridge/src/tests.rs b/pallets/chainbridge/src/tests.rs index bd0ae5a03..ce0e308c0 100644 --- a/pallets/chainbridge/src/tests.rs +++ b/pallets/chainbridge/src/tests.rs @@ -137,50 +137,50 @@ fn asset_transfer_success() { let token_id = vec![1, 2, 3, 4]; let method = "Erc20.transfer".as_bytes().to_vec(); - assert_ok!(Bridge::set_resource(RuntimeOrigin::root(), resource_id, method.clone())); + assert_ok!(Bridge::set_resource(RuntimeOrigin::root(), resource_id, method)); assert_ok!(Bridge::set_threshold(RuntimeOrigin::root(), TEST_THRESHOLD,)); - assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), dest_id.clone())); + assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), dest_id)); assert_ok!(Bridge::transfer_fungible( - dest_id.clone(), - resource_id.clone(), + dest_id, + resource_id, to.clone(), amount.into() )); assert_events(vec![ - RuntimeEvent::Bridge(RawEvent::ChainWhitelisted(dest_id.clone())), + RuntimeEvent::Bridge(RawEvent::ChainWhitelisted(dest_id)), RuntimeEvent::Bridge(RawEvent::FungibleTransfer( - dest_id.clone(), + dest_id, 1, - resource_id.clone(), + resource_id, amount.into(), to.clone(), )), ]); assert_ok!(Bridge::transfer_nonfungible( - dest_id.clone(), - resource_id.clone(), + dest_id, + resource_id, token_id.clone(), to.clone(), metadata.clone() )); assert_events(vec![RuntimeEvent::Bridge(RawEvent::NonFungibleTransfer( - dest_id.clone(), + dest_id, 2, - resource_id.clone(), + resource_id, token_id, - to.clone(), + to, metadata.clone(), ))]); assert_ok!(Bridge::transfer_generic( - dest_id.clone(), - resource_id.clone(), + dest_id, + resource_id, metadata.clone() )); assert_events(vec![RuntimeEvent::Bridge(RawEvent::GenericTransfer( - dest_id.clone(), + dest_id, 3, resource_id, metadata, @@ -197,13 +197,13 @@ fn asset_transfer_invalid_resource_id() { let amount = 100; assert_ok!(Bridge::set_threshold(RuntimeOrigin::root(), TEST_THRESHOLD,)); - assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), dest_id.clone())); + assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), dest_id)); assert_noop!( Bridge::transfer_fungible( - dest_id.clone(), - resource_id.clone(), - to.clone(), + dest_id, + resource_id, + to, amount.into() ), Error::::ResourceDoesNotExist @@ -211,8 +211,8 @@ fn asset_transfer_invalid_resource_id() { assert_noop!( Bridge::transfer_nonfungible( - dest_id.clone(), - resource_id.clone(), + dest_id, + resource_id, vec![], vec![], vec![] @@ -221,7 +221,7 @@ fn asset_transfer_invalid_resource_id() { ); assert_noop!( - Bridge::transfer_generic(dest_id.clone(), resource_id.clone(), vec![]), + Bridge::transfer_generic(dest_id, resource_id, vec![]), Error::::ResourceDoesNotExist ); }) @@ -234,21 +234,21 @@ fn asset_transfer_invalid_chain() { let bad_dest_id = 3; let resource_id = [4; 32]; - assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), chain_id.clone())); - assert_events(vec![RuntimeEvent::Bridge(RawEvent::ChainWhitelisted(chain_id.clone()))]); + assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), chain_id)); + assert_events(vec![RuntimeEvent::Bridge(RawEvent::ChainWhitelisted(chain_id))]); assert_noop!( - Bridge::transfer_fungible(bad_dest_id, resource_id.clone(), vec![], U256::zero()), + Bridge::transfer_fungible(bad_dest_id, resource_id, vec![], U256::zero()), Error::::ChainNotWhitelisted ); assert_noop!( - Bridge::transfer_nonfungible(bad_dest_id, resource_id.clone(), vec![], vec![], vec![]), + Bridge::transfer_nonfungible(bad_dest_id, resource_id, vec![], vec![], vec![]), Error::::ChainNotWhitelisted ); assert_noop!( - Bridge::transfer_generic(bad_dest_id, resource_id.clone(), vec![]), + Bridge::transfer_generic(bad_dest_id, resource_id, vec![]), Error::::ChainNotWhitelisted ); }) @@ -310,7 +310,7 @@ fn create_sucessful_proposal() { r_id, Box::new(proposal.clone()) )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let prop = Bridge::votes(src_id, (prop_id, proposal.clone())).unwrap(); let expected = ProposalVotes { votes_for: vec![RELAYER_A], votes_against: vec![], @@ -327,7 +327,7 @@ fn create_sucessful_proposal() { r_id, Box::new(proposal.clone()) )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let prop = Bridge::votes(src_id, (prop_id, proposal.clone())).unwrap(); let expected = ProposalVotes { votes_for: vec![RELAYER_A], votes_against: vec![RELAYER_B], @@ -344,7 +344,7 @@ fn create_sucessful_proposal() { r_id, Box::new(proposal.clone()) )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let prop = Bridge::votes(src_id, (prop_id, proposal)).unwrap(); let expected = ProposalVotes { votes_for: vec![RELAYER_A, RELAYER_C], votes_against: vec![RELAYER_B], @@ -380,7 +380,7 @@ fn create_unsucessful_proposal() { r_id, Box::new(proposal.clone()) )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let prop = Bridge::votes(src_id, (prop_id, proposal.clone())).unwrap(); let expected = ProposalVotes { votes_for: vec![RELAYER_A], votes_against: vec![], @@ -397,7 +397,7 @@ fn create_unsucessful_proposal() { r_id, Box::new(proposal.clone()) )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let prop = Bridge::votes(src_id, (prop_id, proposal.clone())).unwrap(); let expected = ProposalVotes { votes_for: vec![RELAYER_A], votes_against: vec![RELAYER_B], @@ -414,7 +414,7 @@ fn create_unsucessful_proposal() { r_id, Box::new(proposal.clone()) )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let prop = Bridge::votes(src_id, (prop_id, proposal)).unwrap(); let expected = ProposalVotes { votes_for: vec![RELAYER_A], votes_against: vec![RELAYER_B, RELAYER_C], @@ -452,7 +452,7 @@ fn execute_after_threshold_change() { r_id, Box::new(proposal.clone()) )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let prop = Bridge::votes(src_id, (prop_id, proposal.clone())).unwrap(); let expected = ProposalVotes { votes_for: vec![RELAYER_A], votes_against: vec![], @@ -472,7 +472,7 @@ fn execute_after_threshold_change() { Box::new(proposal.clone()) )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let prop = Bridge::votes(src_id, (prop_id, proposal)).unwrap(); let expected = ProposalVotes { votes_for: vec![RELAYER_A], votes_against: vec![], @@ -510,7 +510,7 @@ fn proposal_expires() { r_id, Box::new(proposal.clone()) )); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let prop = Bridge::votes(src_id, (prop_id, proposal.clone())).unwrap(); let expected = ProposalVotes { votes_for: vec![RELAYER_A], votes_against: vec![], @@ -535,7 +535,7 @@ fn proposal_expires() { ); // Proposal state should remain unchanged - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let prop = Bridge::votes(src_id, (prop_id, proposal.clone())).unwrap(); let expected = ProposalVotes { votes_for: vec![RELAYER_A], votes_against: vec![], @@ -554,7 +554,7 @@ fn proposal_expires() { ), Error::::ProposalExpired ); - let prop = Bridge::votes(src_id, (prop_id.clone(), proposal.clone())).unwrap(); + let prop = Bridge::votes(src_id, (prop_id, proposal)).unwrap(); let expected = ProposalVotes { votes_for: vec![RELAYER_A], votes_against: vec![], diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-accounts/src/lib.rs index e988cdd0f..4968204f3 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-accounts/src/lib.rs @@ -314,7 +314,7 @@ pub mod pallet { unlocking: Default::default(), }; Self::update_ledger_and_deposit(&stash, &controller, &item)?; - Self::deposit_event(Event::::Deposited(stash.clone(), value)); + Self::deposit_event(Event::::Deposited(stash, value)); Ok(()) } @@ -346,7 +346,7 @@ pub mod pallet { Self::update_ledger_and_deposit(&stash, &controller, &ledger)?; - Self::deposit_event(Event::::Deposited(stash.clone(), extra)); + Self::deposit_event(Event::::Deposited(stash, extra)); Ok(()) } diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index e4131c0fe..7d3499d4a 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -104,10 +104,10 @@ pub mod pallet { cluster_params: ClusterParams, ) -> DispatchResult { let caller_id = ensure_signed(origin)?; - let cluster = Cluster::new(cluster_id.clone(), caller_id, cluster_params) - .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; - ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); - Clusters::::insert(cluster_id.clone(), cluster); + let cluster = Cluster::new(cluster_id, caller_id, cluster_params) + .map_err(Into::>::into)?; + ensure!(!Clusters::::contains_key(cluster_id), Error::::ClusterAlreadyExists); + Clusters::::insert(cluster_id, cluster); Self::deposit_event(Event::::ClusterCreated { cluster_id }); Ok(()) } @@ -120,7 +120,7 @@ pub mod pallet { ) -> DispatchResult { let caller_id = ensure_signed(origin)?; let cluster = - Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; + Clusters::::try_get(cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); let mut node = T::NodeRepository::get(node_pub_key.clone()) .map_err(|_| Error::::AttemptToAddNonExistentNode)?; @@ -152,9 +152,9 @@ pub mod pallet { .is_some_and(|staking_cluster| staking_cluster == cluster_id); ensure!(has_stake, Error::::NoStake); - node.set_cluster_id(Some(cluster_id.clone())); + node.set_cluster_id(Some(cluster_id)); T::NodeRepository::update(node).map_err(|_| Error::::AttemptToAddNonExistentNode)?; - ClustersNodes::::insert(cluster_id.clone(), node_pub_key.clone(), true); + ClustersNodes::::insert(cluster_id, node_pub_key.clone(), true); Self::deposit_event(Event::::ClusterNodeAdded { cluster_id, node_pub_key }); Ok(()) @@ -168,7 +168,7 @@ pub mod pallet { ) -> DispatchResult { let caller_id = ensure_signed(origin)?; let cluster = - Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; + Clusters::::try_get(cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); let mut node = T::NodeRepository::get(node_pub_key.clone()) .map_err(|_| Error::::AttemptToRemoveNonExistentNode)?; @@ -176,7 +176,7 @@ pub mod pallet { node.set_cluster_id(None); T::NodeRepository::update(node) .map_err(|_| Error::::AttemptToRemoveNonExistentNode)?; - ClustersNodes::::remove(cluster_id.clone(), node_pub_key.clone()); + ClustersNodes::::remove(cluster_id, node_pub_key.clone()); Self::deposit_event(Event::::ClusterNodeRemoved { cluster_id, node_pub_key }); Ok(()) @@ -191,12 +191,12 @@ pub mod pallet { ) -> DispatchResult { let caller_id = ensure_signed(origin)?; let mut cluster = - Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; + Clusters::::try_get(cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); cluster .set_params(cluster_params) - .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; - Clusters::::insert(cluster_id.clone(), cluster); + .map_err(Into::>::into)?; + Clusters::::insert(cluster_id, cluster); Self::deposit_event(Event::::ClusterParamsSet { cluster_id }); Ok(()) diff --git a/pallets/ddc-metrics-offchain-worker/src/lib.rs b/pallets/ddc-metrics-offchain-worker/src/lib.rs index 7f68798ab..228def0f0 100644 --- a/pallets/ddc-metrics-offchain-worker/src/lib.rs +++ b/pallets/ddc-metrics-offchain-worker/src/lib.rs @@ -19,7 +19,7 @@ use frame_system::offchain::{ }; use hex_literal::hex; -use pallet_contracts; + use sp_core::crypto::{KeyTypeId, UncheckedFrom}; use sp_runtime::{ offchain::{http, storage::StorageValueRef, Duration}, @@ -194,7 +194,7 @@ where }; let should_proceed = Self::check_if_should_proceed(block_number); - if should_proceed == false { + if !should_proceed { return Ok(()) } @@ -246,7 +246,7 @@ where let block_timestamp = sp_io::offchain::timestamp().unix_millis(); if day_end_ms < block_timestamp { - Self::finalize_metric_period(contract_address.clone(), &signer, day_start_ms).map_err( + Self::finalize_metric_period(contract_address, &signer, day_start_ms).map_err( |err| { error!("[OCW] Contract error occurred: {:?}", err); "could not call finalize_metric_period TX" @@ -327,8 +327,8 @@ where fn get_start_of_day_ms() -> u64 { let now = sp_io::offchain::timestamp(); - let day_start_ms = (now.unix_millis() / MS_PER_DAY) * MS_PER_DAY; - day_start_ms + + (now.unix_millis() / MS_PER_DAY) * MS_PER_DAY } fn get_signer() -> ResultStr> { @@ -520,7 +520,7 @@ where account.id, p2p_id, is_online, ); - let call_data = Self::encode_report_ddn_status(&p2p_id, is_online); + let call_data = Self::encode_report_ddn_status(p2p_id, is_online); let contract_id_unl = <::Lookup as StaticLookup>::unlookup( contract_id.clone(), @@ -641,12 +641,12 @@ where "HTTP GET error" })?; - let parsed = serde_json::from_slice(&body).map_err(|err| { + + + serde_json::from_slice(&body).map_err(|err| { warn!("[OCW] Error while parsing JSON from {}: {:?}", url, err); "HTTP JSON parse error" - }); - - parsed + }) } fn http_get_request(http_url: &str) -> Result, http::Error> { diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs b/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs index a261b10c8..7480f8ea3 100644 --- a/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs +++ b/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs @@ -295,7 +295,7 @@ fn should_run_contract() { .unwrap(); let contract_exec_result = pallet_contracts::Pallet::::bare_call( - alice.clone(), + alice, contract_id, 0, Weight::from_ref_time(100_000_000_000), @@ -317,7 +317,7 @@ pub const CTOR_SELECTOR: [u8; 4] = hex!("9bae9d5e"); fn encode_constructor() -> Vec { let mut call_data = CTOR_SELECTOR.to_vec(); - let x = 0 as u128; + let x = 0_u128; for _ in 0..9 { x.encode_to(&mut call_data); } @@ -344,13 +344,13 @@ fn deploy_contract() -> AccountId { GAS_LIMIT, None, wasm.to_vec(), - contract_args.clone(), + contract_args, vec![], ) .unwrap(); // Configure worker with the contract address. - let contract_id = Contracts::contract_address(&alice, &wasm_hash, &vec![]); + let contract_id = Contracts::contract_address(&alice, &wasm_hash, &[]); pub const ADD_DDC_NODE_SELECTOR: [u8; 4] = hex!("11a9e1b9"); diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index a6ff1b3d4..2871f1e29 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -83,8 +83,8 @@ pub mod pallet { ) -> DispatchResult { let caller_id = ensure_signed(origin)?; let node = Node::::new(node_pub_key.clone(), caller_id, node_params) - .map_err(|e| Into::>::into(NodeError::from(e)))?; - Self::create(node).map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + .map_err(Into::>::into)?; + Self::create(node).map_err(Into::>::into)?; Self::deposit_event(Event::::NodeCreated { node_pub_key }); Ok(()) } @@ -93,11 +93,11 @@ pub mod pallet { pub fn delete_node(origin: OriginFor, node_pub_key: NodePubKey) -> DispatchResult { let caller_id = ensure_signed(origin)?; let node = Self::get(node_pub_key.clone()) - .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + .map_err(Into::>::into)?; ensure!(node.get_provider_id() == &caller_id, Error::::OnlyNodeProvider); ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAssignedToCluster); Self::delete(node_pub_key.clone()) - .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + .map_err(Into::>::into)?; Self::deposit_event(Event::::NodeDeleted { node_pub_key }); Ok(()) } @@ -110,11 +110,11 @@ pub mod pallet { ) -> DispatchResult { let caller_id = ensure_signed(origin)?; let mut node = Self::get(node_pub_key.clone()) - .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + .map_err(Into::>::into)?; ensure!(node.get_provider_id() == &caller_id, Error::::OnlyNodeProvider); node.set_params(node_params) - .map_err(|e| Into::>::into(NodeError::from(e)))?; - Self::update(node).map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + .map_err(Into::>::into)?; + Self::update(node).map_err(Into::>::into)?; Self::deposit_event(Event::::NodeParamsChanged { node_pub_key }); Ok(()) } diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index c349b3271..ec96bfe27 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -382,7 +382,7 @@ pub mod pallet { // Add initial CDN participants for &(ref stash, ref controller, ref node, balance, cluster) in &self.edges { assert!( - T::Currency::free_balance(&stash) >= balance, + T::Currency::free_balance(stash) >= balance, "Stash do not have enough balance to participate in CDN." ); assert_ok!(Pallet::::bond( @@ -400,7 +400,7 @@ pub mod pallet { // Add initial storage network participants for &(ref stash, ref controller, ref node, balance, cluster) in &self.storages { assert!( - T::Currency::free_balance(&stash) >= balance, + T::Currency::free_balance(stash) >= balance, "Stash do not have enough balance to participate in storage network." ); assert_ok!(Pallet::::bond( @@ -691,10 +691,10 @@ pub mod pallet { let stash = &ledger.stash; // Can't participate in CDN if already participating in storage network. - ensure!(!Storages::::contains_key(&stash), Error::::AlreadyInRole); + ensure!(!Storages::::contains_key(stash), Error::::AlreadyInRole); // Is it an attempt to cancel a previous "chill"? - if let Some(current_cluster) = Self::edges(&stash) { + if let Some(current_cluster) = Self::edges(stash) { // Switching the cluster is prohibited. The user should chill first. ensure!(current_cluster == cluster, Error::::AlreadyInRole); // Cancel previous "chill" attempts @@ -725,10 +725,10 @@ pub mod pallet { let stash = &ledger.stash; // Can't participate in storage network if already participating in CDN. - ensure!(!Edges::::contains_key(&stash), Error::::AlreadyInRole); + ensure!(!Edges::::contains_key(stash), Error::::AlreadyInRole); // Is it an attempt to cancel a previous "chill"? - if let Some(current_cluster) = Self::storages(&stash) { + if let Some(current_cluster) = Self::storages(stash) { // Switching the cluster is prohibited. The user should chill first. ensure!(current_cluster == cluster, Error::::AlreadyInRole); // Cancel previous "chill" attempts @@ -949,7 +949,7 @@ pub mod pallet { // ToDo: check that validation is finalised for era let era_reward_points: EraRewardPoints = - >::get(&era); + >::get(era); let price_per_byte: u128 = match Self::pricing() { Some(pricing) => pricing, @@ -991,7 +991,7 @@ pub mod pallet { } Self::deposit_event(Event::::PayoutNodes( era, - era_reward_points.clone(), + era_reward_points, price_per_byte, )); log::debug!("Payout event executed"); @@ -1036,7 +1036,7 @@ pub mod pallet { cluster: ClusterId, can_chill_from: EraIndex, ) { - Ledger::::mutate(&controller, |maybe_ledger| { + Ledger::::mutate(controller, |maybe_ledger| { if let Some(ref mut ledger) = maybe_ledger { ledger.chilling = Some(can_chill_from) } @@ -1099,7 +1099,7 @@ pub mod pallet { /// Reset the chilling era for a controller. pub fn reset_chilling(controller: &T::AccountId) { - Ledger::::mutate(&controller, |maybe_ledger| { + Ledger::::mutate(controller, |maybe_ledger| { if let Some(ref mut ledger) = maybe_ledger { ledger.chilling = None } diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 48d046fb6..2278b0148 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -239,7 +239,7 @@ impl ExtBuilder { TestExternalities::new(storage) } - pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + pub fn build_and_execute(self, test: impl FnOnce()) { sp_tracing::try_init_simple(); let mut ext = self.build(); ext.execute_with(test); diff --git a/pallets/ddc-staking/src/testing_utils.rs b/pallets/ddc-staking/src/testing_utils.rs index 74e61221c..d2111f297 100644 --- a/pallets/ddc-staking/src/testing_utils.rs +++ b/pallets/ddc-staking/src/testing_utils.rs @@ -60,7 +60,7 @@ pub fn create_stash_controller_node( node.clone(), amount, )?; - return Ok((stash, controller, node)) + Ok((stash, controller, node)) } /// Create a stash and controller pair with fixed balance. diff --git a/pallets/ddc-staking/src/weights.rs b/pallets/ddc-staking/src/weights.rs index 3b69615ab..67f428730 100644 --- a/pallets/ddc-staking/src/weights.rs +++ b/pallets/ddc-staking/src/weights.rs @@ -48,9 +48,9 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcStaking Nodes (r:1 w:1) // Storage: Balances Locks (r:1 w:1) fn bond() -> Weight { - Weight::from_ref_time(55_007_000 as u64) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(4 as u64)) + Weight::from_ref_time(55_007_000_u64) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking Edges (r:1 w:0) @@ -59,36 +59,36 @@ impl WeightInfo for SubstrateWeight { // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn unbond() -> Weight { - Weight::from_ref_time(47_727_000 as u64) - .saturating_add(T::DbWeight::get().reads(6 as u64)) - .saturating_add(T::DbWeight::get().writes(3 as u64)) + Weight::from_ref_time(47_727_000_u64) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CurrentEra (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unbonded() -> Weight { - Weight::from_ref_time(69_750_000 as u64) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(3 as u64)) + Weight::from_ref_time(69_750_000_u64) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Edges (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:1) fn store() -> Weight { - Weight::from_ref_time(26_112_000 as u64) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) + Weight::from_ref_time(26_112_000_u64) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) // Storage: DdcStaking Edges (r:1 w:1) fn serve() -> Weight { - Weight::from_ref_time(19_892_000 as u64) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) + Weight::from_ref_time(19_892_000_u64) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CurrentEra (r:1 w:0) @@ -96,34 +96,34 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) fn chill() -> Weight { - Weight::from_ref_time(77_450_000 as u64) - .saturating_add(T::DbWeight::get().reads(5 as u64)) - .saturating_add(T::DbWeight::get().writes(2 as u64)) + Weight::from_ref_time(77_450_000_u64) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:2 w:2) fn set_controller() -> Weight { - Weight::from_ref_time(38_521_000 as u64) - .saturating_add(T::DbWeight::get().reads(3 as u64)) - .saturating_add(T::DbWeight::get().writes(3 as u64)) + Weight::from_ref_time(38_521_000_u64) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } // Storage: DdcStaking Nodes (r:1 w:1) fn set_node() -> Weight { - Weight::from_ref_time(21_779_000 as u64) - .saturating_add(T::DbWeight::get().reads(1 as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) + Weight::from_ref_time(21_779_000_u64) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcStaking ClusterManagers (r:1 w:1) fn allow_cluster_manager() -> Weight { - Weight::from_ref_time(11_727_000 as u64) - .saturating_add(T::DbWeight::get().reads(1 as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) + Weight::from_ref_time(11_727_000_u64) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcStaking ClusterManagers (r:1 w:1) fn disallow_cluster_manager() -> Weight { - Weight::from_ref_time(18_006_000 as u64) - .saturating_add(T::DbWeight::get().reads(1 as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) + Weight::from_ref_time(18_006_000_u64) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } } @@ -134,9 +134,9 @@ impl WeightInfo for () { // Storage: DdcStaking Nodes (r:1 w:1) // Storage: Balances Locks (r:1 w:1) fn bond() -> Weight { - Weight::from_ref_time(55_007_000 as u64) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(4 as u64)) + Weight::from_ref_time(55_007_000_u64) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking Edges (r:1 w:0) @@ -145,36 +145,36 @@ impl WeightInfo for () { // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn unbond() -> Weight { - Weight::from_ref_time(47_727_000 as u64) - .saturating_add(RocksDbWeight::get().reads(6 as u64)) - .saturating_add(RocksDbWeight::get().writes(3 as u64)) + Weight::from_ref_time(47_727_000_u64) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CurrentEra (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unbonded() -> Weight { - Weight::from_ref_time(69_750_000 as u64) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(3 as u64)) + Weight::from_ref_time(69_750_000_u64) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Edges (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:1) fn store() -> Weight { - Weight::from_ref_time(26_112_000 as u64) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + Weight::from_ref_time(26_112_000_u64) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) // Storage: DdcStaking Edges (r:1 w:1) fn serve() -> Weight { - Weight::from_ref_time(19_892_000 as u64) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + Weight::from_ref_time(19_892_000_u64) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CurrentEra (r:1 w:0) @@ -182,33 +182,33 @@ impl WeightInfo for () { // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) fn chill() -> Weight { - Weight::from_ref_time(77_450_000 as u64) - .saturating_add(RocksDbWeight::get().reads(5 as u64)) - .saturating_add(RocksDbWeight::get().writes(2 as u64)) + Weight::from_ref_time(77_450_000_u64) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:2 w:2) fn set_controller() -> Weight { - Weight::from_ref_time(38_521_000 as u64) - .saturating_add(RocksDbWeight::get().reads(3 as u64)) - .saturating_add(RocksDbWeight::get().writes(3 as u64)) + Weight::from_ref_time(38_521_000_u64) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } // Storage: DdcStaking Nodes (r:1 w:1) fn set_node() -> Weight { - Weight::from_ref_time(21_779_000 as u64) - .saturating_add(RocksDbWeight::get().reads(1 as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + Weight::from_ref_time(21_779_000_u64) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcStaking ClusterManagers (r:1 w:1) fn allow_cluster_manager() -> Weight { - Weight::from_ref_time(11_727_000 as u64) - .saturating_add(RocksDbWeight::get().reads(1 as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + Weight::from_ref_time(11_727_000_u64) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcStaking ClusterManagers (r:1 w:1) fn disallow_cluster_manager() -> Weight { - Weight::from_ref_time(18_006_000 as u64) - .saturating_add(RocksDbWeight::get().reads(1 as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + Weight::from_ref_time(18_006_000_u64) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } } diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index c23b98588..a2b593182 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -260,12 +260,12 @@ pub fn get_served_bytes_sum(file_requests: &Requests) -> (u64, u64) { fn get_proved_delivered_bytes(chunk: &Chunk, ack_timestamps: &Vec) -> u64 { let log_timestamp = chunk.log.timestamp; - let neighbors = get_closer_neighbors(log_timestamp, &ack_timestamps); + let neighbors = get_closer_neighbors(log_timestamp, ack_timestamps); let is_proved = is_lies_within_threshold(log_timestamp, neighbors, FAILED_CONTENT_CONSUMER_THRESHOLD); if is_proved { - return chunk.log.bytes_sent + chunk.log.bytes_sent } else { 0 } @@ -305,7 +305,7 @@ fn is_lies_within_threshold( pub(crate) fn fetch_cdn_node_aggregates_request(url: &String) -> Vec { log::debug!("fetch_file_request | url: {:?}", url); - let response: FileRequestWrapper = http_get_json(&url).unwrap(); + let response: FileRequestWrapper = http_get_json(url).unwrap(); log::debug!("response.json: {:?}", response.json); let map: Vec = serde_json::from_str(response.json.as_str()).unwrap(); // log::debug!("response.json: {:?}", response.json); @@ -315,7 +315,7 @@ pub(crate) fn fetch_cdn_node_aggregates_request(url: &String) -> Vec FileRequest { log::debug!("fetch_file_request | url: {:?}", url); - let response: FileRequestWrapper = http_get_json(&url).unwrap(); + let response: FileRequestWrapper = http_get_json(url).unwrap(); log::debug!("response.json: {:?}", response.json); let map: FileRequest = serde_json::from_str(response.json.as_str()).unwrap(); @@ -329,12 +329,12 @@ pub(crate) fn http_get_json(url: &str) -> crate::ResultSt "HTTP GET error" })?; - let parsed = serde_json::from_slice(&body).map_err(|err| { + + + serde_json::from_slice(&body).map_err(|err| { log::warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); "HTTP JSON parse error" - }); - - parsed + }) } fn http_get_request(http_url: &str) -> Result, http::Error> { @@ -365,7 +365,9 @@ pub(crate) fn get_final_decision(decisions: Vec) -> Validati let serialized_decisions = serde_json::to_string(&common_decisions).unwrap(); - let final_decision = ValidationDecision { + + + ValidationDecision { edge: decision_example.edge.clone(), result: decision_example.result, payload: utils::hash(&serialized_decisions), @@ -375,9 +377,7 @@ pub(crate) fn get_final_decision(decisions: Vec) -> Validati failed_by_client: 0, failure_rate: 0, }, - }; - - final_decision + } } fn find_largest_group(decisions: Vec) -> Option> { @@ -404,7 +404,7 @@ fn find_largest_group(decisions: Vec) -> Option half { Some(largest_group) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index ac0bfe531..175ab0b88 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -360,7 +360,7 @@ pub mod pallet { // Skip if DDC validation is not enabled. match StorageValueRef::persistent(ENABLE_DDC_VALIDATION_KEY).get::() { - Ok(Some(enabled)) if enabled == true => (), + Ok(Some(enabled)) if enabled => (), _ => return, } @@ -634,13 +634,7 @@ pub mod pallet { let percentage_difference = 1f32 - (bytes_received as f32 / bytes_sent as f32); - return if percentage_difference >= 0.0 && - (T::ValidationThreshold::get() as f32 - percentage_difference) > 0.0 - { - true - } else { - false - } + percentage_difference >= 0.0 && (T::ValidationThreshold::get() as f32 - percentage_difference) > 0.0 } /// Shuffle the `list` swapping it's random elements `list.len()` times. @@ -678,7 +672,7 @@ pub mod pallet { let validators: Vec = DDCValidatorToStashKeys::::iter_keys().collect(); log::debug!("Current validators: {:?}.", validators); - if validators.len() == 0 { + if validators.is_empty() { return Err(AssignmentError::NoValidators) } @@ -692,7 +686,7 @@ pub mod pallet { let edges: Vec = >::iter_keys().collect(); log::debug!("Current edges: {:?}.", edges); - if edges.len() == 0 { + if edges.is_empty() { return Ok(()) } @@ -725,7 +719,7 @@ pub mod pallet { }); } - return Ok(()) + Ok(()) } /// Randomly choose a number in range `[0, total)`. @@ -764,7 +758,7 @@ pub mod pallet { } fn find_validators_from_quorum(validator_id: &T::AccountId, era: &EraIndex) -> Vec { - let validator_edges = Self::assignments(era, &validator_id).unwrap(); + let validator_edges = Self::assignments(era, validator_id).unwrap(); let mut quorum_members: Vec = Vec::new(); >::iter_prefix(era).for_each(|(candidate_id, edges)| { @@ -778,10 +772,7 @@ pub mod pallet { } fn get_public_key() -> Option { - match sr25519_public_keys(KEY_TYPE).first() { - Some(pubkey) => Some(T::AccountId::decode(&mut &pubkey.encode()[..]).unwrap()), - None => None, - } + sr25519_public_keys(KEY_TYPE).first().map(|pubkey| T::AccountId::decode(&mut &pubkey.encode()[..]).unwrap()) } fn validate_edges() -> Result<(), &'static str> { @@ -832,7 +823,7 @@ pub mod pallet { log::debug!("node aggregates: {:?}", node_aggregates); // No data for node - if node_aggregates.len() == 0 { + if node_aggregates.is_empty() { continue } @@ -848,8 +839,8 @@ pub mod pallet { let file_request = dac::fetch_file_request(&request_id_url); requests.insert(file_request.file_request_id.clone(), file_request.clone()); } - dac::get_acknowledged_bytes_bucket(&requests, payments_per_bucket); - let (bytes_sent, bytes_received) = dac::get_served_bytes_sum(&requests); + dac::get_acknowledged_bytes_bucket(requests, payments_per_bucket); + let (bytes_sent, bytes_received) = dac::get_served_bytes_sum(requests); let is_valid = Self::is_valid(bytes_sent, bytes_received); log::debug!("bytes_sent, bytes_received: {:?}, {:?}", bytes_sent, bytes_received); @@ -916,18 +907,18 @@ pub mod pallet { u128, BucketsDetails>, > = BTreeMap::new(); - for bucket in payments_per_bucket.into_iter() { + for bucket in payments_per_bucket.iter_mut() { let cere_payment = bucket.1 as u32; - if payments.contains_key(&bucket.0) { - payments.entry(bucket.0).and_modify(|bucket_info| { - bucket_info.amount += cere_payment.into() - }); - } else { + if let std::collections::btree_map::Entry::Vacant(e) = payments.entry(bucket.0) { let bucket_info = BucketsDetails { bucket_id: bucket.0, amount: cere_payment.into(), }; - payments.insert(bucket.0, bucket_info); + e.insert(bucket_info); + } else { + payments.entry(bucket.0).and_modify(|bucket_info| { + bucket_info.amount += cere_payment.into() + }); } } let mut final_payments = vec![]; @@ -993,7 +984,7 @@ pub mod pallet { let signer = Self::get_signer().unwrap(); // ToDo: replace local call by a call from `ddc-staking` pallet - if cdn_nodes_reward_points.len() > 0 { + if !cdn_nodes_reward_points.is_empty() { let tx_res = signer.send_signed_transaction(|_account| Call::set_era_reward_points { era: current_ddc_era - 1, diff --git a/pallets/ddc-validator/src/shm.rs b/pallets/ddc-validator/src/shm.rs index 6989e148f..066be9bd5 100644 --- a/pallets/ddc-validator/src/shm.rs +++ b/pallets/ddc-validator/src/shm.rs @@ -43,7 +43,7 @@ pub fn base64_decode(input: &String) -> Result, ()> { let mut buf = Vec::with_capacity(1000); // ToDo: calculate capacity buf.resize(1000, 0); BASE64_STANDARD.decode_slice(input, &mut buf).map_err(|_| ())?; - Ok(buf.iter().map(|&char| char as u8).collect()) + Ok(buf.to_vec()) } /// Encodes a vector of bytes into a vector of characters using base64 encoding. @@ -121,9 +121,9 @@ pub(crate) fn get_intermediate_decisions( }; let quorum_decisions = find_quorum_decisions(decisions_for_edge, quorum); - let decoded_decisions = decode_intermediate_decisions(quorum_decisions); + - decoded_decisions + decode_intermediate_decisions(quorum_decisions) } pub(crate) fn decode_intermediate_decisions( @@ -139,7 +139,7 @@ pub(crate) fn decode_intermediate_decisions( log::debug!("data_str: {:?}", data_trimmed); - let decoded_decision: ValidationDecision = serde_json::from_str(&data_trimmed).unwrap(); + let decoded_decision: ValidationDecision = serde_json::from_str(data_trimmed).unwrap(); decoded_decisions.push(decoded_decision); } diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index fc537b88a..4bd841fe8 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -20,7 +20,7 @@ const OCW_SEED: &str = "news slush supreme milk chapter athlete soap sausage put clutch what kitten"; fn last_event() -> RuntimeEvent { - System::events().pop().expect("Event expected").event.into() + System::events().pop().expect("Event expected").event } #[test] @@ -137,7 +137,7 @@ fn it_sets_validation_decision_with_one_validator_in_quorum() { } t.execute_with(|| { - let era_block_number = 20 as u32 * era_to_validate; + let era_block_number = 20_u32 * era_to_validate; System::set_block_number(era_block_number); // required for randomness assert_ok!(DdcValidator::set_validator_key( // register validator 1 @@ -470,7 +470,7 @@ fn charge_payments_content_owners_works_as_expected() { ValidatorError::::DDCEraNotSet ); - let era_block_number = 20 as u32 * era_to_validate; + let era_block_number = 20_u32 * era_to_validate; System::set_block_number(era_block_number); Timestamp::set_timestamp( (DDC_ERA_START_MS + DDC_ERA_DURATION_MS * (era_to_validate as u128 - 1)) as u64, diff --git a/pallets/ddc-validator/src/utils.rs b/pallets/ddc-validator/src/utils.rs index 5c5459b24..a43ee2aa1 100644 --- a/pallets/ddc-validator/src/utils.rs +++ b/pallets/ddc-validator/src/utils.rs @@ -6,9 +6,9 @@ pub use sp_std::prelude::*; pub fn account_to_string(account: T::AccountId) -> String { let to32 = T::AccountId::encode(&account); - let pub_key_str = array_bytes::bytes2hex("", to32); + - pub_key_str + array_bytes::bytes2hex("", to32) } pub fn string_to_account(pub_key_str: String) -> T::AccountId { diff --git a/pallets/ddc/src/lib.rs b/pallets/ddc/src/lib.rs index 8308b880c..c7bdc1d73 100644 --- a/pallets/ddc/src/lib.rs +++ b/pallets/ddc/src/lib.rs @@ -97,10 +97,10 @@ decl_module! { ensure!(data.len() >= T::MinLength::get(), Error::::TooShort); ensure!(data.len() <= T::MaxLength::get(), Error::::TooLong); - if let Some(_) = >::get(&sender) { - Self::deposit_event(RawEvent::DataStringChanged(sender.clone())); + if >::get(&sender).is_some() { + Self::deposit_event(RawEvent::DataStringChanged(sender)); } else { - Self::deposit_event(RawEvent::DataStringSet(sender.clone())); + Self::deposit_event(RawEvent::DataStringSet(sender)); }; >::insert(send_to, data); diff --git a/pallets/erc20/src/lib.rs b/pallets/erc20/src/lib.rs index e025c5177..8e7967ed6 100644 --- a/pallets/erc20/src/lib.rs +++ b/pallets/erc20/src/lib.rs @@ -82,7 +82,7 @@ decl_module! { let source = ensure_signed(origin)?; ensure!(>::chain_whitelisted(dest_id), Error::::InvalidTransfer); let bridge_id = >::account_id(); - T::Currency::transfer(&source, &bridge_id, amount.into(), AllowDeath)?; + T::Currency::transfer(&source, &bridge_id, amount, AllowDeath)?; let resource_id = T::NativeTokenId::get(); let number_amount: u128 = amount.saturated_into(); @@ -96,7 +96,7 @@ decl_module! { pub fn transfer_erc721(origin, recipient: Vec, token_id: U256, dest_id: bridge::ChainId) -> DispatchResult { let source = ensure_signed(origin)?; ensure!(>::chain_whitelisted(dest_id), Error::::InvalidTransfer); - match >::tokens(&token_id) { + match >::tokens(token_id) { Some(token) => { >::burn_token(source, token_id)?; let resource_id = T::Erc721Id::get(); @@ -116,7 +116,7 @@ decl_module! { #[weight = 195_000_000] pub fn transfer(origin, to: T::AccountId, amount: BalanceOf) -> DispatchResult { let source = T::BridgeOrigin::ensure_origin(origin)?; - ::Currency::transfer(&source, &to, amount.into(), AllowDeath)?; + ::Currency::transfer(&source, &to, amount, AllowDeath)?; Ok(()) } diff --git a/pallets/erc721/src/lib.rs b/pallets/erc721/src/lib.rs index 7d93c96f9..638dc864a 100644 --- a/pallets/erc721/src/lib.rs +++ b/pallets/erc721/src/lib.rs @@ -114,8 +114,8 @@ impl Module { let new_token = Erc721Token { id, metadata }; - ::insert(&id, new_token); - >::insert(&id, owner.clone()); + ::insert(id, new_token); + >::insert(id, owner.clone()); let new_total = ::get().saturating_add(U256::one()); ::put(new_total); @@ -130,7 +130,7 @@ impl Module { let owner = Self::owner_of(id).ok_or(Error::::TokenIdDoesNotExist)?; ensure!(owner == from, Error::::NotOwner); // Update owner - >::insert(&id, to.clone()); + >::insert(id, to.clone()); Self::deposit_event(RawEvent::Transferred(from, to, id)); @@ -142,8 +142,8 @@ impl Module { let owner = Self::owner_of(id).ok_or(Error::::TokenIdDoesNotExist)?; ensure!(owner == from, Error::::NotOwner); - ::remove(&id); - >::remove(&id); + ::remove(id); + >::remove(id); let new_total = ::get().saturating_sub(U256::one()); ::put(new_total); diff --git a/pallets/erc721/src/tests.rs b/pallets/erc721/src/tests.rs index f273f83a3..9fa6cde1b 100644 --- a/pallets/erc721/src/tests.rs +++ b/pallets/erc721/src/tests.rs @@ -22,7 +22,7 @@ fn mint_burn_tokens() { ); assert_eq!(Erc721::token_count(), 1.into()); assert_noop!( - Erc721::mint(RuntimeOrigin::root(), USER_A, id_a, metadata_a.clone()), + Erc721::mint(RuntimeOrigin::root(), USER_A, id_a, metadata_a), Error::::TokenAlreadyExists ); @@ -33,19 +33,19 @@ fn mint_burn_tokens() { ); assert_eq!(Erc721::token_count(), 2.into()); assert_noop!( - Erc721::mint(RuntimeOrigin::root(), USER_A, id_b, metadata_b.clone()), + Erc721::mint(RuntimeOrigin::root(), USER_A, id_b, metadata_b), Error::::TokenAlreadyExists ); assert_ok!(Erc721::burn(RuntimeOrigin::root(), id_a)); assert_eq!(Erc721::token_count(), 1.into()); - assert!(!::contains_key(&id_a)); - assert!(!>::contains_key(&id_a)); + assert!(!::contains_key(id_a)); + assert!(!>::contains_key(id_a)); assert_ok!(Erc721::burn(RuntimeOrigin::root(), id_b)); assert_eq!(Erc721::token_count(), 0.into()); - assert!(!::contains_key(&id_b)); - assert!(!>::contains_key(&id_b)); + assert!(!::contains_key(id_b)); + assert!(!>::contains_key(id_b)); }) } @@ -57,8 +57,8 @@ fn transfer_tokens() { let metadata_a: Vec = vec![1, 2, 3]; let metadata_b: Vec = vec![4, 5, 6]; - assert_ok!(Erc721::mint(RuntimeOrigin::root(), USER_A, id_a, metadata_a.clone())); - assert_ok!(Erc721::mint(RuntimeOrigin::root(), USER_A, id_b, metadata_b.clone())); + assert_ok!(Erc721::mint(RuntimeOrigin::root(), USER_A, id_a, metadata_a)); + assert_ok!(Erc721::mint(RuntimeOrigin::root(), USER_A, id_b, metadata_b)); assert_ok!(Erc721::transfer(RuntimeOrigin::signed(USER_A), USER_B, id_a)); assert_eq!(Erc721::owner_of(id_a).unwrap(), USER_B); diff --git a/runtime/cere-dev/src/impls.rs b/runtime/cere-dev/src/impls.rs index c576e8d31..3e725dca7 100644 --- a/runtime/cere-dev/src/impls.rs +++ b/runtime/cere-dev/src/impls.rs @@ -98,7 +98,7 @@ mod multiplier_tests { fn run_with_system_weight(w: Weight, assertions: F) where - F: Fn() -> (), + F: Fn(), { let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() .build_storage::() @@ -114,12 +114,12 @@ mod multiplier_tests { fn truth_value_update_poc_works() { let fm = Multiplier::saturating_from_rational(1, 2); let test_set = vec![ - (0, fm.clone()), - (100, fm.clone()), - (1000, fm.clone()), - (target().ref_time(), fm.clone()), - (max_normal().ref_time() / 2, fm.clone()), - (max_normal().ref_time(), fm.clone()), + (0, fm), + (100, fm), + (1000, fm), + (target().ref_time(), fm), + (max_normal().ref_time() / 2, fm), + (max_normal().ref_time(), fm), ]; test_set.into_iter().for_each(|(w, fm)| { run_with_system_weight(Weight::from_ref_time(w), || { @@ -325,7 +325,7 @@ mod multiplier_tests { #[test] fn weight_to_fee_should_not_overflow_on_large_weights() { - let kb = 1024 as u64; + let kb = 1024_u64; let mb = kb * kb; let max_fm = Multiplier::saturating_from_integer(i128::MAX); diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index d71e17e5c..0bcc2c34a 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -406,7 +406,7 @@ impl pallet_indices::Config for Runtime { } parameter_types! { - pub const ExistentialDeposit: Balance = 1 * DOLLARS; + pub const ExistentialDeposit: Balance = DOLLARS; // For weight estimation, we assume that the most locks on an individual account will be 50. // This number may need to be adjusted in the future if this assumption no longer holds true. pub const MaxLocks: u32 = 50; @@ -566,9 +566,9 @@ parameter_types! { pub const UnsignedPhase: u32 = EPOCH_DURATION_IN_BLOCKS / 4; // signed config - pub const SignedRewardBase: Balance = 1 * DOLLARS; - pub const SignedDepositBase: Balance = 1 * DOLLARS; - pub const SignedDepositByte: Balance = 1 * CENTS; + pub const SignedRewardBase: Balance = DOLLARS; + pub const SignedDepositBase: Balance = DOLLARS; + pub const SignedDepositByte: Balance = CENTS; pub BetterUnsignedThreshold: Perbill = Perbill::from_rational(1u32, 10_000); @@ -723,11 +723,11 @@ impl pallet_bags_list::Config for Runtime { } parameter_types! { - pub const LaunchPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; - pub const VotingPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; + pub const LaunchPeriod: BlockNumber = 24 * 60 * MINUTES; + pub const VotingPeriod: BlockNumber = 24 * 60 * MINUTES; pub const FastTrackVotingPeriod: BlockNumber = 3 * 60 * MINUTES; pub const MinimumDeposit: Balance = 5_000_000 * DOLLARS; - pub const EnactmentPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; + pub const EnactmentPeriod: BlockNumber = 24 * 60 * MINUTES; pub const CooloffPeriod: BlockNumber = 7 * 24 * 60 * MINUTES; pub const MaxProposals: u32 = 100; } @@ -805,7 +805,7 @@ parameter_types! { pub const CandidacyBond: Balance = 500_000_000 * DOLLARS; // 1 storage item created, key size is 32 bytes, value size is 16+16. pub const VotingBondBase: Balance = deposit(1, 64); - pub const VotingBondFactor: Balance = 1 * DOLLARS; + pub const VotingBondFactor: Balance = DOLLARS; pub const TermDuration: BlockNumber = 182 * DAYS; pub const DesiredMembers: u32 = 13; pub const DesiredRunnersUp: u32 = 20; @@ -877,12 +877,12 @@ impl pallet_membership::Config for Runtime { parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); pub const ProposalBondMinimum: Balance = 5_000_000 * DOLLARS; - pub const SpendPeriod: BlockNumber = 1 * DAYS; + pub const SpendPeriod: BlockNumber = DAYS; pub const Burn: Permill = Permill::from_percent(0); - pub const TipCountdown: BlockNumber = 1 * DAYS; + pub const TipCountdown: BlockNumber = DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); pub const TipReportDepositBase: Balance = 5_000_000 * DOLLARS; - pub const DataDepositPerByte: Balance = 1 * DOLLARS; + pub const DataDepositPerByte: Balance = DOLLARS; pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub const MaximumReasonLength: u32 = 16384; pub const MaxApprovals: u32 = 100; @@ -918,7 +918,7 @@ parameter_types! { pub const BountyValueMinimum: Balance = 10 * DOLLARS; pub const BountyDepositBase: Balance = 5_000_000 * DOLLARS; pub const CuratorDepositMultiplier: Permill = Permill::from_percent(50); - pub const CuratorDepositMin: Balance = 1 * DOLLARS; + pub const CuratorDepositMin: Balance = DOLLARS; pub const CuratorDepositMax: Balance = 100 * DOLLARS; pub const BountyDepositPayoutDelay: BlockNumber = 8 * DAYS; pub const BountyUpdatePeriod: BlockNumber = 90 * DAYS; @@ -940,7 +940,7 @@ impl pallet_bounties::Config for Runtime { } parameter_types! { - pub const ChildBountyValueMinimum: Balance = 1 * DOLLARS; + pub const ChildBountyValueMinimum: Balance = DOLLARS; } impl pallet_child_bounties::Config for Runtime { @@ -1193,7 +1193,7 @@ impl pallet_society::Config for Runtime { } parameter_types! { - pub const MinVestedTransfer: Balance = 1 * DOLLARS; + pub const MinVestedTransfer: Balance = DOLLARS; } impl pallet_vesting::Config for Runtime { diff --git a/runtime/cere/src/impls.rs b/runtime/cere/src/impls.rs index 6895f794e..f1763dea1 100644 --- a/runtime/cere/src/impls.rs +++ b/runtime/cere/src/impls.rs @@ -98,7 +98,7 @@ mod multiplier_tests { fn run_with_system_weight(w: Weight, assertions: F) where - F: Fn() -> (), + F: Fn(), { let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() .build_storage::() @@ -114,12 +114,12 @@ mod multiplier_tests { fn truth_value_update_poc_works() { let fm = Multiplier::saturating_from_rational(1, 2); let test_set = vec![ - (0, fm.clone()), - (100, fm.clone()), - (1000, fm.clone()), - (target().ref_time(), fm.clone()), - (max_normal().ref_time() / 2, fm.clone()), - (max_normal().ref_time(), fm.clone()), + (0, fm), + (100, fm), + (1000, fm), + (target().ref_time(), fm), + (max_normal().ref_time() / 2, fm), + (max_normal().ref_time(), fm), ]; test_set.into_iter().for_each(|(w, fm)| { run_with_system_weight(Weight::from_ref_time(w), || { @@ -325,7 +325,7 @@ mod multiplier_tests { #[test] fn weight_to_fee_should_not_overflow_on_large_weights() { - let kb = 1024 as u64; + let kb = 1024_u64; let mb = kb * kb; let max_fm = Multiplier::saturating_from_integer(i128::MAX); diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index c27c8e8e6..c7745b7eb 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -401,7 +401,7 @@ impl pallet_indices::Config for Runtime { } parameter_types! { - pub const ExistentialDeposit: Balance = 1 * DOLLARS; + pub const ExistentialDeposit: Balance = DOLLARS; // For weight estimation, we assume that the most locks on an individual account will be 50. // This number may need to be adjusted in the future if this assumption no longer holds true. pub const MaxLocks: u32 = 50; @@ -562,9 +562,9 @@ parameter_types! { pub const UnsignedPhase: u32 = EPOCH_DURATION_IN_BLOCKS / 4; // signed config - pub const SignedRewardBase: Balance = 1 * DOLLARS; - pub const SignedDepositBase: Balance = 1 * DOLLARS; - pub const SignedDepositByte: Balance = 1 * CENTS; + pub const SignedRewardBase: Balance = DOLLARS; + pub const SignedDepositBase: Balance = DOLLARS; + pub const SignedDepositByte: Balance = CENTS; pub BetterUnsignedThreshold: Perbill = Perbill::from_rational(1u32, 10_000); @@ -719,11 +719,11 @@ impl pallet_bags_list::Config for Runtime { } parameter_types! { - pub const LaunchPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; - pub const VotingPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; + pub const LaunchPeriod: BlockNumber = 24 * 60 * MINUTES; + pub const VotingPeriod: BlockNumber = 24 * 60 * MINUTES; pub const FastTrackVotingPeriod: BlockNumber = 3 * 60 * MINUTES; pub const MinimumDeposit: Balance = 5_000_000 * DOLLARS; - pub const EnactmentPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; + pub const EnactmentPeriod: BlockNumber = 24 * 60 * MINUTES; pub const CooloffPeriod: BlockNumber = 7 * 24 * 60 * MINUTES; pub const MaxProposals: u32 = 100; } @@ -801,7 +801,7 @@ parameter_types! { pub const CandidacyBond: Balance = 500_000_000 * DOLLARS; // 1 storage item created, key size is 32 bytes, value size is 16+16. pub const VotingBondBase: Balance = deposit(1, 64); - pub const VotingBondFactor: Balance = 1 * DOLLARS; + pub const VotingBondFactor: Balance = DOLLARS; pub const TermDuration: BlockNumber = 182 * DAYS; pub const DesiredMembers: u32 = 13; pub const DesiredRunnersUp: u32 = 20; @@ -873,12 +873,12 @@ impl pallet_membership::Config for Runtime { parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); pub const ProposalBondMinimum: Balance = 5_000_000 * DOLLARS; - pub const SpendPeriod: BlockNumber = 1 * DAYS; + pub const SpendPeriod: BlockNumber = DAYS; pub const Burn: Permill = Permill::from_percent(0); - pub const TipCountdown: BlockNumber = 1 * DAYS; + pub const TipCountdown: BlockNumber = DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); pub const TipReportDepositBase: Balance = 5_000_000 * DOLLARS; - pub const DataDepositPerByte: Balance = 1 * DOLLARS; + pub const DataDepositPerByte: Balance = DOLLARS; pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub const MaximumReasonLength: u32 = 16384; pub const MaxApprovals: u32 = 100; @@ -914,7 +914,7 @@ parameter_types! { pub const BountyValueMinimum: Balance = 10 * DOLLARS; pub const BountyDepositBase: Balance = 5_000_000 * DOLLARS; pub const CuratorDepositMultiplier: Permill = Permill::from_percent(50); - pub const CuratorDepositMin: Balance = 1 * DOLLARS; + pub const CuratorDepositMin: Balance = DOLLARS; pub const CuratorDepositMax: Balance = 100 * DOLLARS; pub const BountyDepositPayoutDelay: BlockNumber = 8 * DAYS; pub const BountyUpdatePeriod: BlockNumber = 90 * DAYS; @@ -936,7 +936,7 @@ impl pallet_bounties::Config for Runtime { } parameter_types! { - pub const ChildBountyValueMinimum: Balance = 1 * DOLLARS; + pub const ChildBountyValueMinimum: Balance = DOLLARS; } impl pallet_child_bounties::Config for Runtime { @@ -1189,7 +1189,7 @@ impl pallet_society::Config for Runtime { } parameter_types! { - pub const MinVestedTransfer: Balance = 1 * DOLLARS; + pub const MinVestedTransfer: Balance = DOLLARS; } impl pallet_vesting::Config for Runtime { From e9bfc5ecb9a63a9e96c1304751888cc61bf12ca7 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 21 Sep 2023 18:41:46 +0600 Subject: [PATCH 420/583] Use `sp_std` as a BTreeMap type source --- pallets/ddc-validator/src/lib.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 175ab0b88..0dade22e5 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -59,7 +59,10 @@ pub use sp_runtime::offchain::{ http, storage::StorageValueRef, storage_lock, storage_lock::StorageLock, Duration, Timestamp, }; pub use sp_staking::EraIndex; -pub use sp_std::{collections::btree_map::BTreeMap, prelude::*}; +pub use sp_std::{ + collections::{btree_map, btree_map::BTreeMap}, + prelude::*, +}; extern crate alloc; @@ -909,7 +912,7 @@ pub mod pallet { > = BTreeMap::new(); for bucket in payments_per_bucket.iter_mut() { let cere_payment = bucket.1 as u32; - if let std::collections::btree_map::Entry::Vacant(e) = payments.entry(bucket.0) { + if let btree_map::Entry::Vacant(e) = payments.entry(bucket.0) { let bucket_info = BucketsDetails { bucket_id: bucket.0, amount: cere_payment.into(), From 83e7a7da8bcf162f71989b2e0eb13d328d939abd Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 23 Oct 2023 18:22:49 +0600 Subject: [PATCH 421/583] Disable rustfmt for legacy pallets --- rustfmt.toml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rustfmt.toml b/rustfmt.toml index 441913f61..f58198d98 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -21,3 +21,11 @@ match_block_trailing_comma = true trailing_comma = "Vertical" trailing_semicolon = false use_field_init_shorthand = true + +ignore = [ + "pallets/chainbridge", + "pallets/ddc-metrics-offchain-worker", + "pallets/ddc", + "pallets/erc20", + "pallets/erc721", +] From aad3cdab0b2d5c1a1e013169ea3d685c26d91a9f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 21 Sep 2023 18:51:50 +0600 Subject: [PATCH 422/583] Apply rustfmt --- pallets/ddc-clusters/src/lib.rs | 4 +--- pallets/ddc-nodes/src/lib.rs | 12 ++++-------- pallets/ddc-staking/src/lib.rs | 6 +----- pallets/ddc-validator/src/dac.rs | 4 ---- pallets/ddc-validator/src/lib.rs | 7 +++++-- pallets/ddc-validator/src/shm.rs | 1 - pallets/ddc-validator/src/utils.rs | 1 - 7 files changed, 11 insertions(+), 24 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 7d3499d4a..7569b2760 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -193,9 +193,7 @@ pub mod pallet { let mut cluster = Clusters::::try_get(cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); - cluster - .set_params(cluster_params) - .map_err(Into::>::into)?; + cluster.set_params(cluster_params).map_err(Into::>::into)?; Clusters::::insert(cluster_id, cluster); Self::deposit_event(Event::::ClusterParamsSet { cluster_id }); diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 2871f1e29..75d89e260 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -92,12 +92,10 @@ pub mod pallet { #[pallet::weight(10_000)] pub fn delete_node(origin: OriginFor, node_pub_key: NodePubKey) -> DispatchResult { let caller_id = ensure_signed(origin)?; - let node = Self::get(node_pub_key.clone()) - .map_err(Into::>::into)?; + let node = Self::get(node_pub_key.clone()).map_err(Into::>::into)?; ensure!(node.get_provider_id() == &caller_id, Error::::OnlyNodeProvider); ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAssignedToCluster); - Self::delete(node_pub_key.clone()) - .map_err(Into::>::into)?; + Self::delete(node_pub_key.clone()).map_err(Into::>::into)?; Self::deposit_event(Event::::NodeDeleted { node_pub_key }); Ok(()) } @@ -109,11 +107,9 @@ pub mod pallet { node_params: NodeParams, ) -> DispatchResult { let caller_id = ensure_signed(origin)?; - let mut node = Self::get(node_pub_key.clone()) - .map_err(Into::>::into)?; + let mut node = Self::get(node_pub_key.clone()).map_err(Into::>::into)?; ensure!(node.get_provider_id() == &caller_id, Error::::OnlyNodeProvider); - node.set_params(node_params) - .map_err(Into::>::into)?; + node.set_params(node_params).map_err(Into::>::into)?; Self::update(node).map_err(Into::>::into)?; Self::deposit_event(Event::::NodeParamsChanged { node_pub_key }); Ok(()) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index ec96bfe27..3c8464dc8 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -989,11 +989,7 @@ pub mod pallet { current_rewards.push(rewards); }); } - Self::deposit_event(Event::::PayoutNodes( - era, - era_reward_points, - price_per_byte, - )); + Self::deposit_event(Event::::PayoutNodes(era, era_reward_points, price_per_byte)); log::debug!("Payout event executed"); log::debug!( diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs index a2b593182..205abba4e 100644 --- a/pallets/ddc-validator/src/dac.rs +++ b/pallets/ddc-validator/src/dac.rs @@ -329,8 +329,6 @@ pub(crate) fn http_get_json(url: &str) -> crate::ResultSt "HTTP GET error" })?; - - serde_json::from_slice(&body).map_err(|err| { log::warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); "HTTP JSON parse error" @@ -365,8 +363,6 @@ pub(crate) fn get_final_decision(decisions: Vec) -> Validati let serialized_decisions = serde_json::to_string(&common_decisions).unwrap(); - - ValidationDecision { edge: decision_example.edge.clone(), result: decision_example.result, diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 0dade22e5..f08727d4b 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -637,7 +637,8 @@ pub mod pallet { let percentage_difference = 1f32 - (bytes_received as f32 / bytes_sent as f32); - percentage_difference >= 0.0 && (T::ValidationThreshold::get() as f32 - percentage_difference) > 0.0 + percentage_difference >= 0.0 && + (T::ValidationThreshold::get() as f32 - percentage_difference) > 0.0 } /// Shuffle the `list` swapping it's random elements `list.len()` times. @@ -775,7 +776,9 @@ pub mod pallet { } fn get_public_key() -> Option { - sr25519_public_keys(KEY_TYPE).first().map(|pubkey| T::AccountId::decode(&mut &pubkey.encode()[..]).unwrap()) + sr25519_public_keys(KEY_TYPE) + .first() + .map(|pubkey| T::AccountId::decode(&mut &pubkey.encode()[..]).unwrap()) } fn validate_edges() -> Result<(), &'static str> { diff --git a/pallets/ddc-validator/src/shm.rs b/pallets/ddc-validator/src/shm.rs index 066be9bd5..47619425c 100644 --- a/pallets/ddc-validator/src/shm.rs +++ b/pallets/ddc-validator/src/shm.rs @@ -121,7 +121,6 @@ pub(crate) fn get_intermediate_decisions( }; let quorum_decisions = find_quorum_decisions(decisions_for_edge, quorum); - decode_intermediate_decisions(quorum_decisions) } diff --git a/pallets/ddc-validator/src/utils.rs b/pallets/ddc-validator/src/utils.rs index a43ee2aa1..2ba8379e9 100644 --- a/pallets/ddc-validator/src/utils.rs +++ b/pallets/ddc-validator/src/utils.rs @@ -6,7 +6,6 @@ pub use sp_std::prelude::*; pub fn account_to_string(account: T::AccountId) -> String { let to32 = T::AccountId::encode(&account); - array_bytes::bytes2hex("", to32) } From 12a6612e3220cc5430b8d80664d5bb4d52fe833c Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 22 Sep 2023 12:57:41 +0600 Subject: [PATCH 423/583] Apply clippy suggestions which it can't fix itself --- .gitignore | 2 -- pallets/ddc-metrics-offchain-worker/src/lib.rs | 17 ++++++++--------- .../src/tests/test_data/ddc.wasm | 0 .../src/tests/test_data/metadata.json | 0 4 files changed, 8 insertions(+), 11 deletions(-) create mode 100644 pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc.wasm create mode 100644 pallets/ddc-metrics-offchain-worker/src/tests/test_data/metadata.json diff --git a/.gitignore b/.gitignore index 6dd97a7f6..ac9d585fc 100644 --- a/.gitignore +++ b/.gitignore @@ -20,5 +20,3 @@ # ddc-metrics-offchain-worker mock files pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc.contract -pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc.wasm -pallets/ddc-metrics-offchain-worker/src/tests/test_data/metadata.json diff --git a/pallets/ddc-metrics-offchain-worker/src/lib.rs b/pallets/ddc-metrics-offchain-worker/src/lib.rs index 228def0f0..ffa2dfbb1 100644 --- a/pallets/ddc-metrics-offchain-worker/src/lib.rs +++ b/pallets/ddc-metrics-offchain-worker/src/lib.rs @@ -304,11 +304,10 @@ where ); Err("Skipping") } else { - let block_interval_configured = Self::get_block_interval(); let mut block_interval = T::BlockInterval::get(); - if block_interval_configured.is_some() { + if let Some(block_interval_configured) = Self::get_block_interval() { block_interval = ::BlockNumber::from( - block_interval_configured.unwrap(), + block_interval_configured, ); } @@ -753,7 +752,12 @@ impl MetricsAggregator { let existing_pubkey_index = self.0.iter().position(|one_result_obj| metric.app_id == one_result_obj.app_id); - if existing_pubkey_index.is_none() { + if let Some(existing_pubkey_index) = existing_pubkey_index { + // Add to metrics of an existing app. + self.0[existing_pubkey_index].storage_bytes += metric.storage_bytes; + self.0[existing_pubkey_index].wcu_used += metric.wcu_used; + self.0[existing_pubkey_index].rcu_used += metric.rcu_used; + } else { // New app. let new_metric_obj = Metric { app_id: metric.app_id.clone(), @@ -762,11 +766,6 @@ impl MetricsAggregator { rcu_used: metric.rcu_used, }; self.0.push(new_metric_obj); - } else { - // Add to metrics of an existing app. - self.0[existing_pubkey_index.unwrap()].storage_bytes += metric.storage_bytes; - self.0[existing_pubkey_index.unwrap()].wcu_used += metric.wcu_used; - self.0[existing_pubkey_index.unwrap()].rcu_used += metric.rcu_used; } } diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc.wasm b/pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc.wasm new file mode 100644 index 000000000..e69de29bb diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/test_data/metadata.json b/pallets/ddc-metrics-offchain-worker/src/tests/test_data/metadata.json new file mode 100644 index 000000000..e69de29bb From 5f5fce0814d73bce82279f6077b8bc26335c4a3f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 22 Sep 2023 13:20:50 +0600 Subject: [PATCH 424/583] Pre-push script invoking Clippy linter --- scripts/pre-push.sh | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100755 scripts/pre-push.sh diff --git a/scripts/pre-push.sh b/scripts/pre-push.sh new file mode 100755 index 000000000..9c6679c02 --- /dev/null +++ b/scripts/pre-push.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +# Check code with clippy before publishing +cargo clippy --all --all-targets -- -D warnings +if [ $? -ne 0 ]; then + echo "Run \`cargo clippy --fix --all --allow-staged --allow-dirty\` to apply clippy's suggestions." + exit 1 +fi From cf37b1f6ca328210f2f9de3fe481b564cd79b1c8 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 22 Sep 2023 13:21:41 +0600 Subject: [PATCH 425/583] Add pre-push script setup to init script --- scripts/init.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/init.sh b/scripts/init.sh index beca622b2..1472424dc 100755 --- a/scripts/init.sh +++ b/scripts/init.sh @@ -9,3 +9,4 @@ rustup install nightly-2022-10-09 rustup target add wasm32-unknown-unknown --toolchain nightly-2022-10-09 ln -sf $PWD/scripts/pre-commit.sh $PWD/.git/hooks/pre-commit || true +ln -sf $PWD/scripts/pre-push.sh $PWD/.git/hooks/pre-push || true From 23a4f8523c9c928f1f856a34d64718499cf4eb7d Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 22 Sep 2023 13:23:33 +0600 Subject: [PATCH 426/583] Add Clippy to the `check` CI workflow --- .github/workflows/check.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index db63d8d96..27070bd99 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -35,6 +35,10 @@ jobs: - name: Rust Cache uses: Swatinem/rust-cache@v2 + - name: Check with Clippy + run: | + cargo clippy --all --all-targets -- -D warnings + - name: Check Build run: | SKIP_WASM_BUILD=1 cargo check --release From 212dd548c100adeca80811d3a17fa066f05fd193 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 24 Oct 2023 12:38:46 +0200 Subject: [PATCH 427/583] Reduce by 2 orders of magnitude the constants changed in v4.7.1 --- CHANGELOG.md | 11 ++ Cargo.lock | 330 ++++++++++++++++++------------------ runtime/cere-dev/src/lib.rs | 10 +- runtime/cere/src/lib.rs | 10 +- 4 files changed, 186 insertions(+), 175 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 975dd715d..780fcf968 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [C,D] Updated Substrate to polkadot-v0.9.30 +## [4.7.2] + +### Changed + +- Reduce by 2 orders of magnitude the constants changed in v4.7.1 + +## [4.7.1] + +### Changed +- Updated governance related constants + ## [4.7.0] ### Changed diff --git a/Cargo.lock b/Cargo.lock index 669a99063..c24b3b135 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2069,7 +2069,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", ] @@ -2086,7 +2086,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2109,7 +2109,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -2160,7 +2160,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2171,7 +2171,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2187,7 +2187,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2216,7 +2216,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2248,7 +2248,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "cfg-expr", @@ -2262,7 +2262,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2274,7 +2274,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -2284,7 +2284,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "log", @@ -2302,7 +2302,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -2317,7 +2317,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -2326,7 +2326,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "parity-scale-codec", @@ -4374,7 +4374,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system", "parity-scale-codec", @@ -4583,7 +4583,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4599,7 +4599,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4614,7 +4614,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4638,7 +4638,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4658,7 +4658,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4673,7 +4673,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4724,7 +4724,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4743,7 +4743,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4760,7 +4760,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4788,7 +4788,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -4803,7 +4803,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -4813,7 +4813,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-contracts-primitives", @@ -4830,7 +4830,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -4985,7 +4985,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5001,7 +5001,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5025,7 +5025,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5038,7 +5038,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5094,7 +5094,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5115,7 +5115,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5138,7 +5138,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5154,7 +5154,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5174,7 +5174,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5191,7 +5191,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5208,7 +5208,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5223,7 +5223,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5240,7 +5240,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5260,7 +5260,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -5270,7 +5270,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5287,7 +5287,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5310,7 +5310,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5325,7 +5325,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5339,7 +5339,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5354,7 +5354,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5370,7 +5370,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5391,7 +5391,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5407,7 +5407,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5421,7 +5421,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5444,7 +5444,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5455,7 +5455,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5469,7 +5469,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5487,7 +5487,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5506,7 +5506,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5522,7 +5522,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5537,7 +5537,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5548,7 +5548,7 @@ dependencies = [ [[package]] name = "pallet-transaction-storage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5566,7 +5566,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5583,7 +5583,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5599,7 +5599,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6485,7 +6485,7 @@ checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "env_logger 0.9.3", "jsonrpsee", @@ -6744,7 +6744,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -6755,7 +6755,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6782,7 +6782,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -6805,7 +6805,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6821,7 +6821,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6838,7 +6838,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6849,7 +6849,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -6889,7 +6889,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fnv", "futures", @@ -6917,7 +6917,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "kvdb", @@ -6942,7 +6942,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6966,7 +6966,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "fork-tree", @@ -7008,7 +7008,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7030,7 +7030,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -7043,7 +7043,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -7067,7 +7067,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sc-client-api", "sp-authorship", @@ -7078,7 +7078,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "lru", @@ -7105,7 +7105,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -7121,7 +7121,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7136,7 +7136,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cfg-if", "libc", @@ -7156,7 +7156,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "array-bytes 4.2.0", @@ -7197,7 +7197,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "futures", @@ -7218,7 +7218,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7235,7 +7235,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -7250,7 +7250,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -7297,7 +7297,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cid", "futures", @@ -7317,7 +7317,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7343,7 +7343,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "futures", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -7382,7 +7382,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "fork-tree", @@ -7410,7 +7410,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -7429,7 +7429,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -7459,7 +7459,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libp2p", @@ -7472,7 +7472,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "hash-db", @@ -7511,7 +7511,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7534,7 +7534,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7547,7 +7547,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "directories", @@ -7617,7 +7617,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7631,7 +7631,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7650,7 +7650,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libc", @@ -7669,7 +7669,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "chrono", "futures", @@ -7687,7 +7687,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7718,7 +7718,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7729,7 +7729,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -7755,7 +7755,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -7768,7 +7768,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -8191,7 +8191,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8209,7 +8209,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "proc-macro-crate", @@ -8221,7 +8221,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8234,7 +8234,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "integer-sqrt", "num-traits", @@ -8249,7 +8249,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8262,7 +8262,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "parity-scale-codec", @@ -8274,7 +8274,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -8286,7 +8286,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -8304,7 +8304,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8323,7 +8323,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "merlin", @@ -8346,7 +8346,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8360,7 +8360,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8373,7 +8373,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "base58", @@ -8419,7 +8419,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "byteorder", @@ -8433,7 +8433,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8444,7 +8444,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8453,7 +8453,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8463,7 +8463,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -8474,7 +8474,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "log", @@ -8492,7 +8492,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8506,7 +8506,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "futures", @@ -8532,7 +8532,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "sp-core", @@ -8543,7 +8543,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8560,7 +8560,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "thiserror", "zstd", @@ -8569,7 +8569,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8583,7 +8583,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-core", @@ -8593,7 +8593,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "backtrace", "lazy_static", @@ -8603,7 +8603,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "rustc-hash", "serde", @@ -8613,7 +8613,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "either", "hash256-std-hasher", @@ -8636,7 +8636,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8654,7 +8654,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "proc-macro-crate", @@ -8666,7 +8666,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -8680,7 +8680,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8694,7 +8694,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8705,7 +8705,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8727,12 +8727,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8745,7 +8745,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -8758,7 +8758,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures-timer", @@ -8774,7 +8774,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-std", @@ -8786,7 +8786,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-runtime", @@ -8795,7 +8795,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "log", @@ -8811,7 +8811,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "hash-db", @@ -8834,7 +8834,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8851,7 +8851,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8862,7 +8862,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "log", @@ -8875,7 +8875,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -9016,7 +9016,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "platforms 2.0.0", ] @@ -9024,7 +9024,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -9045,7 +9045,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures-util", "hyper", @@ -9058,7 +9058,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "log", @@ -9079,7 +9079,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "substrate-test-utils-derive", @@ -9089,7 +9089,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9100,7 +9100,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -9561,7 +9561,7 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "clap", "frame-try-runtime", diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index d71e17e5c..a8e695f8d 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -726,7 +726,7 @@ parameter_types! { pub const LaunchPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; pub const VotingPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; pub const FastTrackVotingPeriod: BlockNumber = 3 * 60 * MINUTES; - pub const MinimumDeposit: Balance = 5_000_000 * DOLLARS; + pub const MinimumDeposit: Balance = 50_000 * DOLLARS; pub const EnactmentPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; pub const CooloffPeriod: BlockNumber = 7 * 24 * 60 * MINUTES; pub const MaxProposals: u32 = 100; @@ -802,7 +802,7 @@ impl pallet_collective::Config for Runtime { } parameter_types! { - pub const CandidacyBond: Balance = 500_000_000 * DOLLARS; + pub const CandidacyBond: Balance = 5_000_000 * DOLLARS; // 1 storage item created, key size is 32 bytes, value size is 16+16. pub const VotingBondBase: Balance = deposit(1, 64); pub const VotingBondFactor: Balance = 1 * DOLLARS; @@ -876,12 +876,12 @@ impl pallet_membership::Config for Runtime { parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); - pub const ProposalBondMinimum: Balance = 5_000_000 * DOLLARS; + pub const ProposalBondMinimum: Balance = 50_000 * DOLLARS; pub const SpendPeriod: BlockNumber = 1 * DAYS; pub const Burn: Permill = Permill::from_percent(0); pub const TipCountdown: BlockNumber = 1 * DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); - pub const TipReportDepositBase: Balance = 5_000_000 * DOLLARS; + pub const TipReportDepositBase: Balance = 50_000 * DOLLARS; pub const DataDepositPerByte: Balance = 1 * DOLLARS; pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub const MaximumReasonLength: u32 = 16384; @@ -916,7 +916,7 @@ impl pallet_treasury::Config for Runtime { parameter_types! { pub const BountyCuratorDeposit: Permill = Permill::from_percent(50); pub const BountyValueMinimum: Balance = 10 * DOLLARS; - pub const BountyDepositBase: Balance = 5_000_000 * DOLLARS; + pub const BountyDepositBase: Balance = 50_000 * DOLLARS; pub const CuratorDepositMultiplier: Permill = Permill::from_percent(50); pub const CuratorDepositMin: Balance = 1 * DOLLARS; pub const CuratorDepositMax: Balance = 100 * DOLLARS; diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index c27c8e8e6..448a721b2 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -722,7 +722,7 @@ parameter_types! { pub const LaunchPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; pub const VotingPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; pub const FastTrackVotingPeriod: BlockNumber = 3 * 60 * MINUTES; - pub const MinimumDeposit: Balance = 5_000_000 * DOLLARS; + pub const MinimumDeposit: Balance = 50_000 * DOLLARS; pub const EnactmentPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; pub const CooloffPeriod: BlockNumber = 7 * 24 * 60 * MINUTES; pub const MaxProposals: u32 = 100; @@ -798,7 +798,7 @@ impl pallet_collective::Config for Runtime { } parameter_types! { - pub const CandidacyBond: Balance = 500_000_000 * DOLLARS; + pub const CandidacyBond: Balance = 5_000_000 * DOLLARS; // 1 storage item created, key size is 32 bytes, value size is 16+16. pub const VotingBondBase: Balance = deposit(1, 64); pub const VotingBondFactor: Balance = 1 * DOLLARS; @@ -872,12 +872,12 @@ impl pallet_membership::Config for Runtime { parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); - pub const ProposalBondMinimum: Balance = 5_000_000 * DOLLARS; + pub const ProposalBondMinimum: Balance = 50_000 * DOLLARS; pub const SpendPeriod: BlockNumber = 1 * DAYS; pub const Burn: Permill = Permill::from_percent(0); pub const TipCountdown: BlockNumber = 1 * DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); - pub const TipReportDepositBase: Balance = 5_000_000 * DOLLARS; + pub const TipReportDepositBase: Balance = 50_000 * DOLLARS; pub const DataDepositPerByte: Balance = 1 * DOLLARS; pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub const MaximumReasonLength: u32 = 16384; @@ -912,7 +912,7 @@ impl pallet_treasury::Config for Runtime { parameter_types! { pub const BountyCuratorDeposit: Permill = Permill::from_percent(50); pub const BountyValueMinimum: Balance = 10 * DOLLARS; - pub const BountyDepositBase: Balance = 5_000_000 * DOLLARS; + pub const BountyDepositBase: Balance = 50_000 * DOLLARS; pub const CuratorDepositMultiplier: Permill = Permill::from_percent(50); pub const CuratorDepositMin: Balance = 1 * DOLLARS; pub const CuratorDepositMax: Balance = 100 * DOLLARS; From 9e3b004ba687e4c3b6c4f4e238c08f8d0b08af18 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 24 Oct 2023 15:22:09 +0200 Subject: [PATCH 428/583] Update spec_version --- runtime/cere-dev/src/lib.rs | 2 +- runtime/cere/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index a8e695f8d..3279c7529 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -130,7 +130,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: 48007, + spec_version: 48009, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 448a721b2..be5ab085d 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -125,7 +125,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: 48005, + spec_version: 48009, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, From 201824b66ca31ad128c93e0b45455ca0ea67d16e Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 25 Oct 2023 18:24:20 +0200 Subject: [PATCH 429/583] remove controller from account deposit --- Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../src/lib.rs | 157 ++++++++---------- pallets/ddc-validator/Cargo.toml | 4 +- pallets/ddc-validator/src/lib.rs | 2 +- runtime/cere-dev/Cargo.toml | 4 +- 6 files changed, 72 insertions(+), 99 deletions(-) rename pallets/{ddc-accounts => ddc-customer-accounts}/Cargo.toml (97%) rename pallets/{ddc-accounts => ddc-customer-accounts}/src/lib.rs (77%) diff --git a/Cargo.toml b/Cargo.toml index 835a9919a..e5687657f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ members = [ "pallets/erc20", "pallets/ddc-metrics-offchain-worker", "pallets/ddc-validator", - "pallets/ddc-accounts", + "pallets/ddc-customer-accounts", "pallets/ddc-nodes", "pallets/ddc-clusters", "primitives", diff --git a/pallets/ddc-accounts/Cargo.toml b/pallets/ddc-customer-accounts/Cargo.toml similarity index 97% rename from pallets/ddc-accounts/Cargo.toml rename to pallets/ddc-customer-accounts/Cargo.toml index 89f3de545..3f3ed6fcb 100644 --- a/pallets/ddc-accounts/Cargo.toml +++ b/pallets/ddc-customer-accounts/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "pallet-ddc-accounts" +name = "pallet-ddc-customer-accounts" version = "0.1.0" edition = "2021" diff --git a/pallets/ddc-accounts/src/lib.rs b/pallets/ddc-customer-accounts/src/lib.rs similarity index 77% rename from pallets/ddc-accounts/src/lib.rs rename to pallets/ddc-customer-accounts/src/lib.rs index e988cdd0f..30bfa9bce 100644 --- a/pallets/ddc-accounts/src/lib.rs +++ b/pallets/ddc-customer-accounts/src/lib.rs @@ -55,17 +55,17 @@ pub struct BucketsDetails { #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct AccountsLedger { - /// The stash account whose balance is actually locked and can be used for CDN usage. - pub stash: AccountId, - /// The total amount of the stash's balance that we are currently accounting for. + /// The owner account whose balance is actually locked and can be used for CDN usage. + pub owner: AccountId, + /// The total amount of the owner's balance that we are currently accounting for. /// It's just `active` plus all the `unlocking` balances. #[codec(compact)] pub total: Balance, - /// The total amount of the stash's balance that will be accessible for CDN payments in any + /// The total amount of the owner's balance that will be accessible for CDN payments in any /// forthcoming rounds. #[codec(compact)] pub active: Balance, - /// Any balance that is becoming free, which may eventually be transferred out of the stash + /// Any balance that is becoming free, which may eventually be transferred out of the owner /// (assuming that the content owner has to pay for network usage). It is assumed that this /// will be treated as a first in, first out queue where the new (higher value) eras get pushed /// on the back. @@ -75,9 +75,9 @@ pub struct AccountsLedger { impl AccountsLedger { - /// Initializes the default object using the given stash. - pub fn default_from(stash: AccountId) -> Self { - Self { stash, total: Zero::zero(), active: Zero::zero(), unlocking: Default::default() } + /// Initializes the default object using the given owner. + pub fn default_from(owner: AccountId) -> Self { + Self { owner, total: Zero::zero(), active: Zero::zero(), unlocking: Default::default() } } /// Remove entries from `unlocking` that are sufficiently old and reduce the @@ -102,7 +102,7 @@ impl; } - /// Map from all locked "stash" accounts to the controller account. - #[pallet::storage] - #[pallet::getter(fn bonded)] - pub type Bonded = StorageMap<_, Identity, T::AccountId, T::AccountId>; - - /// Map from all (unlocked) "controller" accounts to the info regarding the staking. + /// Map from all (unlocked) "owner" accounts to the info regarding the staking. #[pallet::storage] #[pallet::getter(fn ledger)] pub type Ledger = @@ -187,15 +180,15 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { - /// An account has bonded this amount. \[stash, amount\] + /// An account has bonded this amount. \[owner, amount\] /// /// NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, /// it will not be emitted for staking rewards when they are added to stake. Deposited(T::AccountId, BalanceOf), - /// An account has unbonded this amount. \[stash, amount\] + /// An account has unbonded this amount. \[owner, amount\] Unbonded(T::AccountId, BalanceOf), /// An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` - /// from the unlocking queue. \[stash, amount\] + /// from the unlocking queue. \[owner, amount\] Withdrawn(T::AccountId, BalanceOf), /// Total amount charged from all accounts to pay CDN nodes Charged(BalanceOf), @@ -203,13 +196,9 @@ pub mod pallet { #[pallet::error] pub enum Error { - /// Not a controller account. - NotController, - /// Not a stash account. - NotStash, - /// Stash is already bonded. - AlreadyBonded, - /// Controller is already paired. + /// Not a owner account. + NotOwner, + /// Owner is already bonded. AlreadyPaired, /// Cannot deposit dust InsufficientDeposit, @@ -270,29 +259,22 @@ pub mod pallet { Ok(()) } - /// Take the origin account as a stash and lock up `value` of its balance. `controller` will + /// Take the origin account as a owner and lock up `value` of its balance. `Owner` will /// be the account that controls it. /// /// `value` must be more than the `minimum_balance` specified by `T::Currency`. /// - /// The dispatch origin for this call must be _Signed_ by the stash account. + /// The dispatch origin for this call must be _Signed_ by the owner account. /// /// Emits `Deposited`. #[pallet::weight(10_000)] pub fn deposit( origin: OriginFor, - controller: ::Source, #[pallet::compact] value: BalanceOf, ) -> DispatchResult { - let stash = ensure_signed(origin)?; - - if >::contains_key(&stash) { - Err(Error::::AlreadyBonded)? - } + let owner = ensure_signed(origin)?; - let controller = T::Lookup::lookup(controller)?; - - if >::contains_key(&controller) { + if >::contains_key(&owner) { Err(Error::::AlreadyPaired)? } @@ -301,27 +283,25 @@ pub mod pallet { Err(Error::::InsufficientDeposit)? } - frame_system::Pallet::::inc_consumers(&stash).map_err(|_| Error::::BadState)?; - - >::insert(&stash, &controller); + frame_system::Pallet::::inc_consumers(&owner).map_err(|_| Error::::BadState)?; - let stash_balance = ::Currency::free_balance(&stash); - let value = value.min(stash_balance); + let owner_balance = ::Currency::free_balance(&owner); + let value = value.min(owner_balance); let item = AccountsLedger { - stash: stash.clone(), + owner: owner.clone(), total: value, active: value, unlocking: Default::default(), }; - Self::update_ledger_and_deposit(&stash, &controller, &item)?; - Self::deposit_event(Event::::Deposited(stash.clone(), value)); + Self::update_ledger_and_deposit(&owner, &item)?; + Self::deposit_event(Event::::Deposited(owner, value)); Ok(()) } - /// Add some extra amount that have appeared in the stash `free_balance` into the balance up + /// Add some extra amount that have appeared in the owner `free_balance` into the balance up /// for CDN payments. /// - /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. + /// The dispatch origin for this call must be _Signed_ by the owner. /// /// Emits `Deposited`. #[pallet::weight(10_000)] @@ -329,13 +309,12 @@ pub mod pallet { origin: OriginFor, #[pallet::compact] max_additional: BalanceOf, ) -> DispatchResult { - let stash = ensure_signed(origin)?; + let owner = ensure_signed(origin)?; - let controller = Self::bonded(&stash).ok_or(Error::::NotStash)?; - let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; + let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; - let stash_balance = ::Currency::free_balance(&stash); - let extra = stash_balance.min(max_additional); + let owner_balance = ::Currency::free_balance(&owner); + let extra = owner_balance.min(max_additional); ledger.total += extra; ledger.active += extra; // Last check: the new active amount of ledger must be more than ED. @@ -344,18 +323,18 @@ pub mod pallet { Error::::InsufficientDeposit ); - Self::update_ledger_and_deposit(&stash, &controller, &ledger)?; + Self::update_ledger_and_deposit(&owner, &ledger)?; - Self::deposit_event(Event::::Deposited(stash.clone(), extra)); + Self::deposit_event(Event::::Deposited(owner.clone(), extra)); Ok(()) } - /// Schedule a portion of the stash to be unlocked ready for transfer out after the bond + /// Schedule a portion of the owner to be unlocked ready for transfer out after the bond /// period ends. If this leaves an amount actively bonded less than /// T::Currency::minimum_balance(), then it is increased to the full amount. /// - /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. + /// The dispatch origin for this call must be _Signed_ by the owner. /// /// Once the unlock period is done, you can call `withdraw_unbonded` to actually move /// the funds out of management ready for transfer. @@ -372,8 +351,8 @@ pub mod pallet { origin: OriginFor, #[pallet::compact] value: BalanceOf, ) -> DispatchResult { - let controller = ensure_signed(origin)?; - let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; + let owner = ensure_signed(origin)?; + let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; ensure!( ledger.unlocking.len() < MaxUnlockingChunks::get() as usize, Error::::NoMoreChunks, @@ -396,9 +375,7 @@ pub mod pallet { let era = current_era + ::BondingDuration::get(); log::debug!("Era for the unbond: {:?}", era); - if let Some(mut chunk) = - ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) - { + if let Some(chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) { // To keep the chunk count down, we only keep one chunk per era. Since // `unlocking` is a FiFo queue, if a chunk exists for `era` we know that it will // be the last one. @@ -410,28 +387,28 @@ pub mod pallet { .map_err(|_| Error::::NoMoreChunks)?; }; - Self::update_ledger(&controller, &ledger); + Self::update_ledger(&owner, &ledger); - Self::deposit_event(Event::::Unbonded(ledger.stash, value)); + Self::deposit_event(Event::::Unbonded(ledger.owner, value)); } Ok(()) } /// Remove any unlocked chunks from the `unlocking` queue from our management. /// - /// This essentially frees up that balance to be used by the stash account to do + /// This essentially frees up that balance to be used by the owner account to do /// whatever it wants. /// - /// The dispatch origin for this call must be _Signed_ by the controller. + /// The dispatch origin for this call must be _Signed_ by the owner. /// /// Emits `Withdrawn`. /// /// See also [`Call::unbond`]. #[pallet::weight(10_000)] pub fn withdraw_unbonded(origin: OriginFor) -> DispatchResult { - let controller = ensure_signed(origin)?; - let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - let (stash, old_total) = (ledger.stash.clone(), ledger.total); + let owner = ensure_signed(origin)?; + let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; + let (owner, old_total) = (ledger.owner.clone(), ledger.total); let current_era = ddc_staking::pallet::Pallet::::current_era().ok_or(Error::::DDCEraNotSet)?; ledger = ledger.consolidate_unlocked(current_era); @@ -440,15 +417,15 @@ pub mod pallet { if ledger.unlocking.is_empty() && ledger.active < ::Currency::minimum_balance() { - log::debug!("Killing stash"); + log::debug!("Killing owner"); // 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 accounts-related information. - Self::kill_stash(&stash)?; + Self::kill_owner(&owner)?; } else { log::debug!("Updating ledger"); // This was the consequence of a partial unbond. just update the ledger and move on. - Self::update_ledger(&controller, &ledger); + Self::update_ledger(&owner, &ledger); }; log::debug!("Current total: {:?}", ledger.total); @@ -465,11 +442,11 @@ pub mod pallet { ::Currency::transfer( &account_id, - &stash, + &owner, value, ExistenceRequirement::KeepAlive, )?; - Self::deposit_event(Event::::Withdrawn(stash, value)); + Self::deposit_event(Event::::Withdrawn(owner, value)); } Ok(()) @@ -480,48 +457,44 @@ pub mod pallet { pub fn account_id() -> T::AccountId { T::PalletId::get().into_account_truncating() } - /// Update the ledger for a controller. + /// Update the ledger for a owner. /// /// This will also deposit the funds to pallet. fn update_ledger_and_deposit( - stash: &T::AccountId, - controller: &T::AccountId, + owner: &T::AccountId, ledger: &AccountsLedger>, ) -> DispatchResult { let account_id = Self::account_id(); ::Currency::transfer( - stash, + owner, &account_id, ledger.total, ExistenceRequirement::KeepAlive, )?; - >::insert(controller, ledger); + >::insert(owner, ledger); Ok(()) } - /// Update the ledger for a controller. + /// Update the ledger for a owner. fn update_ledger( - controller: &T::AccountId, + owner: &T::AccountId, ledger: &AccountsLedger>, ) { - >::insert(controller, ledger); + >::insert(owner, ledger); } - /// Remove all associated data of a stash account from the accounts system. + /// Remove all associated data of a owner account from the accounts system. /// /// Assumes storage is upgraded before calling. /// /// This is called: - /// - after a `withdraw_unbonded()` call that frees all of a stash's bonded balance. - fn kill_stash(stash: &T::AccountId) -> DispatchResult { - let controller = >::get(stash).ok_or(Error::::NotStash)?; - - >::remove(stash); - >::remove(&controller); + /// - after a `withdraw_unbonded()` call that frees all of a owner's bonded balance. + fn kill_owner(owner: &T::AccountId) -> DispatchResult { + >::remove(&owner); - frame_system::Pallet::::dec_consumers(stash); + frame_system::Pallet::::dec_consumers(owner); Ok(()) } @@ -539,7 +512,7 @@ pub mod pallet { let content_owner = bucket.owner_id; let amount = bucket_details.amount * pricing.saturated_into::>(); - let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotController)?; + let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotOwner)?; if ledger.active >= amount { ledger.total -= amount; ledger.active -= amount; diff --git a/pallets/ddc-validator/Cargo.toml b/pallets/ddc-validator/Cargo.toml index d1ceeec47..1c5200e79 100644 --- a/pallets/ddc-validator/Cargo.toml +++ b/pallets/ddc-validator/Cargo.toml @@ -14,7 +14,7 @@ frame-system = { version = "4.0.0-dev", default-features = false, git = "https:/ lite-json = { version = "0.2.0", default-features = false } log = { version = "0.4.17", default-features = false } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-ddc-accounts = { version = "0.1.0", default-features = false, path = "../ddc-accounts" } +pallet-ddc-customer-accounts = { version = "0.1.0", default-features = false, path = "../ddc-customer-accounts" } pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -44,7 +44,7 @@ std = [ "frame-system/std", "lite-json/std", "pallet-contracts/std", - "pallet-ddc-accounts/std", + "pallet-ddc-customer-accounts/std", "pallet-ddc-staking/std", "pallet-session/std", "pallet-staking/std", diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index ac0bfe531..647332f9f 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -47,7 +47,7 @@ pub use frame_system::{ }; pub use lite_json::json::JsonValue; pub use pallet::*; -pub use pallet_ddc_accounts::{self as ddc_accounts, BucketsDetails}; +pub use pallet_ddc_customer_accounts::{self as ddc_accounts, BucketsDetails}; pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_session as session; pub use pallet_staking::{self as staking}; diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 71b9c5112..7302356bc 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -99,7 +99,7 @@ cere-dev-runtime-constants = { path = "./constants", default-features = false } pallet-ddc-staking = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-staking" } pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } -pallet-ddc-accounts = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-accounts" } +pallet-ddc-customer-accounts = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customer-accounts" } pallet-ddc-validator = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-validator" } pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } @@ -186,7 +186,7 @@ std = [ "cere-runtime-common/std", "cere-dev-runtime-constants/std", "pallet-ddc-validator/std", - "pallet-ddc-accounts/std", + "pallet-ddc-customer-accounts/std", "pallet-ddc-nodes/std", "pallet-ddc-clusters/std", ] From 6a4bfd3e8b25601f5ff640ba25781f6564d27500 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 25 Oct 2023 18:54:10 +0200 Subject: [PATCH 430/583] add method allocate bucket to cluster --- pallets/ddc-customer-accounts/src/lib.rs | 26 ++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/pallets/ddc-customer-accounts/src/lib.rs b/pallets/ddc-customer-accounts/src/lib.rs index 30bfa9bce..f9d062b69 100644 --- a/pallets/ddc-customer-accounts/src/lib.rs +++ b/pallets/ddc-customer-accounts/src/lib.rs @@ -43,6 +43,7 @@ pub struct UnlockChunk { pub struct Bucket { bucket_id: u128, owner_id: AccountId, + cluster_id: Option, public_availability: bool, resources_reserved: u128, } @@ -198,12 +199,16 @@ pub mod pallet { pub enum Error { /// Not a owner account. NotOwner, + /// Not an owner of bucket + NotBucketOwner, /// Owner is already bonded. AlreadyPaired, /// Cannot deposit dust InsufficientDeposit, /// Can not schedule more unlock chunks. NoMoreChunks, + /// Bucket with speicifed id doesn't exist. + NoBucketWithId, /// Internal state has become somehow corrupted and the operation cannot continue. BadState, /// Current era not set during runtime @@ -250,6 +255,7 @@ pub mod pallet { let bucket = Bucket { bucket_id: cur_bucket_id + 1, owner_id: bucket_owner, + cluster_id: None, public_availability, resources_reserved, }; @@ -259,6 +265,26 @@ pub mod pallet { Ok(()) } + /// Allocates specified bucket into specified cluster + /// + /// Only bucket owner can call this method + #[pallet::weight(10_000)] + pub fn allocate_bucket_to_cluster( + origin: OriginFor, + bucket_id: u128, + cluster_id: u128, + ) -> DispatchResult { + let bucket_owner = ensure_signed(origin)?; + + let mut bucket = Self::buckets(bucket_id).ok_or(Error::::NoBucketWithId)?; + + ensure!(bucket.owner_id == bucket_owner, Error::::NotBucketOwner); + + bucket.cluster_id = Some(cluster_id); + + Ok(()) + } + /// Take the origin account as a owner and lock up `value` of its balance. `Owner` will /// be the account that controls it. /// From 4844239ce7eb6b374e9a6f21b61da4618196cd49 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 25 Oct 2023 19:03:34 +0200 Subject: [PATCH 431/583] update pallet name --- pallets/ddc-validator/src/mock.rs | 4 ++-- pallets/ddc-validator/src/tests.rs | 2 +- runtime/cere-dev/src/lib.rs | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index 085469277..026a844db 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -41,7 +41,7 @@ frame_support::construct_runtime!( Timestamp: pallet_timestamp, Session: pallet_session, Staking: pallet_staking, - DdcAccounts: pallet_ddc_accounts, + DdcAccounts: pallet_ddc_customer_accounts, DdcStaking: pallet_ddc_staking, RandomnessCollectiveFlip: pallet_randomness_collective_flip, DdcValidator: pallet_ddc_validator, @@ -242,7 +242,7 @@ parameter_types! { pub const DdcAccountsPalletId: PalletId = PalletId(*b"accounts"); } -impl pallet_ddc_accounts::Config for Test { +impl pallet_ddc_customer_accounts::Config for Test { type BondingDuration = BondingDuration; type Currency = Balances; type RuntimeEvent = RuntimeEvent; diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index fc537b88a..5fa240a5f 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -8,7 +8,7 @@ use crate::{ use codec::Decode; use ddc_primitives::{CDNNodePubKey, NodePubKey}; use frame_support::{assert_noop, assert_ok}; -use pallet_ddc_accounts::{BucketsDetails, Error as AccountsError}; +use pallet_ddc_customer_accounts::{BucketsDetails, Error as AccountsError}; use pallet_ddc_staking::{DDC_ERA_DURATION_MS, DDC_ERA_START_MS}; use sp_core::offchain::{testing, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt}; use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 3279c7529..65baf978d 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -48,8 +48,8 @@ pub use node_primitives::{AccountId, Signature}; use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; pub use pallet_cere_ddc; pub use pallet_chainbridge; -pub use pallet_ddc_accounts; pub use pallet_ddc_clusters; +pub use pallet_ddc_customer_accounts; pub use pallet_ddc_metrics_offchain_worker; pub use pallet_ddc_nodes; pub use pallet_ddc_staking; @@ -1340,7 +1340,7 @@ parameter_types! { pub const DdcAccountsPalletId: PalletId = PalletId(*b"accounts"); // DDC maintainer's stake } -impl pallet_ddc_accounts::Config for Runtime { +impl pallet_ddc_customer_accounts::Config for Runtime { type BondingDuration = BondingDuration; type Currency = Balances; type PalletId = DdcAccountsPalletId; @@ -1425,7 +1425,7 @@ construct_runtime!( DdcMetricsOffchainWorker: pallet_ddc_metrics_offchain_worker::{Pallet, Call, Storage, Event}, DdcStaking: pallet_ddc_staking, DdcValidator: pallet_ddc_validator, - DdcAccounts: pallet_ddc_accounts, + DdcAccounts: pallet_ddc_customer_accounts, DdcNodes: pallet_ddc_nodes, DdcClusters: pallet_ddc_clusters } From 27e6661ebecbd036ae9bfb26d86c773e2cec9d5e Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 26 Oct 2023 11:25:00 +0600 Subject: [PATCH 432/583] New `fast_chill` call in `ddc-clusters` --- pallets/ddc-clusters/src/lib.rs | 36 +++++++++++++++++++++++++++++++++ pallets/ddc-staking/src/lib.rs | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index e4131c0fe..482c0ce49 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -73,6 +73,11 @@ pub mod pallet { OnlyClusterManager, NotAuthorized, NoStake, + /// Conditions for fast chill are not met, try the regular `chill` from + /// `pallet-ddc-staking`. + FastChillProhibited, + /// Cluster candidate should not plan to chill. + ChillingProhibited, } #[pallet::storage] @@ -201,5 +206,36 @@ pub mod pallet { Ok(()) } + + /// Allow cluster node candidate to chill in the next DDC era. + /// + /// The dispatch origin for this call must be _Signed_ by the controller. + #[pallet::weight(10_000)] + pub fn fast_chill(origin: OriginFor) -> DispatchResult { + let controller = ensure_signed(origin)?; + + let stash = >::ledger(&controller) + .ok_or(>::NotController)? + .stash; + let node = >::iter() + .find(|(_, v)| *v == stash) + .ok_or(>::BadState)? + .0; + let cluster = >::edges(&stash) + .or(>::storages(&stash)) + .ok_or(Error::::NoStake)?; + let is_cluster_node = ClustersNodes::::get(cluster, node); + ensure!(!is_cluster_node, Error::::FastChillProhibited); + + let can_chill_from = >::current_era().unwrap_or(0) + 1; + >::chill_stash_soon( + &stash, + &controller, + cluster, + can_chill_from, + ); + + Ok(()) + } } } diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index c349b3271..be39bc668 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -1030,7 +1030,7 @@ pub mod pallet { } /// Note a desire of a stash account to chill soon. - fn chill_stash_soon( + pub fn chill_stash_soon( stash: &T::AccountId, controller: &T::AccountId, cluster: ClusterId, From 24759f06a64ee6eef2cca6e1f9269cf14c445abd Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 26 Oct 2023 11:27:01 +0600 Subject: [PATCH 433/583] Reject cluster node candidates planning to chill --- pallets/ddc-clusters/src/lib.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 482c0ce49..16e4f7d88 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -131,6 +131,7 @@ pub mod pallet { .map_err(|_| Error::::AttemptToAddNonExistentNode)?; ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAlreadyAssigned); + // Cluster extension smart contract allows joining. let is_authorized: bool = pallet_contracts::Pallet::::bare_call( caller_id, cluster.props.node_provider_auth_contract, @@ -146,6 +147,7 @@ pub mod pallet { .is_some_and(|x| *x == 1); ensure!(is_authorized, Error::::NotAuthorized); + // Sufficient funds are locked at the DDC Staking module. let node_provider_stash = >::nodes(&node_pub_key).ok_or(Error::::NoStake)?; let maybe_edge_in_cluster = @@ -157,6 +159,16 @@ pub mod pallet { .is_some_and(|staking_cluster| staking_cluster == cluster_id); ensure!(has_stake, Error::::NoStake); + // Candidate is not planning to pause operations any time soon. + let node_provider_controller = + >::bonded(&node_provider_stash) + .ok_or(>::BadState)?; + let chilling = >::ledger(&node_provider_controller) + .ok_or(>::BadState)? + .chilling + .is_some(); + ensure!(!chilling, Error::::ChillingProhibited); + node.set_cluster_id(Some(cluster_id.clone())); T::NodeRepository::update(node).map_err(|_| Error::::AttemptToAddNonExistentNode)?; ClustersNodes::::insert(cluster_id.clone(), node_pub_key.clone(), true); From 14ee9a8eacd42c89b1521bd85424aea6dce43aa3 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Thu, 26 Oct 2023 11:30:07 +0600 Subject: [PATCH 434/583] Bump `cere-dev` runtime `spec_version` --- runtime/cere-dev/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 3279c7529..a44edc47f 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -130,7 +130,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: 48009, + spec_version: 48010, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, From 0b5ab3175927e45a214ed53f6b974f2810c90b07 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 26 Oct 2023 16:00:07 +0200 Subject: [PATCH 435/583] update type for ClusterId and check cluster exists when allocating bucket --- Cargo.lock | 1417 +++++++++++----------- pallets/ddc-customer-accounts/Cargo.toml | 4 + pallets/ddc-customer-accounts/src/lib.rs | 14 +- pallets/ddc-staking/src/lib.rs | 4 +- 4 files changed, 756 insertions(+), 683 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c24b3b135..e04480f9b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,11 +23,11 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli 0.27.3", + "gimli 0.28.0", ] [[package]] @@ -73,9 +73,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ "getrandom 0.2.10", "once_cell", @@ -84,9 +84,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -146,9 +146,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.72" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "approx" @@ -211,20 +211,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 2.5.3", "futures-core", ] [[package]] name = "async-executor" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" +checksum = "4b0c4a4f319e45986f347ee47fef8bf5e81c9abc3f6f58dc2391439f30df65f0" dependencies = [ "async-lock", "async-task", "concurrent-queue", - "fastrand", + "fastrand 2.0.1", "futures-lite", "slab", ] @@ -258,36 +258,53 @@ dependencies = [ "log", "parking", "polling", - "rustix 0.37.23", + "rustix 0.37.26", "slab", - "socket2 0.4.9", + "socket2 0.4.10", "waker-fn", ] [[package]] name = "async-lock" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ - "event-listener", + "event-listener 2.5.3", ] [[package]] name = "async-process" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" dependencies = [ "async-io", "async-lock", - "autocfg", + "async-signal", "blocking", "cfg-if", - "event-listener", + "event-listener 3.0.0", "futures-lite", - "rustix 0.37.23", - "signal-hook", + "rustix 0.38.20", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-signal" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a5415b7abcdc9cd7d63d6badba5288b2ca017e3fbd4173b8f405449f1a2399" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 0.38.20", + "signal-hook-registry", + "slab", "windows-sys 0.48.0", ] @@ -312,7 +329,7 @@ dependencies = [ "log", "memchr", "once_cell", - "pin-project-lite 0.2.10", + "pin-project-lite 0.2.13", "pin-utils", "slab", "wasm-bindgen-futures", @@ -329,45 +346,45 @@ dependencies = [ "futures-io", "futures-util", "pin-utils", - "socket2 0.4.9", + "socket2 0.4.10", "trust-dns-resolver", ] [[package]] name = "async-task" -version = "4.4.0" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" +checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" [[package]] name = "async-trait" -version = "0.1.71" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] name = "asynchronous-codec" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06a0daa378f5fd10634e44b0a29b2a87b890657658e072a30d6f26e57ddee182" +checksum = "4057f2c32adbb2fc158e22fb38433c8e9bbf76b75a4732c7c0cbaf695fb65568" dependencies = [ "bytes", "futures-sink", "futures-util", "memchr", - "pin-project-lite 0.2.10", + "pin-project-lite 0.2.13", ] [[package]] name = "atomic-waker" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "atty" @@ -388,16 +405,16 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ - "addr2line 0.20.0", + "addr2line 0.21.0", "cc", "cfg-if", "libc", "miniz_oxide", - "object 0.31.1", + "object 0.32.1", "rustc-demangle", ] @@ -427,9 +444,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.2" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "base64ct" @@ -473,13 +490,13 @@ dependencies = [ "lazy_static", "lazycell", "peeking_take_while", - "prettyplease 0.2.10", + "prettyplease 0.2.15", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] @@ -490,9 +507,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "bitvec" @@ -527,31 +544,31 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", "arrayvec 0.7.4", - "constant_time_eq 0.2.6", + "constant_time_eq 0.3.0", ] [[package]] name = "blake2s_simd" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637f448b9e61dfadbdcbae9a885fadee1f3eaffb1f8d3c1965d3ade8bdfd44f" +checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae" dependencies = [ "arrayref", "arrayvec 0.7.4", - "constant_time_eq 0.2.6", + "constant_time_eq 0.3.0", ] [[package]] name = "blake3" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "199c42ab6972d92c9f8995f086273d25c42fc0f7b2a1fcefba465c1352d25ba5" +checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" dependencies = [ "arrayref", "arrayvec 0.7.4", @@ -601,17 +618,18 @@ dependencies = [ [[package]] name = "blocking" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" +checksum = "8c36a4d0d48574b3dd360b4b7d95cc651d2b6557b6402848a27d4b228a473e2a" dependencies = [ "async-channel", "async-lock", "async-task", - "atomic-waker", - "fastrand", + "fastrand 2.0.1", + "futures-io", "futures-lite", - "log", + "piper", + "tracing", ] [[package]] @@ -622,9 +640,9 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bstr" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +checksum = "c79ad7fb2dd38f3dabd76b09c6a5a20c038fc0213ef1e9afd30eb777f120f019" dependencies = [ "memchr", "serde", @@ -641,9 +659,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byte-slice-cast" @@ -659,15 +677,15 @@ checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "bzip2-sys" @@ -691,9 +709,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" +checksum = "12024c4645c97566567129c204f65d5815a8c9aecf30fcbe682b2fe034996d36" dependencies = [ "serde", ] @@ -706,18 +724,19 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", - "semver 1.0.18", + "semver 1.0.20", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", ] [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -810,8 +829,8 @@ dependencies = [ "pallet-contracts", "pallet-contracts-primitives", "pallet-contracts-rpc-runtime-api", - "pallet-ddc-accounts", "pallet-ddc-clusters", + "pallet-ddc-customer-accounts", "pallet-ddc-metrics-offchain-worker", "pallet-ddc-nodes", "pallet-ddc-staking", @@ -1122,17 +1141,16 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", - "time", "wasm-bindgen", - "winapi", + "windows-targets", ] [[package]] @@ -1188,7 +1206,7 @@ dependencies = [ "bitflags 1.3.2", "clap_derive", "clap_lex", - "indexmap", + "indexmap 1.9.3", "once_cell", "strsim", "termcolor", @@ -1239,9 +1257,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" dependencies = [ "crossbeam-utils", ] @@ -1258,12 +1276,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" -[[package]] -name = "constant_time_eq" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" - [[package]] name = "constant_time_eq" version = "0.3.0" @@ -1306,9 +1318,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "3fbc60abd742b35f2492f808e1abbb83d45f72db402e14c55057edc9c7b1e9e4" dependencies = [ "libc", ] @@ -1420,16 +1432,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - [[package]] name = "crossbeam-deque" version = "0.8.3" @@ -1569,18 +1571,31 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.0.0-rc.1" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d4ba9852b42210c7538b75484f9daa0655e9a3ac04f693747bb0f02cf3cfe16" +checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" dependencies = [ "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", "fiat-crypto", - "packed_simd_2", - "platforms 3.0.2", + "platforms 3.1.2", + "rustc_version 0.4.0", "subtle", "zeroize", ] +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "data-encoding" version = "2.4.0" @@ -1759,9 +1774,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" +checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" [[package]] name = "ecdsa" @@ -1805,7 +1820,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ "curve25519-dalek 3.2.0", - "hashbrown", + "hashbrown 0.12.3", "hex", "rand_core 0.6.4", "sha2 0.9.9", @@ -1814,9 +1829,9 @@ dependencies = [ [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" @@ -1850,22 +1865,22 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" +checksum = "5998b4f30320c9d93aed72f63af821bfdac50465b75428fce77b48ec482c3939" dependencies = [ "enumflags2_derive", ] [[package]] name = "enumflags2_derive" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" +checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] @@ -1900,6 +1915,12 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.2.8" @@ -1913,11 +1934,10 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.1" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" dependencies = [ - "errno-dragonfly", "libc", "windows-sys 0.48.0", ] @@ -1938,6 +1958,17 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29e56284f00d94c1bc7fd3c77027b4623c88c1f53d8d2394c6199f2921dea325" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite 0.2.13", +] + [[package]] name = "exit-future" version = "0.2.0" @@ -1968,6 +1999,12 @@ dependencies = [ "instant", ] +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + [[package]] name = "fdlimit" version = "0.2.1" @@ -1989,9 +2026,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.1.20" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" +checksum = "d0870c84016d4b481be5c9f323c24f65e31e901ae618f0e80f4308fb00de1d2d" [[package]] name = "file-per-thread-logger" @@ -2005,13 +2042,13 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.21" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", + "redox_syscall 0.3.5", "windows-sys 0.48.0", ] @@ -2051,9 +2088,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "libz-sys", @@ -2069,7 +2106,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", ] @@ -2086,7 +2123,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2109,7 +2146,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -2139,7 +2176,7 @@ dependencies = [ "sc-service", "sc-sysinfo", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "serde_nanos", "sp-api", "sp-blockchain", @@ -2160,7 +2197,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2171,7 +2208,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2187,7 +2224,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2216,7 +2253,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2248,7 +2285,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "cfg-expr", @@ -2262,7 +2299,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2274,7 +2311,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -2284,7 +2321,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "log", @@ -2302,7 +2339,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -2317,7 +2354,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -2326,7 +2363,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "parity-scale-codec", @@ -2424,12 +2461,12 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ - "fastrand", + "fastrand 1.9.0", "futures-core", "futures-io", "memchr", "parking", - "pin-project-lite 0.2.10", + "pin-project-lite 0.2.13", "waker-fn", ] @@ -2441,7 +2478,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] @@ -2486,7 +2523,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.10", + "pin-project-lite 0.2.13", "pin-utils", "slab", ] @@ -2570,15 +2607,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" dependencies = [ "fallible-iterator", - "indexmap", + "indexmap 1.9.3", "stable_deref_trait", ] [[package]] name = "gimli" -version = "0.27.3" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "glob" @@ -2588,9 +2625,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1391ab1f92ffcc08911957149833e682aa3fe252b9f45f966d2ef972274c97df" +checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" dependencies = [ "aho-corasick", "bstr", @@ -2624,9 +2661,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.20" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ "bytes", "fnv", @@ -2634,7 +2671,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -2643,15 +2680,15 @@ dependencies = [ [[package]] name = "handlebars" -version = "4.3.7" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c3372087601b532857d332f5957cbae686da52bb7810bf038c3e3c3cc2fa0d" +checksum = "c39b3bc2a8f715298032cf5087e58573809374b08160aa7d750582bdb82d2683" dependencies = [ "log", "pest", "pest_derive", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "thiserror", ] @@ -2679,6 +2716,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" + [[package]] name = "heck" version = "0.4.1" @@ -2696,9 +2739,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "hex" @@ -2749,6 +2792,15 @@ dependencies = [ "hmac 0.8.1", ] +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "hostname" version = "0.3.1" @@ -2779,7 +2831,7 @@ checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", "http", - "pin-project-lite 0.2.10", + "pin-project-lite 0.2.13", ] [[package]] @@ -2790,9 +2842,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" @@ -2816,8 +2868,8 @@ dependencies = [ "httparse", "httpdate", "itoa 1.0.9", - "pin-project-lite 0.2.10", - "socket2 0.4.9", + "pin-project-lite 0.2.13", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -2841,16 +2893,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows 0.48.0", + "windows-core", ] [[package]] @@ -2908,7 +2960,7 @@ dependencies = [ "log", "rtnetlink", "system-configuration", - "windows 0.34.0", + "windows", ] [[package]] @@ -2947,10 +2999,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", "serde", ] +[[package]] +name = "indexmap" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +dependencies = [ + "equivalent", + "hashbrown 0.14.2", +] + [[package]] name = "inout" version = "0.1.3" @@ -2990,7 +3052,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.2", + "hermit-abi 0.3.3", "libc", "windows-sys 0.48.0", ] @@ -3007,7 +3069,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.3", + "socket2 0.5.5", "widestring", "windows-sys 0.48.0", "winreg", @@ -3015,9 +3077,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" @@ -3025,8 +3087,8 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi 0.3.2", - "rustix 0.38.4", + "hermit-abi 0.3.3", + "rustix 0.38.20", "windows-sys 0.48.0", ] @@ -3053,9 +3115,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] @@ -3128,7 +3190,7 @@ dependencies = [ "rand 0.8.5", "rustc-hash", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "soketto", "thiserror", "tokio", @@ -3149,7 +3211,7 @@ dependencies = [ "jsonrpsee-core", "jsonrpsee-types", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "tokio", "tracing", "tracing-futures", @@ -3176,7 +3238,7 @@ dependencies = [ "anyhow", "beef", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "thiserror", "tracing", ] @@ -3204,7 +3266,7 @@ dependencies = [ "http", "jsonrpsee-core", "jsonrpsee-types", - "serde_json 1.0.103", + "serde_json 1.0.107", "soketto", "tokio", "tokio-stream", @@ -3296,9 +3358,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" [[package]] name = "libloading" @@ -3322,15 +3384,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" - -[[package]] -name = "libm" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libp2p" @@ -3420,9 +3476,9 @@ dependencies = [ "prost 0.10.4", "prost-build 0.10.4", "rand 0.8.5", - "ring", + "ring 0.16.20", "rw-stream-sink", - "sha2 0.10.7", + "sha2 0.10.8", "smallvec", "thiserror", "unsigned-varint", @@ -3496,7 +3552,7 @@ dependencies = [ "prost-build 0.10.4", "rand 0.7.3", "regex", - "sha2 0.10.7", + "sha2 0.10.8", "smallvec", "unsigned-varint", "wasm-timer", @@ -3543,7 +3599,7 @@ dependencies = [ "prost 0.10.4", "prost-build 0.10.4", "rand 0.7.3", - "sha2 0.10.7", + "sha2 0.10.8", "smallvec", "thiserror", "uint", @@ -3568,7 +3624,7 @@ dependencies = [ "log", "rand 0.8.5", "smallvec", - "socket2 0.4.9", + "socket2 0.4.10", "void", ] @@ -3621,7 +3677,7 @@ dependencies = [ "prost 0.10.4", "prost-build 0.10.4", "rand 0.8.5", - "sha2 0.10.7", + "sha2 0.10.8", "snow", "static_assertions", "x25519-dalek", @@ -3718,7 +3774,7 @@ dependencies = [ "prost 0.10.4", "prost-build 0.10.4", "rand 0.8.5", - "sha2 0.10.7", + "sha2 0.10.8", "thiserror", "unsigned-varint", "void", @@ -3786,7 +3842,7 @@ dependencies = [ "libc", "libp2p-core", "log", - "socket2 0.4.9", + "socket2 0.4.10", ] [[package]] @@ -3912,9 +3968,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.9" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" +checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" dependencies = [ "cc", "pkg-config", @@ -3960,9 +4016,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.3" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" +checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" [[package]] name = "lite-json" @@ -3984,9 +4040,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -3994,9 +4050,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" dependencies = [ "value-bag", ] @@ -4007,7 +4063,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" dependencies = [ - "hashbrown", + "hashbrown 0.12.3", ] [[package]] @@ -4071,9 +4127,9 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "matrixmultiply" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" dependencies = [ "autocfg", "rawpointer", @@ -4081,17 +4137,17 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memfd" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e" +checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix 0.37.23", + "rustix 0.38.20", ] [[package]] @@ -4128,7 +4184,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6566c70c1016f525ced45d7b7f97730a2bafb037c788211d0c186ef5b2189f0a" dependencies = [ "hash-db", - "hashbrown", + "hashbrown 0.12.3", "parity-util-mem", ] @@ -4167,9 +4223,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -4217,7 +4273,7 @@ dependencies = [ "core2", "digest 0.10.7", "multihash-derive", - "sha2 0.10.7", + "sha2 0.10.8", "sha3", "unsigned-varint", ] @@ -4374,7 +4430,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system", "parity-scale-codec", @@ -4419,9 +4475,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -4430,9 +4486,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" dependencies = [ "num-traits", ] @@ -4476,19 +4532,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", - "num-bigint 0.4.3", + "num-bigint 0.4.4", "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", - "libm 0.2.7", + "libm", ] [[package]] @@ -4497,7 +4553,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.2", + "hermit-abi 0.3.3", "libc", ] @@ -4508,16 +4564,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" dependencies = [ "crc32fast", - "hashbrown", - "indexmap", + "hashbrown 0.12.3", + "indexmap 1.9.3", "memchr", ] [[package]] name = "object" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] @@ -4548,9 +4604,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "os_str_bytes" -version = "6.5.1" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] name = "output_vt100" @@ -4570,20 +4626,10 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "packed_simd_2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" -dependencies = [ - "cfg-if", - "libm 0.1.4", -] - [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4599,7 +4645,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4614,7 +4660,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4638,7 +4684,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4658,7 +4704,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4673,7 +4719,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4724,7 +4770,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4743,7 +4789,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4760,7 +4806,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4788,7 +4834,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -4803,7 +4849,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -4813,7 +4859,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-contracts-primitives", @@ -4830,7 +4876,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -4841,42 +4887,44 @@ dependencies = [ ] [[package]] -name = "pallet-ddc-accounts" -version = "0.1.0" +name = "pallet-ddc-clusters" +version = "4.8.1" dependencies = [ + "ddc-primitives", + "frame-benchmarking", "frame-support", "frame-system", "log", + "pallet-contracts", + "pallet-ddc-nodes", "pallet-ddc-staking", "parity-scale-codec", "scale-info", + "sp-core", "sp-io", "sp-runtime", "sp-staking", "sp-std", + "sp-tracing", "substrate-test-utils", ] [[package]] -name = "pallet-ddc-clusters" -version = "4.8.1" +name = "pallet-ddc-customer-accounts" +version = "0.1.0" dependencies = [ "ddc-primitives", - "frame-benchmarking", "frame-support", "frame-system", "log", - "pallet-contracts", - "pallet-ddc-nodes", + "pallet-ddc-clusters", "pallet-ddc-staking", "parity-scale-codec", "scale-info", - "sp-core", "sp-io", "sp-runtime", "sp-staking", "sp-std", - "sp-tracing", "substrate-test-utils", ] @@ -4954,7 +5002,7 @@ version = "0.1.0" dependencies = [ "alt_serde", "array-bytes 6.1.0", - "base64 0.21.2", + "base64 0.21.5", "ddc-primitives", "frame-election-provider-support", "frame-support", @@ -4963,7 +5011,7 @@ dependencies = [ "log", "pallet-balances", "pallet-contracts", - "pallet-ddc-accounts", + "pallet-ddc-customer-accounts", "pallet-ddc-staking", "pallet-randomness-collective-flip", "pallet-session", @@ -4985,7 +5033,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5001,7 +5049,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5025,7 +5073,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5038,7 +5086,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5094,7 +5142,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5115,7 +5163,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5138,7 +5186,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5154,7 +5202,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5174,7 +5222,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5191,7 +5239,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5208,7 +5256,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5223,7 +5271,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5240,7 +5288,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5260,7 +5308,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -5270,7 +5318,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5287,7 +5335,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5310,7 +5358,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5325,7 +5373,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5339,7 +5387,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5354,7 +5402,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5370,7 +5418,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5391,7 +5439,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5407,7 +5455,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5421,7 +5469,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5444,7 +5492,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5455,7 +5503,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5469,7 +5517,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5487,7 +5535,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5506,7 +5554,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5522,7 +5570,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5537,7 +5585,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5548,7 +5596,7 @@ dependencies = [ [[package]] name = "pallet-transaction-storage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5566,7 +5614,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5583,7 +5631,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5599,7 +5647,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5632,9 +5680,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.3" +version = "3.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756d439303e94fae44f288ba881ad29670c65b0c4b0e05674ca81061bb65f2c5" +checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" dependencies = [ "arrayvec 0.7.4", "bitvec", @@ -5647,9 +5695,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.3" +version = "3.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d884d78fcf214d70b1e239fcd1c6e5e95aa3be1881918da2e488cc946c7a476" +checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5670,7 +5718,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c32561d248d352148124f036cac253a644685a21dc9fea383eb4907d7bd35a8f" dependencies = [ "cfg-if", - "hashbrown", + "hashbrown 0.12.3", "impl-trait-for-tuples", "parity-util-mem-derive", "parking_lot 0.12.1", @@ -5707,9 +5755,9 @@ checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "parking" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" @@ -5729,7 +5777,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.8", + "parking_lot_core 0.9.9", ] [[package]] @@ -5748,13 +5796,13 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall 0.4.1", "smallvec", "windows-targets", ] @@ -5797,19 +5845,20 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.0" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73935e4d55e2abf7f130186537b19e7a4abc886a0252380b59248af473a3fc9" +checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.0" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef623c9bbfa0eedf5a0efba11a5ee83209c326653ca31ff019bec3a95bfff2b" +checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" dependencies = [ "pest", "pest_generator", @@ -5817,56 +5866,56 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.0" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e8cba4ec22bada7fc55ffe51e2deb6a0e0db2d0b7ab0b103acc80d2510c190" +checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] name = "pest_meta" -version = "2.7.0" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01f71cb40bd8bb94232df14b946909e14660e33fc05db3e50ae2a82d7ea0ca0" +checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" dependencies = [ "once_cell", "pest", - "sha2 0.10.7", + "sha2 0.10.8", ] [[package]] name = "petgraph" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap", + "indexmap 2.0.2", ] [[package]] name = "pin-project" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] @@ -5877,9 +5926,9 @@ checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -5887,6 +5936,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.1", + "futures-io", +] + [[package]] name = "pkcs8" version = "0.8.0" @@ -5912,9 +5972,9 @@ checksum = "e8d0eef3571242013a0d5dc84861c3ae4a652e56e12adf8bdc26ff5f8cb34c94" [[package]] name = "platforms" -version = "3.0.2" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" +checksum = "4503fa043bf02cee09a9582e9554b4c6403b2ef55e4612e96561d294419429f8" [[package]] name = "polling" @@ -5928,7 +5988,7 @@ dependencies = [ "concurrent-queue", "libc", "log", - "pin-project-lite 0.2.10", + "pin-project-lite 0.2.13", "windows-sys 0.48.0", ] @@ -5985,12 +6045,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.10" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92139198957b410250d43fad93e630d956499a625c527eda65175c8680f83387" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] @@ -6042,9 +6102,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] @@ -6236,9 +6296,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.31" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -6357,9 +6417,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" dependencies = [ "either", "rayon-core", @@ -6367,14 +6427,12 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] @@ -6395,6 +6453,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_users" version = "0.4.3" @@ -6408,22 +6475,22 @@ dependencies = [ [[package]] name = "ref-cast" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1641819477c319ef452a075ac34a4be92eb9ba09f6841f62d594d50fdcf0bf6b" +checksum = "acde58d073e9c79da00f2b5b84eed919c8326832648a5b109b3fce1bb1175280" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bf53dad9b6086826722cdc99140793afd9f62faa14a1ad07eb4f955e7a7216" +checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] @@ -6440,14 +6507,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.3", - "regex-syntax 0.7.4", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -6461,13 +6528,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.3" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-syntax 0.8.2", ] [[package]] @@ -6478,21 +6545,21 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "env_logger 0.9.3", "jsonrpsee", "log", "parity-scale-codec", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "sp-core", "sp-io", "sp-runtime", @@ -6529,12 +6596,26 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +dependencies = [ + "cc", + "getrandom 0.2.10", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] + [[package]] name = "rocksdb" version = "0.18.0" @@ -6614,14 +6695,14 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.18", + "semver 1.0.20", ] [[package]] name = "rustix" -version = "0.35.14" +version = "0.35.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6380889b07a03b5ecf1d44dc9ede6fd2145d84b502a2a9ca0b03c48e0cc3220f" +checksum = "413c4d41e2f1b0814c63567d11618483de0bd64f451b452f2ca43896579486ba" dependencies = [ "bitflags 1.3.2", "errno 0.2.8", @@ -6633,12 +6714,12 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.23" +version = "0.37.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +checksum = "84f3f8f960ed3b5a59055428714943298bf3fa2d4a1d53135084e0544829d995" dependencies = [ "bitflags 1.3.2", - "errno 0.3.1", + "errno 0.3.5", "io-lifetimes 1.0.11", "libc", "linux-raw-sys 0.3.8", @@ -6647,25 +6728,25 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.4" +version = "0.38.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" +checksum = "67ce50cb2e16c2903e30d1cbccfd8387a74b9d4c938b6a4c5ec6cc7556f7a8a0" dependencies = [ - "bitflags 2.3.3", - "errno 0.3.1", + "bitflags 2.4.1", + "errno 0.3.5", "libc", - "linux-raw-sys 0.4.3", + "linux-raw-sys 0.4.10", "windows-sys 0.48.0", ] [[package]] name = "rustls" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" dependencies = [ "log", - "ring", + "ring 0.16.20", "sct", "webpki", ] @@ -6688,7 +6769,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.2", + "base64 0.21.5", ] [[package]] @@ -6744,7 +6825,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -6755,7 +6836,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6782,7 +6863,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -6805,7 +6886,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6821,7 +6902,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6830,7 +6911,7 @@ dependencies = [ "sc-network-common", "sc-telemetry", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "sp-core", "sp-runtime", ] @@ -6838,7 +6919,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6849,7 +6930,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -6873,7 +6954,7 @@ dependencies = [ "sc-tracing", "sc-utils", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "sp-blockchain", "sp-core", "sp-keyring", @@ -6889,7 +6970,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fnv", "futures", @@ -6917,7 +6998,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "kvdb", @@ -6942,7 +7023,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6966,7 +7047,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "fork-tree", @@ -7008,7 +7089,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7030,7 +7111,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -7043,7 +7124,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -7067,7 +7148,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sc-client-api", "sp-authorship", @@ -7078,7 +7159,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "lru", @@ -7105,7 +7186,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -7121,7 +7202,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7136,7 +7217,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cfg-if", "libc", @@ -7144,7 +7225,7 @@ dependencies = [ "once_cell", "parity-scale-codec", "parity-wasm 0.45.0", - "rustix 0.35.14", + "rustix 0.35.15", "sc-allocator", "sc-executor-common", "sp-runtime-interface", @@ -7156,7 +7237,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "array-bytes 4.2.0", @@ -7180,7 +7261,7 @@ dependencies = [ "sc-network-gossip", "sc-telemetry", "sc-utils", - "serde_json 1.0.103", + "serde_json 1.0.107", "sp-api", "sp-application-crypto", "sp-arithmetic", @@ -7197,7 +7278,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "futures", @@ -7208,7 +7289,7 @@ dependencies = [ "sc-finality-grandpa", "sc-rpc", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "sp-blockchain", "sp-core", "sp-runtime", @@ -7218,7 +7299,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7235,12 +7316,12 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "async-trait", "parking_lot 0.12.1", - "serde_json 1.0.103", + "serde_json 1.0.107", "sp-application-crypto", "sp-core", "sp-keystore", @@ -7250,7 +7331,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -7281,7 +7362,7 @@ dependencies = [ "sc-peerset", "sc-utils", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "smallvec", "sp-arithmetic", "sp-blockchain", @@ -7297,7 +7378,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cid", "futures", @@ -7317,7 +7398,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7343,7 +7424,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "futures", @@ -7361,7 +7442,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -7382,7 +7463,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "fork-tree", @@ -7410,7 +7491,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -7429,7 +7510,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -7459,20 +7540,20 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libp2p", "log", "sc-utils", - "serde_json 1.0.103", + "serde_json 1.0.107", "wasm-timer", ] [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7481,7 +7562,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "hash-db", @@ -7496,7 +7577,7 @@ dependencies = [ "sc-tracing", "sc-transaction-pool-api", "sc-utils", - "serde_json 1.0.103", + "serde_json 1.0.107", "sp-api", "sp-blockchain", "sp-core", @@ -7511,7 +7592,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7522,7 +7603,7 @@ dependencies = [ "sc-transaction-pool-api", "scale-info", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "sp-core", "sp-rpc", "sp-runtime", @@ -7534,12 +7615,12 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", "log", - "serde_json 1.0.103", + "serde_json 1.0.107", "substrate-prometheus-endpoint", "tokio", ] @@ -7547,7 +7628,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "directories", @@ -7586,7 +7667,7 @@ dependencies = [ "sc-transaction-pool-api", "sc-utils", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "sp-api", "sp-application-crypto", "sp-block-builder", @@ -7617,7 +7698,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7631,7 +7712,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7641,7 +7722,7 @@ dependencies = [ "sc-consensus-epochs", "sc-finality-grandpa", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "sp-blockchain", "sp-runtime", "thiserror", @@ -7650,7 +7731,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libc", @@ -7660,7 +7741,7 @@ dependencies = [ "regex", "sc-telemetry", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "sp-core", "sp-io", "sp-std", @@ -7669,7 +7750,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "chrono", "futures", @@ -7679,7 +7760,7 @@ dependencies = [ "pin-project", "rand 0.7.3", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "thiserror", "wasm-timer", ] @@ -7687,7 +7768,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7718,7 +7799,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7729,7 +7810,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -7755,7 +7836,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -7768,7 +7849,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -7780,9 +7861,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" +checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" dependencies = [ "bitvec", "cfg-if", @@ -7794,9 +7875,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" +checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7833,18 +7914,18 @@ dependencies = [ [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring", - "untrusted", + "ring 0.17.5", + "untrusted 0.9.0", ] [[package]] @@ -7889,9 +7970,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -7902,9 +7983,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -7930,9 +8011,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" dependencies = [ "serde", ] @@ -7945,22 +8026,22 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.171" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" +checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.171" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" +checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] @@ -7975,9 +8056,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.103" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" dependencies = [ "itoa 1.0.9", "ryu", @@ -8033,9 +8114,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -8054,28 +8135,18 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] [[package]] name = "shlex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" - -[[package]] -name = "signal-hook" -version = "0.3.16" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b824b6e687aff278cdbf3b36f07aa52d4bd4099699324d5da86a2ebce3aa00b3" -dependencies = [ - "libc", - "signal-hook-registry", -] +checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" [[package]] name = "signal-hook-registry" @@ -8110,9 +8181,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -8125,9 +8196,9 @@ checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" [[package]] name = "smallvec" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "snap" @@ -8137,26 +8208,26 @@ checksum = "5e9f0ab6ef7eb7353d9119c170a436d1bf248eea575ac42d19d12f4e34130831" [[package]] name = "snow" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ccba027ba85743e09d15c03296797cad56395089b832b48b5a5217880f57733" +checksum = "0c9d1425eb528a21de2755c75af4c9b5d57f50a0d4c3b7f1828a4cd03f8ba155" dependencies = [ "aes-gcm", "blake2", "chacha20poly1305", - "curve25519-dalek 4.0.0-rc.1", + "curve25519-dalek 4.1.1", "rand_core 0.6.4", - "ring", + "ring 0.16.20", "rustc_version 0.4.0", - "sha2 0.10.7", + "sha2 0.10.8", "subtle", ] [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -8164,9 +8235,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys 0.48.0", @@ -8191,7 +8262,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8209,7 +8280,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "proc-macro-crate", @@ -8221,7 +8292,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8234,7 +8305,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "integer-sqrt", "num-traits", @@ -8249,7 +8320,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8262,7 +8333,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "parity-scale-codec", @@ -8274,7 +8345,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -8286,7 +8357,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -8304,7 +8375,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8323,7 +8394,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "merlin", @@ -8346,7 +8417,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8360,7 +8431,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8373,7 +8444,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "base58", @@ -8419,12 +8490,12 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "byteorder", "digest 0.10.7", - "sha2 0.10.7", + "sha2 0.10.8", "sha3", "sp-std", "twox-hash", @@ -8433,7 +8504,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8444,7 +8515,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8453,7 +8524,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8463,7 +8534,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -8474,7 +8545,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "log", @@ -8492,7 +8563,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8506,7 +8577,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "futures", @@ -8532,7 +8603,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "sp-core", @@ -8543,7 +8614,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8560,7 +8631,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "thiserror", "zstd", @@ -8569,7 +8640,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8583,7 +8654,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-core", @@ -8593,7 +8664,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "backtrace", "lazy_static", @@ -8603,7 +8674,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "rustc-hash", "serde", @@ -8613,7 +8684,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "either", "hash256-std-hasher", @@ -8636,7 +8707,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8654,7 +8725,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "proc-macro-crate", @@ -8666,7 +8737,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -8680,7 +8751,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8694,7 +8765,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8705,7 +8776,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8727,12 +8798,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8745,7 +8816,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -8758,7 +8829,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures-timer", @@ -8774,7 +8845,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-std", @@ -8786,7 +8857,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-runtime", @@ -8795,7 +8866,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "log", @@ -8811,11 +8882,11 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "hash-db", - "hashbrown", + "hashbrown 0.12.3", "lazy_static", "lru", "memory-db", @@ -8834,7 +8905,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8851,7 +8922,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8862,7 +8933,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "log", @@ -8875,7 +8946,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8894,6 +8965,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spki" version = "0.5.4" @@ -8906,16 +8983,16 @@ dependencies = [ [[package]] name = "ss58-registry" -version = "1.41.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfc443bad666016e012538782d9e3006213a7db43e9fb1dda91657dc06a6fa08" +checksum = "5e6915280e2d0db8911e5032a5c275571af6bdded2916abd691a659be25d3439" dependencies = [ "Inflector", "num-format", "proc-macro2", "quote", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "unicode-xid", ] @@ -9016,7 +9093,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "platforms 2.0.0", ] @@ -9024,7 +9101,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -9034,7 +9111,7 @@ dependencies = [ "sc-client-api", "sc-rpc-api", "sc-transaction-pool-api", - "serde_json 1.0.103", + "serde_json 1.0.107", "sp-api", "sp-block-builder", "sp-blockchain", @@ -9045,7 +9122,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures-util", "hyper", @@ -9058,7 +9135,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "log", @@ -9079,7 +9156,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "substrate-test-utils-derive", @@ -9089,7 +9166,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9100,7 +9177,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -9133,9 +9210,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.26" +version = "2.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" dependencies = [ "proc-macro2", "quote", @@ -9183,29 +9260,28 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8e77cb757a61f51b947ec4a7e3646efd825b73561db1c232a8ccb639e611a0" +checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" [[package]] name = "tempfile" -version = "3.6.0" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ - "autocfg", "cfg-if", - "fastrand", + "fastrand 2.0.1", "redox_syscall 0.3.5", - "rustix 0.37.23", + "rustix 0.38.20", "windows-sys 0.48.0", ] [[package]] name = "termcolor" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" dependencies = [ "winapi-util", ] @@ -9218,22 +9294,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.43" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.43" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] @@ -9272,17 +9348,6 @@ dependencies = [ "libc", ] -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - [[package]] name = "tiny-bip39" version = "0.8.2" @@ -9319,20 +9384,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.29.1" +version = "1.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" dependencies = [ - "autocfg", "backtrace", "bytes", "libc", "mio", "num_cpus", "parking_lot 0.12.1", - "pin-project-lite 0.2.10", + "pin-project-lite 0.2.13", "signal-hook-registry", - "socket2 0.4.9", + "socket2 0.5.5", "tokio-macros", "windows-sys 0.48.0", ] @@ -9345,7 +9409,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] @@ -9366,21 +9430,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" dependencies = [ "futures-core", - "pin-project-lite 0.2.10", + "pin-project-lite 0.2.13", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", "futures-io", "futures-sink", - "pin-project-lite 0.2.10", + "pin-project-lite 0.2.13", "tokio", "tracing", ] @@ -9402,32 +9466,31 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", - "pin-project-lite 0.2.10", + "pin-project-lite 0.2.13", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -9445,12 +9508,12 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] @@ -9477,7 +9540,7 @@ dependencies = [ "parking_lot 0.11.2", "regex", "serde", - "serde_json 1.0.103", + "serde_json 1.0.107", "sharded-slab", "smallvec", "thread_local", @@ -9494,7 +9557,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "004e1e8f92535694b4cb1444dc5a8073ecf0815e3357f729638b9f8fc4062908" dependencies = [ "hash-db", - "hashbrown", + "hashbrown 0.12.3", "log", "rustc-hex", "smallvec", @@ -9561,7 +9624,7 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "clap", "frame-try-runtime", @@ -9604,9 +9667,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" @@ -9628,9 +9691,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] @@ -9643,9 +9706,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -9658,9 +9721,9 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unicode-xid" @@ -9680,9 +9743,9 @@ dependencies = [ [[package]] name = "unsigned-varint" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" dependencies = [ "asynchronous-codec", "bytes", @@ -9696,6 +9759,12 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.4.1" @@ -9715,9 +9784,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92ccd67fb88503048c01b59152a04effd0782d035a83a6d256ce6085f08f4a3" +checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe" [[package]] name = "vcpkg" @@ -9739,15 +9808,15 @@ checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] name = "waker-fn" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -9768,12 +9837,6 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -9801,7 +9864,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", "wasm-bindgen-shared", ] @@ -9835,7 +9898,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -9908,7 +9971,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57d20cb3c59b788653d99541c646c561c9dd26506f25c0cebfe810659c54c6d7" dependencies = [ "downcast-rs", - "libm 0.2.7", + "libm", "memory_units", "num-rational 0.4.1", "num-traits", @@ -9920,7 +9983,7 @@ version = "0.89.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5d3e08b13876f96dd55608d03cd4883a0545884932d5adf11925876c96daef" dependencies = [ - "indexmap", + "indexmap 1.9.3", ] [[package]] @@ -9932,7 +9995,7 @@ dependencies = [ "anyhow", "bincode", "cfg-if", - "indexmap", + "indexmap 1.9.3", "libc", "log", "object 0.29.0", @@ -9972,7 +10035,7 @@ dependencies = [ "directories-next", "file-per-thread-logger", "log", - "rustix 0.35.14", + "rustix 0.35.15", "serde", "sha2 0.9.9", "toml", @@ -10010,7 +10073,7 @@ dependencies = [ "anyhow", "cranelift-entity", "gimli 0.26.2", - "indexmap", + "indexmap 1.9.3", "log", "object 0.29.0", "serde", @@ -10035,7 +10098,7 @@ dependencies = [ "log", "object 0.29.0", "rustc-demangle", - "rustix 0.35.14", + "rustix 0.35.15", "serde", "target-lexicon", "thiserror", @@ -10053,7 +10116,7 @@ checksum = "f671b588486f5ccec8c5a3dba6b4c07eac2e66ab8c60e6f4e53717c77f709731" dependencies = [ "object 0.29.0", "once_cell", - "rustix 0.35.14", + "rustix 0.35.15", ] [[package]] @@ -10065,7 +10128,7 @@ dependencies = [ "anyhow", "cc", "cfg-if", - "indexmap", + "indexmap 1.9.3", "libc", "log", "mach", @@ -10073,7 +10136,7 @@ dependencies = [ "memoffset 0.6.5", "paste", "rand 0.8.5", - "rustix 0.35.14", + "rustix 0.35.15", "thiserror", "wasmtime-asm-macros", "wasmtime-environ", @@ -10105,12 +10168,12 @@ dependencies = [ [[package]] name = "webpki" -version = "0.22.0" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring", - "untrusted", + "ring 0.17.5", + "untrusted 0.9.0", ] [[package]] @@ -10124,13 +10187,14 @@ dependencies = [ [[package]] name = "which" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" dependencies = [ "either", - "libc", + "home", "once_cell", + "rustix 0.38.20", ] [[package]] @@ -10157,9 +10221,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -10184,10 +10248,10 @@ dependencies = [ ] [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ "windows-targets", ] @@ -10231,17 +10295,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -10252,9 +10316,9 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" @@ -10276,9 +10340,9 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" @@ -10300,9 +10364,9 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" @@ -10324,9 +10388,9 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" @@ -10348,9 +10412,9 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" @@ -10360,9 +10424,9 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" @@ -10384,9 +10448,9 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winreg" @@ -10449,7 +10513,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.38", ] [[package]] @@ -10473,11 +10537,10 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" +version = "2.0.9+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" dependencies = [ "cc", - "libc", "pkg-config", ] diff --git a/pallets/ddc-customer-accounts/Cargo.toml b/pallets/ddc-customer-accounts/Cargo.toml index 3f3ed6fcb..a0b59e62e 100644 --- a/pallets/ddc-customer-accounts/Cargo.toml +++ b/pallets/ddc-customer-accounts/Cargo.toml @@ -5,8 +5,10 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-ddc-clusters = { version = "4.7.0", default-features = false, path = "../ddc-clusters" } pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -22,6 +24,8 @@ substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/parity default = ["std"] std = [ "codec/std", + "ddc-primitives/std", + "pallet-ddc-clusters/std", "frame-support/std", "frame-system/std", "scale-info/std", diff --git a/pallets/ddc-customer-accounts/src/lib.rs b/pallets/ddc-customer-accounts/src/lib.rs index f9d062b69..fa970cc61 100644 --- a/pallets/ddc-customer-accounts/src/lib.rs +++ b/pallets/ddc-customer-accounts/src/lib.rs @@ -3,11 +3,13 @@ use codec::{Decode, Encode, HasCompact}; +use ddc_primitives::ClusterId; use frame_support::{ parameter_types, traits::{Currency, DefensiveSaturating, ExistenceRequirement}, BoundedVec, PalletId, }; +pub use pallet_ddc_clusters::{self as ddc_clusters}; pub use pallet_ddc_staking::{self as ddc_staking}; use scale_info::TypeInfo; use sp_runtime::{ @@ -43,7 +45,7 @@ pub struct UnlockChunk { pub struct Bucket { bucket_id: u128, owner_id: AccountId, - cluster_id: Option, + cluster_id: Option, public_availability: bool, resources_reserved: u128, } @@ -146,7 +148,7 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config + ddc_staking::Config { + pub trait Config: frame_system::Config + ddc_staking::Config + ddc_clusters::Config { /// The accounts's pallet id, used for deriving its sovereign account ID. #[pallet::constant] type PalletId: Get; @@ -215,6 +217,8 @@ pub mod pallet { DDCEraNotSet, /// Bucket with specified id doesn't exist BucketDoesNotExist, + /// DDC Cluster with provided id doesn't exist + ClusterDoesNotExist, } #[pallet::genesis_config] @@ -272,7 +276,7 @@ pub mod pallet { pub fn allocate_bucket_to_cluster( origin: OriginFor, bucket_id: u128, - cluster_id: u128, + cluster_id: ClusterId, ) -> DispatchResult { let bucket_owner = ensure_signed(origin)?; @@ -280,6 +284,10 @@ pub mod pallet { ensure!(bucket.owner_id == bucket_owner, Error::::NotBucketOwner); + ensure!( + ddc_clusters::pallet::Clusters::::contains_key(&cluster_id), + Error::::ClusterDoesNotExist + ); bucket.cluster_id = Some(cluster_id); Ok(()) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index c349b3271..dc6164a38 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -609,9 +609,7 @@ pub mod pallet { // Note: in case there is no current era it is fine to bond one era more. let era = Self::current_era().unwrap_or(0) + T::BondingDuration::get(); - if let Some(mut chunk) = - ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) - { + if let Some(chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) { // To keep the chunk count down, we only keep one chunk per era. Since // `unlocking` is a FiFo queue, if a chunk exists for `era` we know that it will // be the last one. From c13a7d50433507c6577e3a03f78782d922e45275 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 26 Oct 2023 16:19:24 +0200 Subject: [PATCH 436/583] rename ddc-customer-accounts to ddc-customers --- Cargo.lock | 6 +- Cargo.toml | 2 +- node/service/src/chain_spec.rs | 2 +- pallets/ddc-customer-accounts/Cargo.toml | 36 -- pallets/ddc-customer-accounts/src/lib.rs | 575 ----------------------- pallets/ddc-validator/Cargo.toml | 4 +- pallets/ddc-validator/src/lib.rs | 14 +- pallets/ddc-validator/src/tests.rs | 6 +- runtime/cere-dev/Cargo.toml | 4 +- runtime/cere-dev/src/lib.rs | 12 +- 10 files changed, 25 insertions(+), 636 deletions(-) delete mode 100644 pallets/ddc-customer-accounts/Cargo.toml delete mode 100644 pallets/ddc-customer-accounts/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index e04480f9b..4447d7ae3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -830,7 +830,7 @@ dependencies = [ "pallet-contracts-primitives", "pallet-contracts-rpc-runtime-api", "pallet-ddc-clusters", - "pallet-ddc-customer-accounts", + "pallet-ddc-customers", "pallet-ddc-metrics-offchain-worker", "pallet-ddc-nodes", "pallet-ddc-staking", @@ -4910,7 +4910,7 @@ dependencies = [ ] [[package]] -name = "pallet-ddc-customer-accounts" +name = "pallet-ddc-customers" version = "0.1.0" dependencies = [ "ddc-primitives", @@ -5011,7 +5011,7 @@ dependencies = [ "log", "pallet-balances", "pallet-contracts", - "pallet-ddc-customer-accounts", + "pallet-ddc-customers", "pallet-ddc-staking", "pallet-randomness-collective-flip", "pallet-session", diff --git a/Cargo.toml b/Cargo.toml index e5687657f..0cf3246b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ members = [ "pallets/erc20", "pallets/ddc-metrics-offchain-worker", "pallets/ddc-validator", - "pallets/ddc-customer-accounts", + "pallets/ddc-customers", "pallets/ddc-nodes", "pallets/ddc-clusters", "primitives", diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index 412649e65..1559b913a 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -233,7 +233,7 @@ pub fn cere_dev_genesis( }, vesting: Default::default(), transaction_payment: Default::default(), - ddc_accounts: Default::default(), + ddc_customers: Default::default(), nomination_pools: Default::default(), } } diff --git a/pallets/ddc-customer-accounts/Cargo.toml b/pallets/ddc-customer-accounts/Cargo.toml deleted file mode 100644 index a0b59e62e..000000000 --- a/pallets/ddc-customer-accounts/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "pallet-ddc-customer-accounts" -version = "0.1.0" -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-ddc-clusters = { version = "4.7.0", default-features = false, path = "../ddc-clusters" } -pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } -scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -log = { version = "0.4.17", default-features = false } - -[dev-dependencies] -substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } - -[features] -default = ["std"] -std = [ - "codec/std", - "ddc-primitives/std", - "pallet-ddc-clusters/std", - "frame-support/std", - "frame-system/std", - "scale-info/std", - "sp-io/std", - "sp-runtime/std", - "sp-staking/std", - "sp-std/std", -] diff --git a/pallets/ddc-customer-accounts/src/lib.rs b/pallets/ddc-customer-accounts/src/lib.rs deleted file mode 100644 index fa970cc61..000000000 --- a/pallets/ddc-customer-accounts/src/lib.rs +++ /dev/null @@ -1,575 +0,0 @@ -#![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "256"] - -use codec::{Decode, Encode, HasCompact}; - -use ddc_primitives::ClusterId; -use frame_support::{ - parameter_types, - traits::{Currency, DefensiveSaturating, ExistenceRequirement}, - BoundedVec, PalletId, -}; -pub use pallet_ddc_clusters::{self as ddc_clusters}; -pub use pallet_ddc_staking::{self as ddc_staking}; -use scale_info::TypeInfo; -use sp_runtime::{ - traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, Zero}, - RuntimeDebug, SaturatedConversion, -}; -use sp_staking::EraIndex; -use sp_std::prelude::*; - -pub use pallet::*; - -/// The balance type of this pallet. -pub type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; - -parameter_types! { - /// A limit to the number of pending unlocks an account may have in parallel. - pub MaxUnlockingChunks: u32 = 32; -} - -/// Just a Balance/BlockNumber tuple to encode when a chunk of funds will be unlocked. -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct UnlockChunk { - /// Amount of funds to be unlocked. - #[codec(compact)] - value: Balance, - /// Era number at which point it'll be unlocked. - #[codec(compact)] - era: EraIndex, -} - -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct Bucket { - bucket_id: u128, - owner_id: AccountId, - cluster_id: Option, - public_availability: bool, - resources_reserved: u128, -} - -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct BucketsDetails { - pub bucket_id: u128, - pub amount: Balance, -} - -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct AccountsLedger { - /// The owner account whose balance is actually locked and can be used for CDN usage. - pub owner: AccountId, - /// The total amount of the owner's balance that we are currently accounting for. - /// It's just `active` plus all the `unlocking` balances. - #[codec(compact)] - pub total: Balance, - /// The total amount of the owner's balance that will be accessible for CDN payments in any - /// forthcoming rounds. - #[codec(compact)] - pub active: Balance, - /// Any balance that is becoming free, which may eventually be transferred out of the owner - /// (assuming that the content owner has to pay for network usage). It is assumed that this - /// will be treated as a first in, first out queue where the new (higher value) eras get pushed - /// on the back. - pub unlocking: BoundedVec, MaxUnlockingChunks>, -} - -impl - AccountsLedger -{ - /// Initializes the default object using the given owner. - pub fn default_from(owner: AccountId) -> Self { - Self { owner, total: Zero::zero(), active: Zero::zero(), unlocking: Default::default() } - } - - /// Remove entries from `unlocking` that are sufficiently old and reduce the - /// total by the sum of their balances. - fn consolidate_unlocked(self, current_era: EraIndex) -> Self { - let mut total = self.total; - let unlocking: BoundedVec<_, _> = self - .unlocking - .into_iter() - .filter(|chunk| { - log::debug!("Chunk era: {:?}", chunk.era); - if chunk.era > current_era { - true - } else { - total = total.saturating_sub(chunk.value); - false - } - }) - .collect::>() - .try_into() - .expect( - "filtering items from a bounded vec always leaves length less than bounds. qed", - ); - - Self { owner: self.owner, total, active: self.active, unlocking } - } - - /// Charge funds that were scheduled for unlocking. - /// - /// Returns the updated ledger, and the amount actually charged. - fn charge_unlocking(mut self, value: Balance) -> (Self, Balance) { - let mut unlocking_balance = Balance::zero(); - - while let Some(last) = self.unlocking.last_mut() { - if unlocking_balance + last.value <= value { - unlocking_balance += last.value; - self.active -= last.value; - self.unlocking.pop(); - } else { - let diff = value - unlocking_balance; - - unlocking_balance += diff; - self.active -= diff; - last.value -= diff; - } - - if unlocking_balance >= value { - break - } - } - - (self, unlocking_balance) - } -} - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::{pallet_prelude::*, traits::LockableCurrency}; - use frame_system::pallet_prelude::*; - - #[pallet::pallet] - #[pallet::generate_store(pub(super) trait Store)] - #[pallet::without_storage_info] - pub struct Pallet(_); - - #[pallet::config] - pub trait Config: frame_system::Config + ddc_staking::Config + ddc_clusters::Config { - /// The accounts's pallet id, used for deriving its sovereign account ID. - #[pallet::constant] - type PalletId: Get; - type Currency: LockableCurrency; - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// Number of eras that staked funds must remain bonded for. - #[pallet::constant] - type BondingDuration: Get; - } - - /// Map from all (unlocked) "owner" accounts to the info regarding the staking. - #[pallet::storage] - #[pallet::getter(fn ledger)] - pub type Ledger = - StorageMap<_, Identity, T::AccountId, AccountsLedger>>; - - #[pallet::type_value] - pub fn DefaultBucketCount() -> u128 { - 0_u128 - } - #[pallet::storage] - #[pallet::getter(fn buckets_count)] - pub type BucketsCount = - StorageValue>; - - /// Map from bucket ID to to the bucket structure - #[pallet::storage] - #[pallet::getter(fn buckets)] - pub type Buckets = - StorageMap<_, Twox64Concat, u128, Bucket, OptionQuery>; - - #[pallet::event] - #[pallet::generate_deposit(pub(crate) fn deposit_event)] - pub enum Event { - /// An account has bonded this amount. \[owner, amount\] - /// - /// NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, - /// it will not be emitted for staking rewards when they are added to stake. - Deposited(T::AccountId, BalanceOf), - /// An account has unbonded this amount. \[owner, amount\] - Unbonded(T::AccountId, BalanceOf), - /// An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` - /// from the unlocking queue. \[owner, amount\] - Withdrawn(T::AccountId, BalanceOf), - /// Total amount charged from all accounts to pay CDN nodes - Charged(BalanceOf), - } - - #[pallet::error] - pub enum Error { - /// Not a owner account. - NotOwner, - /// Not an owner of bucket - NotBucketOwner, - /// Owner is already bonded. - AlreadyPaired, - /// Cannot deposit dust - InsufficientDeposit, - /// Can not schedule more unlock chunks. - NoMoreChunks, - /// Bucket with speicifed id doesn't exist. - NoBucketWithId, - /// Internal state has become somehow corrupted and the operation cannot continue. - BadState, - /// Current era not set during runtime - DDCEraNotSet, - /// Bucket with specified id doesn't exist - BucketDoesNotExist, - /// DDC Cluster with provided id doesn't exist - ClusterDoesNotExist, - } - - #[pallet::genesis_config] - pub struct GenesisConfig; - - #[cfg(feature = "std")] - impl Default for GenesisConfig { - fn default() -> Self { - Self - } - } - - #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { - fn build(&self) { - let account_id = >::account_id(); - let min = ::Currency::minimum_balance(); - if ::Currency::free_balance(&account_id) < min { - let _ = ::Currency::make_free_balance_be(&account_id, min); - } - } - } - - #[pallet::call] - impl Pallet { - /// Create new bucket with provided public availability & reserved resources - /// - /// Anyone can create a bucket - #[pallet::weight(10_000)] - pub fn create_bucket( - origin: OriginFor, - public_availability: bool, - resources_reserved: u128, - ) -> DispatchResult { - let bucket_owner = ensure_signed(origin)?; - let cur_bucket_id = Self::buckets_count(); - - let bucket = Bucket { - bucket_id: cur_bucket_id + 1, - owner_id: bucket_owner, - cluster_id: None, - public_availability, - resources_reserved, - }; - - >::set(cur_bucket_id + 1); - >::insert(cur_bucket_id + 1, bucket); - Ok(()) - } - - /// Allocates specified bucket into specified cluster - /// - /// Only bucket owner can call this method - #[pallet::weight(10_000)] - pub fn allocate_bucket_to_cluster( - origin: OriginFor, - bucket_id: u128, - cluster_id: ClusterId, - ) -> DispatchResult { - let bucket_owner = ensure_signed(origin)?; - - let mut bucket = Self::buckets(bucket_id).ok_or(Error::::NoBucketWithId)?; - - ensure!(bucket.owner_id == bucket_owner, Error::::NotBucketOwner); - - ensure!( - ddc_clusters::pallet::Clusters::::contains_key(&cluster_id), - Error::::ClusterDoesNotExist - ); - bucket.cluster_id = Some(cluster_id); - - Ok(()) - } - - /// Take the origin account as a owner and lock up `value` of its balance. `Owner` will - /// be the account that controls it. - /// - /// `value` must be more than the `minimum_balance` specified by `T::Currency`. - /// - /// The dispatch origin for this call must be _Signed_ by the owner account. - /// - /// Emits `Deposited`. - #[pallet::weight(10_000)] - pub fn deposit( - origin: OriginFor, - #[pallet::compact] value: BalanceOf, - ) -> DispatchResult { - let owner = ensure_signed(origin)?; - - if >::contains_key(&owner) { - Err(Error::::AlreadyPaired)? - } - - // Reject a deposit which is considered to be _dust_. - if value < ::Currency::minimum_balance() { - Err(Error::::InsufficientDeposit)? - } - - frame_system::Pallet::::inc_consumers(&owner).map_err(|_| Error::::BadState)?; - - let owner_balance = ::Currency::free_balance(&owner); - let value = value.min(owner_balance); - let item = AccountsLedger { - owner: owner.clone(), - total: value, - active: value, - unlocking: Default::default(), - }; - Self::update_ledger_and_deposit(&owner, &item)?; - Self::deposit_event(Event::::Deposited(owner, value)); - Ok(()) - } - - /// Add some extra amount that have appeared in the owner `free_balance` into the balance up - /// for CDN payments. - /// - /// The dispatch origin for this call must be _Signed_ by the owner. - /// - /// Emits `Deposited`. - #[pallet::weight(10_000)] - pub fn deposit_extra( - origin: OriginFor, - #[pallet::compact] max_additional: BalanceOf, - ) -> DispatchResult { - let owner = ensure_signed(origin)?; - - let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; - - let owner_balance = ::Currency::free_balance(&owner); - let extra = owner_balance.min(max_additional); - ledger.total += extra; - ledger.active += extra; - // Last check: the new active amount of ledger must be more than ED. - ensure!( - ledger.active >= ::Currency::minimum_balance(), - Error::::InsufficientDeposit - ); - - Self::update_ledger_and_deposit(&owner, &ledger)?; - - Self::deposit_event(Event::::Deposited(owner.clone(), extra)); - - Ok(()) - } - - /// Schedule a portion of the owner to be unlocked ready for transfer out after the bond - /// period ends. If this leaves an amount actively bonded less than - /// T::Currency::minimum_balance(), then it is increased to the full amount. - /// - /// The dispatch origin for this call must be _Signed_ by the owner. - /// - /// Once the unlock period is done, you can call `withdraw_unbonded` to actually move - /// the funds out of management ready for transfer. - /// - /// No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`) - /// can co-exists at the same time. In that case, [`Call::withdraw_unbonded`] need - /// to be called first to remove some of the chunks (if possible). - /// - /// Emits `Unbonded`. - /// - /// See also [`Call::withdraw_unbonded`]. - #[pallet::weight(10_000)] - pub fn unbond( - origin: OriginFor, - #[pallet::compact] value: BalanceOf, - ) -> DispatchResult { - let owner = ensure_signed(origin)?; - let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; - ensure!( - ledger.unlocking.len() < MaxUnlockingChunks::get() as usize, - Error::::NoMoreChunks, - ); - - let mut value = value.min(ledger.active); - - if !value.is_zero() { - ledger.active -= value; - - // Avoid there being a dust balance left in the accounts system. - if ledger.active < ::Currency::minimum_balance() { - value += ledger.active; - ledger.active = Zero::zero(); - } - - let current_era = ddc_staking::pallet::Pallet::::current_era() - .ok_or(Error::::DDCEraNotSet)?; - // Note: bonding for extra era to allow for accounting - let era = current_era + ::BondingDuration::get(); - log::debug!("Era for the unbond: {:?}", era); - - if let Some(chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) { - // To keep the chunk count down, we only keep one chunk per era. Since - // `unlocking` is a FiFo queue, if a chunk exists for `era` we know that it will - // be the last one. - chunk.value = chunk.value.defensive_saturating_add(value) - } else { - ledger - .unlocking - .try_push(UnlockChunk { value, era }) - .map_err(|_| Error::::NoMoreChunks)?; - }; - - Self::update_ledger(&owner, &ledger); - - Self::deposit_event(Event::::Unbonded(ledger.owner, value)); - } - Ok(()) - } - - /// Remove any unlocked chunks from the `unlocking` queue from our management. - /// - /// This essentially frees up that balance to be used by the owner account to do - /// whatever it wants. - /// - /// The dispatch origin for this call must be _Signed_ by the owner. - /// - /// Emits `Withdrawn`. - /// - /// See also [`Call::unbond`]. - #[pallet::weight(10_000)] - pub fn withdraw_unbonded(origin: OriginFor) -> DispatchResult { - let owner = ensure_signed(origin)?; - let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; - let (owner, old_total) = (ledger.owner.clone(), ledger.total); - let current_era = - ddc_staking::pallet::Pallet::::current_era().ok_or(Error::::DDCEraNotSet)?; - ledger = ledger.consolidate_unlocked(current_era); - log::debug!("Current era: {:?}", current_era); - - if ledger.unlocking.is_empty() && - ledger.active < ::Currency::minimum_balance() - { - log::debug!("Killing owner"); - // 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 accounts-related information. - Self::kill_owner(&owner)?; - } else { - log::debug!("Updating ledger"); - // This was the consequence of a partial unbond. just update the ledger and move on. - Self::update_ledger(&owner, &ledger); - }; - - log::debug!("Current total: {:?}", ledger.total); - log::debug!("Old total: {:?}", old_total); - - // `old_total` should never be less than the new total because - // `consolidate_unlocked` strictly subtracts balance. - if ledger.total < old_total { - log::debug!("Preparing for transfer"); - // Already checked that this won't overflow by entry condition. - let value = old_total - ledger.total; - - let account_id = Self::account_id(); - - ::Currency::transfer( - &account_id, - &owner, - value, - ExistenceRequirement::KeepAlive, - )?; - Self::deposit_event(Event::::Withdrawn(owner, value)); - } - - Ok(()) - } - } - - impl Pallet { - pub fn account_id() -> T::AccountId { - T::PalletId::get().into_account_truncating() - } - /// Update the ledger for a owner. - /// - /// This will also deposit the funds to pallet. - fn update_ledger_and_deposit( - owner: &T::AccountId, - ledger: &AccountsLedger>, - ) -> DispatchResult { - let account_id = Self::account_id(); - - ::Currency::transfer( - owner, - &account_id, - ledger.total, - ExistenceRequirement::KeepAlive, - )?; - >::insert(owner, ledger); - - Ok(()) - } - - /// Update the ledger for a owner. - fn update_ledger( - owner: &T::AccountId, - ledger: &AccountsLedger>, - ) { - >::insert(owner, ledger); - } - - /// Remove all associated data of a owner account from the accounts system. - /// - /// Assumes storage is upgraded before calling. - /// - /// This is called: - /// - after a `withdraw_unbonded()` call that frees all of a owner's bonded balance. - fn kill_owner(owner: &T::AccountId) -> DispatchResult { - >::remove(&owner); - - frame_system::Pallet::::dec_consumers(owner); - - Ok(()) - } - - // Charge payments from content owners - pub fn charge_content_owners( - paying_accounts: Vec>>, - pricing: u128, - ) -> DispatchResult { - let mut total_charged = BalanceOf::::zero(); - - for bucket_details in paying_accounts.iter() { - let bucket: Bucket = Self::buckets(bucket_details.bucket_id) - .ok_or(Error::::BucketDoesNotExist)?; - let content_owner = bucket.owner_id; - let amount = bucket_details.amount * pricing.saturated_into::>(); - - let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotOwner)?; - if ledger.active >= amount { - ledger.total -= amount; - ledger.active -= amount; - total_charged += amount; - log::debug!("Ledger updated state: {:?}", &ledger); - Self::update_ledger(&content_owner, &ledger); - } else { - let diff = amount - ledger.active; - total_charged += ledger.active; - ledger.total -= ledger.active; - ledger.active = BalanceOf::::zero(); - let (ledger, charged) = ledger.charge_unlocking(diff); - log::debug!("Ledger updated state: {:?}", &ledger); - Self::update_ledger(&content_owner, &ledger); - total_charged += charged; - } - } - log::debug!("Total charged: {:?}", &total_charged); - - Self::deposit_event(Event::::Charged(total_charged)); - log::debug!("Deposit event executed"); - - Ok(()) - } - } -} diff --git a/pallets/ddc-validator/Cargo.toml b/pallets/ddc-validator/Cargo.toml index 1c5200e79..b608de995 100644 --- a/pallets/ddc-validator/Cargo.toml +++ b/pallets/ddc-validator/Cargo.toml @@ -14,7 +14,7 @@ frame-system = { version = "4.0.0-dev", default-features = false, git = "https:/ lite-json = { version = "0.2.0", default-features = false } log = { version = "0.4.17", default-features = false } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-ddc-customer-accounts = { version = "0.1.0", default-features = false, path = "../ddc-customer-accounts" } +pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../ddc-customers" } pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -44,7 +44,7 @@ std = [ "frame-system/std", "lite-json/std", "pallet-contracts/std", - "pallet-ddc-customer-accounts/std", + "pallet-ddc-customers/std", "pallet-ddc-staking/std", "pallet-session/std", "pallet-staking/std", diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs index 647332f9f..fc6d1109c 100644 --- a/pallets/ddc-validator/src/lib.rs +++ b/pallets/ddc-validator/src/lib.rs @@ -47,7 +47,7 @@ pub use frame_system::{ }; pub use lite_json::json::JsonValue; pub use pallet::*; -pub use pallet_ddc_customer_accounts::{self as ddc_accounts, BucketsDetails}; +pub use pallet_ddc_customers::{self as ddc_customers, BucketsDetails}; pub use pallet_ddc_staking::{self as ddc_staking}; pub use pallet_session as session; pub use pallet_staking::{self as staking}; @@ -196,7 +196,7 @@ pub mod pallet { + pallet_contracts::Config + pallet_session::Config::AccountId> + pallet_staking::Config - + ddc_accounts::Config + + ddc_customers::Config + ddc_staking::Config + CreateSignedTransaction> where @@ -536,9 +536,9 @@ pub mod pallet { #[pallet::weight(100_000)] pub fn charge_payments_content_owners( origin: OriginFor, - paying_accounts: Vec>>, /* ToDo check if - * bounded vec - * should be used */ + paying_accounts: Vec>>, /* ToDo check if + * bounded vec + * should be used */ ) -> DispatchResult { let ddc_valitor_key = ensure_signed(origin)?; log::debug!("validator is {:?}", &ddc_valitor_key); @@ -567,7 +567,7 @@ pub mod pallet { >::pricing().ok_or(Error::::PricingNotSet)?; EraContentOwnersCharged::::insert(current_era, ddc_valitor_key, true); - >::charge_content_owners(paying_accounts, pricing) + >::charge_content_owners(paying_accounts, pricing) } /// Exstrinsic registers a ddc validator key for future use @@ -914,7 +914,7 @@ pub mod pallet { let mut payments: BTreeMap< u128, - BucketsDetails>, + BucketsDetails>, > = BTreeMap::new(); for bucket in payments_per_bucket.into_iter() { let cere_payment = bucket.1 as u32; diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index 5fa240a5f..6626dbd39 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -526,7 +526,7 @@ fn charge_payments_content_owners_works_as_expected() { // Create buckets for range in 1..6 { - assert_ok!(ddc_accounts::Pallet::::create_bucket( + assert_ok!(ddc_customers::Pallet::::create_bucket( RuntimeOrigin::signed(validator_1_stash.clone()), true, range @@ -543,7 +543,7 @@ fn charge_payments_content_owners_works_as_expected() { ); // Deposit funds for account - assert_ok!(ddc_accounts::Pallet::::deposit( + assert_ok!(ddc_customers::Pallet::::deposit( RuntimeOrigin::signed(validator_1_stash.clone()), validator_1_stash.clone(), 1_000, @@ -564,7 +564,7 @@ fn charge_payments_content_owners_works_as_expected() { ); let last_evt = System::events().pop().expect("Event expected").event; - assert_eq!(last_evt, ddc_accounts::Event::Charged(bucket_info.amount).into()); + assert_eq!(last_evt, ddc_customers::Event::Charged(bucket_info.amount).into()); }) } diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 7302356bc..c5188dbd5 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -99,7 +99,7 @@ cere-dev-runtime-constants = { path = "./constants", default-features = false } pallet-ddc-staking = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-staking" } pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } -pallet-ddc-customer-accounts = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customer-accounts" } +pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } pallet-ddc-validator = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-validator" } pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } @@ -186,7 +186,7 @@ std = [ "cere-runtime-common/std", "cere-dev-runtime-constants/std", "pallet-ddc-validator/std", - "pallet-ddc-customer-accounts/std", + "pallet-ddc-customers/std", "pallet-ddc-nodes/std", "pallet-ddc-clusters/std", ] diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 65baf978d..a023034a2 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -49,7 +49,7 @@ use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; pub use pallet_cere_ddc; pub use pallet_chainbridge; pub use pallet_ddc_clusters; -pub use pallet_ddc_customer_accounts; +pub use pallet_ddc_customers; pub use pallet_ddc_metrics_offchain_worker; pub use pallet_ddc_nodes; pub use pallet_ddc_staking; @@ -1331,19 +1331,19 @@ impl pallet_ddc_staking::Config for Runtime { type DefaultStorageBondSize = DefaultStorageBondSize; type DefaultStorageChillDelay = DefaultStorageChillDelay; type RuntimeEvent = RuntimeEvent; - type StakersPayoutSource = DdcAccountsPalletId; + type StakersPayoutSource = DdcCustomersPalletId; type UnixTime = Timestamp; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; } parameter_types! { - pub const DdcAccountsPalletId: PalletId = PalletId(*b"accounts"); // DDC maintainer's stake + pub const DdcCustomersPalletId: PalletId = PalletId(*b"accounts"); // DDC maintainer's stake } -impl pallet_ddc_customer_accounts::Config for Runtime { +impl pallet_ddc_customers::Config for Runtime { type BondingDuration = BondingDuration; type Currency = Balances; - type PalletId = DdcAccountsPalletId; + type PalletId = DdcCustomersPalletId; type RuntimeEvent = RuntimeEvent; } @@ -1425,7 +1425,7 @@ construct_runtime!( DdcMetricsOffchainWorker: pallet_ddc_metrics_offchain_worker::{Pallet, Call, Storage, Event}, DdcStaking: pallet_ddc_staking, DdcValidator: pallet_ddc_validator, - DdcAccounts: pallet_ddc_customer_accounts, + DdcCustomers: pallet_ddc_customers, DdcNodes: pallet_ddc_nodes, DdcClusters: pallet_ddc_clusters } From 72034055d958165635caa1cdf3950ac6b929f9e8 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 26 Oct 2023 16:32:58 +0200 Subject: [PATCH 437/583] forgot to add renamed pallet --- pallets/ddc-customers/Cargo.toml | 36 ++ pallets/ddc-customers/src/lib.rs | 575 +++++++++++++++++++++++++++++++ 2 files changed, 611 insertions(+) create mode 100644 pallets/ddc-customers/Cargo.toml create mode 100644 pallets/ddc-customers/src/lib.rs diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml new file mode 100644 index 000000000..8007013bb --- /dev/null +++ b/pallets/ddc-customers/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "pallet-ddc-customers" +version = "0.1.0" +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-ddc-clusters = { version = "4.7.0", default-features = false, path = "../ddc-clusters" } +pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } +scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +log = { version = "0.4.17", default-features = false } + +[dev-dependencies] +substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } + +[features] +default = ["std"] +std = [ + "codec/std", + "ddc-primitives/std", + "pallet-ddc-clusters/std", + "frame-support/std", + "frame-system/std", + "scale-info/std", + "sp-io/std", + "sp-runtime/std", + "sp-staking/std", + "sp-std/std", +] diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs new file mode 100644 index 000000000..fa970cc61 --- /dev/null +++ b/pallets/ddc-customers/src/lib.rs @@ -0,0 +1,575 @@ +#![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] + +use codec::{Decode, Encode, HasCompact}; + +use ddc_primitives::ClusterId; +use frame_support::{ + parameter_types, + traits::{Currency, DefensiveSaturating, ExistenceRequirement}, + BoundedVec, PalletId, +}; +pub use pallet_ddc_clusters::{self as ddc_clusters}; +pub use pallet_ddc_staking::{self as ddc_staking}; +use scale_info::TypeInfo; +use sp_runtime::{ + traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, Zero}, + RuntimeDebug, SaturatedConversion, +}; +use sp_staking::EraIndex; +use sp_std::prelude::*; + +pub use pallet::*; + +/// The balance type of this pallet. +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + +parameter_types! { + /// A limit to the number of pending unlocks an account may have in parallel. + pub MaxUnlockingChunks: u32 = 32; +} + +/// Just a Balance/BlockNumber tuple to encode when a chunk of funds will be unlocked. +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] +pub struct UnlockChunk { + /// Amount of funds to be unlocked. + #[codec(compact)] + value: Balance, + /// Era number at which point it'll be unlocked. + #[codec(compact)] + era: EraIndex, +} + +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] +pub struct Bucket { + bucket_id: u128, + owner_id: AccountId, + cluster_id: Option, + public_availability: bool, + resources_reserved: u128, +} + +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] +pub struct BucketsDetails { + pub bucket_id: u128, + pub amount: Balance, +} + +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] +pub struct AccountsLedger { + /// The owner account whose balance is actually locked and can be used for CDN usage. + pub owner: AccountId, + /// The total amount of the owner's balance that we are currently accounting for. + /// It's just `active` plus all the `unlocking` balances. + #[codec(compact)] + pub total: Balance, + /// The total amount of the owner's balance that will be accessible for CDN payments in any + /// forthcoming rounds. + #[codec(compact)] + pub active: Balance, + /// Any balance that is becoming free, which may eventually be transferred out of the owner + /// (assuming that the content owner has to pay for network usage). It is assumed that this + /// will be treated as a first in, first out queue where the new (higher value) eras get pushed + /// on the back. + pub unlocking: BoundedVec, MaxUnlockingChunks>, +} + +impl + AccountsLedger +{ + /// Initializes the default object using the given owner. + pub fn default_from(owner: AccountId) -> Self { + Self { owner, total: Zero::zero(), active: Zero::zero(), unlocking: Default::default() } + } + + /// Remove entries from `unlocking` that are sufficiently old and reduce the + /// total by the sum of their balances. + fn consolidate_unlocked(self, current_era: EraIndex) -> Self { + let mut total = self.total; + let unlocking: BoundedVec<_, _> = self + .unlocking + .into_iter() + .filter(|chunk| { + log::debug!("Chunk era: {:?}", chunk.era); + if chunk.era > current_era { + true + } else { + total = total.saturating_sub(chunk.value); + false + } + }) + .collect::>() + .try_into() + .expect( + "filtering items from a bounded vec always leaves length less than bounds. qed", + ); + + Self { owner: self.owner, total, active: self.active, unlocking } + } + + /// Charge funds that were scheduled for unlocking. + /// + /// Returns the updated ledger, and the amount actually charged. + fn charge_unlocking(mut self, value: Balance) -> (Self, Balance) { + let mut unlocking_balance = Balance::zero(); + + while let Some(last) = self.unlocking.last_mut() { + if unlocking_balance + last.value <= value { + unlocking_balance += last.value; + self.active -= last.value; + self.unlocking.pop(); + } else { + let diff = value - unlocking_balance; + + unlocking_balance += diff; + self.active -= diff; + last.value -= diff; + } + + if unlocking_balance >= value { + break + } + } + + (self, unlocking_balance) + } +} + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use frame_support::{pallet_prelude::*, traits::LockableCurrency}; + use frame_system::pallet_prelude::*; + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config + ddc_staking::Config + ddc_clusters::Config { + /// The accounts's pallet id, used for deriving its sovereign account ID. + #[pallet::constant] + type PalletId: Get; + type Currency: LockableCurrency; + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + /// Number of eras that staked funds must remain bonded for. + #[pallet::constant] + type BondingDuration: Get; + } + + /// Map from all (unlocked) "owner" accounts to the info regarding the staking. + #[pallet::storage] + #[pallet::getter(fn ledger)] + pub type Ledger = + StorageMap<_, Identity, T::AccountId, AccountsLedger>>; + + #[pallet::type_value] + pub fn DefaultBucketCount() -> u128 { + 0_u128 + } + #[pallet::storage] + #[pallet::getter(fn buckets_count)] + pub type BucketsCount = + StorageValue>; + + /// Map from bucket ID to to the bucket structure + #[pallet::storage] + #[pallet::getter(fn buckets)] + pub type Buckets = + StorageMap<_, Twox64Concat, u128, Bucket, OptionQuery>; + + #[pallet::event] + #[pallet::generate_deposit(pub(crate) fn deposit_event)] + pub enum Event { + /// An account has bonded this amount. \[owner, amount\] + /// + /// NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, + /// it will not be emitted for staking rewards when they are added to stake. + Deposited(T::AccountId, BalanceOf), + /// An account has unbonded this amount. \[owner, amount\] + Unbonded(T::AccountId, BalanceOf), + /// An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` + /// from the unlocking queue. \[owner, amount\] + Withdrawn(T::AccountId, BalanceOf), + /// Total amount charged from all accounts to pay CDN nodes + Charged(BalanceOf), + } + + #[pallet::error] + pub enum Error { + /// Not a owner account. + NotOwner, + /// Not an owner of bucket + NotBucketOwner, + /// Owner is already bonded. + AlreadyPaired, + /// Cannot deposit dust + InsufficientDeposit, + /// Can not schedule more unlock chunks. + NoMoreChunks, + /// Bucket with speicifed id doesn't exist. + NoBucketWithId, + /// Internal state has become somehow corrupted and the operation cannot continue. + BadState, + /// Current era not set during runtime + DDCEraNotSet, + /// Bucket with specified id doesn't exist + BucketDoesNotExist, + /// DDC Cluster with provided id doesn't exist + ClusterDoesNotExist, + } + + #[pallet::genesis_config] + pub struct GenesisConfig; + + #[cfg(feature = "std")] + impl Default for GenesisConfig { + fn default() -> Self { + Self + } + } + + #[pallet::genesis_build] + impl GenesisBuild for GenesisConfig { + fn build(&self) { + let account_id = >::account_id(); + let min = ::Currency::minimum_balance(); + if ::Currency::free_balance(&account_id) < min { + let _ = ::Currency::make_free_balance_be(&account_id, min); + } + } + } + + #[pallet::call] + impl Pallet { + /// Create new bucket with provided public availability & reserved resources + /// + /// Anyone can create a bucket + #[pallet::weight(10_000)] + pub fn create_bucket( + origin: OriginFor, + public_availability: bool, + resources_reserved: u128, + ) -> DispatchResult { + let bucket_owner = ensure_signed(origin)?; + let cur_bucket_id = Self::buckets_count(); + + let bucket = Bucket { + bucket_id: cur_bucket_id + 1, + owner_id: bucket_owner, + cluster_id: None, + public_availability, + resources_reserved, + }; + + >::set(cur_bucket_id + 1); + >::insert(cur_bucket_id + 1, bucket); + Ok(()) + } + + /// Allocates specified bucket into specified cluster + /// + /// Only bucket owner can call this method + #[pallet::weight(10_000)] + pub fn allocate_bucket_to_cluster( + origin: OriginFor, + bucket_id: u128, + cluster_id: ClusterId, + ) -> DispatchResult { + let bucket_owner = ensure_signed(origin)?; + + let mut bucket = Self::buckets(bucket_id).ok_or(Error::::NoBucketWithId)?; + + ensure!(bucket.owner_id == bucket_owner, Error::::NotBucketOwner); + + ensure!( + ddc_clusters::pallet::Clusters::::contains_key(&cluster_id), + Error::::ClusterDoesNotExist + ); + bucket.cluster_id = Some(cluster_id); + + Ok(()) + } + + /// Take the origin account as a owner and lock up `value` of its balance. `Owner` will + /// be the account that controls it. + /// + /// `value` must be more than the `minimum_balance` specified by `T::Currency`. + /// + /// The dispatch origin for this call must be _Signed_ by the owner account. + /// + /// Emits `Deposited`. + #[pallet::weight(10_000)] + pub fn deposit( + origin: OriginFor, + #[pallet::compact] value: BalanceOf, + ) -> DispatchResult { + let owner = ensure_signed(origin)?; + + if >::contains_key(&owner) { + Err(Error::::AlreadyPaired)? + } + + // Reject a deposit which is considered to be _dust_. + if value < ::Currency::minimum_balance() { + Err(Error::::InsufficientDeposit)? + } + + frame_system::Pallet::::inc_consumers(&owner).map_err(|_| Error::::BadState)?; + + let owner_balance = ::Currency::free_balance(&owner); + let value = value.min(owner_balance); + let item = AccountsLedger { + owner: owner.clone(), + total: value, + active: value, + unlocking: Default::default(), + }; + Self::update_ledger_and_deposit(&owner, &item)?; + Self::deposit_event(Event::::Deposited(owner, value)); + Ok(()) + } + + /// Add some extra amount that have appeared in the owner `free_balance` into the balance up + /// for CDN payments. + /// + /// The dispatch origin for this call must be _Signed_ by the owner. + /// + /// Emits `Deposited`. + #[pallet::weight(10_000)] + pub fn deposit_extra( + origin: OriginFor, + #[pallet::compact] max_additional: BalanceOf, + ) -> DispatchResult { + let owner = ensure_signed(origin)?; + + let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; + + let owner_balance = ::Currency::free_balance(&owner); + let extra = owner_balance.min(max_additional); + ledger.total += extra; + ledger.active += extra; + // Last check: the new active amount of ledger must be more than ED. + ensure!( + ledger.active >= ::Currency::minimum_balance(), + Error::::InsufficientDeposit + ); + + Self::update_ledger_and_deposit(&owner, &ledger)?; + + Self::deposit_event(Event::::Deposited(owner.clone(), extra)); + + Ok(()) + } + + /// Schedule a portion of the owner to be unlocked ready for transfer out after the bond + /// period ends. If this leaves an amount actively bonded less than + /// T::Currency::minimum_balance(), then it is increased to the full amount. + /// + /// The dispatch origin for this call must be _Signed_ by the owner. + /// + /// Once the unlock period is done, you can call `withdraw_unbonded` to actually move + /// the funds out of management ready for transfer. + /// + /// No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`) + /// can co-exists at the same time. In that case, [`Call::withdraw_unbonded`] need + /// to be called first to remove some of the chunks (if possible). + /// + /// Emits `Unbonded`. + /// + /// See also [`Call::withdraw_unbonded`]. + #[pallet::weight(10_000)] + pub fn unbond( + origin: OriginFor, + #[pallet::compact] value: BalanceOf, + ) -> DispatchResult { + let owner = ensure_signed(origin)?; + let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; + ensure!( + ledger.unlocking.len() < MaxUnlockingChunks::get() as usize, + Error::::NoMoreChunks, + ); + + let mut value = value.min(ledger.active); + + if !value.is_zero() { + ledger.active -= value; + + // Avoid there being a dust balance left in the accounts system. + if ledger.active < ::Currency::minimum_balance() { + value += ledger.active; + ledger.active = Zero::zero(); + } + + let current_era = ddc_staking::pallet::Pallet::::current_era() + .ok_or(Error::::DDCEraNotSet)?; + // Note: bonding for extra era to allow for accounting + let era = current_era + ::BondingDuration::get(); + log::debug!("Era for the unbond: {:?}", era); + + if let Some(chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) { + // To keep the chunk count down, we only keep one chunk per era. Since + // `unlocking` is a FiFo queue, if a chunk exists for `era` we know that it will + // be the last one. + chunk.value = chunk.value.defensive_saturating_add(value) + } else { + ledger + .unlocking + .try_push(UnlockChunk { value, era }) + .map_err(|_| Error::::NoMoreChunks)?; + }; + + Self::update_ledger(&owner, &ledger); + + Self::deposit_event(Event::::Unbonded(ledger.owner, value)); + } + Ok(()) + } + + /// Remove any unlocked chunks from the `unlocking` queue from our management. + /// + /// This essentially frees up that balance to be used by the owner account to do + /// whatever it wants. + /// + /// The dispatch origin for this call must be _Signed_ by the owner. + /// + /// Emits `Withdrawn`. + /// + /// See also [`Call::unbond`]. + #[pallet::weight(10_000)] + pub fn withdraw_unbonded(origin: OriginFor) -> DispatchResult { + let owner = ensure_signed(origin)?; + let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; + let (owner, old_total) = (ledger.owner.clone(), ledger.total); + let current_era = + ddc_staking::pallet::Pallet::::current_era().ok_or(Error::::DDCEraNotSet)?; + ledger = ledger.consolidate_unlocked(current_era); + log::debug!("Current era: {:?}", current_era); + + if ledger.unlocking.is_empty() && + ledger.active < ::Currency::minimum_balance() + { + log::debug!("Killing owner"); + // 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 accounts-related information. + Self::kill_owner(&owner)?; + } else { + log::debug!("Updating ledger"); + // This was the consequence of a partial unbond. just update the ledger and move on. + Self::update_ledger(&owner, &ledger); + }; + + log::debug!("Current total: {:?}", ledger.total); + log::debug!("Old total: {:?}", old_total); + + // `old_total` should never be less than the new total because + // `consolidate_unlocked` strictly subtracts balance. + if ledger.total < old_total { + log::debug!("Preparing for transfer"); + // Already checked that this won't overflow by entry condition. + let value = old_total - ledger.total; + + let account_id = Self::account_id(); + + ::Currency::transfer( + &account_id, + &owner, + value, + ExistenceRequirement::KeepAlive, + )?; + Self::deposit_event(Event::::Withdrawn(owner, value)); + } + + Ok(()) + } + } + + impl Pallet { + pub fn account_id() -> T::AccountId { + T::PalletId::get().into_account_truncating() + } + /// Update the ledger for a owner. + /// + /// This will also deposit the funds to pallet. + fn update_ledger_and_deposit( + owner: &T::AccountId, + ledger: &AccountsLedger>, + ) -> DispatchResult { + let account_id = Self::account_id(); + + ::Currency::transfer( + owner, + &account_id, + ledger.total, + ExistenceRequirement::KeepAlive, + )?; + >::insert(owner, ledger); + + Ok(()) + } + + /// Update the ledger for a owner. + fn update_ledger( + owner: &T::AccountId, + ledger: &AccountsLedger>, + ) { + >::insert(owner, ledger); + } + + /// Remove all associated data of a owner account from the accounts system. + /// + /// Assumes storage is upgraded before calling. + /// + /// This is called: + /// - after a `withdraw_unbonded()` call that frees all of a owner's bonded balance. + fn kill_owner(owner: &T::AccountId) -> DispatchResult { + >::remove(&owner); + + frame_system::Pallet::::dec_consumers(owner); + + Ok(()) + } + + // Charge payments from content owners + pub fn charge_content_owners( + paying_accounts: Vec>>, + pricing: u128, + ) -> DispatchResult { + let mut total_charged = BalanceOf::::zero(); + + for bucket_details in paying_accounts.iter() { + let bucket: Bucket = Self::buckets(bucket_details.bucket_id) + .ok_or(Error::::BucketDoesNotExist)?; + let content_owner = bucket.owner_id; + let amount = bucket_details.amount * pricing.saturated_into::>(); + + let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotOwner)?; + if ledger.active >= amount { + ledger.total -= amount; + ledger.active -= amount; + total_charged += amount; + log::debug!("Ledger updated state: {:?}", &ledger); + Self::update_ledger(&content_owner, &ledger); + } else { + let diff = amount - ledger.active; + total_charged += ledger.active; + ledger.total -= ledger.active; + ledger.active = BalanceOf::::zero(); + let (ledger, charged) = ledger.charge_unlocking(diff); + log::debug!("Ledger updated state: {:?}", &ledger); + Self::update_ledger(&content_owner, &ledger); + total_charged += charged; + } + } + log::debug!("Total charged: {:?}", &total_charged); + + Self::deposit_event(Event::::Charged(total_charged)); + log::debug!("Deposit event executed"); + + Ok(()) + } + } +} From 54757678bd868c27f02142f25cc4606ccd9c7c91 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 26 Oct 2023 17:47:41 +0200 Subject: [PATCH 438/583] rename unbonding to unlock across pallet-customers --- pallets/ddc-customers/src/lib.rs | 57 ++++++++++++++++---------------- runtime/cere-dev/src/lib.rs | 3 +- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index fa970cc61..0092bf9e0 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -154,9 +154,9 @@ pub mod pallet { type PalletId: Get; type Currency: LockableCurrency; type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// Number of eras that staked funds must remain bonded for. + /// Number of eras that staked funds must remain locked for. #[pallet::constant] - type BondingDuration: Get; + type LockingDuration: Get; } /// Map from all (unlocked) "owner" accounts to the info regarding the staking. @@ -183,15 +183,15 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { - /// An account has bonded this amount. \[owner, amount\] + /// An account has deposited this amount. \[owner, amount\] /// - /// NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, + /// NOTE: This event is only emitted when funds are deposited via a dispatchable. Notably, /// it will not be emitted for staking rewards when they are added to stake. Deposited(T::AccountId, BalanceOf), - /// An account has unbonded this amount. \[owner, amount\] - Unbonded(T::AccountId, BalanceOf), - /// An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` - /// from the unlocking queue. \[owner, amount\] + /// An account has initiated unlock for amount. \[owner, amount\] + InitiatDepositUnlock(T::AccountId, BalanceOf), + /// An account has called `withdraw_unlocked_deposit` and removed unlocking chunks worth + /// `Balance` from the unlocking queue. \[owner, amount\] Withdrawn(T::AccountId, BalanceOf), /// Total amount charged from all accounts to pay CDN nodes Charged(BalanceOf), @@ -203,7 +203,7 @@ pub mod pallet { NotOwner, /// Not an owner of bucket NotBucketOwner, - /// Owner is already bonded. + /// Owner is already paired with structure representing account. AlreadyPaired, /// Cannot deposit dust InsufficientDeposit, @@ -364,24 +364,24 @@ pub mod pallet { Ok(()) } - /// Schedule a portion of the owner to be unlocked ready for transfer out after the bond - /// period ends. If this leaves an amount actively bonded less than + /// Schedule a portion of the owner deposited funds to be unlocked ready for transfer out + /// after the lock period ends. If this leaves an amount actively locked less than /// T::Currency::minimum_balance(), then it is increased to the full amount. /// /// The dispatch origin for this call must be _Signed_ by the owner. /// - /// Once the unlock period is done, you can call `withdraw_unbonded` to actually move - /// the funds out of management ready for transfer. + /// Once the unlock period is done, you can call `withdraw_unlocked_deposit` to actually + /// move the funds out of management ready for transfer. /// /// No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`) - /// can co-exists at the same time. In that case, [`Call::withdraw_unbonded`] need + /// can co-exists at the same time. In that case, [`Call::withdraw_unlocked_deposit`] need /// to be called first to remove some of the chunks (if possible). /// - /// Emits `Unbonded`. + /// Emits `InitiatDepositUnlock`. /// - /// See also [`Call::withdraw_unbonded`]. + /// See also [`Call::withdraw_unlocked_deposit`]. #[pallet::weight(10_000)] - pub fn unbond( + pub fn unlock_deposit( origin: OriginFor, #[pallet::compact] value: BalanceOf, ) -> DispatchResult { @@ -405,9 +405,9 @@ pub mod pallet { let current_era = ddc_staking::pallet::Pallet::::current_era() .ok_or(Error::::DDCEraNotSet)?; - // Note: bonding for extra era to allow for accounting - let era = current_era + ::BondingDuration::get(); - log::debug!("Era for the unbond: {:?}", era); + // Note: locking for extra era to allow for accounting + let era = current_era + ::LockingDuration::get(); + log::debug!("Era for the unlock: {:?}", era); if let Some(chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) { // To keep the chunk count down, we only keep one chunk per era. Since @@ -423,7 +423,7 @@ pub mod pallet { Self::update_ledger(&owner, &ledger); - Self::deposit_event(Event::::Unbonded(ledger.owner, value)); + Self::deposit_event(Event::::InitiatDepositUnlock(ledger.owner, value)); } Ok(()) } @@ -437,9 +437,9 @@ pub mod pallet { /// /// Emits `Withdrawn`. /// - /// See also [`Call::unbond`]. + /// See also [`Call::unlock_deposit`]. #[pallet::weight(10_000)] - pub fn withdraw_unbonded(origin: OriginFor) -> DispatchResult { + pub fn withdraw_unlocked_deposit(origin: OriginFor) -> DispatchResult { let owner = ensure_signed(origin)?; let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; let (owner, old_total) = (ledger.owner.clone(), ledger.total); @@ -452,13 +452,14 @@ pub mod pallet { ledger.active < ::Currency::minimum_balance() { log::debug!("Killing owner"); - // 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 accounts-related information. + // This account must have called `unlock_deposit()` 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 accounts-related information. Self::kill_owner(&owner)?; } else { log::debug!("Updating ledger"); - // This was the consequence of a partial unbond. just update the ledger and move on. + // This was the consequence of a partial deposit unlock. just update the ledger and + // move on. Self::update_ledger(&owner, &ledger); }; @@ -524,7 +525,7 @@ pub mod pallet { /// Assumes storage is upgraded before calling. /// /// This is called: - /// - after a `withdraw_unbonded()` call that frees all of a owner's bonded balance. + /// - after a `withdraw_unlocked_deposit()` call that frees all of a owner's locked balance. fn kill_owner(owner: &T::AccountId) -> DispatchResult { >::remove(&owner); diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index a023034a2..167acace3 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1338,10 +1338,11 @@ impl pallet_ddc_staking::Config for Runtime { parameter_types! { pub const DdcCustomersPalletId: PalletId = PalletId(*b"accounts"); // DDC maintainer's stake + pub const LockingDuration: sp_staking::EraIndex = 30 * 24; // 1 hour * 24 = 1 day; (1 era is 2 mins) } impl pallet_ddc_customers::Config for Runtime { - type BondingDuration = BondingDuration; + type LockingDuration = LockingDuration; type Currency = Balances; type PalletId = DdcCustomersPalletId; type RuntimeEvent = RuntimeEvent; From a1f1508ef3d193ab3d5662e44a75da4354b18944 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 26 Oct 2023 18:03:41 +0200 Subject: [PATCH 439/583] fix tests for green CI :) --- Cargo.lock | 332 +++++++++++++++-------------- pallets/ddc-validator/Cargo.toml | 4 + pallets/ddc-validator/src/mock.rs | 18 +- pallets/ddc-validator/src/tests.rs | 5 +- 4 files changed, 188 insertions(+), 171 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4447d7ae3..3d2141735 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2106,7 +2106,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", ] @@ -2123,7 +2123,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2146,7 +2146,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -2197,7 +2197,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2208,7 +2208,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2224,7 +2224,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2253,7 +2253,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2285,7 +2285,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "cfg-expr", @@ -2299,7 +2299,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2311,7 +2311,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -2321,7 +2321,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "log", @@ -2339,7 +2339,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -2354,7 +2354,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -2363,7 +2363,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "parity-scale-codec", @@ -4430,7 +4430,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system", "parity-scale-codec", @@ -4629,7 +4629,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4645,7 +4645,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4660,7 +4660,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4684,7 +4684,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4704,7 +4704,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4719,7 +4719,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4770,7 +4770,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4789,7 +4789,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4806,7 +4806,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4834,7 +4834,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -4849,7 +4849,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -4859,7 +4859,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-contracts-primitives", @@ -4876,7 +4876,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -5011,7 +5011,9 @@ dependencies = [ "log", "pallet-balances", "pallet-contracts", + "pallet-ddc-clusters", "pallet-ddc-customers", + "pallet-ddc-nodes", "pallet-ddc-staking", "pallet-randomness-collective-flip", "pallet-session", @@ -5033,7 +5035,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5049,7 +5051,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5073,7 +5075,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5086,7 +5088,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5142,7 +5144,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5163,7 +5165,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5186,7 +5188,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5202,7 +5204,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5222,7 +5224,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5239,7 +5241,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5256,7 +5258,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5271,7 +5273,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5288,7 +5290,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5308,7 +5310,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -5318,7 +5320,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5335,7 +5337,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5358,7 +5360,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5373,7 +5375,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5387,7 +5389,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5402,7 +5404,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5418,7 +5420,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5439,7 +5441,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5455,7 +5457,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5469,7 +5471,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5492,7 +5494,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5503,7 +5505,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5517,7 +5519,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5535,7 +5537,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5554,7 +5556,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5570,7 +5572,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5585,7 +5587,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5596,7 +5598,7 @@ dependencies = [ [[package]] name = "pallet-transaction-storage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5614,7 +5616,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5631,7 +5633,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5647,7 +5649,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6552,7 +6554,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "env_logger 0.9.3", "jsonrpsee", @@ -6825,7 +6827,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -6836,7 +6838,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6863,7 +6865,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -6886,7 +6888,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6902,7 +6904,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6919,7 +6921,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6930,7 +6932,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -6970,7 +6972,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fnv", "futures", @@ -6998,7 +7000,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "kvdb", @@ -7023,7 +7025,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -7047,7 +7049,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "fork-tree", @@ -7089,7 +7091,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7111,7 +7113,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -7124,7 +7126,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -7148,7 +7150,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sc-client-api", "sp-authorship", @@ -7159,7 +7161,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "lru", @@ -7186,7 +7188,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -7202,7 +7204,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7217,7 +7219,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cfg-if", "libc", @@ -7237,7 +7239,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "array-bytes 4.2.0", @@ -7278,7 +7280,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "futures", @@ -7299,7 +7301,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7316,7 +7318,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -7331,7 +7333,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -7378,7 +7380,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cid", "futures", @@ -7398,7 +7400,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7424,7 +7426,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "futures", @@ -7442,7 +7444,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -7463,7 +7465,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "fork-tree", @@ -7491,7 +7493,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -7510,7 +7512,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -7540,7 +7542,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libp2p", @@ -7553,7 +7555,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7562,7 +7564,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "hash-db", @@ -7592,7 +7594,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7615,7 +7617,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7628,7 +7630,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "directories", @@ -7698,7 +7700,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7712,7 +7714,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7731,7 +7733,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libc", @@ -7750,7 +7752,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "chrono", "futures", @@ -7768,7 +7770,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7799,7 +7801,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7810,7 +7812,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -7836,7 +7838,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -7849,7 +7851,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -8262,7 +8264,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8280,7 +8282,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "proc-macro-crate", @@ -8292,7 +8294,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8305,7 +8307,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "integer-sqrt", "num-traits", @@ -8320,7 +8322,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8333,7 +8335,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "parity-scale-codec", @@ -8345,7 +8347,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -8357,7 +8359,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -8375,7 +8377,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8394,7 +8396,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "merlin", @@ -8417,7 +8419,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8431,7 +8433,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8444,7 +8446,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "base58", @@ -8490,7 +8492,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "byteorder", @@ -8504,7 +8506,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8515,7 +8517,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8524,7 +8526,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8534,7 +8536,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -8545,7 +8547,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "log", @@ -8563,7 +8565,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8577,7 +8579,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "futures", @@ -8603,7 +8605,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "sp-core", @@ -8614,7 +8616,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8631,7 +8633,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "thiserror", "zstd", @@ -8640,7 +8642,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8654,7 +8656,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-core", @@ -8664,7 +8666,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "backtrace", "lazy_static", @@ -8674,7 +8676,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "rustc-hash", "serde", @@ -8684,7 +8686,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "either", "hash256-std-hasher", @@ -8707,7 +8709,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8725,7 +8727,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "proc-macro-crate", @@ -8737,7 +8739,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -8751,7 +8753,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8765,7 +8767,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8776,7 +8778,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8798,12 +8800,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8816,7 +8818,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -8829,7 +8831,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures-timer", @@ -8845,7 +8847,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-std", @@ -8857,7 +8859,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-runtime", @@ -8866,7 +8868,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "log", @@ -8882,7 +8884,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "hash-db", @@ -8905,7 +8907,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8922,7 +8924,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8933,7 +8935,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "log", @@ -8946,7 +8948,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -9093,7 +9095,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "platforms 2.0.0", ] @@ -9101,7 +9103,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -9122,7 +9124,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures-util", "hyper", @@ -9135,7 +9137,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "log", @@ -9156,7 +9158,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "substrate-test-utils-derive", @@ -9166,7 +9168,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9177,7 +9179,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -9624,7 +9626,7 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "clap", "frame-try-runtime", diff --git a/pallets/ddc-validator/Cargo.toml b/pallets/ddc-validator/Cargo.toml index b608de995..1ea14fd9a 100644 --- a/pallets/ddc-validator/Cargo.toml +++ b/pallets/ddc-validator/Cargo.toml @@ -16,6 +16,8 @@ log = { version = "0.4.17", default-features = false } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../ddc-customers" } pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } +pallet-ddc-clusters = { version = "4.7.0", default-features = false, path = "../ddc-clusters" } +pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } @@ -46,6 +48,8 @@ std = [ "pallet-contracts/std", "pallet-ddc-customers/std", "pallet-ddc-staking/std", + "pallet-ddc-clusters/std", + "pallet-ddc-nodes/std", "pallet-session/std", "pallet-staking/std", "scale-info/std", diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index 026a844db..2d9568768 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -41,10 +41,12 @@ frame_support::construct_runtime!( Timestamp: pallet_timestamp, Session: pallet_session, Staking: pallet_staking, - DdcAccounts: pallet_ddc_customer_accounts, + DdcAccounts: pallet_ddc_customers, DdcStaking: pallet_ddc_staking, RandomnessCollectiveFlip: pallet_randomness_collective_flip, DdcValidator: pallet_ddc_validator, + DdcClusters: pallet_ddc_clusters, + DdcNodes: pallet_ddc_nodes, } ); @@ -240,10 +242,11 @@ impl pallet_staking::Config for Test { parameter_types! { pub const DdcAccountsPalletId: PalletId = PalletId(*b"accounts"); + pub const LockingDuration: sp_staking::EraIndex = 30 * 24; } -impl pallet_ddc_customer_accounts::Config for Test { - type BondingDuration = BondingDuration; +impl pallet_ddc_customers::Config for Test { + type LockingDuration = LockingDuration; type Currency = Balances; type RuntimeEvent = RuntimeEvent; type PalletId = DdcAccountsPalletId; @@ -269,6 +272,15 @@ impl pallet_ddc_staking::Config for Test { type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; } +impl pallet_ddc_clusters::Config for Test { + type RuntimeEvent = RuntimeEvent; + type NodeRepository = pallet_ddc_nodes::Pallet; +} + +impl pallet_ddc_nodes::Config for Test { + type RuntimeEvent = RuntimeEvent; +} + parameter_types! { pub const DdcValidatorsQuorumSize: u32 = 3; pub const ValidationThreshold: u32 = 5; diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs index 6626dbd39..9493f2771 100644 --- a/pallets/ddc-validator/src/tests.rs +++ b/pallets/ddc-validator/src/tests.rs @@ -8,7 +8,7 @@ use crate::{ use codec::Decode; use ddc_primitives::{CDNNodePubKey, NodePubKey}; use frame_support::{assert_noop, assert_ok}; -use pallet_ddc_customer_accounts::{BucketsDetails, Error as AccountsError}; +use pallet_ddc_customers::{BucketsDetails, Error as AccountsError}; use pallet_ddc_staking::{DDC_ERA_DURATION_MS, DDC_ERA_START_MS}; use sp_core::offchain::{testing, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt}; use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; @@ -539,13 +539,12 @@ fn charge_payments_content_owners_works_as_expected() { RuntimeOrigin::signed(validator_1_stash.clone()), vec![bucket_info.clone()] ), - AccountsError::::NotController + AccountsError::::NotOwner ); // Deposit funds for account assert_ok!(ddc_customers::Pallet::::deposit( RuntimeOrigin::signed(validator_1_stash.clone()), - validator_1_stash.clone(), 1_000, )); From a5f4de7944a41784c2c7d9dc69f53d2cc2a4f5e3 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Thu, 26 Oct 2023 23:31:02 +0200 Subject: [PATCH 440/583] feat: payment pallet prototype --- Cargo.lock | 351 +++++++++++++++++---------------- Cargo.toml | 1 + pallets/ddc-payouts/Cargo.toml | 40 ++++ pallets/ddc-payouts/src/lib.rs | 345 ++++++++++++++++++++++++++++++++ primitives/src/lib.rs | 1 + runtime/cere-dev/Cargo.toml | 2 + runtime/cere-dev/src/lib.rs | 8 +- 7 files changed, 582 insertions(+), 166 deletions(-) create mode 100644 pallets/ddc-payouts/Cargo.toml create mode 100644 pallets/ddc-payouts/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index c24b3b135..1f222c0a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -814,6 +814,7 @@ dependencies = [ "pallet-ddc-clusters", "pallet-ddc-metrics-offchain-worker", "pallet-ddc-nodes", + "pallet-ddc-payouts", "pallet-ddc-staking", "pallet-ddc-validator", "pallet-democracy", @@ -2069,7 +2070,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", ] @@ -2086,7 +2087,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2109,7 +2110,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -2160,7 +2161,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2171,7 +2172,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2187,7 +2188,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2216,7 +2217,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2248,7 +2249,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "cfg-expr", @@ -2262,7 +2263,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2274,7 +2275,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -2284,7 +2285,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "log", @@ -2302,7 +2303,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -2317,7 +2318,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -2326,7 +2327,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "parity-scale-codec", @@ -4374,7 +4375,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system", "parity-scale-codec", @@ -4583,7 +4584,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4599,7 +4600,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4614,7 +4615,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4638,7 +4639,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4658,7 +4659,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4673,7 +4674,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4724,7 +4725,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4743,7 +4744,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4760,7 +4761,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4788,7 +4789,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -4803,7 +4804,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -4813,7 +4814,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-contracts-primitives", @@ -4830,7 +4831,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -4926,6 +4927,26 @@ dependencies = [ "substrate-test-utils", ] +[[package]] +name = "pallet-ddc-payouts" +version = "4.8.1" +dependencies = [ + "ddc-primitives", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", + "sp-tracing", + "substrate-test-utils", +] + [[package]] name = "pallet-ddc-staking" version = "4.8.1" @@ -4985,7 +5006,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5001,7 +5022,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5025,7 +5046,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5038,7 +5059,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5094,7 +5115,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5115,7 +5136,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5138,7 +5159,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5154,7 +5175,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5174,7 +5195,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5191,7 +5212,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5208,7 +5229,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5223,7 +5244,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5240,7 +5261,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5260,7 +5281,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -5270,7 +5291,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5287,7 +5308,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5310,7 +5331,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5325,7 +5346,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5339,7 +5360,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5354,7 +5375,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5370,7 +5391,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5391,7 +5412,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5407,7 +5428,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5421,7 +5442,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5444,7 +5465,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5455,7 +5476,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5469,7 +5490,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5487,7 +5508,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5506,7 +5527,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5522,7 +5543,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5537,7 +5558,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5548,7 +5569,7 @@ dependencies = [ [[package]] name = "pallet-transaction-storage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5566,7 +5587,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5583,7 +5604,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5599,7 +5620,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6485,7 +6506,7 @@ checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "env_logger 0.9.3", "jsonrpsee", @@ -6744,7 +6765,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -6755,7 +6776,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6782,7 +6803,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -6805,7 +6826,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6821,7 +6842,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6838,7 +6859,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6849,7 +6870,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -6889,7 +6910,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fnv", "futures", @@ -6917,7 +6938,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "kvdb", @@ -6942,7 +6963,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6966,7 +6987,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "fork-tree", @@ -7008,7 +7029,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7030,7 +7051,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -7043,7 +7064,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -7067,7 +7088,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sc-client-api", "sp-authorship", @@ -7078,7 +7099,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "lru", @@ -7105,7 +7126,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -7121,7 +7142,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7136,7 +7157,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cfg-if", "libc", @@ -7156,7 +7177,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "array-bytes 4.2.0", @@ -7197,7 +7218,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "futures", @@ -7218,7 +7239,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7235,7 +7256,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -7250,7 +7271,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -7297,7 +7318,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cid", "futures", @@ -7317,7 +7338,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7343,7 +7364,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "futures", @@ -7361,7 +7382,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -7382,7 +7403,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "fork-tree", @@ -7410,7 +7431,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -7429,7 +7450,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -7459,7 +7480,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libp2p", @@ -7472,7 +7493,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7481,7 +7502,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "hash-db", @@ -7511,7 +7532,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7534,7 +7555,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7547,7 +7568,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "directories", @@ -7617,7 +7638,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7631,7 +7652,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7650,7 +7671,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libc", @@ -7669,7 +7690,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "chrono", "futures", @@ -7687,7 +7708,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7718,7 +7739,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7729,7 +7750,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -7755,7 +7776,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -7768,7 +7789,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -8191,7 +8212,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8209,7 +8230,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "proc-macro-crate", @@ -8221,7 +8242,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8234,7 +8255,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "integer-sqrt", "num-traits", @@ -8249,7 +8270,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8262,7 +8283,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "parity-scale-codec", @@ -8274,7 +8295,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -8286,7 +8307,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -8304,7 +8325,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8323,7 +8344,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "merlin", @@ -8346,7 +8367,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8360,7 +8381,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8373,7 +8394,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "base58", @@ -8419,7 +8440,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "byteorder", @@ -8433,7 +8454,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8444,7 +8465,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8453,7 +8474,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8463,7 +8484,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -8474,7 +8495,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "log", @@ -8492,7 +8513,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8506,7 +8527,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "futures", @@ -8532,7 +8553,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "sp-core", @@ -8543,7 +8564,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8560,7 +8581,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "thiserror", "zstd", @@ -8569,7 +8590,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8583,7 +8604,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-core", @@ -8593,7 +8614,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "backtrace", "lazy_static", @@ -8603,7 +8624,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "rustc-hash", "serde", @@ -8613,7 +8634,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "either", "hash256-std-hasher", @@ -8636,7 +8657,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8654,7 +8675,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "proc-macro-crate", @@ -8666,7 +8687,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -8680,7 +8701,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8694,7 +8715,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8705,7 +8726,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8727,12 +8748,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8745,7 +8766,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -8758,7 +8779,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures-timer", @@ -8774,7 +8795,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-std", @@ -8786,7 +8807,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-runtime", @@ -8795,7 +8816,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "log", @@ -8811,7 +8832,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "hash-db", @@ -8834,7 +8855,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8851,7 +8872,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8862,7 +8883,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "log", @@ -8875,7 +8896,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -9016,7 +9037,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "platforms 2.0.0", ] @@ -9024,7 +9045,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -9045,7 +9066,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures-util", "hyper", @@ -9058,7 +9079,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "log", @@ -9079,7 +9100,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "substrate-test-utils-derive", @@ -9089,7 +9110,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9100,7 +9121,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -9561,7 +9582,7 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "clap", "frame-try-runtime", diff --git a/Cargo.toml b/Cargo.toml index 835a9919a..538f83fb3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ members = [ "pallets/ddc-accounts", "pallets/ddc-nodes", "pallets/ddc-clusters", + "pallets/ddc-payouts", "primitives", ] diff --git a/pallets/ddc-payouts/Cargo.toml b/pallets/ddc-payouts/Cargo.toml new file mode 100644 index 000000000..8f171e21b --- /dev/null +++ b/pallets/ddc-payouts/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "pallet-ddc-payouts" +version = "4.8.1" +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +log = { version = "0.4.17", default-features = false } +scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } + +[dev-dependencies] +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } + +[features] +default = ["std"] +std = [ + "codec/std", + "ddc-primitives/std", + "frame-support/std", + "frame-system/std", + "frame-benchmarking/std", + "scale-info/std", + "sp-io/std", + "sp-runtime/std", + "sp-staking/std", + "sp-std/std", + "sp-core/std", +] +runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs new file mode 100644 index 000000000..e676f2eb3 --- /dev/null +++ b/pallets/ddc-payouts/src/lib.rs @@ -0,0 +1,345 @@ +//! # DDC Payouts Pallet +//! +//! The DDC Payouts pallet is used to distribute payouts based on DAC validation +//! +//! - [`Config`] +//! - [`Call`] +//! - [`Pallet`] +//! +//! ## GenesisConfig +//! +//! The DDC Payouts pallet depends on the [`GenesisConfig`]. The +//! `GenesisConfig` is optional and allow to set some initial nodes in DDC. + +#![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] + +use ddc_primitives::{ClusterId, DdcEra}; +use frame_support::{pallet_prelude::*, parameter_types, BoundedVec}; +use frame_system::pallet_prelude::*; +pub use pallet::*; +use sp_runtime::Perbill; +use sp_std::{ops::Mul, prelude::*}; + +type BatchIndex = u16; + +parameter_types! { + pub MaxBatchesCount: u16 = 1000; +} + +#[frame_support::pallet] +pub mod pallet { + + use super::*; + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + } + + #[pallet::event] + #[pallet::generate_deposit(pub(crate) fn deposit_event)] + pub enum Event { + BillingReportInitialized { cluster_id: ClusterId, era: DdcEra }, + ChargingStarted { cluster_id: ClusterId, era: DdcEra }, + ChargingFinished { cluster_id: ClusterId, era: DdcEra }, + RewardingStarted { cluster_id: ClusterId, era: DdcEra }, + RewardingFinished { cluster_id: ClusterId, era: DdcEra }, + BillingReportFinalized { cluster_id: ClusterId, era: DdcEra }, + } + + #[pallet::error] + pub enum Error { + BillingReportDoesNotExist, + NotExpectedState, + BatchIndexAlreadyProcessed, + BatchIndexIsOutOfRange, + BatchesMissed, + NotDistributedBalance, + BatchIndexOverflow, + BoundedVecOverflow, + } + + #[pallet::storage] + #[pallet::getter(fn active_billing_reports)] + pub type ActiveBillingReports = StorageDoubleMap< + _, + Blake2_128Concat, + ClusterId, + Blake2_128Concat, + DdcEra, + BillingReport, + ValueQuery, + >; + + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq, Default)] + pub struct BillingReport { + state: State, + total_balance: u128, + distributed_balance: u128, + // stage 1 + charging_max_batch_index: BatchIndex, + charging_processed_batches: BoundedVec, + // stage 2 + rewarding_max_batch_index: BatchIndex, + rewarding_processed_batches: BoundedVec, + } + + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq, Default)] + pub enum State { + #[default] + NotInitialized, + Initialized, + ChargingCustomers, + CustomersCharged, + RewardingProviders, + ProvidersRewarded, + Finalized, + } + + #[pallet::call] + impl Pallet { + #[pallet::weight(10_000)] + pub fn begin_billing_report( + origin: OriginFor, + cluster_id: ClusterId, + era: DdcEra, + ) -> DispatchResult { + ensure_signed(origin)?; // todo: check that the caller is DAC account + + let mut billing_report = BillingReport::default(); + billing_report.state = State::Initialized; + ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); + + Self::deposit_event(Event::::BillingReportInitialized { cluster_id, era }); + + Ok(()) + } + + #[pallet::weight(10_000)] + pub fn begin_charging_customers( + origin: OriginFor, + cluster_id: ClusterId, + era: DdcEra, + max_batch_index: BatchIndex, + ) -> DispatchResult { + ensure_signed(origin)?; + + ensure!( + max_batch_index > 0 && max_batch_index < MaxBatchesCount::get(), + Error::::BatchIndexOverflow + ); + + let mut billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + .map_err(|_| Error::::BillingReportDoesNotExist)?; + + ensure!(billing_report.state == State::Initialized, Error::::NotExpectedState); + + billing_report.charging_max_batch_index = max_batch_index; + billing_report.state = State::ChargingCustomers; + ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); + + Self::deposit_event(Event::::ChargingStarted { cluster_id, era }); + + Ok(()) + } + + #[pallet::weight(10_000)] + pub fn send_charging_customers_batch( + origin: OriginFor, + cluster_id: ClusterId, + era: DdcEra, + batch_index: BatchIndex, + payers: Vec<(T::AccountId, u128)>, + ) -> DispatchResult { + ensure_signed(origin)?; + + let billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + .map_err(|_| Error::::BillingReportDoesNotExist)?; + + ensure!(billing_report.state == State::ChargingCustomers, Error::::NotExpectedState); + ensure!( + billing_report.charging_max_batch_index >= batch_index, + Error::::BatchIndexIsOutOfRange + ); + ensure!( + !billing_report.charging_processed_batches.contains(&batch_index), + Error::::BatchIndexAlreadyProcessed + ); + + let mut updated_billing_report = billing_report.clone(); + for payer in payers { + let _customer = payer.0; // todo: charge customer + let amount = payer.1; + updated_billing_report.total_balance += amount; + } + + updated_billing_report + .charging_processed_batches + .try_push(batch_index) + .map_err(|_| Error::::BoundedVecOverflow)?; + + ActiveBillingReports::::insert(cluster_id, era, updated_billing_report); + + Ok(()) + } + + #[pallet::weight(10_000)] + pub fn end_charging_customers( + origin: OriginFor, + cluster_id: ClusterId, + era: DdcEra, + ) -> DispatchResult { + ensure_signed(origin)?; + + let mut billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + .map_err(|_| Error::::BillingReportDoesNotExist)?; + + ensure!(billing_report.state == State::ChargingCustomers, Error::::NotExpectedState); + ensure!( + billing_report.charging_max_batch_index as usize == + billing_report.charging_processed_batches.len() - 1usize, + Error::::BatchesMissed + ); + + billing_report.state = State::CustomersCharged; + ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); + + Self::deposit_event(Event::::ChargingFinished { cluster_id, era }); + + Ok(()) + } + + #[pallet::weight(10_000)] + pub fn begin_rewarding_providers( + origin: OriginFor, + cluster_id: ClusterId, + era: DdcEra, + max_batch_index: BatchIndex, + ) -> DispatchResult { + ensure_signed(origin)?; + + ensure!( + max_batch_index > 0 && max_batch_index < MaxBatchesCount::get(), + Error::::BatchIndexOverflow + ); + + let mut billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + .map_err(|_| Error::::BillingReportDoesNotExist)?; + + ensure!(billing_report.state == State::CustomersCharged, Error::::NotExpectedState); + + billing_report.rewarding_max_batch_index = max_batch_index; + billing_report.state = State::RewardingProviders; + ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); + + Self::deposit_event(Event::::RewardingStarted { cluster_id, era }); + + Ok(()) + } + + #[pallet::weight(10_000)] + pub fn send_rewarding_providers_batch( + origin: OriginFor, + cluster_id: ClusterId, + era: DdcEra, + batch_index: BatchIndex, + payees: Vec<(T::AccountId, Perbill)>, + ) -> DispatchResult { + ensure_signed(origin)?; + + let billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + .map_err(|_| Error::::BillingReportDoesNotExist)?; + + ensure!( + billing_report.state == State::RewardingProviders, + Error::::NotExpectedState + ); + ensure!( + billing_report.rewarding_max_batch_index >= batch_index, + Error::::BatchIndexIsOutOfRange + ); + ensure!( + !billing_report.rewarding_processed_batches.contains(&batch_index), + Error::::BatchIndexAlreadyProcessed + ); + + let mut updated_billing_report = billing_report.clone(); + for payee in payees { + let _provider = payee.0; // todo: reward provider + let share = payee.1; + let amount = share.mul(billing_report.total_balance); + updated_billing_report.distributed_balance += amount; + } + + updated_billing_report + .rewarding_processed_batches + .try_push(batch_index) + .map_err(|_| Error::::BoundedVecOverflow)?; + + ActiveBillingReports::::insert(cluster_id, era, updated_billing_report); + + Ok(()) + } + + #[pallet::weight(10_000)] + pub fn end_rewarding_providers( + origin: OriginFor, + cluster_id: ClusterId, + era: DdcEra, + ) -> DispatchResult { + ensure_signed(origin)?; + + let mut billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + .map_err(|_| Error::::BillingReportDoesNotExist)?; + + ensure!( + billing_report.state == State::RewardingProviders, + Error::::NotExpectedState + ); + ensure!( + billing_report.rewarding_max_batch_index as usize == + billing_report.rewarding_processed_batches.len() - 1usize, + Error::::BatchesMissed + ); + + billing_report.state = State::ProvidersRewarded; + ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); + + Self::deposit_event(Event::::RewardingFinished { cluster_id, era }); + + Ok(()) + } + + #[pallet::weight(10_000)] + pub fn end_billing_report( + origin: OriginFor, + cluster_id: ClusterId, + era: DdcEra, + ) -> DispatchResult { + ensure_signed(origin)?; + + let mut billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + .map_err(|_| Error::::BillingReportDoesNotExist)?; + + ensure!(billing_report.state == State::ProvidersRewarded, Error::::NotExpectedState); + ensure!( + billing_report.total_balance == billing_report.distributed_balance, + Error::::NotDistributedBalance + ); + + billing_report.state = State::Finalized; + // todo: clear and archive billing_report + ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); + + Self::deposit_event(Event::::BillingReportFinalized { cluster_id, era }); + + Ok(()) + } + } +} diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index de23aa1fd..f8d9be6ee 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -9,6 +9,7 @@ use sp_core::hash::H160; use sp_runtime::{AccountId32, RuntimeDebug}; pub type ClusterId = H160; +pub type DdcEra = u64; #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 71b9c5112..14b228d39 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -106,6 +106,7 @@ pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pall pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } pallet-ddc-nodes = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-nodes" } pallet-ddc-clusters = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-clusters" } +pallet-ddc-payouts = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-payouts" } [build-dependencies] substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -189,6 +190,7 @@ std = [ "pallet-ddc-accounts/std", "pallet-ddc-nodes/std", "pallet-ddc-clusters/std", + "pallet-ddc-payouts/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 3279c7529..7f13e599f 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -52,6 +52,7 @@ pub use pallet_ddc_accounts; pub use pallet_ddc_clusters; pub use pallet_ddc_metrics_offchain_worker; pub use pallet_ddc_nodes; +pub use pallet_ddc_payouts; pub use pallet_ddc_staking; use pallet_election_provider_multi_phase::SolutionAccuracyOf; use pallet_grandpa::{ @@ -1372,6 +1373,10 @@ impl pallet_ddc_clusters::Config for Runtime { type NodeRepository = pallet_ddc_nodes::Pallet; } +impl pallet_ddc_payouts::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} + construct_runtime!( pub enum Runtime where Block = Block, @@ -1427,7 +1432,8 @@ construct_runtime!( DdcValidator: pallet_ddc_validator, DdcAccounts: pallet_ddc_accounts, DdcNodes: pallet_ddc_nodes, - DdcClusters: pallet_ddc_clusters + DdcClusters: pallet_ddc_clusters, + DdcPayouts: pallet_ddc_payouts } ); From 51c087436d6f6dfb9ed97b8ecb746dd5da56cbf8 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 27 Oct 2023 17:45:30 +0600 Subject: [PATCH 441/583] Optimize `fast_chill` removing iteration over keys --- pallets/ddc-clusters/src/lib.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 16e4f7d88..4da5c814e 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -78,6 +78,8 @@ pub mod pallet { FastChillProhibited, /// Cluster candidate should not plan to chill. ChillingProhibited, + /// Origin of the call is not a controller of the stake associated with the provided node. + NotNodeController, } #[pallet::storage] @@ -223,16 +225,16 @@ pub mod pallet { /// /// The dispatch origin for this call must be _Signed_ by the controller. #[pallet::weight(10_000)] - pub fn fast_chill(origin: OriginFor) -> DispatchResult { + pub fn fast_chill(origin: OriginFor, node: NodePubKey) -> DispatchResult { let controller = ensure_signed(origin)?; let stash = >::ledger(&controller) .ok_or(>::NotController)? .stash; - let node = >::iter() - .find(|(_, v)| *v == stash) - .ok_or(>::BadState)? - .0; + let node_stash = >::nodes(&node) + .ok_or(>::BadState)?; + ensure!(stash == node_stash, Error::::NotNodeController); + let cluster = >::edges(&stash) .or(>::storages(&stash)) .ok_or(Error::::NoStake)?; From 47c0e04e002007e7513f19fcd6c5af624a9a129a Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 27 Oct 2023 18:57:24 +0600 Subject: [PATCH 442/583] Impl conversion from `NodePubKey` variant to `u8` --- primitives/src/lib.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index de23aa1fd..401f5974e 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -17,5 +17,14 @@ pub enum NodePubKey { CDNPubKey(CDNNodePubKey), } +impl NodePubKey { + pub fn variant_as_number(&self) -> u8 { + match self { + NodePubKey::CDNPubKey(_) => 0, + NodePubKey::StoragePubKey(_) => 1, + } + } +} + pub type StorageNodePubKey = AccountId32; pub type CDNNodePubKey = AccountId32; From 5f255855d15d55e5443fccb14596f38e094ab0f0 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 27 Oct 2023 19:00:06 +0600 Subject: [PATCH 443/583] Reorder node auth and DDC stake check --- pallets/ddc-clusters/src/lib.rs | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 4da5c814e..972ba9f62 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -133,22 +133,6 @@ pub mod pallet { .map_err(|_| Error::::AttemptToAddNonExistentNode)?; ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAlreadyAssigned); - // Cluster extension smart contract allows joining. - let is_authorized: bool = pallet_contracts::Pallet::::bare_call( - caller_id, - cluster.props.node_provider_auth_contract, - Default::default(), - EXTENSION_CALL_GAS_LIMIT, - None, - Vec::from(INK_SELECTOR_IS_AUTHORIZED), - false, - ) - .result? - .data - .first() - .is_some_and(|x| *x == 1); - ensure!(is_authorized, Error::::NotAuthorized); - // Sufficient funds are locked at the DDC Staking module. let node_provider_stash = >::nodes(&node_pub_key).ok_or(Error::::NoStake)?; @@ -171,6 +155,22 @@ pub mod pallet { .is_some(); ensure!(!chilling, Error::::ChillingProhibited); + // Cluster extension smart contract allows joining. + let is_authorized: bool = pallet_contracts::Pallet::::bare_call( + caller_id, + cluster.props.node_provider_auth_contract, + Default::default(), + EXTENSION_CALL_GAS_LIMIT, + None, + Vec::from(INK_SELECTOR_IS_AUTHORIZED), + false, + ) + .result? + .data + .first() + .is_some_and(|x| *x == 1); + ensure!(is_authorized, Error::::NotAuthorized); + node.set_cluster_id(Some(cluster_id.clone())); T::NodeRepository::update(node).map_err(|_| Error::::AttemptToAddNonExistentNode)?; ClustersNodes::::insert(cluster_id.clone(), node_pub_key.clone(), true); From e6127e831f8e11cdebc733cf441ecc94408e918b Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Fri, 27 Oct 2023 19:01:24 +0600 Subject: [PATCH 444/583] Pass node and provider ids to the auth extension --- pallets/ddc-clusters/src/lib.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 972ba9f62..f8a5b35cf 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -156,13 +156,19 @@ pub mod pallet { ensure!(!chilling, Error::::ChillingProhibited); // Cluster extension smart contract allows joining. + // is_authorized(node_provider: AccountId, node: Vec, node_variant: u8) -> bool + let mut call_data = Vec::new(); + call_data.extend_from_slice(&INK_SELECTOR_IS_AUTHORIZED); + call_data.append(&mut node_provider_stash.encode()); + call_data.append(&mut node_pub_key.encode()); + call_data.push(node_pub_key.variant_as_number()); let is_authorized: bool = pallet_contracts::Pallet::::bare_call( caller_id, cluster.props.node_provider_auth_contract, Default::default(), EXTENSION_CALL_GAS_LIMIT, None, - Vec::from(INK_SELECTOR_IS_AUTHORIZED), + call_data, false, ) .result? From df38361cc4e8c50f189dd2105fc60a1b206b62f9 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 30 Oct 2023 12:00:38 +0600 Subject: [PATCH 445/583] Bump `cere-dev` runtime `spec_version` --- runtime/cere-dev/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 3cf8bb6f9..46ee3b429 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -130,7 +130,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: 48010, + spec_version: 48011, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, From 07a6227b5fbad3b4fc6f52eab95f6774caf71713 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 31 Oct 2023 12:47:04 +0600 Subject: [PATCH 446/583] Fix cluster extension contract call data encoding --- pallets/ddc-clusters/src/lib.rs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index f8a5b35cf..fafa00f9b 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -156,13 +156,17 @@ pub mod pallet { ensure!(!chilling, Error::::ChillingProhibited); // Cluster extension smart contract allows joining. - // is_authorized(node_provider: AccountId, node: Vec, node_variant: u8) -> bool - let mut call_data = Vec::new(); - call_data.extend_from_slice(&INK_SELECTOR_IS_AUTHORIZED); - call_data.append(&mut node_provider_stash.encode()); - call_data.append(&mut node_pub_key.encode()); - call_data.push(node_pub_key.variant_as_number()); - let is_authorized: bool = pallet_contracts::Pallet::::bare_call( + let call_data = { + // is_authorized(node_provider: AccountId, node: Vec, node_variant: u8) -> bool + let args: ([u8; 4], T::AccountId, Vec, u8) = ( + INK_SELECTOR_IS_AUTHORIZED, + node_provider_stash, + node_pub_key.encode()[1..].to_vec(), // remove the first byte added by SCALE + node_pub_key.variant_as_number(), + ); + args.encode() + }; + let is_authorized = pallet_contracts::Pallet::::bare_call( caller_id, cluster.props.node_provider_auth_contract, Default::default(), From e28a213372cf98325ad44036aa2633fd5a88d96f Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Thu, 2 Nov 2023 00:19:03 +0100 Subject: [PATCH 447/583] feat: generating a vault address for each billing report --- pallets/ddc-payouts/src/lib.rs | 46 +++++++++++++++++++++++++++++++--- primitives/src/lib.rs | 2 +- runtime/cere-dev/src/lib.rs | 5 ++++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index e676f2eb3..f647f7047 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -31,6 +31,9 @@ parameter_types! { pub mod pallet { use super::*; + use frame_support::PalletId; + use sp_io::hashing::blake2_128; + use sp_runtime::traits::{AccountIdConversion, Zero}; #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] @@ -40,6 +43,8 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config { type RuntimeEvent: From> + IsType<::RuntimeEvent>; + #[pallet::constant] + type PalletId: Get; } #[pallet::event] @@ -73,13 +78,15 @@ pub mod pallet { ClusterId, Blake2_128Concat, DdcEra, - BillingReport, + BillingReport, ValueQuery, >; - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq, Default)] - pub struct BillingReport { + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] + #[scale_info(skip_type_params(T))] + pub struct BillingReport { state: State, + vault: T::AccountId, total_balance: u128, distributed_balance: u128, // stage 1 @@ -90,6 +97,21 @@ pub mod pallet { rewarding_processed_batches: BoundedVec, } + impl Default for BillingReport { + fn default() -> Self { + Self { + state: State::default(), + vault: T::PalletId::get().into_account_truncating(), + total_balance: Zero::zero(), + distributed_balance: Zero::zero(), + charging_max_batch_index: Zero::zero(), + charging_processed_batches: BoundedVec::default(), + rewarding_max_batch_index: Zero::zero(), + rewarding_processed_batches: BoundedVec::default(), + } + } + } + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq, Default)] pub enum State { #[default] @@ -113,6 +135,7 @@ pub mod pallet { ensure_signed(origin)?; // todo: check that the caller is DAC account let mut billing_report = BillingReport::default(); + billing_report.vault = Self::sub_account_id(cluster_id.clone(), era); billing_report.state = State::Initialized; ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); @@ -342,4 +365,21 @@ pub mod pallet { Ok(()) } } + + impl Pallet { + fn account_id() -> T::AccountId { + T::PalletId::get().into_account_truncating() + } + + fn sub_account_id(cluster_id: ClusterId, era: DdcEra) -> T::AccountId { + let mut bytes = Vec::new(); + bytes.extend_from_slice(&cluster_id[..]); + bytes.extend_from_slice(&era.encode()); + let hash = blake2_128(&bytes); + // "modl" + "payouts_" + hash is 28 bytes, the T::AccountId is 32 bytes, so we should be + // safe from the truncation and possible collisions caused by it. The rest 4 bytes will + // be fulfilled with trailing zeros. + T::PalletId::get().into_sub_account_truncating(hash) + } + } } diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index f8d9be6ee..38bf95d96 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -9,7 +9,7 @@ use sp_core::hash::H160; use sp_runtime::{AccountId32, RuntimeDebug}; pub type ClusterId = H160; -pub type DdcEra = u64; +pub type DdcEra = u32; #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 99d5d06ac..886ea9f25 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1374,8 +1374,13 @@ impl pallet_ddc_clusters::Config for Runtime { type NodeRepository = pallet_ddc_nodes::Pallet; } +parameter_types! { + pub const PayoutsPalletId: PalletId = PalletId(*b"payouts_"); +} + impl pallet_ddc_payouts::Config for Runtime { type RuntimeEvent = RuntimeEvent; + type PalletId = PayoutsPalletId; } construct_runtime!( From 824ee831e78bb61a1679cb5186f5a18c50e7d9f5 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Thu, 2 Nov 2023 23:16:36 +0100 Subject: [PATCH 448/583] feat: ddc-traits module is added for loose coupling between pallets --- Cargo.lock | 344 +++++++++++++++++--------------- pallets/ddc-clusters/Cargo.toml | 3 +- pallets/ddc-clusters/src/lib.rs | 99 ++++----- pallets/ddc-staking/Cargo.toml | 1 + pallets/ddc-staking/src/lib.rs | 100 +++++++++- runtime/cere-dev/src/lib.rs | 2 + traits/Cargo.toml | 11 + traits/src/cluster.rs | 12 ++ traits/src/lib.rs | 4 + traits/src/staking.rs | 16 ++ 10 files changed, 356 insertions(+), 236 deletions(-) create mode 100644 traits/Cargo.toml create mode 100644 traits/src/cluster.rs create mode 100644 traits/src/lib.rs create mode 100644 traits/src/staking.rs diff --git a/Cargo.lock b/Cargo.lock index 3d2141735..143e726d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1633,6 +1633,17 @@ dependencies = [ "sp-runtime", ] +[[package]] +name = "ddc-traits" +version = "0.1.0" +dependencies = [ + "ddc-primitives", + "frame-support", + "frame-system", + "sp-core", + "sp-std", +] + [[package]] name = "der" version = "0.5.1" @@ -2106,7 +2117,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", ] @@ -2123,7 +2134,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2146,7 +2157,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "array-bytes 4.2.0", @@ -2197,7 +2208,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2208,7 +2219,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2224,7 +2235,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2253,7 +2264,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2285,7 +2296,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "cfg-expr", @@ -2299,7 +2310,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2311,7 +2322,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -2321,7 +2332,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "log", @@ -2339,7 +2350,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -2354,7 +2365,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -2363,7 +2374,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "parity-scale-codec", @@ -4430,7 +4441,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system", "parity-scale-codec", @@ -4629,7 +4640,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4645,7 +4656,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4660,7 +4671,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4684,7 +4695,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4704,7 +4715,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4719,7 +4730,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4770,7 +4781,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4789,7 +4800,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4806,7 +4817,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4834,7 +4845,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -4849,7 +4860,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -4859,7 +4870,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-contracts-primitives", @@ -4876,7 +4887,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -4891,13 +4902,13 @@ name = "pallet-ddc-clusters" version = "4.8.1" dependencies = [ "ddc-primitives", + "ddc-traits", "frame-benchmarking", "frame-support", "frame-system", "log", "pallet-contracts", "pallet-ddc-nodes", - "pallet-ddc-staking", "parity-scale-codec", "scale-info", "sp-core", @@ -4979,6 +4990,7 @@ name = "pallet-ddc-staking" version = "4.8.1" dependencies = [ "ddc-primitives", + "ddc-traits", "frame-benchmarking", "frame-support", "frame-system", @@ -5035,7 +5047,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5051,7 +5063,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5075,7 +5087,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5088,7 +5100,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5144,7 +5156,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5165,7 +5177,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5188,7 +5200,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5204,7 +5216,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5224,7 +5236,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5241,7 +5253,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5258,7 +5270,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5273,7 +5285,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5290,7 +5302,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5310,7 +5322,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -5320,7 +5332,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5337,7 +5349,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5360,7 +5372,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5375,7 +5387,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5389,7 +5401,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5404,7 +5416,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5420,7 +5432,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5441,7 +5453,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5457,7 +5469,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5471,7 +5483,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5494,7 +5506,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5505,7 +5517,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5519,7 +5531,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5537,7 +5549,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5556,7 +5568,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5572,7 +5584,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5587,7 +5599,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5598,7 +5610,7 @@ dependencies = [ [[package]] name = "pallet-transaction-storage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5616,7 +5628,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5633,7 +5645,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5649,7 +5661,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6554,7 +6566,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "env_logger 0.9.3", "jsonrpsee", @@ -6827,7 +6839,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -6838,7 +6850,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6865,7 +6877,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -6888,7 +6900,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6904,7 +6916,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6921,7 +6933,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6932,7 +6944,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "chrono", @@ -6972,7 +6984,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fnv", "futures", @@ -7000,7 +7012,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "kvdb", @@ -7025,7 +7037,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -7049,7 +7061,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "fork-tree", @@ -7091,7 +7103,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7113,7 +7125,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -7126,7 +7138,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -7150,7 +7162,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sc-client-api", "sp-authorship", @@ -7161,7 +7173,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "lru", @@ -7188,7 +7200,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -7204,7 +7216,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7219,7 +7231,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cfg-if", "libc", @@ -7239,7 +7251,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "array-bytes 4.2.0", @@ -7280,7 +7292,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "futures", @@ -7301,7 +7313,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7318,7 +7330,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -7333,7 +7345,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "async-trait", @@ -7380,7 +7392,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cid", "futures", @@ -7400,7 +7412,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7426,7 +7438,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "futures", @@ -7444,7 +7456,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -7465,7 +7477,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "fork-tree", @@ -7493,7 +7505,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "futures", @@ -7512,7 +7524,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "bytes", @@ -7542,7 +7554,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libp2p", @@ -7555,7 +7567,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7564,7 +7576,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "hash-db", @@ -7594,7 +7606,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7617,7 +7629,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7630,7 +7642,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "directories", @@ -7700,7 +7712,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7714,7 +7726,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7733,7 +7745,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libc", @@ -7752,7 +7764,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "chrono", "futures", @@ -7770,7 +7782,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7801,7 +7813,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7812,7 +7824,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -7838,7 +7850,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -7851,7 +7863,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -8264,7 +8276,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8282,7 +8294,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "proc-macro-crate", @@ -8294,7 +8306,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8307,7 +8319,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "integer-sqrt", "num-traits", @@ -8322,7 +8334,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8335,7 +8347,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "parity-scale-codec", @@ -8347,7 +8359,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -8359,7 +8371,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -8377,7 +8389,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8396,7 +8408,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "merlin", @@ -8419,7 +8431,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8433,7 +8445,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8446,7 +8458,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes 4.2.0", "base58", @@ -8492,7 +8504,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "byteorder", @@ -8506,7 +8518,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8517,7 +8529,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8526,7 +8538,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8536,7 +8548,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -8547,7 +8559,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "log", @@ -8565,7 +8577,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8579,7 +8591,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "futures", @@ -8605,7 +8617,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "sp-core", @@ -8616,7 +8628,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8633,7 +8645,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "thiserror", "zstd", @@ -8642,7 +8654,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8656,7 +8668,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-core", @@ -8666,7 +8678,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "backtrace", "lazy_static", @@ -8676,7 +8688,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "rustc-hash", "serde", @@ -8686,7 +8698,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "either", "hash256-std-hasher", @@ -8709,7 +8721,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8727,7 +8739,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "proc-macro-crate", @@ -8739,7 +8751,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -8753,7 +8765,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8767,7 +8779,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8778,7 +8790,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8800,12 +8812,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8818,7 +8830,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -8831,7 +8843,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures-timer", @@ -8847,7 +8859,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-std", @@ -8859,7 +8871,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-runtime", @@ -8868,7 +8880,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "log", @@ -8884,7 +8896,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "hash-db", @@ -8907,7 +8919,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8924,7 +8936,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8935,7 +8947,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "log", @@ -8948,7 +8960,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -9095,7 +9107,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "platforms 2.0.0", ] @@ -9103,7 +9115,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -9124,7 +9136,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures-util", "hyper", @@ -9137,7 +9149,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "log", @@ -9158,7 +9170,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "substrate-test-utils-derive", @@ -9168,7 +9180,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9179,7 +9191,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -9626,7 +9638,7 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "clap", "frame-try-runtime", diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index a7ed43bdf..62f59dd67 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } +ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -18,7 +19,6 @@ sp-std = { version = "4.0.0-dev", default-features = false, git = "https://githu sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } -pallet-ddc-staking = { version = "4.8.1", default-features = false, path = "../ddc-staking" } [dev-dependencies] sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -35,7 +35,6 @@ std = [ "frame-benchmarking/std", "pallet-contracts/std", "pallet-ddc-nodes/std", - "pallet-ddc-staking/std", "scale-info/std", "sp-core/std", "sp-io/std", diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index fafa00f9b..32547c464 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -16,6 +16,10 @@ #![feature(is_some_and)] // ToDo: delete at rustc > 1.70 use ddc_primitives::{ClusterId, NodePubKey}; +use ddc_traits::{ + cluster::{ClusterVisitor, ClusterVisitorError}, + staking::{StakingVisitor, StakingVisitorError}, +}; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; pub use pallet::*; @@ -45,11 +49,10 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: - frame_system::Config + pallet_contracts::Config + pallet_ddc_staking::Config - { + pub trait Config: frame_system::Config + pallet_contracts::Config { type RuntimeEvent: From> + IsType<::RuntimeEvent>; - type NodeRepository: NodeRepository; + type NodeRepository: NodeRepository; // todo: get rid of tight coupling with nodes-pallet + type StakingVisitor: StakingVisitor; } #[pallet::event] @@ -71,15 +74,11 @@ pub mod pallet { NodeIsAlreadyAssigned, NodeIsNotAssigned, OnlyClusterManager, - NotAuthorized, - NoStake, - /// Conditions for fast chill are not met, try the regular `chill` from - /// `pallet-ddc-staking`. - FastChillProhibited, + NodeIsNotAuthorized, + NodeHasNoStake, + NodeStakeIsInvalid, /// Cluster candidate should not plan to chill. - ChillingProhibited, - /// Origin of the call is not a controller of the stake associated with the provided node. - NotNodeController, + NodeChillingIsProhibited, } #[pallet::storage] @@ -129,38 +128,28 @@ pub mod pallet { let cluster = Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); + + // Node with this node with this public key exists let mut node = T::NodeRepository::get(node_pub_key.clone()) .map_err(|_| Error::::AttemptToAddNonExistentNode)?; ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAlreadyAssigned); // Sufficient funds are locked at the DDC Staking module. - let node_provider_stash = - >::nodes(&node_pub_key).ok_or(Error::::NoStake)?; - let maybe_edge_in_cluster = - >::edges(&node_provider_stash); - let maybe_storage_in_cluster = - >::storages(&node_provider_stash); - let has_stake = maybe_edge_in_cluster - .or(maybe_storage_in_cluster) - .is_some_and(|staking_cluster| staking_cluster == cluster_id); - ensure!(has_stake, Error::::NoStake); + let has_stake = T::StakingVisitor::node_has_stake(&node_pub_key, &cluster_id) + .map_err(|e| Into::>::into(StakingVisitorError::from(e)))?; + ensure!(has_stake, Error::::NodeHasNoStake); // Candidate is not planning to pause operations any time soon. - let node_provider_controller = - >::bonded(&node_provider_stash) - .ok_or(>::BadState)?; - let chilling = >::ledger(&node_provider_controller) - .ok_or(>::BadState)? - .chilling - .is_some(); - ensure!(!chilling, Error::::ChillingProhibited); + let is_chilling = T::StakingVisitor::node_is_chilling(&node_pub_key) + .map_err(|e| Into::>::into(StakingVisitorError::from(e)))?; + ensure!(!is_chilling, Error::::NodeChillingIsProhibited); // Cluster extension smart contract allows joining. let call_data = { // is_authorized(node_provider: AccountId, node: Vec, node_variant: u8) -> bool - let args: ([u8; 4], T::AccountId, Vec, u8) = ( + let args: ([u8; 4], /* T::AccountId, */ Vec, u8) = ( INK_SELECTOR_IS_AUTHORIZED, - node_provider_stash, + // *node.get_provider_id(), node_pub_key.encode()[1..].to_vec(), // remove the first byte added by SCALE node_pub_key.variant_as_number(), ); @@ -179,7 +168,7 @@ pub mod pallet { .data .first() .is_some_and(|x| *x == 1); - ensure!(is_authorized, Error::::NotAuthorized); + ensure!(is_authorized, Error::::NodeIsNotAuthorized); node.set_cluster_id(Some(cluster_id.clone())); T::NodeRepository::update(node).map_err(|_| Error::::AttemptToAddNonExistentNode)?; @@ -230,36 +219,26 @@ pub mod pallet { Ok(()) } + } - /// Allow cluster node candidate to chill in the next DDC era. - /// - /// The dispatch origin for this call must be _Signed_ by the controller. - #[pallet::weight(10_000)] - pub fn fast_chill(origin: OriginFor, node: NodePubKey) -> DispatchResult { - let controller = ensure_signed(origin)?; - - let stash = >::ledger(&controller) - .ok_or(>::NotController)? - .stash; - let node_stash = >::nodes(&node) - .ok_or(>::BadState)?; - ensure!(stash == node_stash, Error::::NotNodeController); - - let cluster = >::edges(&stash) - .or(>::storages(&stash)) - .ok_or(Error::::NoStake)?; - let is_cluster_node = ClustersNodes::::get(cluster, node); - ensure!(!is_cluster_node, Error::::FastChillProhibited); + impl ClusterVisitor for Pallet { + fn cluster_has_node(cluster_id: &ClusterId, node_pub_key: &NodePubKey) -> bool { + ClustersNodes::::get(cluster_id, node_pub_key) + } - let can_chill_from = >::current_era().unwrap_or(0) + 1; - >::chill_stash_soon( - &stash, - &controller, - cluster, - can_chill_from, - ); + fn ensure_cluster(cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { + Clusters::::get(&cluster_id) + .map(|_| ()) + .ok_or(ClusterVisitorError::ClusterDoesNotExist) + } + } - Ok(()) + impl From for Error { + fn from(error: StakingVisitorError) -> Self { + match error { + StakingVisitorError::NodeStakeDoesNotExist => Error::::NodeHasNoStake, + StakingVisitorError::NodeStakeIsInBadState => Error::::NodeStakeIsInvalid, + } } } } diff --git a/pallets/ddc-staking/Cargo.toml b/pallets/ddc-staking/Cargo.toml index 572a2fd25..9fbcc154e 100644 --- a/pallets/ddc-staking/Cargo.toml +++ b/pallets/ddc-staking/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } +ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 6a64ac9b3..55614769b 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -13,6 +13,7 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] +#![feature(is_some_and)] // ToDo: delete at rustc > 1.70 #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; @@ -29,6 +30,11 @@ use crate::weights::WeightInfo; use codec::{Decode, Encode, HasCompact}; pub use ddc_primitives::{ClusterId, NodePubKey}; +use ddc_traits::{ + cluster::{ClusterVisitor, ClusterVisitorError}, + staking::{StakingVisitor, StakingVisitorError}, +}; + use frame_support::{ assert_ok, pallet_prelude::*, @@ -244,6 +250,8 @@ pub mod pallet { /// Time used for computing era index. It is guaranteed to start being called from the first /// `on_finalize`. type UnixTime: UnixTime; + + type ClusterVisitor: ClusterVisitor; } /// Map from all locked "stash" accounts to the controller account. @@ -475,6 +483,12 @@ pub mod pallet { BudgetOverflow, /// Current era not set during runtime DDCEraNotSet, + /// Origin of the call is not a controller of the stake associated with the provided node. + NotNodeController, + /// No stake found associated with the provided node. + NodeHasNoStake, + /// Conditions for fast chill are not met, try the regular `chill` from + FastChillProhibited, } #[pallet::hooks] @@ -678,12 +692,15 @@ pub mod pallet { /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. The /// bond size must be greater than or equal to the `EdgeBondSize`. #[pallet::weight(T::WeightInfo::serve())] - pub fn serve(origin: OriginFor, cluster: ClusterId) -> DispatchResult { + pub fn serve(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let controller = ensure_signed(origin)?; + T::ClusterVisitor::ensure_cluster(&cluster_id) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; ensure!( - ledger.active >= Self::settings(cluster).edge_bond_size, + ledger.active >= Self::settings(cluster_id).edge_bond_size, Error::::InsufficientBond ); let stash = &ledger.stash; @@ -694,13 +711,13 @@ pub mod pallet { // Is it an attempt to cancel a previous "chill"? if let Some(current_cluster) = Self::edges(&stash) { // Switching the cluster is prohibited. The user should chill first. - ensure!(current_cluster == cluster, Error::::AlreadyInRole); + ensure!(current_cluster == cluster_id, Error::::AlreadyInRole); // Cancel previous "chill" attempts Self::reset_chilling(&controller); return Ok(()) } - Self::do_add_edge(stash, cluster); + Self::do_add_edge(stash, cluster_id); Ok(()) } @@ -712,12 +729,15 @@ pub mod pallet { /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. The /// bond size must be greater than or equal to the `StorageBondSize`. #[pallet::weight(T::WeightInfo::store())] - pub fn store(origin: OriginFor, cluster: ClusterId) -> DispatchResult { + pub fn store(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let controller = ensure_signed(origin)?; + T::ClusterVisitor::ensure_cluster(&cluster_id) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; ensure!( - ledger.active >= Self::settings(cluster).storage_bond_size, + ledger.active >= Self::settings(cluster_id).storage_bond_size, Error::::InsufficientBond ); let stash = &ledger.stash; @@ -728,13 +748,13 @@ pub mod pallet { // Is it an attempt to cancel a previous "chill"? if let Some(current_cluster) = Self::storages(&stash) { // Switching the cluster is prohibited. The user should chill first. - ensure!(current_cluster == cluster, Error::::AlreadyInRole); + ensure!(current_cluster == cluster_id, Error::::AlreadyInRole); // Cancel previous "chill" attempts Self::reset_chilling(&controller); return Ok(()) } - Self::do_add_storage(stash, cluster); + Self::do_add_storage(stash, cluster_id); Ok(()) } @@ -940,6 +960,30 @@ pub mod pallet { Ok(()) } + + /// Allow cluster node candidate to chill in the next DDC era. + /// + /// The dispatch origin for this call must be _Signed_ by the controller. + #[pallet::weight(10_000)] + pub fn fast_chill(origin: OriginFor, node_pub_key: NodePubKey) -> DispatchResult { + let controller = ensure_signed(origin)?; + + let stash = >::get(&controller).ok_or(Error::::NotController)?.stash; + let node_stash = >::get(&node_pub_key).ok_or(Error::::BadState)?; + ensure!(stash == node_stash, Error::::NotNodeController); + + let cluster_id = >::get(&stash) + .or(>::get(&stash)) + .ok_or(Error::::NodeHasNoStake)?; + + let is_cluster_node = T::ClusterVisitor::cluster_has_node(&cluster_id, &node_pub_key); + ensure!(!is_cluster_node, Error::::FastChillProhibited); + + let can_chill_from = Self::current_era().unwrap_or(0) + 1; + Self::chill_stash_soon(&stash, &controller, cluster_id, can_chill_from); + + Ok(()) + } } impl Pallet { @@ -1116,4 +1160,44 @@ pub mod pallet { }); } } + + impl StakingVisitor for Pallet { + fn node_has_stake( + node_pub_key: &NodePubKey, + cluster_id: &ClusterId, + ) -> Result { + let stash = + >::get(&node_pub_key).ok_or(StakingVisitorError::NodeStakeDoesNotExist)?; + let maybe_edge_in_cluster = Edges::::get(&stash); + let maybe_storage_in_cluster = Storages::::get(&stash); + + let has_stake: bool = maybe_edge_in_cluster + .or(maybe_storage_in_cluster) + .is_some_and(|staking_cluster| staking_cluster == *cluster_id); + + Ok(has_stake) + } + + fn node_is_chilling(node_pub_key: &NodePubKey) -> Result { + let stash = + >::get(&node_pub_key).ok_or(StakingVisitorError::NodeStakeDoesNotExist)?; + let controller = + >::get(&stash).ok_or(StakingVisitorError::NodeStakeIsInBadState)?; + + let is_chilling = >::get(&controller) + .ok_or(StakingVisitorError::NodeStakeIsInBadState)? + .chilling + .is_some(); + + Ok(is_chilling) + } + } + + impl From for Error { + fn from(error: ClusterVisitorError) -> Self { + match error { + ClusterVisitorError::ClusterDoesNotExist => Error::::NodeHasNoStake, + } + } + } } diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 46ee3b429..0637375e6 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1334,6 +1334,7 @@ impl pallet_ddc_staking::Config for Runtime { type StakersPayoutSource = DdcCustomersPalletId; type UnixTime = Timestamp; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; + type ClusterVisitor = pallet_ddc_clusters::Pallet; } parameter_types! { @@ -1371,6 +1372,7 @@ impl pallet_ddc_nodes::Config for Runtime { impl pallet_ddc_clusters::Config for Runtime { type RuntimeEvent = RuntimeEvent; type NodeRepository = pallet_ddc_nodes::Pallet; + type StakingVisitor = pallet_ddc_staking::Pallet; } construct_runtime!( diff --git a/traits/Cargo.toml b/traits/Cargo.toml new file mode 100644 index 000000000..ef2bb96e9 --- /dev/null +++ b/traits/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "ddc-traits" +version = "0.1.0" +edition = "2021" + +[dependencies] +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +ddc-primitives = { version = "0.1.0", default-features = false, path = "../primitives" } diff --git a/traits/src/cluster.rs b/traits/src/cluster.rs new file mode 100644 index 000000000..a1cae3515 --- /dev/null +++ b/traits/src/cluster.rs @@ -0,0 +1,12 @@ +use ddc_primitives::{ClusterId, NodePubKey}; +use frame_system::Config; + +pub trait ClusterVisitor { + fn cluster_has_node(cluster_id: &ClusterId, node_pub_key: &NodePubKey) -> bool; + + fn ensure_cluster(cluster_id: &ClusterId) -> Result<(), ClusterVisitorError>; +} + +pub enum ClusterVisitorError { + ClusterDoesNotExist, +} diff --git a/traits/src/lib.rs b/traits/src/lib.rs new file mode 100644 index 000000000..f6eb2b0a4 --- /dev/null +++ b/traits/src/lib.rs @@ -0,0 +1,4 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +pub mod cluster; +pub mod staking; diff --git a/traits/src/staking.rs b/traits/src/staking.rs new file mode 100644 index 000000000..5ec1e8bcf --- /dev/null +++ b/traits/src/staking.rs @@ -0,0 +1,16 @@ +use ddc_primitives::{ClusterId, NodePubKey}; +use frame_system::Config; + +pub trait StakingVisitor { + fn node_has_stake( + node_pub_key: &NodePubKey, + cluster_id: &ClusterId, + ) -> Result; + + fn node_is_chilling(node_pub_key: &NodePubKey) -> Result; +} + +pub enum StakingVisitorError { + NodeStakeDoesNotExist, + NodeStakeIsInBadState, +} From dac1f2f1ab376ab93aabf6c36fce9977b63c4340 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Thu, 2 Nov 2023 23:25:56 +0100 Subject: [PATCH 449/583] fix: mock object for ddc-staking tests is fixed --- pallets/ddc-staking/src/mock.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 48d046fb6..9a03bd114 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -4,6 +4,7 @@ use crate::{self as pallet_ddc_staking, *}; use ddc_primitives::{CDNNodePubKey, StorageNodePubKey}; +use ddc_traits::cluster::{ClusterVisitor, ClusterVisitorError}; use frame_support::{ construct_runtime, traits::{ConstU32, ConstU64, Everything, GenesisBuild}, @@ -110,11 +111,20 @@ impl crate::pallet::Config for Test { type UnixTime = Timestamp; type WeightInfo = (); type StakersPayoutSource = DdcAccountsPalletId; + type ClusterVisitor = TestClusterVisitor; } pub(crate) type DdcStakingCall = crate::Call; pub(crate) type TestRuntimeCall = ::RuntimeCall; - +pub struct TestClusterVisitor {} +impl ClusterVisitor for TestClusterVisitor { + fn cluster_has_node(_cluster_id: &ClusterId, _node_pub_key: &NodePubKey) -> bool { + true + } + fn ensure_cluster(_cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { + Ok(()) + } +} pub struct ExtBuilder { has_edges: bool, has_storages: bool, From 714f1c0350c2c7f475deb03ef749187deb83afe4 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 3 Nov 2023 01:06:34 +0100 Subject: [PATCH 450/583] feat: trait bounds are added for the node provider type --- pallets/ddc-clusters/src/lib.rs | 13 +++++----- pallets/ddc-nodes/src/cdn_node.rs | 15 ++++++------ pallets/ddc-nodes/src/lib.rs | 19 +++++++-------- pallets/ddc-nodes/src/node.rs | 24 +++++++++---------- pallets/ddc-nodes/src/storage_node.rs | 34 +++++++++++++-------------- primitives/src/lib.rs | 9 ------- 6 files changed, 53 insertions(+), 61 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 32547c464..6ab995511 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -95,7 +95,7 @@ pub mod pallet { Blake2_128Concat, NodePubKey, bool, - ValueQuery, + OptionQuery, >; #[pallet::call] @@ -147,11 +147,12 @@ pub mod pallet { // Cluster extension smart contract allows joining. let call_data = { // is_authorized(node_provider: AccountId, node: Vec, node_variant: u8) -> bool - let args: ([u8; 4], /* T::AccountId, */ Vec, u8) = ( + let args: ([u8; 4], T::AccountId, Vec, u8) = ( INK_SELECTOR_IS_AUTHORIZED, - // *node.get_provider_id(), - node_pub_key.encode()[1..].to_vec(), // remove the first byte added by SCALE - node_pub_key.variant_as_number(), + node.get_provider_id().to_owned(), + /* remove the first byte* added by SCALE */ + node.get_pub_key().to_owned().encode()[1..].to_vec(), + node.get_type().into(), ); args.encode() }; @@ -223,7 +224,7 @@ pub mod pallet { impl ClusterVisitor for Pallet { fn cluster_has_node(cluster_id: &ClusterId, node_pub_key: &NodePubKey) -> bool { - ClustersNodes::::get(cluster_id, node_pub_key) + ClustersNodes::::get(cluster_id, node_pub_key).is_some() } fn ensure_cluster(cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 2bf763e44..aa0392d3c 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -13,9 +13,10 @@ parameter_types! { } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct CDNNode { +#[scale_info(skip_type_params(T))] +pub struct CDNNode { pub pub_key: CDNNodePubKey, - pub provider_id: AccountId, + pub provider_id: T::AccountId, pub cluster_id: Option, pub props: CDNNodeProps, } @@ -32,11 +33,11 @@ pub struct CDNNodeParams { pub params: Vec, // should be replaced with specific parameters for this type of node } -impl NodeTrait for CDNNode { +impl NodeTrait for CDNNode { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { NodePubKeyRef::CDNPubKeyRef(&self.pub_key) } - fn get_provider_id(&self) -> &AccountId { + fn get_provider_id(&self) -> &T::AccountId { &self.provider_id } fn get_props<'a>(&'a self) -> NodePropsRef<'a> { @@ -70,12 +71,12 @@ impl NodeTrait for CDNNode { } fn new( node_pub_key: NodePubKey, - provider_id: AccountId, + provider_id: T::AccountId, node_params: NodeParams, - ) -> Result, NodeError> { + ) -> Result, NodeError> { match node_pub_key { NodePubKey::CDNPubKey(pub_key) => match node_params { - NodeParams::CDNParams(node_params) => Ok(Node::CDN(CDNNode:: { + NodeParams::CDNParams(node_params) => Ok(Node::CDN(CDNNode:: { provider_id, pub_key, cluster_id: None, diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index a6ff1b3d4..70efb076f 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -66,12 +66,11 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn storage_nodes)] pub type StorageNodes = - StorageMap<_, Blake2_128Concat, StorageNodePubKey, StorageNode>; + StorageMap<_, Blake2_128Concat, StorageNodePubKey, StorageNode>; #[pallet::storage] #[pallet::getter(fn cdn_nodes)] - pub type CDNNodes = - StorageMap<_, Blake2_128Concat, CDNNodePubKey, CDNNode>; + pub type CDNNodes = StorageMap<_, Blake2_128Concat, CDNNodePubKey, CDNNode>; #[pallet::call] impl Pallet { @@ -82,7 +81,7 @@ pub mod pallet { node_params: NodeParams, ) -> DispatchResult { let caller_id = ensure_signed(origin)?; - let node = Node::::new(node_pub_key.clone(), caller_id, node_params) + let node = Node::::new(node_pub_key.clone(), caller_id, node_params) .map_err(|e| Into::>::into(NodeError::from(e)))?; Self::create(node).map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; Self::deposit_event(Event::::NodeCreated { node_pub_key }); @@ -121,9 +120,9 @@ pub mod pallet { } pub trait NodeRepository { - fn create(node: Node) -> Result<(), NodeRepositoryError>; - fn get(node_pub_key: NodePubKey) -> Result, NodeRepositoryError>; - fn update(node: Node) -> Result<(), NodeRepositoryError>; + fn create(node: Node) -> Result<(), NodeRepositoryError>; + fn get(node_pub_key: NodePubKey) -> Result, NodeRepositoryError>; + fn update(node: Node) -> Result<(), NodeRepositoryError>; fn delete(node_pub_key: NodePubKey) -> Result<(), NodeRepositoryError>; } @@ -146,7 +145,7 @@ pub mod pallet { } impl NodeRepository for Pallet { - fn create(node: Node) -> Result<(), NodeRepositoryError> { + fn create(node: Node) -> Result<(), NodeRepositoryError> { match node { Node::Storage(storage_node) => { if StorageNodes::::contains_key(&storage_node.pub_key) { @@ -165,7 +164,7 @@ pub mod pallet { } } - fn get(node_pub_key: NodePubKey) -> Result, NodeRepositoryError> { + fn get(node_pub_key: NodePubKey) -> Result, NodeRepositoryError> { match node_pub_key { NodePubKey::StoragePubKey(pub_key) => match StorageNodes::::try_get(pub_key) { Ok(storage_node) => Ok(Node::Storage(storage_node)), @@ -178,7 +177,7 @@ pub mod pallet { } } - fn update(node: Node) -> Result<(), NodeRepositoryError> { + fn update(node: Node) -> Result<(), NodeRepositoryError> { match node { Node::Storage(storage_node) => { if !StorageNodes::::contains_key(&storage_node.pub_key) { diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index e571cfe85..abed0b026 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -10,9 +10,9 @@ use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub enum Node { - Storage(StorageNode), - CDN(CDNNode), +pub enum Node { + Storage(StorageNode), + CDN(CDNNode), } // Params fields are always coming from extrinsic input @@ -52,9 +52,9 @@ pub enum NodePropsRef<'a> { CDNPropsRef(&'a CDNNodeProps), } -pub trait NodeTrait { +pub trait NodeTrait { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; - fn get_provider_id(&self) -> &AccountId; + fn get_provider_id(&self) -> &T::AccountId; fn get_props<'a>(&'a self) -> NodePropsRef<'a>; fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError>; fn set_params(&mut self, props: NodeParams) -> Result<(), NodeError>; @@ -63,19 +63,19 @@ pub trait NodeTrait { fn get_type(&self) -> NodeType; fn new( node_pub_key: NodePubKey, - provider_id: AccountId, + provider_id: T::AccountId, params: NodeParams, - ) -> Result, NodeError>; + ) -> Result, NodeError>; } -impl NodeTrait for Node { +impl NodeTrait for Node { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { match &self { Node::Storage(node) => node.get_pub_key(), Node::CDN(node) => node.get_pub_key(), } } - fn get_provider_id(&self) -> &AccountId { + fn get_provider_id(&self) -> &T::AccountId { match &self { Node::Storage(node) => node.get_provider_id(), Node::CDN(node) => node.get_provider_id(), @@ -119,9 +119,9 @@ impl NodeTrait for Node { } fn new( node_pub_key: NodePubKey, - provider_id: AccountId, + provider_id: T::AccountId, node_params: NodeParams, - ) -> Result, NodeError> { + ) -> Result, NodeError> { match node_pub_key { NodePubKey::StoragePubKey(_) => StorageNode::new(node_pub_key, provider_id, node_params), @@ -175,7 +175,7 @@ impl From for Error { NodeError::InvalidStorageNodeParams => Error::::InvalidNodeParams, NodeError::InvalidCDNNodeParams => Error::::InvalidNodeParams, NodeError::StorageNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, - NodeError::CDNNodeParamsExceedsLimit => Error::::InvalidNodeParams, + NodeError::CDNNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, NodeError::InvalidStorageNodeProps => Error::::InvalidNodeParams, NodeError::InvalidCDNNodeProps => Error::::InvalidNodeParams, } diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 92b867391..d55088195 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -13,9 +13,10 @@ parameter_types! { } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct StorageNode { +#[scale_info(skip_type_params(T))] +pub struct StorageNode { pub pub_key: StorageNodePubKey, - pub provider_id: AccountId, + pub provider_id: T::AccountId, pub cluster_id: Option, pub props: StorageNodeProps, } @@ -32,11 +33,11 @@ pub struct StorageNodeParams { pub params: Vec, // should be replaced with specific parameters for this type of node } -impl NodeTrait for StorageNode { +impl NodeTrait for StorageNode { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { NodePubKeyRef::StoragePubKeyRef(&self.pub_key) } - fn get_provider_id(&self) -> &AccountId { + fn get_provider_id(&self) -> &T::AccountId { &self.provider_id } fn get_props<'a>(&'a self) -> NodePropsRef<'a> { @@ -70,23 +71,22 @@ impl NodeTrait for StorageNode { } fn new( node_pub_key: NodePubKey, - provider_id: AccountId, + provider_id: T::AccountId, node_params: NodeParams, - ) -> Result, NodeError> { + ) -> Result, NodeError> { match node_pub_key { NodePubKey::StoragePubKey(pub_key) => match node_params { - NodeParams::StorageParams(node_params) => - Ok(Node::Storage(StorageNode:: { - provider_id, - pub_key, - cluster_id: None, - props: StorageNodeProps { - params: match node_params.params.try_into() { - Ok(vec) => vec, - Err(_) => return Err(NodeError::StorageNodeParamsExceedsLimit), - }, + NodeParams::StorageParams(node_params) => Ok(Node::Storage(StorageNode:: { + provider_id, + pub_key, + cluster_id: None, + props: StorageNodeProps { + params: match node_params.params.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::StorageNodeParamsExceedsLimit), }, - })), + }, + })), _ => Err(NodeError::InvalidStorageNodeParams), }, _ => Err(NodeError::InvalidStorageNodePubKey), diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 401f5974e..de23aa1fd 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -17,14 +17,5 @@ pub enum NodePubKey { CDNPubKey(CDNNodePubKey), } -impl NodePubKey { - pub fn variant_as_number(&self) -> u8 { - match self { - NodePubKey::CDNPubKey(_) => 0, - NodePubKey::StoragePubKey(_) => 1, - } - } -} - pub type StorageNodePubKey = AccountId32; pub type CDNNodePubKey = AccountId32; From 9ca85ab15cb3e8ec128d6fbfc80b875b4770e2f5 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 3 Nov 2023 02:36:26 +0100 Subject: [PATCH 451/583] chore: auth contract call is moved to a module --- pallets/ddc-clusters/src/lib.rs | 63 ++++++++--------- .../ddc-clusters/src/node_provider_auth.rs | 69 +++++++++++++++++++ pallets/ddc-nodes/src/cdn_node.rs | 6 +- pallets/ddc-nodes/src/node.rs | 28 +------- pallets/ddc-nodes/src/storage_node.rs | 6 +- primitives/src/lib.rs | 26 +++++++ 6 files changed, 128 insertions(+), 70 deletions(-) create mode 100644 pallets/ddc-clusters/src/node_provider_auth.rs diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 6ab995511..2d389b431 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -15,6 +15,10 @@ #![recursion_limit = "256"] #![feature(is_some_and)] // ToDo: delete at rustc > 1.70 +use crate::{ + cluster::{Cluster, ClusterError, ClusterParams}, + node_provider_auth::{NodeProviderAuthContract, NodeProviderAuthContractError}, +}; use ddc_primitives::{ClusterId, NodePubKey}; use ddc_traits::{ cluster::{ClusterVisitor, ClusterVisitorError}, @@ -25,18 +29,9 @@ use frame_system::pallet_prelude::*; pub use pallet::*; use pallet_ddc_nodes::{NodeRepository, NodeTrait}; use sp_std::prelude::*; -mod cluster; - -pub use crate::cluster::{Cluster, ClusterError, ClusterParams}; - -/// ink! 4.x selector for the "is_authorized" message, equals to the first four bytes of the -/// blake2("is_authorized"). See also: https://use.ink/basics/selectors#selector-calculation/, -/// https://use.ink/macros-attributes/selector/. -const INK_SELECTOR_IS_AUTHORIZED: [u8; 4] = [0x96, 0xb0, 0x45, 0x3e]; -/// The maximum amount of weight that the cluster extension contract call is allowed to consume. -/// See also https://github.com/paritytech/substrate/blob/a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d/frame/contracts/rpc/src/lib.rs#L63. -const EXTENSION_CALL_GAS_LIMIT: Weight = Weight::from_ref_time(5_000_000_000_000); +mod cluster; +mod node_provider_auth; #[frame_support::pallet] pub mod pallet { @@ -79,6 +74,7 @@ pub mod pallet { NodeStakeIsInvalid, /// Cluster candidate should not plan to chill. NodeChillingIsProhibited, + NodeAuthContractCallFailed, } #[pallet::storage] @@ -129,7 +125,7 @@ pub mod pallet { Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); - // Node with this node with this public key exists + // Node with this node with this public key exists. let mut node = T::NodeRepository::get(node_pub_key.clone()) .map_err(|_| Error::::AttemptToAddNonExistentNode)?; ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAlreadyAssigned); @@ -145,32 +141,20 @@ pub mod pallet { ensure!(!is_chilling, Error::::NodeChillingIsProhibited); // Cluster extension smart contract allows joining. - let call_data = { - // is_authorized(node_provider: AccountId, node: Vec, node_variant: u8) -> bool - let args: ([u8; 4], T::AccountId, Vec, u8) = ( - INK_SELECTOR_IS_AUTHORIZED, - node.get_provider_id().to_owned(), - /* remove the first byte* added by SCALE */ - node.get_pub_key().to_owned().encode()[1..].to_vec(), - node.get_type().into(), - ); - args.encode() - }; - let is_authorized = pallet_contracts::Pallet::::bare_call( - caller_id, + let auth_contract = NodeProviderAuthContract::::new( cluster.props.node_provider_auth_contract, - Default::default(), - EXTENSION_CALL_GAS_LIMIT, - None, - call_data, - false, - ) - .result? - .data - .first() - .is_some_and(|x| *x == 1); + caller_id, + ); + let is_authorized = auth_contract + .is_authorized( + node.get_provider_id().to_owned(), + node.get_pub_key().to_owned(), + node.get_type(), + ) + .map_err(|e| Into::>::into(NodeProviderAuthContractError::from(e)))?; ensure!(is_authorized, Error::::NodeIsNotAuthorized); + // Add node to the cluster. node.set_cluster_id(Some(cluster_id.clone())); T::NodeRepository::update(node).map_err(|_| Error::::AttemptToAddNonExistentNode)?; ClustersNodes::::insert(cluster_id.clone(), node_pub_key.clone(), true); @@ -242,4 +226,13 @@ pub mod pallet { } } } + + impl From for Error { + fn from(error: NodeProviderAuthContractError) -> Self { + match error { + NodeProviderAuthContractError::ContractCallFailed => + Error::::NodeAuthContractCallFailed, + } + } + } } diff --git a/pallets/ddc-clusters/src/node_provider_auth.rs b/pallets/ddc-clusters/src/node_provider_auth.rs new file mode 100644 index 000000000..e3f038818 --- /dev/null +++ b/pallets/ddc-clusters/src/node_provider_auth.rs @@ -0,0 +1,69 @@ +use crate::Config; +use codec::Encode; +use ddc_primitives::{NodePubKey, NodeType}; +use frame_support::weights::Weight; +use pallet_contracts::chain_extension::UncheckedFrom; +use sp_std::prelude::Vec; + +/// ink! 4.x selector for the "is_authorized" message, equals to the first four bytes of the +/// blake2("is_authorized"). See also: https://use.ink/basics/selectors#selector-calculation/, +/// https://use.ink/macros-attributes/selector/. +const INK_SELECTOR_IS_AUTHORIZED: [u8; 4] = [0x96, 0xb0, 0x45, 0x3e]; + +/// The maximum amount of weight that the cluster extension contract call is allowed to consume. +/// See also https://github.com/paritytech/substrate/blob/a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d/frame/contracts/rpc/src/lib.rs#L63. +const EXTENSION_CALL_GAS_LIMIT: Weight = Weight::from_ref_time(5_000_000_000_000); + +pub struct NodeProviderAuthContract { + contract_id: T::AccountId, + caller_id: T::AccountId, +} + +impl NodeProviderAuthContract +where + T::AccountId: UncheckedFrom + AsRef<[u8]>, +{ + pub fn is_authorized( + &self, + node_provider_id: T::AccountId, + node_pub_key: NodePubKey, + node_type: NodeType, + ) -> Result { + let call_data = { + // is_authorized(node_provider: AccountId, node: Vec, node_variant: u8) -> bool + let args: ([u8; 4], T::AccountId, Vec, u8) = ( + INK_SELECTOR_IS_AUTHORIZED, + node_provider_id, + /* remove the first byte* added by SCALE */ + node_pub_key.encode()[1..].to_vec(), + node_type.into(), + ); + args.encode() + }; + + let is_authorized = pallet_contracts::Pallet::::bare_call( + self.caller_id.clone(), + self.contract_id.clone(), + Default::default(), + EXTENSION_CALL_GAS_LIMIT, + None, + call_data, + false, + ) + .result + .map_err(|_| NodeProviderAuthContractError::ContractCallFailed)? + .data + .first() + .is_some_and(|x| *x == 1); + + Ok(is_authorized) + } + + pub fn new(contract_id: T::AccountId, caller_id: T::AccountId) -> Self { + Self { contract_id, caller_id } + } +} + +pub enum NodeProviderAuthContractError { + ContractCallFailed, +} diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index aa0392d3c..7bec6566b 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -1,8 +1,6 @@ -use crate::node::{ - Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType, -}; +use crate::node::{Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait}; use codec::{Decode, Encode}; -use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey}; +use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey, NodeType}; use frame_support::{parameter_types, BoundedVec}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index abed0b026..d9431c8b6 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -5,7 +5,7 @@ use crate::{ ClusterId, }; use codec::{Decode, Encode}; -use ddc_primitives::{CDNNodePubKey, NodePubKey, StorageNodePubKey}; +use ddc_primitives::{CDNNodePubKey, NodePubKey, NodeType, StorageNodePubKey}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; @@ -130,32 +130,6 @@ impl NodeTrait for Node { } } -#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub enum NodeType { - Storage = 1, - CDN = 2, -} - -impl From for u8 { - fn from(node_type: NodeType) -> Self { - match node_type { - NodeType::Storage => 1, - NodeType::CDN => 2, - } - } -} - -impl TryFrom for NodeType { - type Error = (); - fn try_from(value: u8) -> Result { - match value { - 1 => Ok(NodeType::Storage), - 2 => Ok(NodeType::CDN), - _ => Err(()), - } - } -} - pub enum NodeError { InvalidStorageNodePubKey, InvalidCDNNodePubKey, diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index d55088195..f847c119f 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,8 +1,6 @@ -use crate::node::{ - Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType, -}; +use crate::node::{Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait}; use codec::{Decode, Encode}; -use ddc_primitives::{ClusterId, NodePubKey, StorageNodePubKey}; +use ddc_primitives::{ClusterId, NodePubKey, NodeType, StorageNodePubKey}; use frame_support::{parameter_types, BoundedVec}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index de23aa1fd..0f1efd446 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -19,3 +19,29 @@ pub enum NodePubKey { pub type StorageNodePubKey = AccountId32; pub type CDNNodePubKey = AccountId32; + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub enum NodeType { + Storage = 1, + CDN = 2, +} + +impl From for u8 { + fn from(node_type: NodeType) -> Self { + match node_type { + NodeType::Storage => 1, + NodeType::CDN => 2, + } + } +} + +impl TryFrom for NodeType { + type Error = (); + fn try_from(value: u8) -> Result { + match value { + 1 => Ok(NodeType::Storage), + 2 => Ok(NodeType::CDN), + _ => Err(()), + } + } +} From dd7c198df52bf5d7fc136910a2826f72d94bdd22 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 3 Nov 2023 15:05:15 +0100 Subject: [PATCH 452/583] fix: tests compilation is fixed --- Cargo.lock | 1 + pallets/ddc-staking/src/mock.rs | 2 +- pallets/ddc-validator/Cargo.toml | 1 + pallets/ddc-validator/src/mock.rs | 31 +++++++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 143e726d2..01736ee8a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5016,6 +5016,7 @@ dependencies = [ "array-bytes 6.1.0", "base64 0.21.5", "ddc-primitives", + "ddc-traits", "frame-election-provider-support", "frame-support", "frame-system", diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 9a03bd114..cf55112b7 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -116,7 +116,7 @@ impl crate::pallet::Config for Test { pub(crate) type DdcStakingCall = crate::Call; pub(crate) type TestRuntimeCall = ::RuntimeCall; -pub struct TestClusterVisitor {} +pub struct TestClusterVisitor; impl ClusterVisitor for TestClusterVisitor { fn cluster_has_node(_cluster_id: &ClusterId, _node_pub_key: &NodePubKey) -> bool { true diff --git a/pallets/ddc-validator/Cargo.toml b/pallets/ddc-validator/Cargo.toml index 1ea14fd9a..513ab2c1e 100644 --- a/pallets/ddc-validator/Cargo.toml +++ b/pallets/ddc-validator/Cargo.toml @@ -29,6 +29,7 @@ sp-keystore = { version = "0.12.0", default-features = false, git = "https://git sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } [dev-dependencies] pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs index 2d9568768..6840c7d1d 100644 --- a/pallets/ddc-validator/src/mock.rs +++ b/pallets/ddc-validator/src/mock.rs @@ -1,5 +1,10 @@ use crate::{self as pallet_ddc_validator, *}; use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey}; +use ddc_traits::{ + cluster::{ClusterVisitor, ClusterVisitorError}, + staking::{StakingVisitor, StakingVisitorError}, +}; + use frame_election_provider_support::{onchain, SequentialPhragmen}; use frame_support::{ parameter_types, @@ -270,11 +275,37 @@ impl pallet_ddc_staking::Config for Test { type StakersPayoutSource = DdcAccountsPalletId; type UnixTime = Timestamp; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; + type ClusterVisitor = TestClusterVisitor; +} + +pub struct TestClusterVisitor; +impl ClusterVisitor for TestClusterVisitor { + fn cluster_has_node(_cluster_id: &ClusterId, _node_pub_key: &NodePubKey) -> bool { + true + } + fn ensure_cluster(_cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { + Ok(()) + } } impl pallet_ddc_clusters::Config for Test { type RuntimeEvent = RuntimeEvent; type NodeRepository = pallet_ddc_nodes::Pallet; + type StakingVisitor = TestStakingVisitor; +} + +pub struct TestStakingVisitor; +impl StakingVisitor for TestStakingVisitor { + fn node_has_stake( + _node_pub_key: &NodePubKey, + _cluster_id: &ClusterId, + ) -> Result { + Ok(true) + } + + fn node_is_chilling(_node_pub_key: &NodePubKey) -> Result { + Ok(true) + } } impl pallet_ddc_nodes::Config for Test { From 051983947655139c6ca2aaf049e043eef99cf8b0 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 6 Nov 2023 16:41:32 +0100 Subject: [PATCH 453/583] rebase dev --- Cargo.lock | 64 +- Cargo.toml | 1 - pallets/ddc-validator/Cargo.toml | 1 + pallets/ddc-validator/README.md | 1 - pallets/ddc-validator/src/dac.rs | 414 ------- pallets/ddc-validator/src/lib.rs | 1015 ----------------- .../set-1/aggregated-node-data-for-era.json | 1 - .../src/mock-data/set-1/file-request1.json | 1 - .../src/mock-data/set-1/file-request2.json | 1 - .../src/mock-data/set-1/file-request3.json | 1 - .../set-1/final-validation-decision.json | 1 - .../save-validation-decision-result.json | 1 - .../shared-validation-decisions-for-era.json | 1 - .../mock-data/set-1/validation-decision.json | 1 - pallets/ddc-validator/src/payments.rs | 1 - pallets/ddc-validator/src/shm.rs | 162 --- pallets/ddc-validator/src/tests.rs | 606 ---------- pallets/ddc-validator/src/utils.rs | 73 -- pallets/ddc-validator/src/validation.rs | 1 - runtime/cere-dev/Cargo.toml | 2 - runtime/cere-dev/src/lib.rs | 33 +- 21 files changed, 27 insertions(+), 2355 deletions(-) delete mode 100644 pallets/ddc-validator/README.md delete mode 100644 pallets/ddc-validator/src/dac.rs delete mode 100644 pallets/ddc-validator/src/lib.rs delete mode 100644 pallets/ddc-validator/src/mock-data/set-1/aggregated-node-data-for-era.json delete mode 100644 pallets/ddc-validator/src/mock-data/set-1/file-request1.json delete mode 100644 pallets/ddc-validator/src/mock-data/set-1/file-request2.json delete mode 100644 pallets/ddc-validator/src/mock-data/set-1/file-request3.json delete mode 100644 pallets/ddc-validator/src/mock-data/set-1/final-validation-decision.json delete mode 100644 pallets/ddc-validator/src/mock-data/set-1/save-validation-decision-result.json delete mode 100644 pallets/ddc-validator/src/mock-data/set-1/shared-validation-decisions-for-era.json delete mode 100644 pallets/ddc-validator/src/mock-data/set-1/validation-decision.json delete mode 100644 pallets/ddc-validator/src/payments.rs delete mode 100644 pallets/ddc-validator/src/shm.rs delete mode 100644 pallets/ddc-validator/src/tests.rs delete mode 100644 pallets/ddc-validator/src/utils.rs delete mode 100644 pallets/ddc-validator/src/validation.rs diff --git a/Cargo.lock b/Cargo.lock index 01736ee8a..3944e2252 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -165,12 +165,6 @@ version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" -[[package]] -name = "array-bytes" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b1c5a481ec30a5abd8dfbd94ab5cf1bb4e9a66be7f1b3b322f2f1170c200fd" - [[package]] name = "arrayref" version = "0.3.7" @@ -834,7 +828,6 @@ dependencies = [ "pallet-ddc-metrics-offchain-worker", "pallet-ddc-nodes", "pallet-ddc-staking", - "pallet-ddc-validator", "pallet-democracy", "pallet-election-provider-multi-phase", "pallet-election-provider-support-benchmarking", @@ -2160,7 +2153,7 @@ version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", - "array-bytes 4.2.0", + "array-bytes", "chrono", "clap", "comfy-table", @@ -5008,43 +5001,6 @@ dependencies = [ "substrate-test-utils", ] -[[package]] -name = "pallet-ddc-validator" -version = "0.1.0" -dependencies = [ - "alt_serde", - "array-bytes 6.1.0", - "base64 0.21.5", - "ddc-primitives", - "ddc-traits", - "frame-election-provider-support", - "frame-support", - "frame-system", - "lite-json", - "log", - "pallet-balances", - "pallet-contracts", - "pallet-ddc-clusters", - "pallet-ddc-customers", - "pallet-ddc-nodes", - "pallet-ddc-staking", - "pallet-randomness-collective-flip", - "pallet-session", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "serde", - "serde_json 1.0.44", - "sp-core", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-staking", - "sp-std", -] - [[package]] name = "pallet-democracy" version = "4.0.0-dev" @@ -6947,7 +6903,7 @@ name = "sc-cli" version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ - "array-bytes 4.2.0", + "array-bytes", "chrono", "clap", "fdlimit", @@ -7255,7 +7211,7 @@ version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", - "array-bytes 4.2.0", + "array-bytes", "async-trait", "dyn-clone", "finality-grandpa", @@ -7333,7 +7289,7 @@ name = "sc-keystore" version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ - "array-bytes 4.2.0", + "array-bytes", "async-trait", "parking_lot 0.12.1", "serde_json 1.0.107", @@ -7348,7 +7304,7 @@ name = "sc-network" version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ - "array-bytes 4.2.0", + "array-bytes", "async-trait", "asynchronous-codec", "bitflags 1.3.2", @@ -7459,7 +7415,7 @@ name = "sc-network-light" version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ - "array-bytes 4.2.0", + "array-bytes", "futures", "libp2p", "log", @@ -7480,7 +7436,7 @@ name = "sc-network-sync" version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ - "array-bytes 4.2.0", + "array-bytes", "fork-tree", "futures", "libp2p", @@ -7508,7 +7464,7 @@ name = "sc-network-transactions" version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ - "array-bytes 4.2.0", + "array-bytes", "futures", "hex", "libp2p", @@ -7527,7 +7483,7 @@ name = "sc-offchain" version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ - "array-bytes 4.2.0", + "array-bytes", "bytes", "fnv", "futures", @@ -8461,7 +8417,7 @@ name = "sp-core" version = "6.0.0" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ - "array-bytes 4.2.0", + "array-bytes", "base58", "bitflags 1.3.2", "blake2", diff --git a/Cargo.toml b/Cargo.toml index 0cf3246b8..3d7599231 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,6 @@ members = [ "pallets/erc721", "pallets/erc20", "pallets/ddc-metrics-offchain-worker", - "pallets/ddc-validator", "pallets/ddc-customers", "pallets/ddc-nodes", "pallets/ddc-clusters", diff --git a/pallets/ddc-validator/Cargo.toml b/pallets/ddc-validator/Cargo.toml index 513ab2c1e..6ddfdda06 100644 --- a/pallets/ddc-validator/Cargo.toml +++ b/pallets/ddc-validator/Cargo.toml @@ -62,3 +62,4 @@ std = [ "sp-staking/std", "sp-std/std", ] + diff --git a/pallets/ddc-validator/README.md b/pallets/ddc-validator/README.md deleted file mode 100644 index ba9427397..000000000 --- a/pallets/ddc-validator/README.md +++ /dev/null @@ -1 +0,0 @@ -# DDC Validator \ No newline at end of file diff --git a/pallets/ddc-validator/src/dac.rs b/pallets/ddc-validator/src/dac.rs deleted file mode 100644 index c23b98588..000000000 --- a/pallets/ddc-validator/src/dac.rs +++ /dev/null @@ -1,414 +0,0 @@ -//! A module with Data Activity Capture (DAC) interaction. - -use crate::{utils, DacTotalAggregates, OpCode, ValidationDecision}; -use alloc::string::String; // ToDo: remove String usage -use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; -use codec::{Decode, Encode}; -use sp_runtime::offchain::{http, Duration}; -use sp_staking::EraIndex; -pub use sp_std::{ - collections::{btree_map::BTreeMap, btree_set::BTreeSet}, - prelude::*, -}; - -pub type TimestampInSec = u64; -pub const HTTP_TIMEOUT_MS: u64 = 30_000; -pub const FAILED_CONTENT_CONSUMER_THRESHOLD: TimestampInSec = 100; - -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct RedisFtAggregate { - #[serde(rename = "FT.AGGREGATE")] - pub ft_aggregate: Vec, -} - -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(crate = "alt_serde")] -#[serde(untagged)] -pub enum FtAggregate { - Length(u32), - Node(Vec), -} - -#[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] -pub struct BytesSent { - pub node_public_key: String, - pub era: EraIndex, - pub sum: u32, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct FileRequestWrapper { - #[serde(rename = "JSON.GET")] - json: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct CDNNodeAggregates { - aggregate: Vec, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct CDNNodeAggregate { - total_bytes_sent: u64, - total_queries: u64, - total_reads: u64, - total_reads_acked: u64, - total_queries_acked: u64, - average_response_time_ms: f64, - total_bytes_received: u64, - pub request_ids: Vec, - total_writes_acked: u64, - average_response_time_ms_samples: u64, - total_writes: u64, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct FileRequests { - requests: Requests, -} - -pub type Requests = BTreeMap; - -#[derive(Serialize, Deserialize, Debug, Clone)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct FileRequest { - pub file_request_id: String, - file_info: FileInfo, - bucket_id: u128, - timestamp: u64, - chunks: BTreeMap, - user_public_key: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct Chunk { - log: Log, - cid: String, - ack: Option, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct Ack { - user_timestamp: u64, - nonce: String, - signature: Option, - aggregated: u64, - user_public_key: String, - bytes_received: u64, - requested_chunk_cids: Vec, - node_public_key: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct Log { - #[serde(rename = "type")] - log_type: u64, - signature: Option, - aggregated: u64, - user_public_key: String, - era: u64, - bucket_id: u128, - user_address: String, - bytes_sent: u64, - timestamp: u64, - node_public_key: String, - session_id: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct FileInfo { - #[serde(rename = "chunkCids", skip_deserializing)] - chunk_cids: Option>, - - #[serde(rename = "requestedChunkCids")] - requested_chunk_cids: Vec, -} - -type EdgeId = String; -type ValidatorId = String; - -#[derive(Debug, Deserialize, Serialize)] -#[serde(crate = "alt_serde")] -pub(crate) struct EdgesToResults(BTreeMap>); - -#[derive(Debug, Deserialize, Serialize)] -#[serde(crate = "alt_serde")] -pub(crate) struct Wrapper { - #[serde(rename = "HGET")] - decisions: String, -} - -#[derive(Debug, Deserialize, Serialize, Clone)] -#[serde(crate = "alt_serde")] -pub(crate) struct ValidationResult { - validator_id: ValidatorId, - edge_id: EdgeId, - result: bool, - received: u64, - sent: u64, - era: EraIndex, -} - -#[derive(Debug, Deserialize, Serialize)] -#[serde(crate = "alt_serde")] -pub(crate) struct FinalDecision { - result: bool, - edge_id: EdgeId, - era: EraIndex, - received: u64, - sent: u64, - results_logs: Vec, -} - -#[derive(Debug, Deserialize, Serialize)] -#[serde(crate = "alt_serde")] -pub(crate) struct FinalDecisions(BTreeMap); - -#[derive(Clone, Debug, Encode, Decode, scale_info::TypeInfo, PartialEq)] -pub struct BytesReceived { - pub node_public_key: String, - pub era: EraIndex, - pub sum: u32, -} - -fn get_timestamps_with_ack(file_requests: &Requests) -> Vec { - let mut timestamps: Vec = Vec::new(); - - for (_, file_request) in file_requests { - for (_, chunk) in &file_request.chunks { - if let Some(_ack) = &chunk.ack { - timestamps.push(chunk.log.timestamp); - } - } - } - - timestamps.sort(); - - timestamps -} - -pub fn get_acknowledged_bytes_bucket<'a>( - file_requests: &'a Requests, - acknowledged_bytes_by_bucket: &'a mut Vec<(u128, u64)>, -) -> &'a Vec<(u128, u64)> { - let ack_timestamps = get_timestamps_with_ack(file_requests); - - for (_, file_request) in file_requests { - let mut total_bytes_received = 0u64; - let bucket_id = file_request.bucket_id; - for (_, chunk) in &file_request.chunks { - // Only check reads - match chunk.log.log_type.try_into() { - Ok(OpCode::Read) => - if let Some(ack) = &chunk.ack { - total_bytes_received += ack.bytes_received; - } else { - total_bytes_received += get_proved_delivered_bytes(chunk, &ack_timestamps); - }, - _ => (), - } - } - acknowledged_bytes_by_bucket.push((bucket_id, total_bytes_received)); - } - - acknowledged_bytes_by_bucket -} - -pub fn get_served_bytes_sum(file_requests: &Requests) -> (u64, u64) { - let ack_timestamps = get_timestamps_with_ack(file_requests); - let mut total_bytes_received = 0u64; - let mut total_bytes_sent = 0u64; - - for (_, file_request) in file_requests { - for (_, chunk) in &file_request.chunks { - match chunk.log.log_type.try_into() { - Ok(OpCode::Read) => { - total_bytes_sent += chunk.log.bytes_sent; - - if let Some(ack) = &chunk.ack { - total_bytes_received += ack.bytes_received; - } else { - total_bytes_received += get_proved_delivered_bytes(chunk, &ack_timestamps); - } - }, - _ => (), - } - } - } - - (total_bytes_sent, total_bytes_received) -} - -fn get_proved_delivered_bytes(chunk: &Chunk, ack_timestamps: &Vec) -> u64 { - let log_timestamp = chunk.log.timestamp; - let neighbors = get_closer_neighbors(log_timestamp, &ack_timestamps); - let is_proved = - is_lies_within_threshold(log_timestamp, neighbors, FAILED_CONTENT_CONSUMER_THRESHOLD); - - if is_proved { - return chunk.log.bytes_sent - } else { - 0 - } -} - -fn get_closer_neighbors( - timestamp: TimestampInSec, - timestamps: &Vec, -) -> (TimestampInSec, TimestampInSec) { - let mut before = 0; - let mut after = TimestampInSec::MAX; - for ts in timestamps { - if ts < ×tamp { - before = before.max(*ts); - } else if ts > ×tamp { - after = after.min(*ts); - } - } - - (before, after) -} - -fn is_lies_within_threshold( - timestamp: TimestampInSec, - borders: (TimestampInSec, TimestampInSec), - threshold: TimestampInSec, -) -> bool { - let left_distance = timestamp - borders.0; - let right_distance = borders.1 - timestamp; - - if left_distance < threshold || right_distance < threshold { - return true - } - - false -} - -pub(crate) fn fetch_cdn_node_aggregates_request(url: &String) -> Vec { - log::debug!("fetch_file_request | url: {:?}", url); - let response: FileRequestWrapper = http_get_json(&url).unwrap(); - log::debug!("response.json: {:?}", response.json); - let map: Vec = serde_json::from_str(response.json.as_str()).unwrap(); - // log::debug!("response.json: {:?}", response.json); - - map -} - -pub(crate) fn fetch_file_request(url: &String) -> FileRequest { - log::debug!("fetch_file_request | url: {:?}", url); - let response: FileRequestWrapper = http_get_json(&url).unwrap(); - log::debug!("response.json: {:?}", response.json); - - let map: FileRequest = serde_json::from_str(response.json.as_str()).unwrap(); - - map -} - -pub(crate) fn http_get_json(url: &str) -> crate::ResultStr { - let body = http_get_request(url).map_err(|err| { - log::error!("[DAC Validator] Error while getting {}: {:?}", url, err); - "HTTP GET error" - })?; - - let parsed = serde_json::from_slice(&body).map_err(|err| { - log::warn!("[DAC Validator] Error while parsing JSON from {}: {:?}", url, err); - "HTTP JSON parse error" - }); - - parsed -} - -fn http_get_request(http_url: &str) -> Result, http::Error> { - // log::debug!("[DAC Validator] Sending request to: {:?}", http_url); - - // Initiate an external HTTP GET request. This is using high-level wrappers from - // `sp_runtime`. - let request = http::Request::get(http_url); - - let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); - - let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; - - let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; - - if response.code != 200 { - log::warn!("[DAC Validator] http_get_request unexpected status code: {}", response.code); - return Err(http::Error::Unknown) - } - - // Next we fully read the response body and collect it to a vector of bytes. - Ok(response.body().collect::>()) -} - -pub(crate) fn get_final_decision(decisions: Vec) -> ValidationDecision { - let common_decisions = find_largest_group(decisions).unwrap(); - let decision_example = common_decisions.get(0).unwrap(); - - let serialized_decisions = serde_json::to_string(&common_decisions).unwrap(); - - let final_decision = ValidationDecision { - edge: decision_example.edge.clone(), - result: decision_example.result, - payload: utils::hash(&serialized_decisions), - totals: DacTotalAggregates { - received: decision_example.totals.received, - sent: decision_example.totals.sent, - failed_by_client: 0, - failure_rate: 0, - }, - }; - - final_decision -} - -fn find_largest_group(decisions: Vec) -> Option> { - let mut groups: Vec> = Vec::new(); - let half = decisions.len() / 2; - - for decision in decisions { - let mut found_group = false; - - for group in &mut groups { - if group.iter().all(|x| { - x.result == decision.result && - x.totals.received == decision.totals.received && - x.totals.sent == decision.totals.sent - }) { - group.push(decision.clone()); - found_group = true; - break - } - } - - if !found_group { - groups.push(vec![decision]); - } - } - - let largest_group = groups.into_iter().max_by_key(|group| group.len()).unwrap_or(Vec::new()); - - if largest_group.len() > half { - Some(largest_group) - } else { - None - } -} diff --git a/pallets/ddc-validator/src/lib.rs b/pallets/ddc-validator/src/lib.rs deleted file mode 100644 index fc6d1109c..000000000 --- a/pallets/ddc-validator/src/lib.rs +++ /dev/null @@ -1,1015 +0,0 @@ -//! # DDC Validator pallet -//! -//! The DDC Validator pallet defines storage item to store validation results and implements OCW -//! (off-chain worker) to produce these results using the data from Data Activity Capture (DAC). -//! -//! - [`Config`] -//! - [`Call`] -//! - [`Pallet`] -//! - [`Hooks`] -//! -//! ## Notes -//! -//! - Era definition in this pallet is different than in the `pallet-staking`. Check DAC -//! documentation for `era` definition used in this pallet. - -#![cfg_attr(not(feature = "std"), no_std)] - -mod dac; -mod payments; -mod shm; -mod utils; -mod validation; - -#[cfg(test)] -mod mock; - -#[cfg(test)] -mod tests; - -pub use alloc::{format, string::String}; -pub use alt_serde::{de::DeserializeOwned, Deserialize, Serialize}; -pub use codec::{Decode, Encode, HasCompact, MaxEncodedLen}; -pub use core::fmt::Debug; -pub use frame_support::{ - decl_event, decl_module, decl_storage, defensive, - dispatch::DispatchResult, - pallet_prelude::*, - parameter_types, storage, - traits::{Currency, Randomness, UnixTime}, - weights::Weight, - BoundedVec, RuntimeDebug, -}; -pub use frame_system::{ - ensure_signed, - offchain::{AppCrypto, CreateSignedTransaction, SendSignedTransaction, Signer, SigningTypes}, - pallet_prelude::*, -}; -pub use lite_json::json::JsonValue; -pub use pallet::*; -pub use pallet_ddc_customers::{self as ddc_customers, BucketsDetails}; -pub use pallet_ddc_staking::{self as ddc_staking}; -pub use pallet_session as session; -pub use pallet_staking::{self as staking}; -pub use scale_info::TypeInfo; -pub use serde_json::Value; -pub use sp_core::crypto::{AccountId32, KeyTypeId, UncheckedFrom}; -pub use sp_io::{crypto::sr25519_public_keys, offchain_index}; -pub use sp_runtime::offchain::{ - http, storage::StorageValueRef, storage_lock, storage_lock::StorageLock, Duration, Timestamp, -}; -pub use sp_staking::EraIndex; -pub use sp_std::{collections::btree_map::BTreeMap, prelude::*}; - -extern crate alloc; - -/// The balance type of this pallet. -type BalanceOf = <::Currency as Currency< - ::AccountId, ->>::Balance; - -type ResultStr = Result; - -/// Offchain local storage key that holds the last era in which the validator completed its -/// assignment. -const LAST_VALIDATED_ERA_KEY: &[u8; 40] = b"pallet-ddc-validator::last_validated_era"; -/// Offchain local storage that holds the validation lock -const VALIDATION_LOCK: &[u8; 37] = b"pallet-ddc-validator::validation_lock"; - -/// Local storage key that holds the flag to enable DDC validation. Set it to true (0x01) to enable -/// DDC validation, set it to false (0x00) or delete the key to disable it. -const ENABLE_DDC_VALIDATION_KEY: &[u8; 21] = b"enable-ddc-validation"; - -pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"dacv"); - -/// Webdis in experimental cluster connected to Redis in dev. -pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://webdis:7379"; -// pub const DEFAULT_DATA_PROVIDER_URL: &str = "http://161.35.140.182:7379"; -pub const DATA_PROVIDER_URL_KEY: &[u8; 7] = b"dac-url"; -pub const QUORUM_SIZE: usize = 1; - -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub enum OpCode { - Read = 1, - Write = 2, - Search = 3, -} - -impl TryFrom for OpCode { - type Error = &'static str; - - fn try_from(v: u64) -> Result { - match v { - x if x == OpCode::Write as u64 => Ok(OpCode::Write), - x if x == OpCode::Read as u64 => Ok(OpCode::Read), - x if x == OpCode::Search as u64 => Ok(OpCode::Search), - _ => Err("Invalid value to for log type"), - } - } -} - -#[derive(Debug)] -pub enum AssignmentError { - NoValidators, - NotEnoughValidators { requested_quorum: usize, available_validators: usize }, - DefensiveEmptyQuorumsCycle, -} - -/// Aggregated values from DAC that describe CDN node's activity during a certain era. -#[derive( - PartialEq, - Eq, - Clone, - Encode, - Decode, - RuntimeDebug, - TypeInfo, - MaxEncodedLen, - Serialize, - Deserialize, -)] -#[serde(crate = "alt_serde")] -pub struct DacTotalAggregates { - /// Total bytes received by the client. - pub received: u64, - /// Total bytes sent by the CDN node. - pub sent: u64, - /// Total bytes sent by the CDN node to the client which interrupts the connection. - pub failed_by_client: u64, - /// ToDo: explain. - pub failure_rate: u64, -} - -/// Final DAC Validation decision. -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, Serialize, Deserialize)] -#[serde(crate = "alt_serde")] -pub struct ValidationDecision { - /// CDN node public key. - pub edge: String, - /// Validation result. - pub result: bool, - /// A hash of the data used to produce validation result. - pub payload: [u8; 32], - /// Values aggregated from the payload. - pub totals: DacTotalAggregates, -} - -pub mod crypto { - use super::KEY_TYPE; - use frame_system::offchain::AppCrypto; - use sp_core::sr25519::Signature as Sr25519Signature; - use sp_runtime::{ - app_crypto::{app_crypto, sr25519}, - traits::Verify, - }; - app_crypto!(sr25519, KEY_TYPE); - - use sp_runtime::{MultiSignature, MultiSigner}; - - pub struct TestAuthId; - - impl AppCrypto<::Signer, Sr25519Signature> for TestAuthId { - type RuntimeAppPublic = Public; - type GenericSignature = sp_core::sr25519::Signature; - type GenericPublic = sp_core::sr25519::Public; - } - - impl AppCrypto for TestAuthId { - type RuntimeAppPublic = Public; - type GenericSignature = sp_core::sr25519::Signature; - type GenericPublic = sp_core::sr25519::Public; - } -} - -#[frame_support::pallet] -pub mod pallet { - use super::*; - - #[pallet::pallet] - #[pallet::without_storage_info] - #[pallet::generate_store(pub(super) trait Store)] - pub struct Pallet(_); - - #[pallet::config] - pub trait Config: - frame_system::Config - + pallet_contracts::Config - + pallet_session::Config::AccountId> - + pallet_staking::Config - + ddc_customers::Config - + ddc_staking::Config - + CreateSignedTransaction> - where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, - { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - /// Something that provides randomness in the runtime. Required by the tasks assignment - /// procedure. - type Randomness: Randomness; - - /// A dispatchable call. - type RuntimeCall: From>; - - type AuthorityId: AppCrypto; - - /// Number of validators expected to produce an individual validation decision to form a - /// consensus. Tasks assignment procedure use this value to determine the number of - /// validators are getting the same task. Must be an odd number. - #[pallet::constant] - type DdcValidatorsQuorumSize: Get; - - type ValidatorsMax: Get; - - /// Proof-of-Delivery parameter specifies an allowed deviation between bytes sent and bytes - /// received. The deviation is expressed as a percentage. For example, if the value is 10, - /// then the difference between bytes sent and bytes received is allowed to be up to 10%. - /// The value must be in range [0, 100]. - #[pallet::constant] - type ValidationThreshold: Get; - } - - /// The map from the era and validator stash key to the list of CDN nodes to validate. - #[pallet::storage] - #[pallet::getter(fn assignments)] - pub(super) type Assignments = - StorageDoubleMap<_, Twox64Concat, EraIndex, Identity, T::AccountId, Vec>; - - /// Map to from era and account ID to bool indicateing that a particular content owner was - /// charged for the era - #[pallet::storage] - #[pallet::getter(fn content_owners_charged)] - pub(super) type EraContentOwnersCharged = - StorageDoubleMap<_, Twox64Concat, EraIndex, Identity, T::AccountId, bool, ValueQuery>; - - /// A signal to start a process on all the validators. - #[pallet::storage] - #[pallet::getter(fn signal)] - pub(super) type Signal = StorageValue<_, bool>; - - /// The map from the era and CDN participant stash key to the validation decision related. - #[pallet::storage] - #[pallet::getter(fn validation_decisions)] - pub type ValidationDecisions = - StorageDoubleMap<_, Twox64Concat, EraIndex, Identity, T::AccountId, ValidationDecision>; - - // Map to check if validation decision was performed for the era - #[pallet::storage] - #[pallet::getter(fn validation_decision_set_for_node)] - pub(super) type ValidationDecisionSetForNode = - StorageDoubleMap<_, Twox64Concat, EraIndex, Identity, T::AccountId, bool, ValueQuery>; - - // Map to check if reward points were set for the era - #[pallet::storage] - #[pallet::getter(fn reward_points_set_for_node)] - pub(super) type RewardPointsSetForNode = - StorageDoubleMap<_, Twox64Concat, EraIndex, Identity, T::AccountId, bool, ValueQuery>; - - /// The last era for which the tasks assignment produced. - #[pallet::storage] - #[pallet::getter(fn last_managed_era)] - pub type LastManagedEra = StorageValue<_, EraIndex>; - - /// The mapping of ddc validator keys to validator stash keys - /// - /// Keys registered by validators are mapped to validator stash accounts. - /// The mapping is formed in the way that facilitates fast checking that storage contains key. - /// Similarly the validator stash is checked if he is still in the list of validators. - #[pallet::storage] - #[pallet::getter(fn get_stash_for_ddc_validator)] - pub type DDCValidatorToStashKeys = - StorageMap<_, Identity, T::AccountId, T::AccountId>; - - #[pallet::error] - pub enum Error { - /// Caller is not controller of validator node - NotController, - /// Checked stash is not an active validator - NotValidatorStash, - /// OCW key has not been registered by validator - DDCValidatorKeyNotRegistered, - /// Attempt to charge content owners twice - ContentOwnersDoubleSpend, - /// Validation decision has been already set for CDN node for some era - ValidationDecisionAlreadySet, - /// Node is not participating in the network - NodeNotActive, - /// Pricing has not been set by sudo - PricingNotSet, - /// Current era not set during runtime - DDCEraNotSet, - } - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event - where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, - { - // Validator submits decision for an era - ValidationDecision(EraIndex, T::AccountId, ValidationDecision), - // Set era reward points - EraRewardPoints(EraIndex, Vec<(T::AccountId, u64)>), - } - - #[pallet::hooks] - impl Hooks> for Pallet - where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, - { - fn on_initialize(block_number: T::BlockNumber) -> Weight { - if block_number <= 1u32.into() { - return Weight::from_ref_time(0) - } - - Signal::::set(Some(false)); - - let current_ddc_era = match ddc_staking::pallet::Pallet::::current_era() { - Some(era) => era, - None => { - log::debug!("DDC era not set."); - return Weight::from_ref_time(0) - }, - }; - log::debug!("Current DDC era: {:?}.", current_ddc_era); - - // Skip assignment if already exists for current era - match Self::last_managed_era() { - Some(last_managed_era) if current_ddc_era < last_managed_era => - return Weight::from_ref_time(0), - _ => (), - } - - match Self::assign(3usize, current_ddc_era + 1) { - Ok(_) => >::put(current_ddc_era + 1), - Err(e) => log::debug!("DDC validation assignment error: {:?}.", e), - } - - Weight::from_ref_time(0) - } - - fn offchain_worker(_block_number: T::BlockNumber) { - // Skip if not a validator. - if !sp_io::offchain::is_validator() { - return - } - - // Skip if DDC validation is not enabled. - match StorageValueRef::persistent(ENABLE_DDC_VALIDATION_KEY).get::() { - Ok(Some(enabled)) if enabled == true => (), - _ => return, - } - - let mut should_validate_because_new_era = true; - - let mut validation_lock = StorageLock::::new(VALIDATION_LOCK); - - // Skip if the validation is already in progress. - if validation_lock.try_lock().is_err() { - should_validate_because_new_era = false; - } - - let last_validated_era_storage = StorageValueRef::persistent(LAST_VALIDATED_ERA_KEY); - let last_validated_era = match last_validated_era_storage.get::() { - Ok(Some(last_validated_era)) => last_validated_era, - _ => 0, // let's consider an absent or undecodable data as we never did a validation - }; - - let current_ddc_era = match ddc_staking::pallet::Pallet::::current_era() { - Some(era) => era, - None => { - defensive!("DDC era not set"); - return - }, - }; - - // Skip if the validation is already complete for the era. - if current_ddc_era <= last_validated_era { - should_validate_because_new_era = false; - } - - // Validation start forced externally? - let should_validate_because_signal = Signal::::get().unwrap_or(false); - - if !should_validate_because_new_era && !should_validate_because_signal { - return - } - - if let Err(e) = Self::validate_edges() { - log::warn!("🔎 DDC validation failed. {}", e); - return - } - last_validated_era_storage.set(¤t_ddc_era); - log::info!("🔎 DDC validation complete for {} era.", current_ddc_era); - } - } - - #[pallet::call] - impl Pallet - where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, - { - /// Run a process at the same time on all the validators. - #[pallet::weight(10_000)] - pub fn send_signal(origin: OriginFor) -> DispatchResult { - ensure_signed(origin)?; - - Signal::::set(Some(true)); - - Ok(()) - } - - /// Set validation decision for a given CDN node in an era. - /// - /// Only registered validator keys can call this exstrinsic. - /// Validation decision can be set only once per era per CDN node. - /// CDN node should be active. - #[pallet::weight(10_000)] - pub fn set_validation_decision( - origin: OriginFor, - era: EraIndex, - cdn_node: T::AccountId, - validation_decision: ValidationDecision, - ) -> DispatchResult { - let ddc_valitor_key = ensure_signed(origin)?; - - ensure!( - DDCValidatorToStashKeys::::contains_key(&ddc_valitor_key), - Error::::DDCValidatorKeyNotRegistered - ); - - ensure!( - staking::Validators::::contains_key( - Self::get_stash_for_ddc_validator(&ddc_valitor_key).unwrap() - ), - Error::::NotValidatorStash - ); - - ensure!( - !Self::validation_decision_set_for_node(era, &cdn_node), - Error::::ValidationDecisionAlreadySet - ); - - ensure!( - >::contains_key(&cdn_node), - Error::::NodeNotActive - ); - - ValidationDecisions::::insert(era, cdn_node.clone(), validation_decision.clone()); - - ValidationDecisionSetForNode::::insert(era, cdn_node.clone(), true); - - Self::deposit_event(Event::::ValidationDecision(era, cdn_node, validation_decision)); - - Ok(()) - } - - /// Set reward points for CDN participants at the given era. - /// - /// Only registered validator keys can call this exstrinsic. - /// Reward points can be set only once per era per CDN node. - /// CDN node should be active. - /// - /// `stakers_points` is a vector of (stash account ID, reward points) pairs. The rewards - /// distribution will be based on total reward points, with each CDN participant receiving a - /// proportionate reward based on their individual reward points. - #[pallet::weight(100_000)] - pub fn set_era_reward_points( - origin: OriginFor, - era: EraIndex, - stakers_points: Vec<(T::AccountId, u64)>, - ) -> DispatchResult { - let ddc_valitor_key = ensure_signed(origin)?; - - ensure!( - DDCValidatorToStashKeys::::contains_key(&ddc_valitor_key), - Error::::DDCValidatorKeyNotRegistered - ); - - ensure!( - staking::Validators::::contains_key( - Self::get_stash_for_ddc_validator(&ddc_valitor_key).unwrap() - ), - Error::::NotValidatorStash - ); - - let mut rewards_counter = 0; - - >::mutate(era, |era_rewards| { - for (staker, points) in stakers_points.clone().into_iter() { - if !Self::reward_points_set_for_node(era, &staker) { - // ToDo deal with edge case when node is chilling - if >::contains_key(&staker) { - *era_rewards.individual.entry(staker.clone()).or_default() += points; - era_rewards.total += points; - >::mutate( - &staker, - |current_reward_points| { - let rewards: ddc_staking::EraRewardPointsPerNode = - ddc_staking::EraRewardPointsPerNode { era, points }; - current_reward_points.push(rewards); - }, - ); - RewardPointsSetForNode::::insert(era, staker, true); - rewards_counter += 1; - } - } - } - }); - - if rewards_counter > 0 { - Self::deposit_event(Event::::EraRewardPoints(era, stakers_points)); - } - - Ok(()) - } - - /// Exstrinsic deducts balances of content owners - /// - /// Only registered validator keys can call this exstrinsic. - /// Reward points can be set only once per era per validator. - #[pallet::weight(100_000)] - pub fn charge_payments_content_owners( - origin: OriginFor, - paying_accounts: Vec>>, /* ToDo check if - * bounded vec - * should be used */ - ) -> DispatchResult { - let ddc_valitor_key = ensure_signed(origin)?; - log::debug!("validator is {:?}", &ddc_valitor_key); - - let current_era = - ddc_staking::pallet::Pallet::::current_era().ok_or(Error::::DDCEraNotSet)?; - - ensure!( - DDCValidatorToStashKeys::::contains_key(&ddc_valitor_key), - Error::::DDCValidatorKeyNotRegistered - ); - - ensure!( - staking::Validators::::contains_key( - Self::get_stash_for_ddc_validator(&ddc_valitor_key).unwrap() - ), - Error::::NotValidatorStash - ); - - ensure!( - !Self::content_owners_charged(current_era, &ddc_valitor_key), - Error::::ContentOwnersDoubleSpend - ); - - let pricing: u128 = - >::pricing().ok_or(Error::::PricingNotSet)?; - EraContentOwnersCharged::::insert(current_era, ddc_valitor_key, true); - - >::charge_content_owners(paying_accounts, pricing) - } - - /// Exstrinsic registers a ddc validator key for future use - /// - /// Only controller of validator can call this exstrinsic - /// Validator has to be in the active set - #[pallet::weight(100_000)] - pub fn set_validator_key( - origin: OriginFor, - ddc_validator_pub: T::AccountId, - ) -> DispatchResult { - let controller = ensure_signed(origin)?; - let ledger = staking::Ledger::::get(&controller).ok_or(Error::::NotController)?; - - ensure!( - staking::Validators::::contains_key(&ledger.stash), - Error::::NotValidatorStash - ); - - DDCValidatorToStashKeys::::insert(ddc_validator_pub, &ledger.stash); - Ok(()) - } - } - - impl Pallet - where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, - { - fn get_data_provider_url() -> String { - let url_ref = sp_io::offchain::local_storage_get( - sp_core::offchain::StorageKind::PERSISTENT, - DATA_PROVIDER_URL_KEY, - ); - - match url_ref { - Some(url) => - String::from_utf8(url).expect("Data provider URL should be valid UTF-8 string"), - None => String::from(DEFAULT_DATA_PROVIDER_URL), - } - } - - fn get_data_url() -> String { - let data_url = Self::get_data_provider_url(); - let json_getter = "/JSON.GET/"; - let url = format!("{}{}", data_url, json_getter); - - url - } - - fn get_signer() -> ResultStr> { - let signer = Signer::<_, _>::any_account(); - if !signer.can_sign() { - return Err("[DAC Validator] No local accounts available. Consider adding one via `author_insertKey` RPC."); - } - - Ok(signer) - } - - fn is_valid(bytes_sent: u64, bytes_received: u64) -> bool { - if bytes_sent == bytes_received { - return true - } - - let percentage_difference = 1f32 - (bytes_received as f32 / bytes_sent as f32); - - return if percentage_difference >= 0.0 && - (T::ValidationThreshold::get() as f32 - percentage_difference) > 0.0 - { - true - } else { - false - } - } - - /// Shuffle the `list` swapping it's random elements `list.len()` times. - fn shuffle(mut list: Vec) -> Vec { - let len = list.len(); - for i in 1..len { - let random_index = Self::choose(len as u32).unwrap() as usize; - list.swap(i, random_index) - } - - list - } - - /// Split the `list` to several chunks `segment_len` length each. - /// - /// The very last chunk will be shorter than `segment_len` if `list.len()` is not divisible - /// by `segment_len`. - fn split(list: Vec, segment_len: usize) -> Vec> { - let mut result: Vec> = Vec::new(); - - if segment_len == 0 { - return result - } - - for i in (0..list.len()).step_by(segment_len) { - let end = usize::min(i + segment_len, list.len()); - let chunk = list[i..end].to_vec(); - result.push(chunk); - } - - result - } - - fn assign(quorum_size: usize, era: EraIndex) -> Result<(), AssignmentError> { - let validators: Vec = DDCValidatorToStashKeys::::iter_keys().collect(); - log::debug!("Current validators: {:?}.", validators); - - if validators.len() == 0 { - return Err(AssignmentError::NoValidators) - } - - if validators.len() < quorum_size { - return Err(AssignmentError::NotEnoughValidators { - requested_quorum: quorum_size, - available_validators: validators.len(), - }) - } - - let edges: Vec = >::iter_keys().collect(); - log::debug!("Current edges: {:?}.", edges); - - if edges.len() == 0 { - return Ok(()) - } - - let shuffled_validators = Self::shuffle(validators); - let shuffled_edges = Self::shuffle(edges); - - let validators_keys: Vec = shuffled_validators - .iter() - .map(|v| utils::account_to_string::(v.clone())) - .collect(); - - // Create several groups of validators `quorum_size` length each. - let quorums = Self::split(validators_keys, quorum_size); - - // Write an assignment to each validator in each quorum. The difference between the - // number of edges assigned to each validator is not higher then 1. If the number of - // edges is less then the number of quorums, some quorums will not have any edges - // assigned. - let mut quorums_cycle = quorums.iter().cycle(); - for edge in shuffled_edges { - let Some(quorum_validators) = quorums_cycle.next() else { - return Err(AssignmentError::DefensiveEmptyQuorumsCycle); - }; - quorum_validators.iter().for_each(|validator| { - Assignments::::append( - era, - utils::string_to_account::(validator.clone()), - edge.clone(), - ); - }); - } - - return Ok(()) - } - - /// Randomly choose a number in range `[0, total)`. - /// Returns `None` for zero input. - /// Modification of `choose_ticket` from `pallet-lottery` version `4.0.0-dev`. - fn choose(total: u32) -> Option { - if total == 0 { - return None - } - let mut random_number = Self::generate_random_number(0); - - // Best effort attempt to remove bias from modulus operator. - for i in 1..128 { - if random_number < u32::MAX - u32::MAX % total { - break - } - - random_number = Self::generate_random_number(i); - } - - Some(random_number % total) - } - - /// Generate a random number from a given seed. - /// Note that there is potential bias introduced by using modulus operator. - /// You should call this function with different seed values until the random - /// number lies within `u32::MAX - u32::MAX % n`. - /// Modification of `generate_random_number` from `pallet-lottery` version `4.0.0-dev`. - fn generate_random_number(seed: u32) -> u32 { - let (random_seed, _) = - ::Randomness::random(&(b"ddc-validator", seed).encode()); - let random_number = ::decode(&mut random_seed.as_ref()) - .expect("secure hashes should always be bigger than u32; qed"); - - random_number - } - - fn find_validators_from_quorum(validator_id: &T::AccountId, era: &EraIndex) -> Vec { - let validator_edges = Self::assignments(era, &validator_id).unwrap(); - let mut quorum_members: Vec = Vec::new(); - - >::iter_prefix(era).for_each(|(candidate_id, edges)| { - if validator_edges == edges { - let candidate_id_str = utils::account_to_string::(candidate_id); - quorum_members.push(candidate_id_str); - } - }); - - quorum_members - } - - fn get_public_key() -> Option { - match sr25519_public_keys(KEY_TYPE).first() { - Some(pubkey) => Some(T::AccountId::decode(&mut &pubkey.encode()[..]).unwrap()), - None => None, - } - } - - fn validate_edges() -> Result<(), &'static str> { - let current_ddc_era = - ddc_staking::pallet::Pallet::::current_era().ok_or("DDC era not set")?; - let data_url = Self::get_data_url(); - let data_provider_url = Self::get_data_provider_url(); - log::debug!("[DAC Validator] Data provider URL: {:?}", &data_provider_url); - - let validator = match Self::get_public_key() { - Some(key) => key, - None => return Err("No validator public key found."), - }; - - log::debug!("validator: {:?}", validator); - - let assigned_edges = match Self::assignments(current_ddc_era - 1, validator.clone()) { - Some(edges) => edges, - None => return Err("No assignments for the previous era."), - }; - - log::debug!("assigned_edges: {:?}", assigned_edges); - - // Calculate CDN nodes reward points from validation decision aggregates - let mut cdn_nodes_reward_points: Vec<(T::AccountId, u64)> = vec![]; - - for assigned_edge in assigned_edges.iter() { - log::debug!("assigned edge: {:?}", assigned_edge); - - let Some((node, _)) = >::iter().find(|(_, s)| assigned_edge == s) else { - log::debug!("no known node for: {:?}", assigned_edge); - continue; - }; - - log::debug!("assigned edge node: {:?}", assigned_edge); - - // form url for each node - let edge_url = format!( - "{}{}{}/$.{}", - data_url, - "ddc:dac:aggregation:nodes:", - current_ddc_era - 1, - array_bytes::bytes2hex("", node.encode()), - ); - log::debug!("edge url: {:?}", edge_url); - - let node_aggregates = dac::fetch_cdn_node_aggregates_request(&edge_url); - log::debug!("node aggregates: {:?}", node_aggregates); - - // No data for node - if node_aggregates.len() == 0 { - continue - } - - let request_ids = &node_aggregates[0].request_ids; - log::debug!("request_ids: {:?}", request_ids); - - // Store bucket payments - let payments_per_bucket = &mut Vec::new(); - let requests = &mut dac::Requests::new(); - for request_id in request_ids.iter() { - let request_id_url = - format!("{}{}{}", data_url, "ddc:dac:data:file:", request_id.clone()); - let file_request = dac::fetch_file_request(&request_id_url); - requests.insert(file_request.file_request_id.clone(), file_request.clone()); - } - dac::get_acknowledged_bytes_bucket(&requests, payments_per_bucket); - let (bytes_sent, bytes_received) = dac::get_served_bytes_sum(&requests); - let is_valid = Self::is_valid(bytes_sent, bytes_received); - - log::debug!("bytes_sent, bytes_received: {:?}, {:?}", bytes_sent, bytes_received); - - let payload = serde_json::to_string(&requests).unwrap(); - let decision = ValidationDecision { - edge: utils::account_to_string::(assigned_edge.clone()), - result: is_valid, - payload: utils::hash(&payload), - totals: DacTotalAggregates { - received: bytes_received, - sent: bytes_sent, - failed_by_client: 0, - failure_rate: 0, - }, - }; - - log::debug!("decision to be encoded: {:?}", decision); - - let serialized_decision = serde_json::to_string(&decision).unwrap(); - let encoded_decision = - shm::base64_encode(&serialized_decision.as_bytes().to_vec()).unwrap(); - log::debug!("encoded decision: {:?}", encoded_decision); - - let validator_str = utils::account_to_string::(validator.clone()); - let edge_str = utils::account_to_string::(assigned_edge.clone()); - - let encoded_decision_str = encoded_decision.iter().cloned().collect::(); - - let response = shm::share_intermediate_validation_result( - &data_provider_url, - current_ddc_era - 1, - &validator_str, - &edge_str, - is_valid, - &encoded_decision_str, - ); - - if let Err(res) = response.clone() { - log::error!("share_intermediate_validation_result request failed: {:?}", res); - } - - if let Ok(res) = response.clone() { - log::debug!("shm res: {:?}", res.to_string()); - } - - if let Ok(_res) = response { - let edge = utils::account_to_string::(assigned_edge.clone()); - let prev_era = (current_ddc_era - 1) as EraIndex; - let quorum = Self::find_validators_from_quorum(&validator, &prev_era); - let validations_res = shm::get_intermediate_decisions( - &data_provider_url, - &edge_str, - &prev_era, - quorum, - ); - - log::debug!("get_intermediate_decisions result: {:?}", validations_res); - - if validations_res.len() == QUORUM_SIZE { - log::debug!("payments per bucket: {:?}", payments_per_bucket); - - let mut payments: BTreeMap< - u128, - BucketsDetails>, - > = BTreeMap::new(); - for bucket in payments_per_bucket.into_iter() { - let cere_payment = bucket.1 as u32; - if payments.contains_key(&bucket.0) { - payments.entry(bucket.0).and_modify(|bucket_info| { - bucket_info.amount += cere_payment.into() - }); - } else { - let bucket_info = BucketsDetails { - bucket_id: bucket.0, - amount: cere_payment.into(), - }; - payments.insert(bucket.0, bucket_info); - } - } - let mut final_payments = vec![]; - for (_, bucket_info) in payments { - final_payments.push(bucket_info); - } - log::debug!("final payments: {:?}", final_payments); - - // Store CDN node reward points on-chain - let signer: Signer = Signer::<_, _>::any_account(); - if !signer.can_sign() { - log::warn!("No local accounts available to charge payments for CDN. Consider adding one via `author_insertKey` RPC."); - return Err("signing key not set") - } - // ToDo: replace local call by a call from `ddc-staking` pallet - let tx_res: Option<(frame_system::offchain::Account, Result<(), ()>)> = - signer.send_signed_transaction(|_account| { - Call::charge_payments_content_owners { - paying_accounts: final_payments.clone(), - } - }); - - match tx_res { - Some((acc, Ok(()))) => - log::debug!("[{:?}]: submit transaction success.", acc.id), - Some((acc, Err(e))) => log::debug!( - "[{:?}]: submit transaction failure. Reason: {:?}", - acc.id, - e - ), - None => log::debug!("submit transaction failure."), - } - - let final_res = dac::get_final_decision(validations_res); - - let signer = Self::get_signer().unwrap(); - - let tx_res = - signer.send_signed_transaction(|_acct| Call::set_validation_decision { - era: current_ddc_era - 1, - cdn_node: utils::string_to_account::(edge.clone()), - validation_decision: final_res.clone(), - }); - - match tx_res { - Some((acc, Ok(()))) => - log::debug!("[{:?}]: submit transaction success.", acc.id), - Some((acc, Err(e))) => log::debug!( - "[{:?}]: submit transaction failure. Reason: {:?}", - acc.id, - e - ), - None => log::debug!("submit transaction failure."), - } - - cdn_nodes_reward_points.push(( - utils::string_to_account::(final_res.edge), - final_res.totals.sent, - )); - } - } - } - let signer = Self::get_signer().unwrap(); - - // ToDo: replace local call by a call from `ddc-staking` pallet - if cdn_nodes_reward_points.len() > 0 { - let tx_res = - signer.send_signed_transaction(|_account| Call::set_era_reward_points { - era: current_ddc_era - 1, - stakers_points: cdn_nodes_reward_points.clone(), - }); - - match tx_res { - Some((acc, Ok(()))) => - log::debug!("[{:?}]: submit transaction success.", acc.id), - Some((acc, Err(e))) => - log::debug!("[{:?}]: submit transaction failure. Reason: {:?}", acc.id, e), - None => log::debug!("submit transaction failure."), - } - } - - Ok(()) - } - } -} diff --git a/pallets/ddc-validator/src/mock-data/set-1/aggregated-node-data-for-era.json b/pallets/ddc-validator/src/mock-data/set-1/aggregated-node-data-for-era.json deleted file mode 100644 index 37b3242fe..000000000 --- a/pallets/ddc-validator/src/mock-data/set-1/aggregated-node-data-for-era.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":"[{\"totalBytesSent\":600,\"totalQueries\":0,\"totalReads\":3,\"totalReadsAcked\":3,\"totalQueriesAcked\":0,\"averageResponseTimeMs\":1.8852459016393444,\"totalBytesReceived\":600,\"requestIds\":[\"84640a53-fc1f-4ac5-921c-6695056840bc\",\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7\",\"80a62530-fd76-40b5-bc53-dd82365e89ce\"],\"totalWritesAcked\":3,\"averageResponseTimeMsSamples\":61,\"totalWrites\":3}]"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock-data/set-1/file-request1.json b/pallets/ddc-validator/src/mock-data/set-1/file-request1.json deleted file mode 100644 index 5a29a982b..000000000 --- a/pallets/ddc-validator/src/mock-data/set-1/file-request1.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":"{\"fileRequestId\":\"84640a53-fc1f-4ac5-921c-6695056840bc\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"],\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"]},\"bucketId\":5,\"timestamp\":1688473909701,\"chunks\":{\"84640a53-fc1f-4ac5-921c-6695056840bc:bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\":{\"log\":{\"type\":1,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":3,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49690\",\"bytesSent\":100,\"timestamp\":1688473909701,\"nodePublicKey\":\"0101010101010101010101010101010101010101010101010101010101010101\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\",\"ack\":{\"userTimestamp\":1688473909709,\"nonce\":\"Gt7AFrznCPzgI/5q+tynLy2BKUooSGAkUCaGsF6AOMs=\",\"signature\":\"Gll6xIftbtP4JPB6miy3DLKMBDrKz05QSIBNJ3RqYi0Fg1wNJRFoSIqhOJDXDUB4NlrLQdl+HWrYRL20Hsx6iA==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":100,\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcb2\"],\"nodePublicKey\":\"0101010101010101010101010101010101010101010101010101010101010101\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock-data/set-1/file-request2.json b/pallets/ddc-validator/src/mock-data/set-1/file-request2.json deleted file mode 100644 index b0e3fdc19..000000000 --- a/pallets/ddc-validator/src/mock-data/set-1/file-request2.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":"{\"fileRequestId\":\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcd2\"],\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcd2\"]},\"bucketId\":5,\"timestamp\":1688473909723,\"chunks\":{\"d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7:bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcd2\":{\"log\":{\"type\":2,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":3,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49714\",\"bytesSent\":200,\"timestamp\":1688473909723,\"nodePublicKey\":\"0101010101010101010101010101010101010101010101010101010101010101\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcd2\",\"ack\":{\"userTimestamp\":1688473909726,\"nonce\":\"2mdA3QVq02ME77vnqGjBNQqTRhM5gHjVAWcroNd5IZA=\",\"signature\":\"6PIWJXyEyHfWZrX6HKFNj3fRm5LbBsBX54zmVZpo+nMqqTV26xaQbEsRTfuhm4k+XGxci3VSuofPWFEpRuOmhg==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":200,\"requestedChunkCids\":[\"bafk2bzaceds3kr47j7imur2krbwhydosbocto73kx3erhmknjelpk6doltcd2\"],\"nodePublicKey\":\"0101010101010101010101010101010101010101010101010101010101010101\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock-data/set-1/file-request3.json b/pallets/ddc-validator/src/mock-data/set-1/file-request3.json deleted file mode 100644 index 047c057e6..000000000 --- a/pallets/ddc-validator/src/mock-data/set-1/file-request3.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":"{\"fileRequestId\":\"80a62530-fd76-40b5-bc53-dd82365e89ce\",\"fileInfo\":{\"chunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"requestedChunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"]},\"bucketId\":5,\"timestamp\":1688473910041,\"chunks\":{\"80a62530-fd76-40b5-bc53-dd82365e89ce:bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\":{\"log\":{\"type\":1,\"signature\":null,\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"era\":3,\"bucketId\":5,\"userAddress\":\"172.18.0.1:49736\",\"bytesSent\":300,\"timestamp\":1688473910041,\"nodePublicKey\":\"0101010101010101010101010101010101010101010101010101010101010101\",\"sessionId\":\"6afL1/kz+7NInOaHjwfUWZuoBwSZ2qX9JDOuSULCENk=\"},\"cid\":\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\",\"ack\":{\"userTimestamp\":1688473910043,\"nonce\":\"VU1XCPjQxA4y6TnrOAy44QabS7nmmxAU8vyduqoLt9U=\",\"signature\":\"Us7//t0+y00oHhthPSjqphHJYwE1qgPQtBSdy5hZxUInKdQXTBX58VLQekoKMHtptQQggR1gPf9Pyy1enmXziQ==\",\"aggregated\":1,\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\",\"bytesReceived\":300,\"requestedChunkCids\":[\"bafk2bzaced573lhaxdjlztd5xawkeakiz7j7dayrqbzrx5shjobordrrrlio4\"],\"nodePublicKey\":\"0101010101010101010101010101010101010101010101010101010101010101\"}}},\"userPublicKey\":\"knW4sRsf5iyoE+bP+duWD8KEYiRddtPDQ7Hpx1KLyEM=\"}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock-data/set-1/final-validation-decision.json b/pallets/ddc-validator/src/mock-data/set-1/final-validation-decision.json deleted file mode 100644 index b63b98c6c..000000000 --- a/pallets/ddc-validator/src/mock-data/set-1/final-validation-decision.json +++ /dev/null @@ -1 +0,0 @@ -{"edge":"0101010101010101010101010101010101010101010101010101010101010101","result":true,"payload":[242,221,51,34,29,242,150,119,6,131,41,15,161,173,121,43,221,22,150,173,180,224,179,58,72,4,96,188,17,164,177,109],"totals":{"received":600,"sent":600,"failed_by_client":0,"failure_rate":0}} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock-data/set-1/save-validation-decision-result.json b/pallets/ddc-validator/src/mock-data/set-1/save-validation-decision-result.json deleted file mode 100644 index 5fa9734a3..000000000 --- a/pallets/ddc-validator/src/mock-data/set-1/save-validation-decision-result.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":null} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock-data/set-1/shared-validation-decisions-for-era.json b/pallets/ddc-validator/src/mock-data/set-1/shared-validation-decisions-for-era.json deleted file mode 100644 index da4aa921a..000000000 --- a/pallets/ddc-validator/src/mock-data/set-1/shared-validation-decisions-for-era.json +++ /dev/null @@ -1 +0,0 @@ -{"JSON.GET":"{\"0101010101010101010101010101010101010101010101010101010101010101\":{\"d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67\":{\"result\":true,\"data\":\"eyJlZGdlIjoiMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMSIsInJlc3VsdCI6dHJ1ZSwicGF5bG9hZCI6WzI0MiwgMjIxLCA1MSwgMzQsIDI5LCAyNDIsIDE1MCwgMTE5LCA2LCAxMzEsIDQxLCAxNSwgMTYxLCAxNzMsIDEyMSwgNDMsIDIyMSwgMjIsIDE1MCwgMTczLCAxODAsIDIyNCwgMTc5LCA1OCwgNzIsIDQsIDk2LCAxODgsIDE3LCAxNjQsIDE3NywgMTA5XSwidG90YWxzIjp7InJlY2VpdmVkIjo2MDAsInNlbnQiOjYwMCwiZmFpbGVkX2J5X2NsaWVudCI6MCwiZmFpbHVyZV9yYXRlIjowfX0=\"}},\"1c4a1b081af8dd09096ebb6e7ad61dd549ac2931cdb2b1216589094ad71ca90b\":{\"d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67\":{\"result\":false,\"data\":\"eyJlZGdlIjoiMWM0YTFiMDgxYWY4ZGQwOTA5NmViYjZlN2FkNjFkZDU0OWFjMjkzMWNkYjJiMTIxNjU4OTA5NGFkNzFjYTkwYiIsInJlc3VsdCI6ZmFsc2UsInBheWxvYWQiOlsxMDQsMjM4LDczLDczLDIwNCwxNzIsMjU0LDE4MSw3NywxMTYsMTM2LDE4OSwyNDYsOTAsMTY0LDE1NCwxNjcsMywxNTUsMjUzLDgwLDMzLDI1MSwxNCw3OCwyMzYsMTY3LDEzNCwxNjEsNjQsMjIyLDE4MV0sInRvdGFscyI6eyJyZWNlaXZlZCI6OTAwLCJzZW50Ijo1NDQsImZhaWxlZF9ieV9jbGllbnQiOjAsImZhaWx1cmVfcmF0ZSI6MH19\"}}}"} \ No newline at end of file diff --git a/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json b/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json deleted file mode 100644 index de8eec3a7..000000000 --- a/pallets/ddc-validator/src/mock-data/set-1/validation-decision.json +++ /dev/null @@ -1 +0,0 @@ -{"edge":"0101010101010101010101010101010101010101010101010101010101010101","result":true,"payload":[56, 47, 100, 81, 135, 215, 168, 111, 55, 82, 203, 118, 238, 69, 174, 209, 232, 241, 187, 128, 231, 237, 139, 193, 162, 162, 91, 11, 169, 209, 27, 55],"totals":{"received":400,"sent":400,"failed_by_client":0,"failure_rate":0}} \ No newline at end of file diff --git a/pallets/ddc-validator/src/payments.rs b/pallets/ddc-validator/src/payments.rs deleted file mode 100644 index a1a26ade5..000000000 --- a/pallets/ddc-validator/src/payments.rs +++ /dev/null @@ -1 +0,0 @@ -//! Payments module to calculate and store a withdrawal per content owner and a payout per CDN node. diff --git a/pallets/ddc-validator/src/shm.rs b/pallets/ddc-validator/src/shm.rs deleted file mode 100644 index 6989e148f..000000000 --- a/pallets/ddc-validator/src/shm.rs +++ /dev/null @@ -1,162 +0,0 @@ -//! Validators' "shared memory" module. -//! -//! It implements a step of the DAC and Validation sequence when validators share their intermediate -//! validation results with each other. The design of the "shared memory" is expected to become like -//! transactions pool or peers list in the future, but for now it works on the centralized Redis -//! server which we maintain for DAC DataModel. - -use alloc::{format, string::String}; -pub use sp_std::collections::btree_map::BTreeMap; -// ToDo: remove String usage -use crate::{dac, utils, ValidationDecision}; -use alt_serde::{Deserialize, Serialize}; -use base64::prelude::*; -use lite_json::json::JsonValue; -use sp_runtime::offchain::{http, Duration}; -use sp_staking::EraIndex; -use sp_std::prelude::*; - -const HTTP_TIMEOUT_MS: u64 = 30_000; - -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "alt_serde")] -#[serde(rename_all = "camelCase")] -pub struct IntermediateDecisionsWrapper { - #[serde(rename = "JSON.GET")] - json: String, -} - -#[derive(Debug, Deserialize, Serialize, Clone)] -#[serde(crate = "alt_serde")] -pub(crate) struct IntermediateDecisions { - validators_to_decisions: BTreeMap, -} - -#[derive(Debug, Deserialize, Serialize, Clone)] -#[serde(crate = "alt_serde")] -struct IntermediateDecision { - result: bool, - data: String, -} - -pub fn base64_decode(input: &String) -> Result, ()> { - let mut buf = Vec::with_capacity(1000); // ToDo: calculate capacity - buf.resize(1000, 0); - BASE64_STANDARD.decode_slice(input, &mut buf).map_err(|_| ())?; - Ok(buf.iter().map(|&char| char as u8).collect()) -} - -/// Encodes a vector of bytes into a vector of characters using base64 encoding. -pub fn base64_encode(input: &Vec) -> Result, ()> { - let mut buf = Vec::with_capacity(1000); // ToDo: calculate capacity - buf.resize(1000, 0); - BASE64_STANDARD.encode_slice(input, &mut buf).map_err(|_| ())?; - Ok(buf.iter().map(|&byte| byte as char).collect()) -} - -/// Publish intermediate validation result to redis. -pub fn share_intermediate_validation_result( - shared_memory_webdis_url: &String, - era: EraIndex, - validator: &String, - cdn_node: &String, - validation_result: bool, - validation_decision_encoded: &String, -) -> Result { - let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); - let validation_decision_string = String::from(validation_decision_encoded); - let json = serde_json::json!({ - "result": validation_result, - "data": validation_decision_string, - }); - let json_str = serde_json::to_string(&json).unwrap(); - let unescaped_json = utils::unescape(&json_str); - let url_encoded_json = utils::url_encode(&unescaped_json); - - log::debug!("json_str: {:?}", json_str); - - let url = format!( - "{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{}", - shared_memory_webdis_url, validator, cdn_node, era, url_encoded_json, - ); - - log::debug!("share_intermediate_validation_result url: {:?}", url); - let request = http::Request::get(url.as_str()); - let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; - let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; - if response.code != 200 { - log::warn!("Unexpected status code: {}", response.code); - return Err(http::Error::Unknown) - } - let body = response.body().collect::>(); - let body_str = sp_std::str::from_utf8(&body).map_err(|_| { - log::warn!("No UTF-8 body"); - http::Error::Unknown - })?; - - log::debug!("body_str: {:?}", body_str); - - let json = lite_json::parse_json(body_str).map_err(|_| { - log::warn!("No JSON body"); - http::Error::Unknown - })?; - Ok(json) -} - -pub(crate) fn get_intermediate_decisions( - data_provider_url: &String, - edge: &str, - era: &EraIndex, - quorum: Vec, -) -> Vec { - let url = format!("{}/JSON.GET/ddc:dac:shared:nodes:{}", data_provider_url, era); - - let response: IntermediateDecisionsWrapper = dac::http_get_json(url.as_str()).unwrap(); - let mut edges_to_validators_decisions: BTreeMap< - String, - BTreeMap, - > = serde_json::from_str(&response.json).unwrap(); - let decisions_for_edge = IntermediateDecisions { - validators_to_decisions: edges_to_validators_decisions.remove(edge).unwrap(), - }; - - let quorum_decisions = find_quorum_decisions(decisions_for_edge, quorum); - let decoded_decisions = decode_intermediate_decisions(quorum_decisions); - - decoded_decisions -} - -pub(crate) fn decode_intermediate_decisions( - decisions: IntermediateDecisions, -) -> Vec { - let mut decoded_decisions: Vec = Vec::new(); - - for (_, decision) in decisions.validators_to_decisions.iter() { - let data = base64_decode(&decision.data).unwrap(); - - let data_str = String::from_utf8_lossy(&data); - let data_trimmed = data_str.trim_end_matches('\0'); - - log::debug!("data_str: {:?}", data_trimmed); - - let decoded_decision: ValidationDecision = serde_json::from_str(&data_trimmed).unwrap(); - - decoded_decisions.push(decoded_decision); - } - - decoded_decisions -} - -pub(crate) fn find_quorum_decisions( - all_decisions: IntermediateDecisions, - quorum: Vec, -) -> IntermediateDecisions { - let mut quorum_decisions: BTreeMap = BTreeMap::new(); - for (validator_id, decision) in all_decisions.validators_to_decisions.iter() { - if quorum.contains(validator_id) { - quorum_decisions.insert(validator_id.clone(), decision.clone()); - } - } - - IntermediateDecisions { validators_to_decisions: quorum_decisions } -} diff --git a/pallets/ddc-validator/src/tests.rs b/pallets/ddc-validator/src/tests.rs deleted file mode 100644 index 9493f2771..000000000 --- a/pallets/ddc-validator/src/tests.rs +++ /dev/null @@ -1,606 +0,0 @@ -#![cfg(test)] - -use super::*; -use crate::{ - mock::{Timestamp, *}, - Error as ValidatorError, -}; -use codec::Decode; -use ddc_primitives::{CDNNodePubKey, NodePubKey}; -use frame_support::{assert_noop, assert_ok}; -use pallet_ddc_customers::{BucketsDetails, Error as AccountsError}; -use pallet_ddc_staking::{DDC_ERA_DURATION_MS, DDC_ERA_START_MS}; -use sp_core::offchain::{testing, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt}; -use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; -use sp_runtime::offchain::storage::StorageValueRef; -use std::sync::Arc; - -const OCW_PUB_KEY_STR: &str = "d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67"; -const OCW_SEED: &str = - "news slush supreme milk chapter athlete soap sausage put clutch what kitten"; - -fn last_event() -> RuntimeEvent { - System::events().pop().expect("Event expected").event.into() -} - -#[test] -fn it_sets_validation_decision_with_one_validator_in_quorum() { - let mut t = new_test_ext(); - - let (offchain, offchain_state) = testing::TestOffchainExt::new(); - t.register_extension(OffchainDbExt::new(offchain.clone())); - t.register_extension(OffchainWorkerExt::new(offchain)); - - let keystore = KeyStore::new(); - keystore.sr25519_generate_new(KEY_TYPE, Some(OCW_SEED)).unwrap(); - t.register_extension(KeystoreExt(Arc::new(keystore))); - - let (pool, pool_state) = testing::TestTransactionPoolExt::new(); - t.register_extension(TransactionPoolExt::new(pool)); - - let era_to_validate: EraIndex = 3; - let edge_stash_to_validate = AccountId::from([0x1; 32]); - let edge_stash_to_validate_str = - utils::account_to_string::(edge_stash_to_validate.clone()); - let edge_node_to_validate = NodePubKey::CDNPubKey(CDNNodePubKey::new([0x21; 32])); - let edge_node_to_validate_str = array_bytes::bytes2hex("", edge_node_to_validate.encode()); - let validator_1_stash = AccountId::from([ - 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, - 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, - 0xdf, 0x67, - ]); - let validator_1_controller = AccountId::from([0xaa; 32]); - let validator_2_stash = AccountId::from([0xb; 32]); - let validator_2_controller = AccountId::from([0xbb; 32]); - let validator_3_stash = AccountId::from([0xc; 32]); - let validator_3_controller = AccountId::from([0xcc; 32]); - - { - let mut state = offchain_state.write(); - - let mut expect_request = |url: &str, response: &[u8]| { - state.expect_request(testing::PendingRequest { - method: "GET".into(), - uri: url.to_string(), - response: Some(response.to_vec()), - sent: true, - ..Default::default() - }); - }; - - expect_request( - &format!( - "{}/JSON.GET/ddc:dac:aggregation:nodes:{}/$.{}", - DEFAULT_DATA_PROVIDER_URL, era_to_validate, edge_node_to_validate_str - ), - include_bytes!("./mock-data/set-1/aggregated-node-data-for-era.json"), - ); - - expect_request( - &format!( - "{}/JSON.GET/ddc:dac:data:file:84640a53-fc1f-4ac5-921c-6695056840bc", - DEFAULT_DATA_PROVIDER_URL - ), - include_bytes!("./mock-data/set-1/file-request1.json"), - ); - - expect_request( - &format!( - "{}/JSON.GET/ddc:dac:data:file:d0a55c8b-fcb9-41b5-aa9a-8b40e9c4edf7", - DEFAULT_DATA_PROVIDER_URL - ), - include_bytes!("./mock-data/set-1/file-request2.json"), - ); - - expect_request( - &format!( - "{}/JSON.GET/ddc:dac:data:file:80a62530-fd76-40b5-bc53-dd82365e89ce", - DEFAULT_DATA_PROVIDER_URL - ), - include_bytes!("./mock-data/set-1/file-request3.json"), - ); - - let decision: ValidationDecision = - serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")) - .unwrap(); - let serialized_decision = serde_json::to_string(&decision).unwrap(); - let encoded_decision_vec = - shm::base64_encode(&serialized_decision.as_bytes().to_vec()).unwrap(); - let encoded_decision_str = encoded_decision_vec.iter().cloned().collect::(); - let result_json = serde_json::json!({ - "result": decision.result, - "data": encoded_decision_str, - }); - let result_json_str = serde_json::to_string(&result_json).unwrap(); - let unescaped_result_json = utils::unescape(&result_json_str); - let url_encoded_result_json = utils::url_encode(&unescaped_result_json); - - expect_request( - &format!( - "{}/FCALL/save_validation_result_by_node/1/{}:{}:{}/{}", - DEFAULT_DATA_PROVIDER_URL, - OCW_PUB_KEY_STR, - edge_stash_to_validate_str, - era_to_validate, - url_encoded_result_json, - ), - include_bytes!("./mock-data/set-1/save-validation-decision-result.json"), - ); - - expect_request( - &format!( - "{}/JSON.GET/ddc:dac:shared:nodes:{}", - DEFAULT_DATA_PROVIDER_URL, era_to_validate - ), - include_bytes!("./mock-data/set-1/shared-validation-decisions-for-era.json"), - ); - } - - t.execute_with(|| { - let era_block_number = 20 as u32 * era_to_validate; - System::set_block_number(era_block_number); // required for randomness - assert_ok!(DdcValidator::set_validator_key( - // register validator 1 - RuntimeOrigin::signed(validator_1_controller), - validator_1_stash, - )); - assert_ok!(DdcValidator::set_validator_key( - // register validator 2 - RuntimeOrigin::signed(validator_2_controller), - validator_2_stash, - )); - assert_ok!(DdcValidator::set_validator_key( - // register validator 3 - RuntimeOrigin::signed(validator_3_controller), - validator_3_stash, - )); - Timestamp::set_timestamp( - (DDC_ERA_START_MS + DDC_ERA_DURATION_MS * (era_to_validate as u128 - 1)) as u64, - ); - DdcStaking::on_finalize(era_block_number - 1); // set DDC era counter - DdcValidator::on_initialize(era_block_number - 1); // make assignments - - Timestamp::set_timestamp( - (DDC_ERA_START_MS + DDC_ERA_DURATION_MS * (era_to_validate as u128 + 1)) as u64, - ); - DdcStaking::on_finalize(era_block_number + 1); // inc DDC era counter - StorageValueRef::persistent(ENABLE_DDC_VALIDATION_KEY).set(&true); // enable validation - DdcValidator::offchain_worker(era_block_number + 1); // execute assignments - - let mut transactions = pool_state.read().transactions.clone(); - transactions.reverse(); - assert_eq!(transactions.len(), 3); - - let tx = transactions.pop().unwrap(); - let tx = Extrinsic::decode(&mut &*tx).unwrap(); - assert!(tx.signature.is_some()); - - let bucket_info = BucketsDetails { bucket_id: 5, amount: 400u128 }; - - assert_eq!( - tx.call, - crate::mock::RuntimeCall::DdcValidator(crate::Call::charge_payments_content_owners { - paying_accounts: vec![bucket_info] - }) - ); - - let tx = transactions.pop().unwrap(); - let tx = Extrinsic::decode(&mut &*tx).unwrap(); - assert!(tx.signature.is_some()); - - let common_decision: ValidationDecision = serde_json::from_slice(include_bytes!( - "./mock-data/set-1/final-validation-decision.json" - )) - .unwrap(); - let common_decisions = vec![common_decision.clone()]; - let serialized_decisions = serde_json::to_string(&common_decisions).unwrap(); - - assert_eq!( - tx.call, - crate::mock::RuntimeCall::DdcValidator(crate::Call::set_validation_decision { - era: era_to_validate, - cdn_node: edge_stash_to_validate.clone(), - validation_decision: ValidationDecision { - edge: edge_stash_to_validate_str, - result: true, - payload: utils::hash(&serialized_decisions), - totals: DacTotalAggregates { - received: common_decision.totals.received, - sent: common_decision.totals.sent, - failed_by_client: common_decision.totals.failed_by_client, - failure_rate: common_decision.totals.failure_rate, - } - } - }) - ); - - let tx = transactions.pop().unwrap(); - let tx = Extrinsic::decode(&mut &*tx).unwrap(); - - let stakers_points = vec![(edge_stash_to_validate, common_decision.totals.sent)]; - - assert!(tx.signature.is_some()); - assert_eq!( - tx.call, - crate::mock::RuntimeCall::DdcValidator(crate::Call::set_era_reward_points { - era: era_to_validate, - stakers_points, - }) - ); - }) -} - -#[test] -fn send_signal_works_as_expected() { - let mut t = new_test_ext(); - - let validator_controller = AccountId::from([0xaa; 32]); - - t.execute_with(|| { - assert_eq!(DdcValidator::signal(), None); - assert_ok!(DdcValidator::send_signal(RuntimeOrigin::signed(validator_controller))); - assert_eq!(DdcValidator::signal(), Some(true)); - DdcValidator::on_initialize(2); - System::set_block_number(2); - assert_eq!(DdcValidator::signal(), Some(false)); - }) -} - -#[test] -fn set_validation_decision_works_as_expected() { - let mut t = new_test_ext(); - - let era_to_validate: EraIndex = 3; - let cdn_node_to_validate = AccountId::from([0x1; 32]); - let not_a_cdn_node = AccountId::from([0x2; 32]); - let validator_1_stash = AccountId::from([ - 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, - 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, - 0xdf, 0x67, - ]); - let validator_1_controller = AccountId::from([0xaa; 32]); - let validator_1_not_controller = AccountId::from([0xdd; 32]); - - let decision: ValidationDecision = - serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")) - .unwrap(); - - t.execute_with(|| { - System::set_block_number(1); - - assert_noop!( - DdcValidator::set_validation_decision( - RuntimeOrigin::signed(validator_1_controller.clone()), - era_to_validate, - cdn_node_to_validate.clone(), - decision.clone(), - ), - ValidatorError::::DDCValidatorKeyNotRegistered - ); - - // Set a mapping from stash to not a validator - DDCValidatorToStashKeys::::insert( - validator_1_stash.clone(), - validator_1_not_controller.clone(), - ); - - assert_noop!( - DdcValidator::set_validation_decision( - RuntimeOrigin::signed(validator_1_stash.clone()), - era_to_validate, - cdn_node_to_validate.clone(), - decision.clone() - ), - ValidatorError::::NotValidatorStash - ); - - assert_ok!(DdcValidator::set_validator_key( - // register validator 1 - RuntimeOrigin::signed(validator_1_controller.clone()), - validator_1_stash.clone(), - )); - - assert_noop!( - DdcValidator::set_validation_decision( - RuntimeOrigin::signed(validator_1_stash.clone()), - era_to_validate, - not_a_cdn_node.clone(), - decision.clone() - ), - ValidatorError::::NodeNotActive - ); - - assert_ok!(DdcValidator::set_validation_decision( - RuntimeOrigin::signed(validator_1_stash.clone()), - era_to_validate, - cdn_node_to_validate.clone(), - decision.clone() - )); - - assert_noop!( - DdcValidator::set_validation_decision( - RuntimeOrigin::signed(validator_1_stash), - era_to_validate, - cdn_node_to_validate.clone(), - decision.clone() - ), - ValidatorError::::ValidationDecisionAlreadySet - ); - - let evt = last_event(); - - assert_eq!( - evt, - crate::Event::ValidationDecision(era_to_validate, cdn_node_to_validate, decision) - .into() - ); - }) -} - -#[test] -fn set_era_reward_points_works_as_expected() { - let mut t = new_test_ext(); - - let era_to_validate: EraIndex = 3; - let cdn_node_to_validate = AccountId::from([0x1; 32]); - let not_a_cdn_node = AccountId::from([0x2; 32]); - let validator_1_stash = AccountId::from([ - 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, - 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, - 0xdf, 0x67, - ]); - let validator_1_controller = AccountId::from([0xaa; 32]); - let validator_1_not_controller = AccountId::from([0xdd; 32]); - - let decision: ValidationDecision = - serde_json::from_slice(include_bytes!("./mock-data/set-1/validation-decision.json")) - .unwrap(); - - let stakers_points = vec![(cdn_node_to_validate.clone(), decision.totals.sent)]; - let fake_stakers_points = vec![(not_a_cdn_node.clone(), decision.totals.sent)]; - - t.execute_with(|| { - System::set_block_number(1); - - assert_noop!( - DdcValidator::set_era_reward_points( - RuntimeOrigin::signed(validator_1_controller.clone()), - era_to_validate, - stakers_points.clone(), - ), - ValidatorError::::DDCValidatorKeyNotRegistered - ); - - // Set a mapping from stash to not a validator - DDCValidatorToStashKeys::::insert( - validator_1_stash.clone(), - validator_1_not_controller.clone(), - ); - - assert_noop!( - DdcValidator::set_era_reward_points( - RuntimeOrigin::signed(validator_1_stash.clone()), - era_to_validate, - stakers_points.clone() - ), - ValidatorError::::NotValidatorStash - ); - - assert_ok!(DdcValidator::set_validator_key( - // register validator 1 - RuntimeOrigin::signed(validator_1_controller), - validator_1_stash.clone(), - )); - - // attempting to set era reward points for account, which is not an active CDN node - assert_ok!(DdcValidator::set_era_reward_points( - RuntimeOrigin::signed(validator_1_stash.clone()), - era_to_validate, - fake_stakers_points.clone() - )); - - // rewards points should not be set - assert_eq!( - DdcValidator::reward_points_set_for_node(era_to_validate, not_a_cdn_node), - false - ); - - assert_ok!(DdcValidator::set_era_reward_points( - RuntimeOrigin::signed(validator_1_stash.clone()), - era_to_validate, - stakers_points.clone() - )); - - let reward_points = ddc_staking::pallet::ErasEdgesRewardPointsPerNode::::get( - cdn_node_to_validate.clone(), - ); - - assert_eq!(reward_points.len(), 1); - - // Second run will still pass, but state will not change, as for specified node era points - // were set already - assert_ok!(DdcValidator::set_era_reward_points( - RuntimeOrigin::signed(validator_1_stash.clone()), - era_to_validate, - stakers_points.clone() - )); - - let reward_points_update_attempt = - ddc_staking::pallet::ErasEdgesRewardPointsPerNode::::get( - cdn_node_to_validate.clone(), - ); - - assert_eq!(reward_points_update_attempt.len(), 1); - - assert_eq!( - DdcValidator::reward_points_set_for_node(era_to_validate, cdn_node_to_validate), - true - ); - - assert_eq!(System::events().len(), 1); - let evt = System::events().pop().expect("Event expected").event; - - assert_eq!(evt, crate::Event::EraRewardPoints(era_to_validate, stakers_points).into()); - }) -} - -#[test] -fn charge_payments_content_owners_works_as_expected() { - let mut t = new_test_ext(); - - let era_to_validate: EraIndex = 3; - let validator_1_stash = AccountId::from([ - 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, - 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, - 0xdf, 0x67, - ]); - let validator_1_controller = AccountId::from([0xaa; 32]); - let validator_1_not_controller = AccountId::from([0xdd; 32]); - - let bucket_info = BucketsDetails { bucket_id: 5, amount: 600u128 }; - - t.execute_with(|| { - System::set_block_number(1); - - assert_noop!( - DdcValidator::charge_payments_content_owners( - RuntimeOrigin::signed(validator_1_controller.clone()), - vec![bucket_info.clone()], - ), - ValidatorError::::DDCEraNotSet - ); - - let era_block_number = 20 as u32 * era_to_validate; - System::set_block_number(era_block_number); - Timestamp::set_timestamp( - (DDC_ERA_START_MS + DDC_ERA_DURATION_MS * (era_to_validate as u128 - 1)) as u64, - ); - DdcStaking::on_finalize(era_block_number - 1); - - assert_noop!( - DdcValidator::charge_payments_content_owners( - RuntimeOrigin::signed(validator_1_stash.clone()), - vec![bucket_info.clone()] - ), - ValidatorError::::DDCValidatorKeyNotRegistered - ); - - // Set a mapping from stash to not a validator - DDCValidatorToStashKeys::::insert( - validator_1_stash.clone(), - validator_1_not_controller.clone(), - ); - - assert_noop!( - DdcValidator::charge_payments_content_owners( - RuntimeOrigin::signed(validator_1_stash.clone()), - vec![bucket_info.clone()] - ), - ValidatorError::::NotValidatorStash - ); - - assert_ok!(DdcValidator::set_validator_key( - // register validator 1 - RuntimeOrigin::signed(validator_1_controller.clone()), - validator_1_stash.clone(), - )); - - assert_noop!( - DdcValidator::charge_payments_content_owners( - RuntimeOrigin::signed(validator_1_stash.clone()), - vec![bucket_info.clone()] - ), - ValidatorError::::PricingNotSet - ); - - ddc_staking::Pricing::::set(Some(1)); // set CERE token per byte / reward - - // No buckets were created at this point - assert_noop!( - DdcValidator::charge_payments_content_owners( - RuntimeOrigin::signed(validator_1_stash.clone()), - vec![bucket_info.clone()] - ), - AccountsError::::BucketDoesNotExist - ); - - // Create buckets - for range in 1..6 { - assert_ok!(ddc_customers::Pallet::::create_bucket( - RuntimeOrigin::signed(validator_1_stash.clone()), - true, - range - )); - } - - // Account to charge payments from is not created - assert_noop!( - DdcValidator::charge_payments_content_owners( - RuntimeOrigin::signed(validator_1_stash.clone()), - vec![bucket_info.clone()] - ), - AccountsError::::NotOwner - ); - - // Deposit funds for account - assert_ok!(ddc_customers::Pallet::::deposit( - RuntimeOrigin::signed(validator_1_stash.clone()), - 1_000, - )); - - assert_ok!(DdcValidator::charge_payments_content_owners( - RuntimeOrigin::signed(validator_1_stash.clone()), - vec![bucket_info.clone()] - )); - - // Should not be able to charge account twice by the same validator during one era - assert_noop!( - DdcValidator::charge_payments_content_owners( - RuntimeOrigin::signed(validator_1_stash.clone()), - vec![bucket_info.clone()] - ), - ValidatorError::::ContentOwnersDoubleSpend - ); - - let last_evt = System::events().pop().expect("Event expected").event; - assert_eq!(last_evt, ddc_customers::Event::Charged(bucket_info.amount).into()); - }) -} - -#[test] -fn set_validator_key_works_as_expected() { - let mut t = new_test_ext(); - - let validator_1_stash = AccountId::from([ - 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, 0x94, - 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, 0x55, 0xf4, - 0xdf, 0x67, - ]); - let validator_1_controller: AccountId32 = AccountId::from([0xaa; 32]); - - t.execute_with(|| { - assert_noop!( - DdcValidator::set_validator_key( - RuntimeOrigin::signed(validator_1_stash.clone()), - validator_1_stash.clone(), - ), - ValidatorError::::NotController - ); - - assert_ok!(DdcValidator::set_validator_key( - RuntimeOrigin::signed(validator_1_controller.clone()), - validator_1_stash.clone(), - )); - - staking::Validators::::remove(validator_1_stash.clone()); - - // If stash is not a validator anymore, action will fail - assert_noop!( - DdcValidator::set_validator_key( - RuntimeOrigin::signed(validator_1_controller), - validator_1_stash, - ), - ValidatorError::::NotValidatorStash - ); - }) -} diff --git a/pallets/ddc-validator/src/utils.rs b/pallets/ddc-validator/src/utils.rs deleted file mode 100644 index 5c5459b24..000000000 --- a/pallets/ddc-validator/src/utils.rs +++ /dev/null @@ -1,73 +0,0 @@ -use alloc::{format, string::String}; -use codec::{Decode, Encode}; -use sp_core::crypto::AccountId32; -use sp_io::hashing::blake2_256; -pub use sp_std::prelude::*; - -pub fn account_to_string(account: T::AccountId) -> String { - let to32 = T::AccountId::encode(&account); - let pub_key_str = array_bytes::bytes2hex("", to32); - - pub_key_str -} - -pub fn string_to_account(pub_key_str: String) -> T::AccountId { - let acc32: sp_core::crypto::AccountId32 = - array_bytes::hex2array::<_, 32>(pub_key_str).unwrap().into(); - let mut to32 = AccountId32::as_ref(&acc32); - let address: T::AccountId = T::AccountId::decode(&mut to32).unwrap(); - address -} - -pub(crate) fn hash(data: &String) -> [u8; 32] { - let hash = blake2_256(data.as_bytes()); - let mut result = [0u8; 32]; - result.copy_from_slice(&hash); - - result -} - -pub(crate) fn url_encode(input: &str) -> String { - let mut encoded = String::new(); - - for byte in input.bytes() { - match byte { - // Unreserved characters (alphanumeric and -_.~) - b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'_' | b'.' | b'~' => { - encoded.push(byte as char); - }, - _ => { - encoded.push('%'); - encoded.push_str(&format!("{:02X}", byte)); - }, - } - } - - encoded -} - -pub(crate) fn unescape(json: &str) -> String { - let mut result = String::new(); - let mut chars = json.chars().peekable(); - - while let Some(c) = chars.next() { - if c == '\\' { - match chars.peek() { - Some('u') => { - // Skip over the next 5 characters - for _ in 0..5 { - chars.next(); - } - }, - _ => { - // Skip over the next character - chars.next(); - }, - } - } else { - result.push(c); - } - } - - result -} diff --git a/pallets/ddc-validator/src/validation.rs b/pallets/ddc-validator/src/validation.rs deleted file mode 100644 index 017d90782..000000000 --- a/pallets/ddc-validator/src/validation.rs +++ /dev/null @@ -1 +0,0 @@ -//! DAC Validation implementation. diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index c5188dbd5..f5ba45aba 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -100,7 +100,6 @@ pallet-ddc-staking = { version = "4.8.1", default-features = false, path = "../. pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } -pallet-ddc-validator = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-validator" } pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } @@ -185,7 +184,6 @@ std = [ "pallet-ddc-staking/std", "cere-runtime-common/std", "cere-dev-runtime-constants/std", - "pallet-ddc-validator/std", "pallet-ddc-customers/std", "pallet-ddc-nodes/std", "pallet-ddc-clusters/std", diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 0637375e6..cb3ea26e3 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1349,22 +1349,6 @@ impl pallet_ddc_customers::Config for Runtime { type RuntimeEvent = RuntimeEvent; } -parameter_types! { - pub const DdcValidatorsQuorumSize: u32 = 3; - pub const ValidationThreshold: u32 = 5; - pub const ValidatorsMax: u32 = 64; -} - -impl pallet_ddc_validator::Config for Runtime { - type DdcValidatorsQuorumSize = DdcValidatorsQuorumSize; - type Randomness = RandomnessCollectiveFlip; - type RuntimeCall = RuntimeCall; - type RuntimeEvent = RuntimeEvent; - type AuthorityId = pallet_ddc_validator::crypto::TestAuthId; - type ValidationThreshold = ValidationThreshold; - type ValidatorsMax = ValidatorsMax; -} - impl pallet_ddc_nodes::Config for Runtime { type RuntimeEvent = RuntimeEvent; } @@ -1427,7 +1411,6 @@ construct_runtime!( Erc20: pallet_erc20::{Pallet, Call, Storage, Event}, DdcMetricsOffchainWorker: pallet_ddc_metrics_offchain_worker::{Pallet, Call, Storage, Event}, DdcStaking: pallet_ddc_staking, - DdcValidator: pallet_ddc_validator, DdcCustomers: pallet_ddc_customers, DdcNodes: pallet_ddc_nodes, DdcClusters: pallet_ddc_clusters @@ -1489,9 +1472,25 @@ pub type Executive = frame_executive::Executive< >, pallet_staking::migrations::v12::MigrateToV12, pallet_contracts::Migration, + custom_migration::Upgrade, ), >; +mod custom_migration { + use super::*; + + use frame_support::{traits::OnRuntimeUpgrade, weights::Weight, Twox128}; + use sp_io::{hashing::twox_128, storage::clear_prefix}; + + pub struct Upgrade; + impl OnRuntimeUpgrade for Upgrade { + fn on_runtime_upgrade() -> Weight { + clear_prefix(&twox_128(b"DdcValidator"), None); + Weight::from_ref_time(0) + } + } +} + #[cfg(feature = "runtime-benchmarks")] #[macro_use] extern crate frame_benchmarking; From 5de2dfb0eaf11d81ef0300bbc5c51e50be811019 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 3 Nov 2023 14:55:22 +0100 Subject: [PATCH 454/583] remove ddc validator from lib.rs --- Cargo.lock | 258 ++++++++++++++++++++---------------- runtime/cere-dev/src/lib.rs | 2 +- 2 files changed, 147 insertions(+), 113 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3944e2252..b4063fadd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -231,7 +231,7 @@ checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" dependencies = [ "async-channel", "async-executor", - "async-io", + "async-io 1.13.0", "async-lock", "blocking", "futures-lite", @@ -251,13 +251,33 @@ dependencies = [ "futures-lite", "log", "parking", - "polling", - "rustix 0.37.26", + "polling 2.8.0", + "rustix 0.37.27", "slab", "socket2 0.4.10", "waker-fn", ] +[[package]] +name = "async-io" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10da8f3146014722c89e7859e1d7bb97873125d7346d10ca642ffab794355828" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling 3.3.0", + "rustix 0.38.21", + "slab", + "tracing", + "waker-fn", + "windows-sys 0.48.0", +] + [[package]] name = "async-lock" version = "2.8.0" @@ -273,30 +293,30 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" dependencies = [ - "async-io", + "async-io 1.13.0", "async-lock", "async-signal", "blocking", "cfg-if", - "event-listener 3.0.0", + "event-listener 3.0.1", "futures-lite", - "rustix 0.38.20", + "rustix 0.38.21", "windows-sys 0.48.0", ] [[package]] name = "async-signal" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a5415b7abcdc9cd7d63d6badba5288b2ca017e3fbd4173b8f405449f1a2399" +checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" dependencies = [ - "async-io", + "async-io 2.1.0", "async-lock", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.20", + "rustix 0.38.21", "signal-hook-registry", "slab", "windows-sys 0.48.0", @@ -310,7 +330,7 @@ checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" dependencies = [ "async-channel", "async-global-executor", - "async-io", + "async-io 1.13.0", "async-lock", "async-process", "crossbeam-utils", @@ -720,7 +740,7 @@ dependencies = [ "cargo-platform", "semver 1.0.20", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", ] [[package]] @@ -1311,9 +1331,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbc60abd742b35f2492f808e1abbb83d45f72db402e14c55057edc9c7b1e9e4" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -1572,7 +1592,7 @@ dependencies = [ "cpufeatures", "curve25519-dalek-derive", "fiat-crypto", - "platforms 3.1.2", + "platforms 3.2.0", "rustc_version 0.4.0", "subtle", "zeroize", @@ -1580,9 +1600,9 @@ dependencies = [ [[package]] name = "curve25519-dalek-derive" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", @@ -1778,9 +1798,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "ecdsa" @@ -1964,9 +1984,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29e56284f00d94c1bc7fd3c77027b4623c88c1f53d8d2394c6199f2921dea325" +checksum = "01cec0252c2afff729ee6f00e903d479fba81784c8e2bd77447673471fdfaea1" dependencies = [ "concurrent-queue", "parking", @@ -2030,9 +2050,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0870c84016d4b481be5c9f323c24f65e31e901ae618f0e80f4308fb00de1d2d" +checksum = "a481586acf778f1b1455424c343f71124b048ffa5f4fc3f8f6ae9dc432dcb3c7" [[package]] name = "file-per-thread-logger" @@ -2180,7 +2200,7 @@ dependencies = [ "sc-service", "sc-sysinfo", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "serde_nanos", "sp-api", "sp-blockchain", @@ -2412,9 +2432,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -2427,9 +2447,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -2437,15 +2457,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -2455,9 +2475,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-lite" @@ -2476,9 +2496,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", @@ -2498,15 +2518,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-timer" @@ -2516,9 +2536,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -2692,7 +2712,7 @@ dependencies = [ "pest", "pest_derive", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "thiserror", ] @@ -2955,7 +2975,7 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "015a7df1eb6dda30df37f34b63ada9b7b352984b0e84de2a20ed526345000791" dependencies = [ - "async-io", + "async-io 1.13.0", "core-foundation", "fnv", "futures", @@ -3009,9 +3029,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", "hashbrown 0.14.2", @@ -3092,7 +3112,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi 0.3.3", - "rustix 0.38.20", + "rustix 0.38.21", "windows-sys 0.48.0", ] @@ -3128,9 +3148,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" dependencies = [ "wasm-bindgen", ] @@ -3194,7 +3214,7 @@ dependencies = [ "rand 0.8.5", "rustc-hash", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "soketto", "thiserror", "tokio", @@ -3215,7 +3235,7 @@ dependencies = [ "jsonrpsee-core", "jsonrpsee-types", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "tokio", "tracing", "tracing-futures", @@ -3242,7 +3262,7 @@ dependencies = [ "anyhow", "beef", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "thiserror", "tracing", ] @@ -3270,7 +3290,7 @@ dependencies = [ "http", "jsonrpsee-core", "jsonrpsee-types", - "serde_json 1.0.107", + "serde_json 1.0.108", "soketto", "tokio", "tokio-stream", @@ -3617,7 +3637,7 @@ version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66e5e5919509603281033fd16306c61df7a4428ce274b67af5e14b07de5cdcb2" dependencies = [ - "async-io", + "async-io 1.13.0", "data-encoding", "dns-parser", "futures", @@ -3838,7 +3858,7 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a6771dc19aa3c65d6af9a8c65222bfc8fcd446630ddca487acd161fa6096f3b" dependencies = [ - "async-io", + "async-io 1.13.0", "futures", "futures-timer", "if-watch", @@ -4151,7 +4171,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix 0.38.20", + "rustix 0.38.21", ] [[package]] @@ -4413,7 +4433,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" dependencies = [ - "async-io", + "async-io 1.13.0", "bytes", "futures", "libc", @@ -5866,7 +5886,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.0.2", + "indexmap 2.1.0", ] [[package]] @@ -5943,9 +5963,9 @@ checksum = "e8d0eef3571242013a0d5dc84861c3ae4a652e56e12adf8bdc26ff5f8cb34c94" [[package]] name = "platforms" -version = "3.1.2" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4503fa043bf02cee09a9582e9554b4c6403b2ef55e4612e96561d294419429f8" +checksum = "14e6ab3f592e6fb464fc9712d8d6e6912de6473954635fd76a589d832cffcbb0" [[package]] name = "polling" @@ -5963,6 +5983,20 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "polling" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53b6af1f60f36f8c2ac2aad5459d75a5a9b4be1e8cdd40264f315d78193e531" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite 0.2.13", + "rustix 0.38.21", + "tracing", + "windows-sys 0.48.0", +] + [[package]] name = "poly1305" version = "0.7.2" @@ -6530,7 +6564,7 @@ dependencies = [ "log", "parity-scale-codec", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "sp-core", "sp-io", "sp-runtime", @@ -6671,9 +6705,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.35.15" +version = "0.35.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413c4d41e2f1b0814c63567d11618483de0bd64f451b452f2ca43896579486ba" +checksum = "5363f616a5244fd47fc1dd0a0b24c28a5c0154f5010c16332a7ad6f78f2e8b62" dependencies = [ "bitflags 1.3.2", "errno 0.2.8", @@ -6685,9 +6719,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.26" +version = "0.37.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f3f8f960ed3b5a59055428714943298bf3fa2d4a1d53135084e0544829d995" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" dependencies = [ "bitflags 1.3.2", "errno 0.3.5", @@ -6699,9 +6733,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.20" +version = "0.38.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ce50cb2e16c2903e30d1cbccfd8387a74b9d4c938b6a4c5ec6cc7556f7a8a0" +checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" dependencies = [ "bitflags 2.4.1", "errno 0.3.5", @@ -6882,7 +6916,7 @@ dependencies = [ "sc-network-common", "sc-telemetry", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "sp-core", "sp-runtime", ] @@ -6925,7 +6959,7 @@ dependencies = [ "sc-tracing", "sc-utils", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "sp-blockchain", "sp-core", "sp-keyring", @@ -7196,7 +7230,7 @@ dependencies = [ "once_cell", "parity-scale-codec", "parity-wasm 0.45.0", - "rustix 0.35.15", + "rustix 0.35.16", "sc-allocator", "sc-executor-common", "sp-runtime-interface", @@ -7232,7 +7266,7 @@ dependencies = [ "sc-network-gossip", "sc-telemetry", "sc-utils", - "serde_json 1.0.107", + "serde_json 1.0.108", "sp-api", "sp-application-crypto", "sp-arithmetic", @@ -7260,7 +7294,7 @@ dependencies = [ "sc-finality-grandpa", "sc-rpc", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "sp-blockchain", "sp-core", "sp-runtime", @@ -7292,7 +7326,7 @@ dependencies = [ "array-bytes", "async-trait", "parking_lot 0.12.1", - "serde_json 1.0.107", + "serde_json 1.0.108", "sp-application-crypto", "sp-core", "sp-keystore", @@ -7333,7 +7367,7 @@ dependencies = [ "sc-peerset", "sc-utils", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "smallvec", "sp-arithmetic", "sp-blockchain", @@ -7517,7 +7551,7 @@ dependencies = [ "libp2p", "log", "sc-utils", - "serde_json 1.0.107", + "serde_json 1.0.108", "wasm-timer", ] @@ -7548,7 +7582,7 @@ dependencies = [ "sc-tracing", "sc-transaction-pool-api", "sc-utils", - "serde_json 1.0.107", + "serde_json 1.0.108", "sp-api", "sp-blockchain", "sp-core", @@ -7574,7 +7608,7 @@ dependencies = [ "sc-transaction-pool-api", "scale-info", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "sp-core", "sp-rpc", "sp-runtime", @@ -7591,7 +7625,7 @@ dependencies = [ "futures", "jsonrpsee", "log", - "serde_json 1.0.107", + "serde_json 1.0.108", "substrate-prometheus-endpoint", "tokio", ] @@ -7638,7 +7672,7 @@ dependencies = [ "sc-transaction-pool-api", "sc-utils", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "sp-api", "sp-application-crypto", "sp-block-builder", @@ -7693,7 +7727,7 @@ dependencies = [ "sc-consensus-epochs", "sc-finality-grandpa", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "sp-blockchain", "sp-runtime", "thiserror", @@ -7712,7 +7746,7 @@ dependencies = [ "regex", "sc-telemetry", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "sp-core", "sp-io", "sp-std", @@ -7731,7 +7765,7 @@ dependencies = [ "pin-project", "rand 0.7.3", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "thiserror", "wasm-timer", ] @@ -8027,9 +8061,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa 1.0.9", "ryu", @@ -8963,7 +8997,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "unicode-xid", ] @@ -9050,9 +9084,9 @@ dependencies = [ [[package]] name = "substrate-bip39" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49eee6965196b32f882dd2ee85a92b1dbead41b04e53907f269de3b0dc04733c" +checksum = "e620c7098893ba667438b47169c00aacdd9e7c10e042250ce2b60b087ec97328" dependencies = [ "hmac 0.11.0", "pbkdf2 0.8.0", @@ -9082,7 +9116,7 @@ dependencies = [ "sc-client-api", "sc-rpc-api", "sc-transaction-pool-api", - "serde_json 1.0.107", + "serde_json 1.0.108", "sp-api", "sp-block-builder", "sp-blockchain", @@ -9237,14 +9271,14 @@ checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" [[package]] name = "tempfile" -version = "3.8.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand 2.0.1", - "redox_syscall 0.3.5", - "rustix 0.38.20", + "redox_syscall 0.4.1", + "rustix 0.38.21", "windows-sys 0.48.0", ] @@ -9511,7 +9545,7 @@ dependencies = [ "parking_lot 0.11.2", "regex", "serde", - "serde_json 1.0.107", + "serde_json 1.0.108", "sharded-slab", "smallvec", "thread_local", @@ -9816,9 +9850,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -9826,9 +9860,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" dependencies = [ "bumpalo", "log", @@ -9841,9 +9875,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" dependencies = [ "cfg-if", "js-sys", @@ -9853,9 +9887,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9863,9 +9897,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", @@ -9876,9 +9910,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "wasm-gc-api" @@ -10006,7 +10040,7 @@ dependencies = [ "directories-next", "file-per-thread-logger", "log", - "rustix 0.35.15", + "rustix 0.35.16", "serde", "sha2 0.9.9", "toml", @@ -10069,7 +10103,7 @@ dependencies = [ "log", "object 0.29.0", "rustc-demangle", - "rustix 0.35.15", + "rustix 0.35.16", "serde", "target-lexicon", "thiserror", @@ -10087,7 +10121,7 @@ checksum = "f671b588486f5ccec8c5a3dba6b4c07eac2e66ab8c60e6f4e53717c77f709731" dependencies = [ "object 0.29.0", "once_cell", - "rustix 0.35.15", + "rustix 0.35.16", ] [[package]] @@ -10107,7 +10141,7 @@ dependencies = [ "memoffset 0.6.5", "paste", "rand 0.8.5", - "rustix 0.35.15", + "rustix 0.35.16", "thiserror", "wasmtime-asm-macros", "wasmtime-environ", @@ -10129,9 +10163,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" dependencies = [ "js-sys", "wasm-bindgen", @@ -10165,7 +10199,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.20", + "rustix 0.38.21", ] [[package]] diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index cb3ea26e3..e460db929 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -130,7 +130,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: 48011, + spec_version: 48012, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, From 2d1ab85244539b9d52b58d26848197dd37d94d3f Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 6 Nov 2023 18:45:49 +0100 Subject: [PATCH 455/583] extend clusters with cluster gov params --- pallets/ddc-clusters/src/cluster.rs | 39 ++++++++++++++++++++++++--- pallets/ddc-clusters/src/lib.rs | 41 +++++++++++++++++++++++++---- runtime/cere-dev/src/lib.rs | 1 + 3 files changed, 73 insertions(+), 8 deletions(-) diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index 862c42ddf..862124bb4 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -3,6 +3,8 @@ use codec::{Decode, Encode}; use ddc_primitives::ClusterId; use frame_support::{pallet_prelude::*, parameter_types, BoundedVec}; use scale_info::TypeInfo; +use sp_runtime::Perbill; +use sp_staking::EraIndex; use sp_std::vec::Vec; parameter_types! { @@ -10,10 +12,11 @@ parameter_types! { } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct Cluster { +pub struct Cluster { pub cluster_id: ClusterId, pub manager_id: AccountId, pub props: ClusterProps, + pub gov_params: ClusterGovParams, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] @@ -31,12 +34,33 @@ pub struct ClusterParams { pub node_provider_auth_contract: AccountId, } -impl Cluster { +// ClusterGovParams includes Governance sensetive parameters +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct ClusterGovParams { + pub treasury_share: Perbill, + pub validators_share: Perbill, + pub cluster_reserve_share: Perbill, + #[codec(compact)] + pub edge_bond_size: Balance, + pub edge_chill_delay: EraIndex, + pub edge_unbonding_delay: EraIndex, + #[codec(compact)] + pub storage_bond_size: Balance, + pub storage_chill_delay: EraIndex, + pub storage_unbonding_delay: EraIndex, + pub unit_per_mb_stored: u128, + pub unit_per_mb_streamed: u128, + pub unit_per_put_request: u128, + pub unit_per_get_request: u128, +} + +impl Cluster { pub fn new( cluster_id: ClusterId, manager_id: AccountId, cluster_params: ClusterParams, - ) -> Result, ClusterError> { + gov_params: ClusterGovParams, + ) -> Result, ClusterError> { Ok(Cluster { cluster_id, manager_id, @@ -47,6 +71,7 @@ impl Cluster { }, node_provider_auth_contract: cluster_params.node_provider_auth_contract, }, + gov_params, }) } @@ -63,6 +88,14 @@ impl Cluster { }; Ok(()) } + + pub fn set_gov_params( + &mut self, + cluster_gov_params: ClusterGovParams, + ) -> Result<(), ClusterError> { + self.gov_params = cluster_gov_params; + Ok(()) + } } pub enum ClusterError { diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 2d389b431..b2aed6706 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -16,7 +16,7 @@ #![feature(is_some_and)] // ToDo: delete at rustc > 1.70 use crate::{ - cluster::{Cluster, ClusterError, ClusterParams}, + cluster::{Cluster, ClusterError, ClusterGovParams, ClusterParams}, node_provider_auth::{NodeProviderAuthContract, NodeProviderAuthContractError}, }; use ddc_primitives::{ClusterId, NodePubKey}; @@ -24,7 +24,10 @@ use ddc_traits::{ cluster::{ClusterVisitor, ClusterVisitorError}, staking::{StakingVisitor, StakingVisitorError}, }; -use frame_support::pallet_prelude::*; +use frame_support::{ + pallet_prelude::*, + traits::{Currency, LockableCurrency}, +}; use frame_system::pallet_prelude::*; pub use pallet::*; use pallet_ddc_nodes::{NodeRepository, NodeTrait}; @@ -33,6 +36,10 @@ use sp_std::prelude::*; mod cluster; mod node_provider_auth; +/// The balance type of this pallet. +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + #[frame_support::pallet] pub mod pallet { use super::*; @@ -48,6 +55,7 @@ pub mod pallet { type RuntimeEvent: From> + IsType<::RuntimeEvent>; type NodeRepository: NodeRepository; // todo: get rid of tight coupling with nodes-pallet type StakingVisitor: StakingVisitor; + type Currency: LockableCurrency; } #[pallet::event] @@ -57,6 +65,7 @@ pub mod pallet { ClusterNodeAdded { cluster_id: ClusterId, node_pub_key: NodePubKey }, ClusterNodeRemoved { cluster_id: ClusterId, node_pub_key: NodePubKey }, ClusterParamsSet { cluster_id: ClusterId }, + ClusterGovParamsSet { cluster_id: ClusterId }, } #[pallet::error] @@ -80,7 +89,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn clusters)] pub type Clusters = - StorageMap<_, Blake2_128Concat, ClusterId, Cluster>; + StorageMap<_, Blake2_128Concat, ClusterId, Cluster>>; #[pallet::storage] #[pallet::getter(fn clusters_nodes)] @@ -104,10 +113,12 @@ pub mod pallet { origin: OriginFor, cluster_id: ClusterId, cluster_params: ClusterParams, + cluster_gov_params: ClusterGovParams>, ) -> DispatchResult { let caller_id = ensure_signed(origin)?; - let cluster = Cluster::new(cluster_id.clone(), caller_id, cluster_params) - .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; + let cluster = + Cluster::new(cluster_id.clone(), caller_id, cluster_params, cluster_gov_params) + .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); Clusters::::insert(cluster_id.clone(), cluster); Self::deposit_event(Event::::ClusterCreated { cluster_id }); @@ -204,6 +215,26 @@ pub mod pallet { Ok(()) } + + // Sets Governance sensetive parameters + #[pallet::weight(10_000)] + pub fn set_cluster_gov_params( + origin: OriginFor, + cluster_id: ClusterId, + cluster_gov_params: ClusterGovParams>, + ) -> DispatchResult { + let caller_id = ensure_signed(origin)?; + let mut cluster = + Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; + ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); + cluster + .set_gov_params(cluster_gov_params) + .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; + Clusters::::insert(cluster_id.clone(), cluster); + Self::deposit_event(Event::::ClusterGovParamsSet { cluster_id }); + + Ok(()) + } } impl ClusterVisitor for Pallet { diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 0637375e6..7d678d1b6 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1373,6 +1373,7 @@ impl pallet_ddc_clusters::Config for Runtime { type RuntimeEvent = RuntimeEvent; type NodeRepository = pallet_ddc_nodes::Pallet; type StakingVisitor = pallet_ddc_staking::Pallet; + type Currency = Balances; } construct_runtime!( From a6b1ee64e40e1b35a5a296361afb0ff3722658fb Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 6 Nov 2023 19:01:38 +0100 Subject: [PATCH 456/583] add separate mapping for cluster gov params --- pallets/ddc-clusters/src/cluster.rs | 17 +++-------------- pallets/ddc-clusters/src/lib.rs | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 24 deletions(-) diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index 862124bb4..12aaeda0d 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -12,11 +12,10 @@ parameter_types! { } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct Cluster { +pub struct Cluster { pub cluster_id: ClusterId, pub manager_id: AccountId, pub props: ClusterProps, - pub gov_params: ClusterGovParams, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] @@ -54,13 +53,12 @@ pub struct ClusterGovParams { pub unit_per_get_request: u128, } -impl Cluster { +impl Cluster { pub fn new( cluster_id: ClusterId, manager_id: AccountId, cluster_params: ClusterParams, - gov_params: ClusterGovParams, - ) -> Result, ClusterError> { + ) -> Result, ClusterError> { Ok(Cluster { cluster_id, manager_id, @@ -71,7 +69,6 @@ impl Cluster { }, node_provider_auth_contract: cluster_params.node_provider_auth_contract, }, - gov_params, }) } @@ -88,14 +85,6 @@ impl Cluster { }; Ok(()) } - - pub fn set_gov_params( - &mut self, - cluster_gov_params: ClusterGovParams, - ) -> Result<(), ClusterError> { - self.gov_params = cluster_gov_params; - Ok(()) - } } pub enum ClusterError { diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index b2aed6706..59ce7fb52 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -89,7 +89,12 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn clusters)] pub type Clusters = - StorageMap<_, Blake2_128Concat, ClusterId, Cluster>>; + StorageMap<_, Blake2_128Concat, ClusterId, Cluster>; + + #[pallet::storage] + #[pallet::getter(fn clusters_gov_params)] + pub type ClustersGovParams = + StorageMap<_, Twox64Concat, ClusterId, ClusterGovParams>>; #[pallet::storage] #[pallet::getter(fn clusters_nodes)] @@ -113,12 +118,10 @@ pub mod pallet { origin: OriginFor, cluster_id: ClusterId, cluster_params: ClusterParams, - cluster_gov_params: ClusterGovParams>, ) -> DispatchResult { let caller_id = ensure_signed(origin)?; - let cluster = - Cluster::new(cluster_id.clone(), caller_id, cluster_params, cluster_gov_params) - .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; + let cluster = Cluster::new(cluster_id.clone(), caller_id, cluster_params) + .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); Clusters::::insert(cluster_id.clone(), cluster); Self::deposit_event(Event::::ClusterCreated { cluster_id }); @@ -224,13 +227,10 @@ pub mod pallet { cluster_gov_params: ClusterGovParams>, ) -> DispatchResult { let caller_id = ensure_signed(origin)?; - let mut cluster = + let cluster = Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); - cluster - .set_gov_params(cluster_gov_params) - .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; - Clusters::::insert(cluster_id.clone(), cluster); + ClustersGovParams::::insert(cluster_id.clone(), cluster_gov_params); Self::deposit_event(Event::::ClusterGovParamsSet { cluster_id }); Ok(()) From 582070e4ab0491050dc1307e75c323625c62d03b Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 6 Nov 2023 19:13:41 +0100 Subject: [PATCH 457/583] remove remaining files for ddc validator --- pallets/ddc-validator/Cargo.toml | 65 ----- pallets/ddc-validator/src/mock.rs | 446 ------------------------------ runtime/cere-dev/src/lib.rs | 4 +- 3 files changed, 1 insertion(+), 514 deletions(-) delete mode 100644 pallets/ddc-validator/Cargo.toml delete mode 100644 pallets/ddc-validator/src/mock.rs diff --git a/pallets/ddc-validator/Cargo.toml b/pallets/ddc-validator/Cargo.toml deleted file mode 100644 index 6ddfdda06..000000000 --- a/pallets/ddc-validator/Cargo.toml +++ /dev/null @@ -1,65 +0,0 @@ -[package] -name = "pallet-ddc-validator" -version = "0.1.0" -edition = "2021" - -[dependencies] -alt_serde = { version = "1", default-features = false, features = ["derive"] } -array-bytes = "6.0.0" -base64 = { version = "0.21.0", default-features = false } -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -lite-json = { version = "0.2.0", default-features = false } -log = { version = "0.4.17", default-features = false } -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../ddc-customers" } -pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } -pallet-ddc-clusters = { version = "4.7.0", default-features = false, path = "../ddc-clusters" } -pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } -pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } -pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -serde = { version = "1.0.101", optional = true } -serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } - -[dev-dependencies] -pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-staking-reward-curve = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -ddc-primitives = { version = "0.1.0", path = "../../primitives" } - -[features] -default = ["std"] -std = [ - "codec/std", - "frame-election-provider-support/std", - "frame-support/std", - "frame-system/std", - "lite-json/std", - "pallet-contracts/std", - "pallet-ddc-customers/std", - "pallet-ddc-staking/std", - "pallet-ddc-clusters/std", - "pallet-ddc-nodes/std", - "pallet-session/std", - "pallet-staking/std", - "scale-info/std", - "serde", - "sp-core/std", - "sp-io/std", - "sp-keystore", - "sp-runtime/std", - "sp-staking/std", - "sp-std/std", -] - diff --git a/pallets/ddc-validator/src/mock.rs b/pallets/ddc-validator/src/mock.rs deleted file mode 100644 index 6840c7d1d..000000000 --- a/pallets/ddc-validator/src/mock.rs +++ /dev/null @@ -1,446 +0,0 @@ -use crate::{self as pallet_ddc_validator, *}; -use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey}; -use ddc_traits::{ - cluster::{ClusterVisitor, ClusterVisitorError}, - staking::{StakingVisitor, StakingVisitorError}, -}; - -use frame_election_provider_support::{onchain, SequentialPhragmen}; -use frame_support::{ - parameter_types, - traits::{Everything, Nothing, U128CurrencyToVote}, - weights::Weight, - PalletId, -}; -use frame_system::offchain::SendTransactionTypes; -use pallet_contracts as contracts; -use pallet_session::ShouldEndSession; -use sp_core::H256; -use sp_io::TestExternalities; -use sp_runtime::{ - curve::PiecewiseLinear, - generic, impl_opaque_keys, - testing::{TestXt, UintAuthorityId}, - traits::{ - BlakeTwo256, Convert, Extrinsic as ExtrinsicT, IdentifyAccount, IdentityLookup, Verify, - }, - MultiSignature, Perbill, -}; -type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; -type Block = frame_system::mocking::MockBlock; -type Balance = u128; -pub type Signature = MultiSignature; -pub type AccountId = <::Signer as IdentifyAccount>::AccountId; -pub type BlockNumber = u32; -pub type Moment = u64; - -frame_support::construct_runtime!( - pub enum Test where - Block = Block, - NodeBlock = Block, - UncheckedExtrinsic = UncheckedExtrinsic, - { - System: frame_system, - Balances: pallet_balances, - Contracts: contracts, - Timestamp: pallet_timestamp, - Session: pallet_session, - Staking: pallet_staking, - DdcAccounts: pallet_ddc_customers, - DdcStaking: pallet_ddc_staking, - RandomnessCollectiveFlip: pallet_randomness_collective_flip, - DdcValidator: pallet_ddc_validator, - DdcClusters: pallet_ddc_clusters, - DdcNodes: pallet_ddc_nodes, - } -); - -parameter_types! { - pub const BlockHashCount: BlockNumber = 250; - pub const MaximumBlockWeight: Weight = Weight::from_ref_time(1024); - pub const MaximumBlockLength: u32 = 2 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::one(); -} - -impl frame_system::Config for Test { - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - type RuntimeOrigin = RuntimeOrigin; - type Index = u64; - type BlockNumber = BlockNumber; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - // u64; // sp_core::sr25519::Public; - type Lookup = IdentityLookup; - type Header = generic::Header; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -parameter_types! { - pub const SignedClaimHandicap: BlockNumber = 2; - pub const TombstoneDeposit: Balance = 16; - pub const StorageSizeOffset: u32 = 8; - pub const RentByteFee: Balance = 4; - pub const RentDepositOffset: Balance = 10_000; - pub const SurchargeReward: Balance = 150; - pub const MaxDepth: u32 = 100; - pub const MaxValueSize: u32 = 16_384; - pub Schedule: pallet_contracts::Schedule = Default::default(); -} - -pub struct TestWeightToFee; -impl Convert for TestWeightToFee { - fn convert(weight: u64) -> u128 { - weight as u128 - } -} - -impl contracts::Config for Test { - type AddressGenerator = pallet_contracts::DefaultAddressGenerator; - type RuntimeCall = RuntimeCall; - type CallFilter = Nothing; - type CallStack = [pallet_contracts::Frame; 31]; - type ChainExtension = (); - type ContractAccessWeight = (); - type Currency = Balances; - type DeletionQueueDepth = (); - type DeletionWeightLimit = (); - type DepositPerByte = DepositPerByte; - type DepositPerItem = DepositPerItem; - type RuntimeEvent = RuntimeEvent; - type MaxCodeLen = ConstU32<{ 128 * 1024 }>; - type MaxStorageKeyLen = ConstU32<128>; - type Randomness = RandomnessCollectiveFlip; - type Schedule = Schedule; - type Time = Timestamp; - type WeightInfo = (); - type WeightPrice = (); -} - -parameter_types! { - pub const TransactionByteFee: u64 = 0; - pub const DepositPerItem: Balance = 0; - pub const DepositPerByte: Balance = 0; -} - -parameter_types! { - pub const MinimumPeriod: u64 = 1; -} - -impl pallet_timestamp::Config for Test { - type Moment = Moment; - type OnTimestampSet = (); - type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); -} - -impl pallet_randomness_collective_flip::Config for Test {} - -pub struct TestShouldEndSession; -impl ShouldEndSession for TestShouldEndSession { - fn should_end_session(now: u32) -> bool { - now % 10 == 0 // every 10 blocks - } -} - -impl_opaque_keys! { - pub struct MockSessionKeys { - pub dummy: UintAuthorityId, - } -} - -impl From for MockSessionKeys { - fn from(dummy: UintAuthorityId) -> Self { - Self { dummy } - } -} - -impl pallet_session::Config for Test { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = AccountId; - type ValidatorIdOf = (); - type ShouldEndSession = TestShouldEndSession; - type NextSessionRotation = (); - type SessionManager = (); - type SessionHandler = pallet_session::TestSessionHandler; - type Keys = MockSessionKeys; - type WeightInfo = (); -} - -impl pallet_session::historical::Config for Test { - type FullIdentification = pallet_staking::Exposure; - type FullIdentificationOf = pallet_staking::ExposureOf; -} - -pallet_staking_reward_curve::build! { - const REWARD_CURVE: PiecewiseLinear<'static> = curve!( - min_inflation: 0_000_100, - max_inflation: 0_050_000, - ideal_stake: 0_200_000, - falloff: 0_050_000, - max_piece_count: 100, - test_precision: 0_050_000, - ); -} - -pub struct OnChainSeqPhragmen; -impl onchain::Config for OnChainSeqPhragmen { - type System = Test; - type Solver = SequentialPhragmen; - type DataProvider = Staking; - type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; -} - -parameter_types! { - pub const SessionsPerEra: sp_staking::SessionIndex = 6; - pub const BondingDuration: sp_staking::EraIndex = 3; - pub const SlashDeferDuration: sp_staking::EraIndex = 2; - pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const MaxNominatorRewardedPerValidator: u32 = 256; - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); - pub OffchainRepeat: BlockNumber = 5; -} - -impl pallet_staking::Config for Test { - type MaxNominations = ConstU32<16>; - type Currency = Balances; - type UnixTime = Timestamp; - type CurrencyToVote = U128CurrencyToVote; - type RewardRemainder = (); - type RuntimeEvent = RuntimeEvent; - type Slash = (); // send the slashed funds to the treasury. - type Reward = (); // rewards are minted from the void - type SessionsPerEra = SessionsPerEra; - type BondingDuration = BondingDuration; - type SlashDeferDuration = SlashDeferDuration; - type SlashCancelOrigin = frame_system::EnsureRoot; - type SessionInterface = Self; - type EraPayout = pallet_staking::ConvertCurve; - type NextNewSession = Session; - type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; - type ElectionProvider = onchain::UnboundedExecution; - type GenesisElectionProvider = Self::ElectionProvider; - type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; - type MaxUnlockingChunks = ConstU32<32>; - type WeightInfo = pallet_staking::weights::SubstrateWeight; - type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type CurrencyBalance = Balance; - type OnStakerSlash = (); - type HistoryDepth = ConstU32<84>; - type TargetList = pallet_staking::UseValidatorsMap; -} - -parameter_types! { - pub const DdcAccountsPalletId: PalletId = PalletId(*b"accounts"); - pub const LockingDuration: sp_staking::EraIndex = 30 * 24; -} - -impl pallet_ddc_customers::Config for Test { - type LockingDuration = LockingDuration; - type Currency = Balances; - type RuntimeEvent = RuntimeEvent; - type PalletId = DdcAccountsPalletId; -} - -parameter_types! { - pub const DefaultEdgeBondSize: Balance = 100; - pub const DefaultEdgeChillDelay: EraIndex = 2; - pub const DefaultStorageBondSize: Balance = 100; - pub const DefaultStorageChillDelay: EraIndex = 2; -} - -impl pallet_ddc_staking::Config for Test { - type BondingDuration = BondingDuration; - type Currency = Balances; - type DefaultEdgeBondSize = DefaultEdgeBondSize; - type DefaultEdgeChillDelay = DefaultEdgeChillDelay; - type DefaultStorageBondSize = DefaultStorageBondSize; - type DefaultStorageChillDelay = DefaultStorageChillDelay; - type RuntimeEvent = RuntimeEvent; - type StakersPayoutSource = DdcAccountsPalletId; - type UnixTime = Timestamp; - type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; - type ClusterVisitor = TestClusterVisitor; -} - -pub struct TestClusterVisitor; -impl ClusterVisitor for TestClusterVisitor { - fn cluster_has_node(_cluster_id: &ClusterId, _node_pub_key: &NodePubKey) -> bool { - true - } - fn ensure_cluster(_cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { - Ok(()) - } -} - -impl pallet_ddc_clusters::Config for Test { - type RuntimeEvent = RuntimeEvent; - type NodeRepository = pallet_ddc_nodes::Pallet; - type StakingVisitor = TestStakingVisitor; -} - -pub struct TestStakingVisitor; -impl StakingVisitor for TestStakingVisitor { - fn node_has_stake( - _node_pub_key: &NodePubKey, - _cluster_id: &ClusterId, - ) -> Result { - Ok(true) - } - - fn node_is_chilling(_node_pub_key: &NodePubKey) -> Result { - Ok(true) - } -} - -impl pallet_ddc_nodes::Config for Test { - type RuntimeEvent = RuntimeEvent; -} - -parameter_types! { - pub const DdcValidatorsQuorumSize: u32 = 3; - pub const ValidationThreshold: u32 = 5; -} - -impl pallet_ddc_validator::Config for Test { - type DdcValidatorsQuorumSize = DdcValidatorsQuorumSize; - type RuntimeEvent = RuntimeEvent; - type Randomness = RandomnessCollectiveFlip; - type RuntimeCall = RuntimeCall; - type AuthorityId = pallet_ddc_validator::crypto::TestAuthId; - type ValidationThreshold = ValidationThreshold; - type ValidatorsMax = (); -} - -impl SendTransactionTypes for Test -where - RuntimeCall: From, -{ - type OverarchingCall = RuntimeCall; - type Extrinsic = Extrinsic; -} - -parameter_types! { - pub const ExistentialDeposit: u64 = 1; - pub const MaxLocks: u32 = 10; -} - -impl pallet_balances::Config for Test { - type Balance = Balance; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = (); -} - -// Build genesis storage according to the mock runtime. -pub fn new_test_ext() -> sp_io::TestExternalities { - let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); - - let balances = vec![ - // edge stash - (AccountId::from([0x1; 32]), 1000), - // edge controller - (AccountId::from([0x11; 32]), 1000), - // validator1 stash; has to be equal to the OCW key in the current implementation - ( - AccountId::from([ - 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, - 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, - 0x55, 0xf4, 0xdf, 0x67, - ]), - 10000, - ), - // validator1 controller - (AccountId::from([0xaa; 32]), 10000), - // validator2 stash - (AccountId::from([0xb; 32]), 10000), - // validator2 controller - (AccountId::from([0xbb; 32]), 10000), - // validator3 stash - (AccountId::from([0xc; 32]), 10000), - // validator3 controller - (AccountId::from([0xcc; 32]), 10000), - ]; - let _ = pallet_balances::GenesisConfig:: { balances }.assimilate_storage(&mut storage); - - let stakers = vec![ - ( - AccountId::from([ - 0xd2, 0xbf, 0x4b, 0x84, 0x4d, 0xfe, 0xfd, 0x67, 0x72, 0xa8, 0x84, 0x3e, 0x66, 0x9f, - 0x94, 0x34, 0x08, 0x96, 0x6a, 0x97, 0x7e, 0x3a, 0xe2, 0xaf, 0x1d, 0xd7, 0x8e, 0x0f, - 0x55, 0xf4, 0xdf, 0x67, - ]), - AccountId::from([0xaa; 32]), - 1000, - pallet_staking::StakerStatus::Validator, - ), - ( - AccountId::from([0xb; 32]), - AccountId::from([0xbb; 32]), - 1000, - pallet_staking::StakerStatus::Validator, - ), - ( - AccountId::from([0xc; 32]), - AccountId::from([0xcc; 32]), - 1000, - pallet_staking::StakerStatus::Validator, - ), - ]; - let _ = pallet_staking::GenesisConfig:: { stakers, ..Default::default() } - .assimilate_storage(&mut storage); - - let edges = vec![( - AccountId::from([0x1; 32]), - AccountId::from([0x11; 32]), - NodePubKey::CDNPubKey(CDNNodePubKey::new([0x21; 32])), - 100, - ClusterId::from([1; 20]), - )]; - let storages = vec![]; - let _ = pallet_ddc_staking::GenesisConfig:: { edges, storages, ..Default::default() } - .assimilate_storage(&mut storage); - - TestExternalities::new(storage) -} - -pub type Extrinsic = TestXt; - -impl SigningTypes for Test { - type Public = ::Signer; - type Signature = Signature; -} - -impl CreateSignedTransaction for Test -where - RuntimeCall: From, -{ - fn create_transaction>( - call: RuntimeCall, - _public: ::Signer, - _account: AccountId, - nonce: u64, - ) -> Option<(RuntimeCall, ::SignaturePayload)> { - Some((call, (nonce, ()))) - } -} diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index e460db929..58e95dab4 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1477,9 +1477,7 @@ pub type Executive = frame_executive::Executive< >; mod custom_migration { - use super::*; - - use frame_support::{traits::OnRuntimeUpgrade, weights::Weight, Twox128}; + use frame_support::{traits::OnRuntimeUpgrade, weights::Weight}; use sp_io::{hashing::twox_128, storage::clear_prefix}; pub struct Upgrade; From 288862be2e67ff41fa9ff041a065ea7d4d5855bb Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 1 Nov 2023 11:19:46 +0100 Subject: [PATCH 458/583] update bucket_id type from u128 to u64 and add storage migration --- pallets/ddc-customers/src/lib.rs | 23 +++++++++++----- pallets/ddc-customers/src/migration.rs | 36 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 pallets/ddc-customers/src/migration.rs diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 0092bf9e0..d102d6e78 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -19,6 +19,8 @@ use sp_runtime::{ use sp_staking::EraIndex; use sp_std::prelude::*; +mod migration; + pub use pallet::*; /// The balance type of this pallet. @@ -43,7 +45,7 @@ pub struct UnlockChunk { #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct Bucket { - bucket_id: u128, + bucket_id: u64, owner_id: AccountId, cluster_id: Option, public_availability: bool, @@ -52,7 +54,7 @@ pub struct Bucket { #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct BucketsDetails { - pub bucket_id: u128, + pub bucket_id: u64, pub amount: Balance, } @@ -147,6 +149,13 @@ pub mod pallet { #[pallet::without_storage_info] pub struct Pallet(_); + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + migration::migrate_to_v2::() + } + } + #[pallet::config] pub trait Config: frame_system::Config + ddc_staking::Config + ddc_clusters::Config { /// The accounts's pallet id, used for deriving its sovereign account ID. @@ -166,19 +175,19 @@ pub mod pallet { StorageMap<_, Identity, T::AccountId, AccountsLedger>>; #[pallet::type_value] - pub fn DefaultBucketCount() -> u128 { - 0_u128 + pub fn DefaultBucketCount() -> u64 { + 0_u64 } #[pallet::storage] #[pallet::getter(fn buckets_count)] pub type BucketsCount = - StorageValue>; + StorageValue>; /// Map from bucket ID to to the bucket structure #[pallet::storage] #[pallet::getter(fn buckets)] pub type Buckets = - StorageMap<_, Twox64Concat, u128, Bucket, OptionQuery>; + StorageMap<_, Twox64Concat, u64, Bucket, OptionQuery>; #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] @@ -275,7 +284,7 @@ pub mod pallet { #[pallet::weight(10_000)] pub fn allocate_bucket_to_cluster( origin: OriginFor, - bucket_id: u128, + bucket_id: u64, cluster_id: ClusterId, ) -> DispatchResult { let bucket_owner = ensure_signed(origin)?; diff --git a/pallets/ddc-customers/src/migration.rs b/pallets/ddc-customers/src/migration.rs new file mode 100644 index 000000000..5bc3e34cc --- /dev/null +++ b/pallets/ddc-customers/src/migration.rs @@ -0,0 +1,36 @@ +use super::*; + +use frame_support::{ + storage_alias, + traits::{Get, GetStorageVersion, StorageVersion}, + weights::Weight, + BoundedVec, Twox64Concat, +}; + +// only contains V1 storage format +pub mod v1 { + use super::*; + + #[storage_alias] + pub(super) type Buckets = + StorageMap, Twox64Concat, u64, Bucket<::AccountId>>; +} + +// contains checks and transforms storage to V2 format +pub fn migrate_to_v2() -> Weight { + // We transform the storage values from the old into the new format. + Buckets::::translate::, _>(|_k: u64, bucket: Bucket| { + Some(Bucket { + bucket_id: bucket.bucket_id as u64, + owner_id: bucket.owner_id, + cluster_id: bucket.cluster_id, + public_availability: bucket.public_availability, + resources_reserved: bucket.resources_reserved, + }) + }); + + // Very inefficient, mostly here for illustration purposes. + let count = Buckets::::iter().count(); + // Return the weight consumed by the migration. + T::DbWeight::get().reads_writes(count as u64 + 1, count as u64 + 1) +} From f92f450710fc0f8e00fc7bfb5c9c8b8255341c49 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 3 Nov 2023 10:20:47 +0100 Subject: [PATCH 459/583] correct key for v1 storage format --- pallets/ddc-customers/src/migration.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-customers/src/migration.rs b/pallets/ddc-customers/src/migration.rs index 5bc3e34cc..c25e22ec6 100644 --- a/pallets/ddc-customers/src/migration.rs +++ b/pallets/ddc-customers/src/migration.rs @@ -13,7 +13,7 @@ pub mod v1 { #[storage_alias] pub(super) type Buckets = - StorageMap, Twox64Concat, u64, Bucket<::AccountId>>; + StorageMap, Twox64Concat, u128, Bucket<::AccountId>>; } // contains checks and transforms storage to V2 format From 6990e49e7b1f54ff2ecf51b2b1d1195b3285ca51 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 6 Nov 2023 14:59:02 +0100 Subject: [PATCH 460/583] remove migration & resources reserved for buckets --- pallets/ddc-customers/src/lib.rs | 17 +----------- pallets/ddc-customers/src/migration.rs | 36 -------------------------- 2 files changed, 1 insertion(+), 52 deletions(-) delete mode 100644 pallets/ddc-customers/src/migration.rs diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index d102d6e78..a5a734003 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -19,8 +19,6 @@ use sp_runtime::{ use sp_staking::EraIndex; use sp_std::prelude::*; -mod migration; - pub use pallet::*; /// The balance type of this pallet. @@ -49,7 +47,6 @@ pub struct Bucket { owner_id: AccountId, cluster_id: Option, public_availability: bool, - resources_reserved: u128, } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] @@ -149,13 +146,6 @@ pub mod pallet { #[pallet::without_storage_info] pub struct Pallet(_); - #[pallet::hooks] - impl Hooks> for Pallet { - fn on_runtime_upgrade() -> frame_support::weights::Weight { - migration::migrate_to_v2::() - } - } - #[pallet::config] pub trait Config: frame_system::Config + ddc_staking::Config + ddc_clusters::Config { /// The accounts's pallet id, used for deriving its sovereign account ID. @@ -257,11 +247,7 @@ pub mod pallet { /// /// Anyone can create a bucket #[pallet::weight(10_000)] - pub fn create_bucket( - origin: OriginFor, - public_availability: bool, - resources_reserved: u128, - ) -> DispatchResult { + pub fn create_bucket(origin: OriginFor, public_availability: bool) -> DispatchResult { let bucket_owner = ensure_signed(origin)?; let cur_bucket_id = Self::buckets_count(); @@ -270,7 +256,6 @@ pub mod pallet { owner_id: bucket_owner, cluster_id: None, public_availability, - resources_reserved, }; >::set(cur_bucket_id + 1); diff --git a/pallets/ddc-customers/src/migration.rs b/pallets/ddc-customers/src/migration.rs deleted file mode 100644 index c25e22ec6..000000000 --- a/pallets/ddc-customers/src/migration.rs +++ /dev/null @@ -1,36 +0,0 @@ -use super::*; - -use frame_support::{ - storage_alias, - traits::{Get, GetStorageVersion, StorageVersion}, - weights::Weight, - BoundedVec, Twox64Concat, -}; - -// only contains V1 storage format -pub mod v1 { - use super::*; - - #[storage_alias] - pub(super) type Buckets = - StorageMap, Twox64Concat, u128, Bucket<::AccountId>>; -} - -// contains checks and transforms storage to V2 format -pub fn migrate_to_v2() -> Weight { - // We transform the storage values from the old into the new format. - Buckets::::translate::, _>(|_k: u64, bucket: Bucket| { - Some(Bucket { - bucket_id: bucket.bucket_id as u64, - owner_id: bucket.owner_id, - cluster_id: bucket.cluster_id, - public_availability: bucket.public_availability, - resources_reserved: bucket.resources_reserved, - }) - }); - - // Very inefficient, mostly here for illustration purposes. - let count = Buckets::::iter().count(); - // Return the weight consumed by the migration. - T::DbWeight::get().reads_writes(count as u64 + 1, count as u64 + 1) -} From dfc6d843c4fe38391e0aac86abb5bb70286e568a Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 6 Nov 2023 15:17:38 +0100 Subject: [PATCH 461/583] move BucketId to ddc-primitives --- pallets/ddc-customers/src/lib.rs | 16 ++++++++-------- primitives/src/lib.rs | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index a5a734003..8528b577b 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -3,7 +3,7 @@ use codec::{Decode, Encode, HasCompact}; -use ddc_primitives::ClusterId; +use ddc_primitives::{BucketId, ClusterId}; use frame_support::{ parameter_types, traits::{Currency, DefensiveSaturating, ExistenceRequirement}, @@ -43,7 +43,7 @@ pub struct UnlockChunk { #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct Bucket { - bucket_id: u64, + bucket_id: BucketId, owner_id: AccountId, cluster_id: Option, public_availability: bool, @@ -51,7 +51,7 @@ pub struct Bucket { #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct BucketsDetails { - pub bucket_id: u64, + pub bucket_id: BucketId, pub amount: Balance, } @@ -165,19 +165,19 @@ pub mod pallet { StorageMap<_, Identity, T::AccountId, AccountsLedger>>; #[pallet::type_value] - pub fn DefaultBucketCount() -> u64 { - 0_u64 + pub fn DefaultBucketCount() -> BucketId { + 0 } #[pallet::storage] #[pallet::getter(fn buckets_count)] pub type BucketsCount = - StorageValue>; + StorageValue>; /// Map from bucket ID to to the bucket structure #[pallet::storage] #[pallet::getter(fn buckets)] pub type Buckets = - StorageMap<_, Twox64Concat, u64, Bucket, OptionQuery>; + StorageMap<_, Twox64Concat, BucketId, Bucket, OptionQuery>; #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] @@ -269,7 +269,7 @@ pub mod pallet { #[pallet::weight(10_000)] pub fn allocate_bucket_to_cluster( origin: OriginFor, - bucket_id: u64, + bucket_id: BucketId, cluster_id: ClusterId, ) -> DispatchResult { let bucket_owner = ensure_signed(origin)?; diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 0f1efd446..a3abee7c4 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -9,6 +9,7 @@ use sp_core::hash::H160; use sp_runtime::{AccountId32, RuntimeDebug}; pub type ClusterId = H160; +pub type BucketId = u64; #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] From eaaaf58a0285efa00f70616dd185f96cee7f075e Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 6 Nov 2023 21:14:39 +0100 Subject: [PATCH 462/583] change edge to cdn prefix in naming --- pallets/ddc-clusters/src/cluster.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index 12aaeda0d..7274fbf16 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -40,9 +40,9 @@ pub struct ClusterGovParams { pub validators_share: Perbill, pub cluster_reserve_share: Perbill, #[codec(compact)] - pub edge_bond_size: Balance, - pub edge_chill_delay: EraIndex, - pub edge_unbonding_delay: EraIndex, + pub cdn_bond_size: Balance, + pub cdn_chill_delay: EraIndex, + pub cdn_unbonding_delay: EraIndex, #[codec(compact)] pub storage_bond_size: Balance, pub storage_chill_delay: EraIndex, From 29b2fe2c646d969b95084ed6226272fc992e1fe1 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Mon, 6 Nov 2023 21:20:39 +0100 Subject: [PATCH 463/583] bucket can only be allocated to cluster once --- pallets/ddc-customers/src/lib.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 8528b577b..4e41485a2 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -218,6 +218,8 @@ pub mod pallet { BucketDoesNotExist, /// DDC Cluster with provided id doesn't exist ClusterDoesNotExist, + /// Bucket already allocated to cluster + BucketAlreadyInCluster, } #[pallet::genesis_config] @@ -276,6 +278,7 @@ pub mod pallet { let mut bucket = Self::buckets(bucket_id).ok_or(Error::::NoBucketWithId)?; + ensure!(bucket.cluster_id == None, Error::::BucketAlreadyInCluster); ensure!(bucket.owner_id == bucket_owner, Error::::NotBucketOwner); ensure!( From 93dcd6e4a806ab252616e8e982d88339f5ad90ba Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 7 Nov 2023 10:28:30 +0100 Subject: [PATCH 464/583] merge create_bucket and allocate_bucket_to_cluster methods --- pallets/ddc-customers/src/lib.rs | 38 +++++++------------------------- 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 4e41485a2..4adcee4b5 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -46,7 +46,6 @@ pub struct Bucket { bucket_id: BucketId, owner_id: AccountId, cluster_id: Option, - public_availability: bool, } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] @@ -245,19 +244,23 @@ pub mod pallet { #[pallet::call] impl Pallet { - /// Create new bucket with provided public availability & reserved resources + /// Create new bucket with specified cluster id /// /// Anyone can create a bucket #[pallet::weight(10_000)] - pub fn create_bucket(origin: OriginFor, public_availability: bool) -> DispatchResult { + pub fn create_bucket(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let bucket_owner = ensure_signed(origin)?; let cur_bucket_id = Self::buckets_count(); + ensure!( + ddc_clusters::pallet::Clusters::::contains_key(&cluster_id), + Error::::ClusterDoesNotExist + ); + let bucket = Bucket { bucket_id: cur_bucket_id + 1, owner_id: bucket_owner, - cluster_id: None, - public_availability, + cluster_id: Some(cluster_id), }; >::set(cur_bucket_id + 1); @@ -265,31 +268,6 @@ pub mod pallet { Ok(()) } - /// Allocates specified bucket into specified cluster - /// - /// Only bucket owner can call this method - #[pallet::weight(10_000)] - pub fn allocate_bucket_to_cluster( - origin: OriginFor, - bucket_id: BucketId, - cluster_id: ClusterId, - ) -> DispatchResult { - let bucket_owner = ensure_signed(origin)?; - - let mut bucket = Self::buckets(bucket_id).ok_or(Error::::NoBucketWithId)?; - - ensure!(bucket.cluster_id == None, Error::::BucketAlreadyInCluster); - ensure!(bucket.owner_id == bucket_owner, Error::::NotBucketOwner); - - ensure!( - ddc_clusters::pallet::Clusters::::contains_key(&cluster_id), - Error::::ClusterDoesNotExist - ); - bucket.cluster_id = Some(cluster_id); - - Ok(()) - } - /// Take the origin account as a owner and lock up `value` of its balance. `Owner` will /// be the account that controls it. /// From bd2793547653b13a2b4330f6a503f0cdb50fd96f Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 7 Nov 2023 15:30:54 +0100 Subject: [PATCH 465/583] substitute bond size check with cluster gov params --- pallets/ddc-clusters/src/lib.rs | 17 +++++++++++ pallets/ddc-staking/src/lib.rs | 50 +++++++++++++++++++++++++++------ traits/src/cluster.rs | 6 ++++ 3 files changed, 65 insertions(+), 8 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 59ce7fb52..08f246e69 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -31,6 +31,7 @@ use frame_support::{ use frame_system::pallet_prelude::*; pub use pallet::*; use pallet_ddc_nodes::{NodeRepository, NodeTrait}; +use sp_runtime::SaturatedConversion; use sp_std::prelude::*; mod cluster; @@ -247,6 +248,22 @@ pub mod pallet { .map(|_| ()) .ok_or(ClusterVisitorError::ClusterDoesNotExist) } + + fn get_bond_size( + cluster_id: &ClusterId, + node_pub_key: &NodePubKey, + ) -> Result { + // ensure!(ClustersNodes::::contains_key(cluster_id), + // Error::::ClusterDoesNotExist); + let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) + .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; + match node_pub_key { + NodePubKey::StoragePubKey(_node_pub_key) => + Ok(cluster_gov_params.storage_bond_size.saturated_into::()), + NodePubKey::CDNPubKey(_node_pub_key) => + Ok(cluster_gov_params.cdn_bond_size.saturated_into::()), + } + } } impl From for Error { diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 55614769b..84c1183c0 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -49,7 +49,7 @@ use frame_system::pallet_prelude::*; use scale_info::TypeInfo; use sp_runtime::{ traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, StaticLookup, Zero}, - RuntimeDebug, + RuntimeDebug, SaturatedConversion, }; use sp_staking::EraIndex; use sp_std::{collections::btree_map::BTreeMap, prelude::*}; @@ -402,6 +402,7 @@ pub mod pallet { assert_ok!(Pallet::::serve( T::RuntimeOrigin::from(Some(controller.clone()).into()), cluster, + node.clone() )); } @@ -420,6 +421,7 @@ pub mod pallet { assert_ok!(Pallet::::store( T::RuntimeOrigin::from(Some(controller.clone()).into()), cluster, + node.clone(), )); } } @@ -487,6 +489,8 @@ pub mod pallet { NotNodeController, /// No stake found associated with the provided node. NodeHasNoStake, + /// No cluster governance params found for cluster + NoClusterGovParams, /// Conditions for fast chill are not met, try the regular `chill` from FastChillProhibited, } @@ -590,6 +594,7 @@ pub mod pallet { pub fn unbond( origin: OriginFor, #[pallet::compact] value: BalanceOf, + node_pub_key: NodePubKey, ) -> DispatchResult { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; @@ -609,10 +614,15 @@ pub mod pallet { ledger.active = Zero::zero(); } + // Check if stash is mapped to the node + let node_stash = >::get(&node_pub_key).ok_or(Error::::BadState)?; + ensure!(ledger.stash.clone() == node_stash, Error::::NotNodeController); + let min_active_bond = if let Some(cluster_id) = Self::edges(&ledger.stash) { - Self::settings(cluster_id).edge_bond_size - } else if let Some(cluster_id) = Self::storages(&ledger.stash) { - Self::settings(cluster_id).storage_bond_size + // Retrieve the respective bond size from Cluster Visitor + let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, &node_pub_key) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + bond_size.saturated_into::>() } else { Zero::zero() }; @@ -692,19 +702,31 @@ pub mod pallet { /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. The /// bond size must be greater than or equal to the `EdgeBondSize`. #[pallet::weight(T::WeightInfo::serve())] - pub fn serve(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { + pub fn serve( + origin: OriginFor, + cluster_id: ClusterId, + node_pub_key: NodePubKey, + ) -> DispatchResult { let controller = ensure_signed(origin)?; T::ClusterVisitor::ensure_cluster(&cluster_id) .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; + // Retrieve the respective bond size from Cluster Visitor + let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, &node_pub_key) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + ensure!( - ledger.active >= Self::settings(cluster_id).edge_bond_size, + ledger.active >= bond_size.saturated_into::>(), Error::::InsufficientBond ); let stash = &ledger.stash; + // Check if stash is mapped to the node + let node_stash = >::get(&node_pub_key).ok_or(Error::::BadState)?; + ensure!(*stash == node_stash, Error::::NotNodeController); + // Can't participate in CDN if already participating in storage network. ensure!(!Storages::::contains_key(&stash), Error::::AlreadyInRole); @@ -729,19 +751,30 @@ pub mod pallet { /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. The /// bond size must be greater than or equal to the `StorageBondSize`. #[pallet::weight(T::WeightInfo::store())] - pub fn store(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { + pub fn store( + origin: OriginFor, + cluster_id: ClusterId, + node_pub_key: NodePubKey, + ) -> DispatchResult { let controller = ensure_signed(origin)?; T::ClusterVisitor::ensure_cluster(&cluster_id) .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; + // Retrieve the respective bond size from Cluster Visitor + let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, &node_pub_key) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; ensure!( - ledger.active >= Self::settings(cluster_id).storage_bond_size, + ledger.active >= bond_size.saturated_into::>(), Error::::InsufficientBond ); let stash = &ledger.stash; + // Check if stash is mapped to the node + let node_stash = >::get(&node_pub_key).ok_or(Error::::BadState)?; + ensure!(*stash == node_stash, Error::::NotNodeController); + // Can't participate in storage network if already participating in CDN. ensure!(!Edges::::contains_key(&stash), Error::::AlreadyInRole); @@ -1197,6 +1230,7 @@ pub mod pallet { fn from(error: ClusterVisitorError) -> Self { match error { ClusterVisitorError::ClusterDoesNotExist => Error::::NodeHasNoStake, + ClusterVisitorError::ClusterGovParamsNotSet => Error::::NoClusterGovParams, } } } diff --git a/traits/src/cluster.rs b/traits/src/cluster.rs index a1cae3515..505de5298 100644 --- a/traits/src/cluster.rs +++ b/traits/src/cluster.rs @@ -5,8 +5,14 @@ pub trait ClusterVisitor { fn cluster_has_node(cluster_id: &ClusterId, node_pub_key: &NodePubKey) -> bool; fn ensure_cluster(cluster_id: &ClusterId) -> Result<(), ClusterVisitorError>; + + fn get_bond_size( + cluster_id: &ClusterId, + node_pub_key: &NodePubKey, + ) -> Result; } pub enum ClusterVisitorError { ClusterDoesNotExist, + ClusterGovParamsNotSet, } From 8f9549e56efe9953576d81ddad296304f37fc47a Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 7 Nov 2023 16:20:39 +0100 Subject: [PATCH 466/583] remove unnecessary params & update mock --- pallets/ddc-staking/src/lib.rs | 36 ++++++++++----------------------- pallets/ddc-staking/src/mock.rs | 6 ++++++ 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 84c1183c0..58bfa5b9b 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -49,7 +49,7 @@ use frame_system::pallet_prelude::*; use scale_info::TypeInfo; use sp_runtime::{ traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, StaticLookup, Zero}, - RuntimeDebug, SaturatedConversion, + AccountId32, RuntimeDebug, SaturatedConversion, }; use sp_staking::EraIndex; use sp_std::{collections::btree_map::BTreeMap, prelude::*}; @@ -402,7 +402,6 @@ pub mod pallet { assert_ok!(Pallet::::serve( T::RuntimeOrigin::from(Some(controller.clone()).into()), cluster, - node.clone() )); } @@ -421,7 +420,6 @@ pub mod pallet { assert_ok!(Pallet::::store( T::RuntimeOrigin::from(Some(controller.clone()).into()), cluster, - node.clone(), )); } } @@ -702,20 +700,18 @@ pub mod pallet { /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. The /// bond size must be greater than or equal to the `EdgeBondSize`. #[pallet::weight(T::WeightInfo::serve())] - pub fn serve( - origin: OriginFor, - cluster_id: ClusterId, - node_pub_key: NodePubKey, - ) -> DispatchResult { + pub fn serve(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let controller = ensure_signed(origin)?; + let account = AccountId32::new([0; 32]); T::ClusterVisitor::ensure_cluster(&cluster_id) .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; // Retrieve the respective bond size from Cluster Visitor - let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, &node_pub_key) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + let bond_size = + T::ClusterVisitor::get_bond_size(&cluster_id, &NodePubKey::CDNPubKey(account)) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; ensure!( ledger.active >= bond_size.saturated_into::>(), @@ -723,10 +719,6 @@ pub mod pallet { ); let stash = &ledger.stash; - // Check if stash is mapped to the node - let node_stash = >::get(&node_pub_key).ok_or(Error::::BadState)?; - ensure!(*stash == node_stash, Error::::NotNodeController); - // Can't participate in CDN if already participating in storage network. ensure!(!Storages::::contains_key(&stash), Error::::AlreadyInRole); @@ -751,30 +743,24 @@ pub mod pallet { /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. The /// bond size must be greater than or equal to the `StorageBondSize`. #[pallet::weight(T::WeightInfo::store())] - pub fn store( - origin: OriginFor, - cluster_id: ClusterId, - node_pub_key: NodePubKey, - ) -> DispatchResult { + pub fn store(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let controller = ensure_signed(origin)?; + let account = AccountId32::new([0; 32]); T::ClusterVisitor::ensure_cluster(&cluster_id) .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; // Retrieve the respective bond size from Cluster Visitor - let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, &node_pub_key) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + let bond_size = + T::ClusterVisitor::get_bond_size(&cluster_id, &NodePubKey::StoragePubKey(account)) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; ensure!( ledger.active >= bond_size.saturated_into::>(), Error::::InsufficientBond ); let stash = &ledger.stash; - // Check if stash is mapped to the node - let node_stash = >::get(&node_pub_key).ok_or(Error::::BadState)?; - ensure!(*stash == node_stash, Error::::NotNodeController); - // Can't participate in storage network if already participating in CDN. ensure!(!Edges::::contains_key(&stash), Error::::AlreadyInRole); diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index cf55112b7..cac16850e 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -124,6 +124,12 @@ impl ClusterVisitor for TestClusterVisitor { fn ensure_cluster(_cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { Ok(()) } + fn get_bond_size( + _cluster_id: &ClusterId, + _node_pub_key: &NodePubKey, + ) -> Result { + Ok(10) + } } pub struct ExtBuilder { has_edges: bool, From 7bf20fbfdb25637711a6282a1c399c79d9ac1dbb Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 7 Nov 2023 16:56:37 +0100 Subject: [PATCH 467/583] change the param for getting bond size --- pallets/ddc-clusters/src/lib.rs | 9 ++++----- pallets/ddc-staking/src/lib.rs | 29 ++++++++++++----------------- pallets/ddc-staking/src/mock.rs | 2 +- traits/src/cluster.rs | 4 ++-- 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 08f246e69..6bdf9fc84 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -19,7 +19,7 @@ use crate::{ cluster::{Cluster, ClusterError, ClusterGovParams, ClusterParams}, node_provider_auth::{NodeProviderAuthContract, NodeProviderAuthContractError}, }; -use ddc_primitives::{ClusterId, NodePubKey}; +use ddc_primitives::{ClusterId, NodePubKey, NodeType}; use ddc_traits::{ cluster::{ClusterVisitor, ClusterVisitorError}, staking::{StakingVisitor, StakingVisitorError}, @@ -251,17 +251,16 @@ pub mod pallet { fn get_bond_size( cluster_id: &ClusterId, - node_pub_key: &NodePubKey, + node_pub_key: NodeType, ) -> Result { // ensure!(ClustersNodes::::contains_key(cluster_id), // Error::::ClusterDoesNotExist); let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; match node_pub_key { - NodePubKey::StoragePubKey(_node_pub_key) => + NodeType::Storage => Ok(cluster_gov_params.storage_bond_size.saturated_into::()), - NodePubKey::CDNPubKey(_node_pub_key) => - Ok(cluster_gov_params.cdn_bond_size.saturated_into::()), + NodeType::CDN => Ok(cluster_gov_params.cdn_bond_size.saturated_into::()), } } } diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 58bfa5b9b..6ef7d34af 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -29,7 +29,7 @@ pub mod weights; use crate::weights::WeightInfo; use codec::{Decode, Encode, HasCompact}; -pub use ddc_primitives::{ClusterId, NodePubKey}; +pub use ddc_primitives::{ClusterId, NodePubKey, NodeType}; use ddc_traits::{ cluster::{ClusterVisitor, ClusterVisitorError}, staking::{StakingVisitor, StakingVisitorError}, @@ -49,7 +49,7 @@ use frame_system::pallet_prelude::*; use scale_info::TypeInfo; use sp_runtime::{ traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, StaticLookup, Zero}, - AccountId32, RuntimeDebug, SaturatedConversion, + RuntimeDebug, SaturatedConversion, }; use sp_staking::EraIndex; use sp_std::{collections::btree_map::BTreeMap, prelude::*}; @@ -592,7 +592,6 @@ pub mod pallet { pub fn unbond( origin: OriginFor, #[pallet::compact] value: BalanceOf, - node_pub_key: NodePubKey, ) -> DispatchResult { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; @@ -612,15 +611,15 @@ pub mod pallet { ledger.active = Zero::zero(); } - // Check if stash is mapped to the node - let node_stash = >::get(&node_pub_key).ok_or(Error::::BadState)?; - ensure!(ledger.stash.clone() == node_stash, Error::::NotNodeController); - let min_active_bond = if let Some(cluster_id) = Self::edges(&ledger.stash) { - // Retrieve the respective bond size from Cluster Visitor - let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, &node_pub_key) + let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, NodeType::CDN) .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; bond_size.saturated_into::>() + } else if let Some(cluster_id) = Self::storages(&ledger.stash) { + let bond_size = + T::ClusterVisitor::get_bond_size(&cluster_id, NodeType::Storage) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + bond_size.saturated_into::>() } else { Zero::zero() }; @@ -702,16 +701,14 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::serve())] pub fn serve(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let controller = ensure_signed(origin)?; - let account = AccountId32::new([0; 32]); T::ClusterVisitor::ensure_cluster(&cluster_id) .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; // Retrieve the respective bond size from Cluster Visitor - let bond_size = - T::ClusterVisitor::get_bond_size(&cluster_id, &NodePubKey::CDNPubKey(account)) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, NodeType::CDN) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; ensure!( ledger.active >= bond_size.saturated_into::>(), @@ -745,16 +742,14 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::store())] pub fn store(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let controller = ensure_signed(origin)?; - let account = AccountId32::new([0; 32]); T::ClusterVisitor::ensure_cluster(&cluster_id) .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; // Retrieve the respective bond size from Cluster Visitor - let bond_size = - T::ClusterVisitor::get_bond_size(&cluster_id, &NodePubKey::StoragePubKey(account)) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, NodeType::Storage) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; ensure!( ledger.active >= bond_size.saturated_into::>(), Error::::InsufficientBond diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index cac16850e..0035892f9 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -126,7 +126,7 @@ impl ClusterVisitor for TestClusterVisitor { } fn get_bond_size( _cluster_id: &ClusterId, - _node_pub_key: &NodePubKey, + _node_pub_key: NodeType, ) -> Result { Ok(10) } diff --git a/traits/src/cluster.rs b/traits/src/cluster.rs index 505de5298..e7036df66 100644 --- a/traits/src/cluster.rs +++ b/traits/src/cluster.rs @@ -1,4 +1,4 @@ -use ddc_primitives::{ClusterId, NodePubKey}; +use ddc_primitives::{ClusterId, NodePubKey, NodeType}; use frame_system::Config; pub trait ClusterVisitor { @@ -8,7 +8,7 @@ pub trait ClusterVisitor { fn get_bond_size( cluster_id: &ClusterId, - node_pub_key: &NodePubKey, + node_pub_key: NodeType, ) -> Result; } From 781bd3a661639094be0a5c4da28f1909c0f1bdf2 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 7 Nov 2023 17:13:49 +0100 Subject: [PATCH 468/583] update to loose coupling for cluster info --- Cargo.lock | 1 + pallets/ddc-customers/Cargo.toml | 1 + pallets/ddc-customers/src/lib.rs | 10 +++++----- runtime/cere-dev/src/lib.rs | 1 + 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b4063fadd..261f5de39 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4938,6 +4938,7 @@ name = "pallet-ddc-customers" version = "0.1.0" dependencies = [ "ddc-primitives", + "ddc-traits", "frame-support", "frame-system", "log", diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 8007013bb..8e899be0e 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } +ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-ddc-clusters = { version = "4.7.0", default-features = false, path = "../ddc-clusters" } diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 4adcee4b5..53c75f34a 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -4,6 +4,7 @@ use codec::{Decode, Encode, HasCompact}; use ddc_primitives::{BucketId, ClusterId}; +use ddc_traits::cluster::ClusterVisitor; use frame_support::{ parameter_types, traits::{Currency, DefensiveSaturating, ExistenceRequirement}, @@ -146,7 +147,7 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config + ddc_staking::Config + ddc_clusters::Config { + pub trait Config: frame_system::Config + ddc_staking::Config { /// The accounts's pallet id, used for deriving its sovereign account ID. #[pallet::constant] type PalletId: Get; @@ -155,6 +156,7 @@ pub mod pallet { /// Number of eras that staked funds must remain locked for. #[pallet::constant] type LockingDuration: Get; + type ClusterVisitor: ClusterVisitor; } /// Map from all (unlocked) "owner" accounts to the info regarding the staking. @@ -252,10 +254,8 @@ pub mod pallet { let bucket_owner = ensure_signed(origin)?; let cur_bucket_id = Self::buckets_count(); - ensure!( - ddc_clusters::pallet::Clusters::::contains_key(&cluster_id), - Error::::ClusterDoesNotExist - ); + ::ClusterVisitor::ensure_cluster(&cluster_id) + .map_err(|_| Error::::ClusterDoesNotExist)?; let bucket = Bucket { bucket_id: cur_bucket_id + 1, diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 58e95dab4..e396168e7 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1347,6 +1347,7 @@ impl pallet_ddc_customers::Config for Runtime { type Currency = Balances; type PalletId = DdcCustomersPalletId; type RuntimeEvent = RuntimeEvent; + type ClusterVisitor = pallet_ddc_clusters::Pallet; } impl pallet_ddc_nodes::Config for Runtime { From f393b71d66afa3206957f1b895e17e3f0ec3c46d Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 7 Nov 2023 17:15:23 +0100 Subject: [PATCH 469/583] rename param node_pub_key to node_type --- pallets/ddc-clusters/src/lib.rs | 2 +- pallets/ddc-staking/src/mock.rs | 2 +- traits/src/cluster.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 6bdf9fc84..0ed7c0e78 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -251,7 +251,7 @@ pub mod pallet { fn get_bond_size( cluster_id: &ClusterId, - node_pub_key: NodeType, + node_type: NodeType, ) -> Result { // ensure!(ClustersNodes::::contains_key(cluster_id), // Error::::ClusterDoesNotExist); diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 0035892f9..f009fec41 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -126,7 +126,7 @@ impl ClusterVisitor for TestClusterVisitor { } fn get_bond_size( _cluster_id: &ClusterId, - _node_pub_key: NodeType, + _node_type: NodeType, ) -> Result { Ok(10) } diff --git a/traits/src/cluster.rs b/traits/src/cluster.rs index e7036df66..99cd8be6b 100644 --- a/traits/src/cluster.rs +++ b/traits/src/cluster.rs @@ -8,7 +8,7 @@ pub trait ClusterVisitor { fn get_bond_size( cluster_id: &ClusterId, - node_pub_key: NodeType, + node_type: NodeType, ) -> Result; } From 72125ee55e1c33293ff6e668ab22d8a0f3bac81d Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 7 Nov 2023 17:19:09 +0100 Subject: [PATCH 470/583] fix small bug --- pallets/ddc-clusters/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 0ed7c0e78..6a7c0549b 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -257,7 +257,7 @@ pub mod pallet { // Error::::ClusterDoesNotExist); let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; - match node_pub_key { + match node_type { NodeType::Storage => Ok(cluster_gov_params.storage_bond_size.saturated_into::()), NodeType::CDN => Ok(cluster_gov_params.cdn_bond_size.saturated_into::()), From ddbcf7560c6344f28d866cb15004b00d8ec0e745 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 7 Nov 2023 17:24:59 +0100 Subject: [PATCH 471/583] make cluster_id not an optional field in bucket struct --- pallets/ddc-customers/src/lib.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 53c75f34a..c474e9869 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -46,7 +46,7 @@ pub struct UnlockChunk { pub struct Bucket { bucket_id: BucketId, owner_id: AccountId, - cluster_id: Option, + cluster_id: ClusterId, } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] @@ -257,11 +257,8 @@ pub mod pallet { ::ClusterVisitor::ensure_cluster(&cluster_id) .map_err(|_| Error::::ClusterDoesNotExist)?; - let bucket = Bucket { - bucket_id: cur_bucket_id + 1, - owner_id: bucket_owner, - cluster_id: Some(cluster_id), - }; + let bucket = + Bucket { bucket_id: cur_bucket_id + 1, owner_id: bucket_owner, cluster_id }; >::set(cur_bucket_id + 1); >::insert(cur_bucket_id + 1, bucket); From c5cd1a390c545a7e3dc0a39c12dfe67dce08d019 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 7 Nov 2023 17:27:39 +0100 Subject: [PATCH 472/583] remove ddc-clusters from cargo.toml --- Cargo.lock | 1 - pallets/ddc-customers/Cargo.toml | 2 -- pallets/ddc-customers/src/lib.rs | 1 - 3 files changed, 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 261f5de39..23c1bdd39 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4942,7 +4942,6 @@ dependencies = [ "frame-support", "frame-system", "log", - "pallet-ddc-clusters", "pallet-ddc-staking", "parity-scale-codec", "scale-info", diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 8e899be0e..15e19a71f 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -9,7 +9,6 @@ ddc-primitives = { version = "0.1.0", default-features = false, path = "../../pr ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-ddc-clusters = { version = "4.7.0", default-features = false, path = "../ddc-clusters" } pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -26,7 +25,6 @@ default = ["std"] std = [ "codec/std", "ddc-primitives/std", - "pallet-ddc-clusters/std", "frame-support/std", "frame-system/std", "scale-info/std", diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index c474e9869..5ae8f64d1 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -10,7 +10,6 @@ use frame_support::{ traits::{Currency, DefensiveSaturating, ExistenceRequirement}, BoundedVec, PalletId, }; -pub use pallet_ddc_clusters::{self as ddc_clusters}; pub use pallet_ddc_staking::{self as ddc_staking}; use scale_info::TypeInfo; use sp_runtime::{ From ff8a1dfc73b399f3c52e18d9b395fe1e4a688a02 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 7 Nov 2023 20:55:20 +0100 Subject: [PATCH 473/583] remove obsolete error and add event for bucket creation --- pallets/ddc-customers/src/lib.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 5ae8f64d1..ce6bbb037 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -194,6 +194,8 @@ pub mod pallet { Withdrawn(T::AccountId, BalanceOf), /// Total amount charged from all accounts to pay CDN nodes Charged(BalanceOf), + /// Bucket with specific id created + BucketCreated(BucketId), } #[pallet::error] @@ -218,8 +220,6 @@ pub mod pallet { BucketDoesNotExist, /// DDC Cluster with provided id doesn't exist ClusterDoesNotExist, - /// Bucket already allocated to cluster - BucketAlreadyInCluster, } #[pallet::genesis_config] @@ -251,16 +251,18 @@ pub mod pallet { #[pallet::weight(10_000)] pub fn create_bucket(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let bucket_owner = ensure_signed(origin)?; - let cur_bucket_id = Self::buckets_count(); + let cur_bucket_id = Self::buckets_count() + 1; ::ClusterVisitor::ensure_cluster(&cluster_id) .map_err(|_| Error::::ClusterDoesNotExist)?; - let bucket = - Bucket { bucket_id: cur_bucket_id + 1, owner_id: bucket_owner, cluster_id }; + let bucket = Bucket { bucket_id: cur_bucket_id, owner_id: bucket_owner, cluster_id }; + + >::set(cur_bucket_id); + >::insert(cur_bucket_id, bucket); + + Self::deposit_event(Event::::BucketCreated(cur_bucket_id)); - >::set(cur_bucket_id + 1); - >::insert(cur_bucket_id + 1, bucket); Ok(()) } From af0c415c6774691d96a3394bbf66fae88e75c93d Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 7 Nov 2023 21:23:30 +0100 Subject: [PATCH 474/583] add strong type params for cdn node --- pallets/ddc-nodes/src/cdn_node.rs | 33 +++++++++++++++++++++---------- pallets/ddc-nodes/src/lib.rs | 1 + pallets/ddc-nodes/src/node.rs | 2 ++ 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 7bec6566b..5b3954953 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -8,6 +8,7 @@ use sp_std::prelude::*; parameter_types! { pub MaxCDNNodeParamsLen: u16 = 2048; + pub MaxHostLen: u8 = 255; } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] @@ -21,14 +22,18 @@ pub struct CDNNode { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNodeProps { - // this is a temporal way of storing node parameters as a stringified json, - // should be replaced with specific properties for this type of node once they are defined - pub params: BoundedVec, + pub host: BoundedVec, + pub http_port: u16, + pub grpc_port: u16, + pub p2p_port: u16, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNodeParams { - pub params: Vec, // should be replaced with specific parameters for this type of node + pub host: Vec, + pub http_port: u16, + pub grpc_port: u16, + pub p2p_port: u16, } impl NodeTrait for CDNNode { @@ -49,10 +54,15 @@ impl NodeTrait for CDNNode { Ok(()) } fn set_params(&mut self, node_params: NodeParams) -> Result<(), NodeError> { - self.props.params = match node_params { - NodeParams::CDNParams(cdn_params) => match cdn_params.params.try_into() { - Ok(vec) => vec, - Err(_) => return Err(NodeError::CDNNodeParamsExceedsLimit), + match node_params { + NodeParams::CDNParams(cdn_params) => { + self.props.host = match cdn_params.host.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::CDNHostLenExceedsLimit), + }; + self.props.http_port = cdn_params.http_port; + self.props.grpc_port = cdn_params.grpc_port; + self.props.p2p_port = cdn_params.p2p_port; }, _ => return Err(NodeError::InvalidCDNNodeParams), }; @@ -79,10 +89,13 @@ impl NodeTrait for CDNNode { pub_key, cluster_id: None, props: CDNNodeProps { - params: match node_params.params.try_into() { + host: match node_params.host.try_into() { Ok(vec) => vec, - Err(_) => return Err(NodeError::CDNNodeParamsExceedsLimit), + Err(_) => return Err(NodeError::CDNHostLenExceedsLimit), }, + http_port: node_params.http_port, + grpc_port: node_params.grpc_port, + p2p_port: node_params.p2p_port, }, })), _ => Err(NodeError::InvalidCDNNodeParams), diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 70efb076f..f0e881f7f 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -61,6 +61,7 @@ pub mod pallet { NodeParamsExceedsLimit, OnlyNodeProvider, NodeIsAssignedToCluster, + HostLenExceedsLimit, } #[pallet::storage] diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index d9431c8b6..4d16b7fd8 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -137,6 +137,7 @@ pub enum NodeError { InvalidCDNNodeParams, StorageNodeParamsExceedsLimit, CDNNodeParamsExceedsLimit, + CDNHostLenExceedsLimit, InvalidCDNNodeProps, InvalidStorageNodeProps, } @@ -150,6 +151,7 @@ impl From for Error { NodeError::InvalidCDNNodeParams => Error::::InvalidNodeParams, NodeError::StorageNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, NodeError::CDNNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, + NodeError::CDNHostLenExceedsLimit => Error::::HostLenExceedsLimit, NodeError::InvalidStorageNodeProps => Error::::InvalidNodeParams, NodeError::InvalidCDNNodeProps => Error::::InvalidNodeParams, } From 6147518a400a71d2cd96c7014f4867127a0cb8d4 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 8 Nov 2023 11:37:29 +0100 Subject: [PATCH 475/583] rename all mentions of edge to CDN --- pallets/ddc-staking/README.md | 2 +- pallets/ddc-staking/src/benchmarking.rs | 24 +++---- pallets/ddc-staking/src/lib.rs | 86 ++++++++++++------------ pallets/ddc-staking/src/mock.rs | 36 +++++----- pallets/ddc-staking/src/testing_utils.rs | 6 +- pallets/ddc-staking/src/tests.rs | 18 ++--- pallets/ddc-staking/src/weights.rs | 16 ++--- runtime/cere-dev/src/lib.rs | 8 +-- 8 files changed, 98 insertions(+), 98 deletions(-) diff --git a/pallets/ddc-staking/README.md b/pallets/ddc-staking/README.md index ef00bef50..f8ac2385a 100644 --- a/pallets/ddc-staking/README.md +++ b/pallets/ddc-staking/README.md @@ -11,6 +11,6 @@ The DDC Staking module is the means by which an account can voluntarily place fu - DDC Staking: The process of locking up funds for some time in order to become a participant of the DDC. - Stash account: The account holding an owner's funds used for staking. - Controller account: The account that controls an owner's funds for staking. -- Edge: CDN participant. +- CDN: CDN network participant. - Storage: Storage network participant. - Era: A time period of DDC participants activity data capture and accumulation which will further be used to calculate pay outs. diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index f5454fc99..4183f0d39 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -34,7 +34,7 @@ benchmarks! { unbond { // clean up any existing state. - clear_storages_and_edges::(); + clear_storages_and_cdns::(); let (stash, controller, _) = create_stash_controller_node::(0, 100)?; let ledger = Ledger::::get(&controller).ok_or("ledger not created before")?; @@ -74,29 +74,29 @@ benchmarks! { } serve { - let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultEdgeBondSize::get())?; + let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultCDNBondSize::get())?; whitelist_account!(controller); }: _(RawOrigin::Signed(controller), ClusterId::from([1; 20])) verify { - assert!(Edges::::contains_key(&stash)); + assert!(CDNs::::contains_key(&stash)); } chill { // clean up any existing state. - clear_storages_and_edges::(); + clear_storages_and_cdns::(); - let (edge_stash, edge_controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultEdgeBondSize::get())?; - DdcStaking::::serve(RawOrigin::Signed(edge_controller.clone()).into(), ClusterId::from([1; 20]))?; - assert!(Edges::::contains_key(&edge_stash)); + let (cdn_stash, cdn_controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultCDNBondSize::get())?; + DdcStaking::::serve(RawOrigin::Signed(cdn_controller.clone()).into(), ClusterId::from([1; 20]))?; + assert!(CDNs::::contains_key(&cdn_stash)); CurrentEra::::put(1); - DdcStaking::::chill(RawOrigin::Signed(edge_controller.clone()).into())?; - CurrentEra::::put(1 + Settings::::get(ClusterId::from([1; 20])).edge_chill_delay); + DdcStaking::::chill(RawOrigin::Signed(cdn_controller.clone()).into())?; + CurrentEra::::put(1 + Settings::::get(ClusterId::from([1; 20])).cdn_chill_delay); - whitelist_account!(edge_controller); - }: _(RawOrigin::Signed(edge_controller)) + whitelist_account!(cdn_controller); + }: _(RawOrigin::Signed(cdn_controller)) verify { - assert!(!Edges::::contains_key(&edge_stash)); + assert!(!CDNs::::contains_key(&cdn_stash)); } set_controller { diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 6ef7d34af..df8e6639a 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -187,9 +187,9 @@ impl { /// The bond size required to become and maintain the role of a CDN participant. #[codec(compact)] - pub edge_bond_size: BalanceOf, + pub cdn_bond_size: BalanceOf, /// Number of eras should pass before a CDN participant can chill. - pub edge_chill_delay: EraIndex, + pub cdn_chill_delay: EraIndex, /// The bond size required to become and maintain the role of a storage network participant. #[codec(compact)] pub storage_bond_size: BalanceOf, @@ -201,8 +201,8 @@ impl Default for ClusterSettings { /// Default to the values specified in the runtime config. fn default() -> Self { Self { - edge_bond_size: T::DefaultEdgeBondSize::get(), - edge_chill_delay: T::DefaultEdgeChillDelay::get(), + cdn_bond_size: T::DefaultCDNBondSize::get(), + cdn_chill_delay: T::DefaultCDNChillDelay::get(), storage_bond_size: T::DefaultStorageBondSize::get(), storage_chill_delay: T::DefaultStorageChillDelay::get(), } @@ -224,11 +224,11 @@ pub mod pallet { /// Default bond size for a CDN participant. #[pallet::constant] - type DefaultEdgeBondSize: Get>; + type DefaultCDNBondSize: Get>; /// Default number or DDC eras required to pass before a CDN participant can chill. #[pallet::constant] - type DefaultEdgeChillDelay: Get; + type DefaultCDNChillDelay: Get; /// Default bond size for a storage network participant. #[pallet::constant] @@ -274,8 +274,8 @@ pub mod pallet { /// The map of (wannabe) CDN participants stash keys to the DDC cluster ID they wish to /// participate into. #[pallet::storage] - #[pallet::getter(fn edges)] - pub type Edges = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; + #[pallet::getter(fn cdns)] + pub type CDNs = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; /// The map of (wannabe) storage network participants stash keys to the DDC cluster ID they wish /// to participate into. @@ -318,8 +318,8 @@ pub mod pallet { /// /// See also [`pallet_staking::ErasRewardPoints`]. #[pallet::storage] - #[pallet::getter(fn eras_edges_reward_points)] - pub type ErasEdgesRewardPoints = + #[pallet::getter(fn eras_cdns_reward_points)] + pub type ErasCDNsRewardPoints = StorageMap<_, Twox64Concat, EraIndex, EraRewardPoints, ValueQuery>; /// The reward each CDN participant earned in the era. @@ -327,8 +327,8 @@ pub mod pallet { /// /// P.S. Not part of Mainnet #[pallet::storage] - #[pallet::getter(fn eras_edges_reward_points_per_node)] - pub type ErasEdgesRewardPointsPerNode = + #[pallet::getter(fn eras_cdns_reward_points_per_node)] + pub type ErasCDNsRewardPointsPerNode = StorageMap<_, Identity, T::AccountId, Vec, ValueQuery>; /// Price per byte of the bucket traffic in smallest units of the currency. @@ -348,7 +348,7 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { - pub edges: Vec<(T::AccountId, T::AccountId, NodePubKey, BalanceOf, ClusterId)>, + pub cdns: Vec<(T::AccountId, T::AccountId, NodePubKey, BalanceOf, ClusterId)>, pub storages: Vec<(T::AccountId, T::AccountId, NodePubKey, BalanceOf, ClusterId)>, pub settings: Vec<(ClusterId, BalanceOf, EraIndex, BalanceOf, EraIndex)>, } @@ -357,7 +357,7 @@ pub mod pallet { impl Default for GenesisConfig { fn default() -> Self { GenesisConfig { - edges: Default::default(), + cdns: Default::default(), storages: Default::default(), settings: Default::default(), } @@ -370,8 +370,8 @@ pub mod pallet { // clusters' settings for &( cluster, - edge_bond_size, - edge_chill_delay, + cdn_bond_size, + cdn_chill_delay, storage_bond_size, storage_chill_delay, ) in &self.settings @@ -379,8 +379,8 @@ pub mod pallet { Settings::::insert( cluster, ClusterSettings:: { - edge_bond_size, - edge_chill_delay, + cdn_bond_size, + cdn_chill_delay, storage_bond_size, storage_chill_delay, }, @@ -388,7 +388,7 @@ pub mod pallet { } // Add initial CDN participants - for &(ref stash, ref controller, ref node, balance, cluster) in &self.edges { + for &(ref stash, ref controller, ref node, balance, cluster) in &self.cdns { assert!( T::Currency::free_balance(&stash) >= balance, "Stash do not have enough balance to participate in CDN." @@ -460,7 +460,7 @@ pub mod pallet { AlreadyPaired, /// Cannot have a storage network or CDN participant, with the size less than defined by /// governance (see `BondSize`). If unbonding is the intention, `chill` first to remove - /// one's role as storage/edge. + /// one's role as storage/cdn node. InsufficientBond, /// Can not schedule more unlock chunks. NoMoreChunks, @@ -611,7 +611,7 @@ pub mod pallet { ledger.active = Zero::zero(); } - let min_active_bond = if let Some(cluster_id) = Self::edges(&ledger.stash) { + let min_active_bond = if let Some(cluster_id) = Self::cdns(&ledger.stash) { let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, NodeType::CDN) .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; bond_size.saturated_into::>() @@ -697,7 +697,7 @@ pub mod pallet { /// `cluster` is the ID of the DDC cluster the participant wishes to join. /// /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. The - /// bond size must be greater than or equal to the `EdgeBondSize`. + /// bond size must be greater than or equal to the `CDNBondSize`. #[pallet::weight(T::WeightInfo::serve())] pub fn serve(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let controller = ensure_signed(origin)?; @@ -720,7 +720,7 @@ pub mod pallet { ensure!(!Storages::::contains_key(&stash), Error::::AlreadyInRole); // Is it an attempt to cancel a previous "chill"? - if let Some(current_cluster) = Self::edges(&stash) { + if let Some(current_cluster) = Self::cdns(&stash) { // Switching the cluster is prohibited. The user should chill first. ensure!(current_cluster == cluster_id, Error::::AlreadyInRole); // Cancel previous "chill" attempts @@ -728,7 +728,7 @@ pub mod pallet { return Ok(()) } - Self::do_add_edge(stash, cluster_id); + Self::do_add_cdn(stash, cluster_id); Ok(()) } @@ -757,7 +757,7 @@ pub mod pallet { let stash = &ledger.stash; // Can't participate in storage network if already participating in CDN. - ensure!(!Edges::::contains_key(&stash), Error::::AlreadyInRole); + ensure!(!CDNs::::contains_key(&stash), Error::::AlreadyInRole); // Is it an attempt to cancel a previous "chill"? if let Some(current_cluster) = Self::storages(&stash) { @@ -799,8 +799,8 @@ pub mod pallet { }; // Extract delay from the cluster settings. - let (cluster, delay) = if let Some(cluster) = Self::edges(&ledger.stash) { - (cluster, Self::settings(cluster).edge_chill_delay) + let (cluster, delay) = if let Some(cluster) = Self::cdns(&ledger.stash) { + (cluster, Self::settings(cluster).cdn_chill_delay) } else if let Some(cluster) = Self::storages(&ledger.stash) { (cluster, Self::settings(cluster).storage_chill_delay) } else { @@ -967,7 +967,7 @@ pub mod pallet { } // Ensure only one node per stash during the DDC era. - ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); + ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); >::insert(new_node, stash); @@ -986,7 +986,7 @@ pub mod pallet { let node_stash = >::get(&node_pub_key).ok_or(Error::::BadState)?; ensure!(stash == node_stash, Error::::NotNodeController); - let cluster_id = >::get(&stash) + let cluster_id = >::get(&stash) .or(>::get(&stash)) .ok_or(Error::::NodeHasNoStake)?; @@ -1005,7 +1005,7 @@ pub mod pallet { // ToDo: check that validation is finalised for era let era_reward_points: EraRewardPoints = - >::get(&era); + >::get(&era); let price_per_byte: u128 = match Self::pricing() { Some(pricing) => pricing, @@ -1079,8 +1079,8 @@ pub mod pallet { /// Chill a stash account. fn chill_stash(stash: &T::AccountId) { let chilled_as_storage = Self::do_remove_storage(stash); - let chilled_as_edge = Self::do_remove_edge(stash); - if chilled_as_storage || chilled_as_edge { + let chilled_as_cdn = Self::do_remove_cdn(stash); + if chilled_as_storage || chilled_as_cdn { Self::deposit_event(Event::::Chilled(stash.clone())); } } @@ -1118,25 +1118,25 @@ pub mod pallet { } Self::do_remove_storage(stash); - Self::do_remove_edge(stash); + Self::do_remove_cdn(stash); frame_system::Pallet::::dec_consumers(stash); Ok(()) } - /// This function will add a CDN participant to the `Edges` storage map. + /// This function will add a CDN participant to the `CDNs` storage map. /// /// If the CDN participant already exists, their cluster will be updated. - pub fn do_add_edge(who: &T::AccountId, cluster: ClusterId) { - Edges::::insert(who, cluster); + pub fn do_add_cdn(who: &T::AccountId, cluster: ClusterId) { + CDNs::::insert(who, cluster); } - /// This function will remove a CDN participant from the `Edges` map. + /// This function will remove a CDN participant from the `CDNs` map. /// - /// Returns true if `who` was removed from `Edges`, otherwise false. - pub fn do_remove_edge(who: &T::AccountId) -> bool { - Edges::::take(who).is_some() + /// Returns true if `who` was removed from `CDNs`, otherwise false. + pub fn do_remove_cdn(who: &T::AccountId) -> bool { + CDNs::::take(who).is_some() } /// This function will add a storage network participant to the `Storages` storage map. @@ -1166,7 +1166,7 @@ pub mod pallet { era: EraIndex, stakers_points: impl IntoIterator, ) { - >::mutate(era, |era_rewards| { + >::mutate(era, |era_rewards| { for (staker, points) in stakers_points.into_iter() { *era_rewards.individual.entry(staker).or_default() += points; era_rewards.total += points; @@ -1182,10 +1182,10 @@ pub mod pallet { ) -> Result { let stash = >::get(&node_pub_key).ok_or(StakingVisitorError::NodeStakeDoesNotExist)?; - let maybe_edge_in_cluster = Edges::::get(&stash); + let maybe_cdn_in_cluster = CDNs::::get(&stash); let maybe_storage_in_cluster = Storages::::get(&stash); - let has_stake: bool = maybe_edge_in_cluster + let has_stake: bool = maybe_cdn_in_cluster .or(maybe_storage_in_cluster) .is_some_and(|staking_cluster| staking_cluster == *cluster_id); diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index f009fec41..40a08cf37 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -93,8 +93,8 @@ impl pallet_timestamp::Config for Test { parameter_types! { pub const BondingDuration: EraIndex = 10; - pub const DefaultEdgeBondSize: Balance = 100; - pub const DefaultEdgeChillDelay: EraIndex = 1; + pub const DefaultCDNBondSize: Balance = 100; + pub const DefaultCDNChillDelay: EraIndex = 1; pub const DefaultStorageBondSize: Balance = 100; pub const DefaultStorageChillDelay: EraIndex = 1; pub const DdcAccountsPalletId: PalletId = PalletId(*b"accounts"); @@ -103,8 +103,8 @@ parameter_types! { impl crate::pallet::Config for Test { type BondingDuration = BondingDuration; type Currency = Balances; - type DefaultEdgeBondSize = DefaultEdgeBondSize; - type DefaultEdgeChillDelay = DefaultEdgeChillDelay; + type DefaultCDNBondSize = DefaultCDNBondSize; + type DefaultCDNChillDelay = DefaultCDNChillDelay; type DefaultStorageBondSize = DefaultStorageBondSize; type DefaultStorageChillDelay = DefaultStorageChillDelay; type RuntimeEvent = RuntimeEvent; @@ -132,28 +132,28 @@ impl ClusterVisitor for TestClusterVisitor { } } pub struct ExtBuilder { - has_edges: bool, + has_cdns: bool, has_storages: bool, stakes: BTreeMap, - edges: Vec<(AccountId, AccountId, Balance, ClusterId)>, + cdns: Vec<(AccountId, AccountId, Balance, ClusterId)>, storages: Vec<(AccountId, AccountId, Balance, ClusterId)>, } impl Default for ExtBuilder { fn default() -> Self { Self { - has_edges: true, + has_cdns: true, has_storages: true, stakes: Default::default(), - edges: Default::default(), + cdns: Default::default(), storages: Default::default(), } } } impl ExtBuilder { - pub fn has_edges(mut self, has: bool) -> Self { - self.has_edges = has; + pub fn has_cdns(mut self, has: bool) -> Self { + self.has_cdns = has; self } pub fn has_storages(mut self, has: bool) -> Self { @@ -164,14 +164,14 @@ impl ExtBuilder { self.stakes.insert(who, stake); self } - pub fn add_edge( + pub fn add_cdn( mut self, stash: AccountId, controller: AccountId, stake: Balance, cluster: ClusterId, ) -> Self { - self.edges.push((stash, controller, stake, cluster)); + self.cdns.push((stash, controller, stake, cluster)); self } pub fn add_storage( @@ -194,13 +194,13 @@ impl ExtBuilder { (2, 100), (3, 100), (4, 100), - // edge controllers + // cdn controllers (10, 100), (20, 100), // storage controllers (30, 100), (40, 100), - // edge stashes + // cdn stashes (11, 100), (21, 100), // storage stashes @@ -209,9 +209,9 @@ impl ExtBuilder { ], } .assimilate_storage(&mut storage); - let mut edges = vec![]; - if self.has_edges { - edges = vec![ + let mut cdns = vec![]; + if self.has_cdns { + cdns = vec![ // (stash, controller, node, stake, cluster) ( 11, @@ -250,7 +250,7 @@ impl ExtBuilder { ]; } - let _ = pallet_ddc_staking::GenesisConfig:: { edges, storages, ..Default::default() } + let _ = pallet_ddc_staking::GenesisConfig:: { cdns, storages, ..Default::default() } .assimilate_storage(&mut storage); TestExternalities::new(storage) diff --git a/pallets/ddc-staking/src/testing_utils.rs b/pallets/ddc-staking/src/testing_utils.rs index 74e61221c..05f2a2bda 100644 --- a/pallets/ddc-staking/src/testing_utils.rs +++ b/pallets/ddc-staking/src/testing_utils.rs @@ -11,11 +11,11 @@ use sp_std::prelude::*; const SEED: u32 = 0; -/// This function removes all storage and edge nodes from storage. -pub fn clear_storages_and_edges() { +/// This function removes all storage and CDN nodes from storage. +pub fn clear_storages_and_cdns() { #[allow(unused_must_use)] { - Edges::::clear(u32::MAX, None); + CDNs::::clear(u32::MAX, None); Storages::::clear(u32::MAX, None); } } diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index 2af19cce0..1fd702a07 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -18,15 +18,15 @@ fn set_settings_works() { RuntimeOrigin::root(), ClusterId::from([1; 20]), Some(ClusterSettings { - edge_bond_size: 10, - edge_chill_delay: 2, + cdn_bond_size: 10, + cdn_chill_delay: 2, storage_bond_size: 10, storage_chill_delay: 2, }), )); let settings = DdcStaking::settings(ClusterId::from([1; 20])); - assert_eq!(settings.edge_bond_size, 10); - assert_eq!(settings.edge_chill_delay, 2); + assert_eq!(settings.cdn_bond_size, 10); + assert_eq!(settings.cdn_chill_delay, 2); assert_eq!(settings.storage_bond_size, 10); assert_eq!(settings.storage_chill_delay, 2); @@ -34,8 +34,8 @@ fn set_settings_works() { assert_ok!(DdcStaking::set_settings(RuntimeOrigin::root(), ClusterId::from([1; 20]), None)); let settings = DdcStaking::settings(ClusterId::from([1; 20])); let default_settings: ClusterSettings = Default::default(); - assert_eq!(settings.edge_bond_size, default_settings.edge_bond_size); - assert_eq!(settings.edge_chill_delay, default_settings.edge_chill_delay); + assert_eq!(settings.cdn_bond_size, default_settings.cdn_bond_size); + assert_eq!(settings.cdn_chill_delay, default_settings.cdn_chill_delay); assert_eq!(settings.storage_bond_size, default_settings.storage_bond_size); assert_eq!(settings.storage_chill_delay, default_settings.storage_chill_delay); }); @@ -135,7 +135,7 @@ fn staking_should_work() { unlocking: Default::default(), }) ); - assert_eq!(DdcStaking::edges(3), Some(ClusterId::from([0; 20]))); + assert_eq!(DdcStaking::cdns(3), Some(ClusterId::from([0; 20]))); assert_eq!(DdcStaking::nodes(NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32]))), Some(3)); // Set `CurrentEra`. @@ -147,7 +147,7 @@ fn staking_should_work() { // Removal is scheduled, stashed value of 4 is still lock. let chilling = DdcStaking::current_era().unwrap() + - DdcStaking::settings(ClusterId::from([0; 20])).edge_chill_delay; + DdcStaking::settings(ClusterId::from([0; 20])).cdn_chill_delay; assert_eq!( DdcStaking::ledger(&4), Some(StakingLedger { @@ -185,7 +185,7 @@ fn staking_should_work() { assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); // Account 3 is no longer a CDN participant. - assert_eq!(DdcStaking::edges(3), None); + assert_eq!(DdcStaking::cdns(3), None); }); } diff --git a/pallets/ddc-staking/src/weights.rs b/pallets/ddc-staking/src/weights.rs index 3b69615ab..50971c029 100644 --- a/pallets/ddc-staking/src/weights.rs +++ b/pallets/ddc-staking/src/weights.rs @@ -53,7 +53,7 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().writes(4 as u64)) } // Storage: DdcStaking Ledger (r:1 w:1) - // Storage: DdcStaking Edges (r:1 w:0) + // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) // Storage: DdcStaking CurrentEra (r:1 w:0) // Storage: Balances Locks (r:1 w:1) @@ -74,7 +74,7 @@ impl WeightInfo for SubstrateWeight { } // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcStaking Settings (r:1 w:0) - // Storage: DdcStaking Edges (r:1 w:0) + // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:1) fn store() -> Weight { Weight::from_ref_time(26_112_000 as u64) @@ -84,7 +84,7 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) - // Storage: DdcStaking Edges (r:1 w:1) + // Storage: DdcStaking CDNs (r:1 w:1) fn serve() -> Weight { Weight::from_ref_time(19_892_000 as u64) .saturating_add(T::DbWeight::get().reads(4 as u64)) @@ -92,7 +92,7 @@ impl WeightInfo for SubstrateWeight { } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CurrentEra (r:1 w:0) - // Storage: DdcStaking Edges (r:1 w:1) + // Storage: DdcStaking CDNs (r:1 w:1) // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) fn chill() -> Weight { @@ -139,7 +139,7 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().writes(4 as u64)) } // Storage: DdcStaking Ledger (r:1 w:1) - // Storage: DdcStaking Edges (r:1 w:0) + // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) // Storage: DdcStaking CurrentEra (r:1 w:0) // Storage: Balances Locks (r:1 w:1) @@ -160,7 +160,7 @@ impl WeightInfo for () { } // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcStaking Settings (r:1 w:0) - // Storage: DdcStaking Edges (r:1 w:0) + // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:1) fn store() -> Weight { Weight::from_ref_time(26_112_000 as u64) @@ -170,7 +170,7 @@ impl WeightInfo for () { // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) - // Storage: DdcStaking Edges (r:1 w:1) + // Storage: DdcStaking CDNs (r:1 w:1) fn serve() -> Weight { Weight::from_ref_time(19_892_000 as u64) .saturating_add(RocksDbWeight::get().reads(4 as u64)) @@ -178,7 +178,7 @@ impl WeightInfo for () { } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CurrentEra (r:1 w:0) - // Storage: DdcStaking Edges (r:1 w:1) + // Storage: DdcStaking CDNs (r:1 w:1) // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) fn chill() -> Weight { diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 9898aad4c..7ca70d747 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1317,8 +1317,8 @@ impl pallet_ddc_metrics_offchain_worker::Config for Runtime { } parameter_types! { - pub const DefaultEdgeBondSize: Balance = 100 * DOLLARS; - pub const DefaultEdgeChillDelay: EraIndex = 7 * 24 * 60 / 2; // approx. 1 week with 2 min DDC era + pub const DefaultCDNBondSize: Balance = 100 * DOLLARS; + pub const DefaultCDNChillDelay: EraIndex = 7 * 24 * 60 / 2; // approx. 1 week with 2 min DDC era pub const DefaultStorageBondSize: Balance = 100 * DOLLARS; pub const DefaultStorageChillDelay: EraIndex = 7 * 24 * 60 / 2; // approx. 1 week with 2 min DDC era } @@ -1326,8 +1326,8 @@ parameter_types! { impl pallet_ddc_staking::Config for Runtime { type BondingDuration = BondingDuration; type Currency = Balances; - type DefaultEdgeBondSize = DefaultEdgeBondSize; - type DefaultEdgeChillDelay = DefaultEdgeChillDelay; + type DefaultCDNBondSize = DefaultCDNBondSize; + type DefaultCDNChillDelay = DefaultCDNChillDelay; type DefaultStorageBondSize = DefaultStorageBondSize; type DefaultStorageChillDelay = DefaultStorageChillDelay; type RuntimeEvent = RuntimeEvent; From 5e43de0eab85655dec169646d1bf82e3aa109f5c Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 8 Nov 2023 14:34:24 +0100 Subject: [PATCH 476/583] remove cluster settings from ddc-staking; add get_chill_delay for cluster visitor --- Cargo.lock | 1 + pallets/ddc-clusters/src/lib.rs | 15 ++- pallets/ddc-staking/src/benchmarking.rs | 22 +--- pallets/ddc-staking/src/lib.rs | 166 ++---------------------- pallets/ddc-staking/src/mock.rs | 17 ++- pallets/ddc-staking/src/tests.rs | 71 +--------- pallets/ddc-staking/src/weights.rs | 26 ---- runtime/cere-dev/src/lib.rs | 4 - traits/Cargo.toml | 1 + traits/src/cluster.rs | 6 + 10 files changed, 44 insertions(+), 285 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 23c1bdd39..6661c7979 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1654,6 +1654,7 @@ dependencies = [ "frame-support", "frame-system", "sp-core", + "sp-staking", "sp-std", ] diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 6a7c0549b..6a3954652 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -32,6 +32,7 @@ use frame_system::pallet_prelude::*; pub use pallet::*; use pallet_ddc_nodes::{NodeRepository, NodeTrait}; use sp_runtime::SaturatedConversion; +use sp_staking::EraIndex; use sp_std::prelude::*; mod cluster; @@ -253,8 +254,6 @@ pub mod pallet { cluster_id: &ClusterId, node_type: NodeType, ) -> Result { - // ensure!(ClustersNodes::::contains_key(cluster_id), - // Error::::ClusterDoesNotExist); let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; match node_type { @@ -263,6 +262,18 @@ pub mod pallet { NodeType::CDN => Ok(cluster_gov_params.cdn_bond_size.saturated_into::()), } } + + fn get_chill_delay( + cluster_id: &ClusterId, + node_type: NodeType, + ) -> Result { + let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) + .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; + match node_type { + NodeType::Storage => Ok(cluster_gov_params.storage_chill_delay), + NodeType::CDN => Ok(cluster_gov_params.cdn_chill_delay), + } + } } impl From for Error { diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index 4183f0d39..9e1f1510d 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -2,7 +2,7 @@ use super::*; use crate::Pallet as DdcStaking; -use ddc_primitives::CDNNodePubKey; +use ddc_primitives::{CDNNodePubKey, NodeType}; use testing_utils::*; use frame_support::traits::{Currency, Get}; @@ -91,7 +91,7 @@ benchmarks! { assert!(CDNs::::contains_key(&cdn_stash)); CurrentEra::::put(1); DdcStaking::::chill(RawOrigin::Signed(cdn_controller.clone()).into())?; - CurrentEra::::put(1 + Settings::::get(ClusterId::from([1; 20])).cdn_chill_delay); + CurrentEra::::put(1 + T::ClusterVisitor::get_chill_delay(ClusterId::from([1; 20]), NodeType::CDN)); whitelist_account!(cdn_controller); }: _(RawOrigin::Signed(cdn_controller)) @@ -117,22 +117,4 @@ benchmarks! { verify { assert!(Nodes::::contains_key(&new_node)); } - - allow_cluster_manager { - let new_cluster_manager = create_funded_user::("cluster_manager", USER_SEED, 100); - let new_cluster_manager_lookup = T::Lookup::unlookup(new_cluster_manager.clone()); - }: _(RawOrigin::Root, new_cluster_manager_lookup) - verify { - assert!(ClusterManagers::::get().contains(&new_cluster_manager)); - } - - disallow_cluster_manager { - let new_cluster_manager = create_funded_user::("cluster_manager", USER_SEED, 100); - let new_cluster_manager_lookup = T::Lookup::unlookup(new_cluster_manager.clone()); - DdcStaking::::allow_cluster_manager(RawOrigin::Root.into(), new_cluster_manager_lookup.clone())?; - assert!(ClusterManagers::::get().contains(&new_cluster_manager)); - }: _(RawOrigin::Root, new_cluster_manager_lookup) - verify { - assert!(!ClusterManagers::::get().contains(&new_cluster_manager)); - } } diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index df8e6639a..a4ab54c0c 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -181,34 +181,6 @@ impl { - /// The bond size required to become and maintain the role of a CDN participant. - #[codec(compact)] - pub cdn_bond_size: BalanceOf, - /// Number of eras should pass before a CDN participant can chill. - pub cdn_chill_delay: EraIndex, - /// The bond size required to become and maintain the role of a storage network participant. - #[codec(compact)] - pub storage_bond_size: BalanceOf, - /// Number of eras should pass before a storage network participant can chill. - pub storage_chill_delay: EraIndex, -} - -impl Default for ClusterSettings { - /// Default to the values specified in the runtime config. - fn default() -> Self { - Self { - cdn_bond_size: T::DefaultCDNBondSize::get(), - cdn_chill_delay: T::DefaultCDNChillDelay::get(), - storage_bond_size: T::DefaultStorageBondSize::get(), - storage_chill_delay: T::DefaultStorageChillDelay::get(), - } - } -} - #[frame_support::pallet] pub mod pallet { use super::*; @@ -222,22 +194,6 @@ pub mod pallet { pub trait Config: frame_system::Config { type Currency: LockableCurrency; - /// Default bond size for a CDN participant. - #[pallet::constant] - type DefaultCDNBondSize: Get>; - - /// Default number or DDC eras required to pass before a CDN participant can chill. - #[pallet::constant] - type DefaultCDNChillDelay: Get; - - /// Default bond size for a storage network participant. - #[pallet::constant] - type DefaultStorageBondSize: Get>; - - /// Default number or DDC eras required to pass before a storage participant can chill. - #[pallet::constant] - type DefaultStorageChillDelay: Get; - type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// Number of eras that staked funds must remain bonded for. #[pallet::constant] @@ -259,12 +215,6 @@ pub mod pallet { #[pallet::getter(fn bonded)] pub type Bonded = StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; - /// DDC clusters staking settings. - #[pallet::storage] - #[pallet::getter(fn settings)] - pub type Settings = - StorageMap<_, Identity, ClusterId, ClusterSettings, ValueQuery>; - /// Map from all (unlocked) "controller" accounts to the info regarding the staking. #[pallet::storage] #[pallet::getter(fn ledger)] @@ -336,11 +286,6 @@ pub mod pallet { #[pallet::getter(fn pricing)] pub type Pricing = StorageValue<_, u128>; - /// A list of accounts allowed to become cluster managers. - #[pallet::storage] - #[pallet::getter(fn cluster_managers)] - pub type ClusterManagers = StorageValue<_, Vec, ValueQuery>; - /// Map from DDC node ID to the node operator stash account. #[pallet::storage] #[pallet::getter(fn nodes)] @@ -350,43 +295,18 @@ pub mod pallet { pub struct GenesisConfig { pub cdns: Vec<(T::AccountId, T::AccountId, NodePubKey, BalanceOf, ClusterId)>, pub storages: Vec<(T::AccountId, T::AccountId, NodePubKey, BalanceOf, ClusterId)>, - pub settings: Vec<(ClusterId, BalanceOf, EraIndex, BalanceOf, EraIndex)>, } #[cfg(feature = "std")] impl Default for GenesisConfig { fn default() -> Self { - GenesisConfig { - cdns: Default::default(), - storages: Default::default(), - settings: Default::default(), - } + GenesisConfig { cdns: Default::default(), storages: Default::default() } } } #[pallet::genesis_build] impl GenesisBuild for GenesisConfig { fn build(&self) { - // clusters' settings - for &( - cluster, - cdn_bond_size, - cdn_chill_delay, - storage_bond_size, - storage_chill_delay, - ) in &self.settings - { - Settings::::insert( - cluster, - ClusterSettings:: { - cdn_bond_size, - cdn_chill_delay, - storage_bond_size, - storage_chill_delay, - }, - ); - } - // Add initial CDN participants for &(ref stash, ref controller, ref node, balance, cluster) in &self.cdns { assert!( @@ -800,9 +720,14 @@ pub mod pallet { // Extract delay from the cluster settings. let (cluster, delay) = if let Some(cluster) = Self::cdns(&ledger.stash) { - (cluster, Self::settings(cluster).cdn_chill_delay) + let chill_delay = T::ClusterVisitor::get_chill_delay(&cluster, NodeType::CDN) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + (cluster, chill_delay) } else if let Some(cluster) = Self::storages(&ledger.stash) { - (cluster, Self::settings(cluster).storage_chill_delay) + let chill_delay = + T::ClusterVisitor::get_chill_delay(&cluster, NodeType::Storage) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + (cluster, chill_delay) } else { return Ok(()) // already chilled }; @@ -862,31 +787,6 @@ pub mod pallet { Ok(()) } - /// Set custom DDC staking settings for a particular cluster. - /// - /// * `settings` - The new settings for the cluster. If `None`, the settings will be removed - /// from the storage and default settings will be used. - /// - /// RuntimeOrigin must be Root to call this function. - /// - /// NOTE: Existing CDN and storage network participants will not be affected by this - /// settings update. - #[pallet::weight(10_000)] - pub fn set_settings( - origin: OriginFor, - cluster: ClusterId, - settings: Option>, - ) -> DispatchResult { - ensure_root(origin)?; - - match settings { - None => Settings::::remove(cluster), - Some(settings) => Settings::::insert(cluster, settings), - } - - Ok(()) - } - /// Pay out all the stakers for a single era. #[pallet::weight(100_000)] pub fn payout_stakers(origin: OriginFor, era: EraIndex) -> DispatchResult { @@ -903,56 +803,6 @@ pub mod pallet { Self::do_payout_stakers(era) } - /// Set price per byte of the bucket traffic in smallest units of the currency. - /// - /// The dispatch origin for this call must be _Root_. - #[pallet::weight(10_000)] - pub fn set_pricing(origin: OriginFor, price_per_byte: u128) -> DispatchResult { - ensure_root(origin)?; - >::set(Some(price_per_byte)); - Ok(()) - } - - /// Add a new account to the list of cluster managers. - /// - /// RuntimeOrigin must be Root to call this function. - #[pallet::weight(T::WeightInfo::allow_cluster_manager())] - pub fn allow_cluster_manager( - origin: OriginFor, - grantee: ::Source, - ) -> DispatchResult { - ensure_root(origin)?; - - let grantee = T::Lookup::lookup(grantee)?; - ClusterManagers::::mutate(|grantees| { - if !grantees.contains(&grantee) { - grantees.push(grantee); - } - }); - - Ok(()) - } - - /// Remove an account from the list of cluster managers. - /// - /// RuntimeOrigin must be Root to call this function. - #[pallet::weight(T::WeightInfo::disallow_cluster_manager())] - pub fn disallow_cluster_manager( - origin: OriginFor, - revokee: ::Source, - ) -> DispatchResult { - ensure_root(origin)?; - - let revokee = T::Lookup::lookup(revokee)?; - ClusterManagers::::mutate(|grantees| { - if let Some(pos) = grantees.iter().position(|g| g == &revokee) { - grantees.remove(pos); - } - }); - - Ok(()) - } - /// (Re-)set the DDC node of a node operator stash account. Requires to chill first. /// /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 40a08cf37..9d02c06aa 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -17,6 +17,7 @@ use sp_runtime::{ testing::Header, traits::{BlakeTwo256, IdentityLookup}, }; +use sp_staking::EraIndex; use sp_std::collections::btree_map::BTreeMap; /// The AccountId alias in this test module. @@ -93,20 +94,12 @@ impl pallet_timestamp::Config for Test { parameter_types! { pub const BondingDuration: EraIndex = 10; - pub const DefaultCDNBondSize: Balance = 100; - pub const DefaultCDNChillDelay: EraIndex = 1; - pub const DefaultStorageBondSize: Balance = 100; - pub const DefaultStorageChillDelay: EraIndex = 1; pub const DdcAccountsPalletId: PalletId = PalletId(*b"accounts"); } impl crate::pallet::Config for Test { type BondingDuration = BondingDuration; type Currency = Balances; - type DefaultCDNBondSize = DefaultCDNBondSize; - type DefaultCDNChillDelay = DefaultCDNChillDelay; - type DefaultStorageBondSize = DefaultStorageBondSize; - type DefaultStorageChillDelay = DefaultStorageChillDelay; type RuntimeEvent = RuntimeEvent; type UnixTime = Timestamp; type WeightInfo = (); @@ -130,6 +123,12 @@ impl ClusterVisitor for TestClusterVisitor { ) -> Result { Ok(10) } + fn get_chill_delay( + _cluster_id: &ClusterId, + _node_type: NodeType, + ) -> Result { + Ok(10) + } } pub struct ExtBuilder { has_cdns: bool, @@ -250,7 +249,7 @@ impl ExtBuilder { ]; } - let _ = pallet_ddc_staking::GenesisConfig:: { cdns, storages, ..Default::default() } + let _ = pallet_ddc_staking::GenesisConfig:: { cdns, storages } .assimilate_storage(&mut storage); TestExternalities::new(storage) diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index 1fd702a07..7ca84fdda 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -1,7 +1,8 @@ //! Tests for the module. use super::{mock::*, *}; -use ddc_primitives::CDNNodePubKey; +use ddc_primitives::{CDNNodePubKey, NodeType}; +use ddc_traits::cluster::{ClusterVisitor, ClusterVisitorError}; use frame_support::{ assert_noop, assert_ok, assert_storage_noop, error::BadOrigin, traits::ReservableCurrency, }; @@ -10,37 +11,6 @@ use pallet_balances::Error as BalancesError; pub const BLOCK_TIME: u64 = 1000; pub const INIT_TIMESTAMP: u64 = 30_000; -#[test] -fn set_settings_works() { - ExtBuilder::default().build_and_execute(|| { - // setting works - assert_ok!(DdcStaking::set_settings( - RuntimeOrigin::root(), - ClusterId::from([1; 20]), - Some(ClusterSettings { - cdn_bond_size: 10, - cdn_chill_delay: 2, - storage_bond_size: 10, - storage_chill_delay: 2, - }), - )); - let settings = DdcStaking::settings(ClusterId::from([1; 20])); - assert_eq!(settings.cdn_bond_size, 10); - assert_eq!(settings.cdn_chill_delay, 2); - assert_eq!(settings.storage_bond_size, 10); - assert_eq!(settings.storage_chill_delay, 2); - - // removing works - assert_ok!(DdcStaking::set_settings(RuntimeOrigin::root(), ClusterId::from([1; 20]), None)); - let settings = DdcStaking::settings(ClusterId::from([1; 20])); - let default_settings: ClusterSettings = Default::default(); - assert_eq!(settings.cdn_bond_size, default_settings.cdn_bond_size); - assert_eq!(settings.cdn_chill_delay, default_settings.cdn_chill_delay); - assert_eq!(settings.storage_bond_size, default_settings.storage_bond_size); - assert_eq!(settings.storage_chill_delay, default_settings.storage_chill_delay); - }); -} - #[test] fn basic_setup_works() { // Verifies initial conditions of mock @@ -76,9 +46,6 @@ fn basic_setup_works() { ); // Account 1 does not control any stash assert_eq!(DdcStaking::ledger(&1), None); - - // Cluster 1 settings are default - assert_eq!(DdcStaking::settings(ClusterId::from([1; 20])), Default::default()); }); } @@ -146,8 +113,9 @@ fn staking_should_work() { assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); // Removal is scheduled, stashed value of 4 is still lock. - let chilling = DdcStaking::current_era().unwrap() + - DdcStaking::settings(ClusterId::from([0; 20])).cdn_chill_delay; + let chilling = DdcStaking::current_era().unwrap() + 10u32; + // ClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::CDN) + // .unwrap_or(10_u32); assert_eq!( DdcStaking::ledger(&4), Some(StakingLedger { @@ -188,32 +156,3 @@ fn staking_should_work() { assert_eq!(DdcStaking::cdns(3), None); }); } - -#[test] -fn cluster_managers_list_can_be_managed_by_governance_only() { - ExtBuilder::default().build_and_execute(|| { - // Governance can allow an account to become cluster manager. - assert_ok!(DdcStaking::allow_cluster_manager(RuntimeOrigin::root(), 1)); - - // Repeat call does nothing. - assert_storage_noop!(assert_ok!(DdcStaking::allow_cluster_manager( - RuntimeOrigin::root(), - 1, - ))); - - // Non-governance can't allow an account to become a cluster manager. - assert_noop!(DdcStaking::allow_cluster_manager(RuntimeOrigin::signed(1), 2), BadOrigin); - - // Non-governance can't disallow an account to become a cluster manager. - assert_noop!(DdcStaking::disallow_cluster_manager(RuntimeOrigin::signed(1), 1), BadOrigin); - - // Governance can disallow an account to become a cluster manager. - assert_ok!(DdcStaking::disallow_cluster_manager(RuntimeOrigin::root(), 1)); - - // Repeat call does nothing. - assert_storage_noop!(assert_ok!(DdcStaking::disallow_cluster_manager( - RuntimeOrigin::root(), - 1, - ))); - }); -} diff --git a/pallets/ddc-staking/src/weights.rs b/pallets/ddc-staking/src/weights.rs index 50971c029..969385330 100644 --- a/pallets/ddc-staking/src/weights.rs +++ b/pallets/ddc-staking/src/weights.rs @@ -36,8 +36,6 @@ pub trait WeightInfo { fn chill() -> Weight; fn set_controller() -> Weight; fn set_node() -> Weight; - fn allow_cluster_manager() -> Weight; - fn disallow_cluster_manager() -> Weight; } /// Weights for pallet_ddc_staking using the Substrate node and recommended hardware. @@ -113,18 +111,6 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } - // Storage: DdcStaking ClusterManagers (r:1 w:1) - fn allow_cluster_manager() -> Weight { - Weight::from_ref_time(11_727_000 as u64) - .saturating_add(T::DbWeight::get().reads(1 as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) - } - // Storage: DdcStaking ClusterManagers (r:1 w:1) - fn disallow_cluster_manager() -> Weight { - Weight::from_ref_time(18_006_000 as u64) - .saturating_add(T::DbWeight::get().reads(1 as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) - } } // For backwards compatibility and tests @@ -199,16 +185,4 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } - // Storage: DdcStaking ClusterManagers (r:1 w:1) - fn allow_cluster_manager() -> Weight { - Weight::from_ref_time(11_727_000 as u64) - .saturating_add(RocksDbWeight::get().reads(1 as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) - } - // Storage: DdcStaking ClusterManagers (r:1 w:1) - fn disallow_cluster_manager() -> Weight { - Weight::from_ref_time(18_006_000 as u64) - .saturating_add(RocksDbWeight::get().reads(1 as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) - } } diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 7ca70d747..43dfb06da 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1326,10 +1326,6 @@ parameter_types! { impl pallet_ddc_staking::Config for Runtime { type BondingDuration = BondingDuration; type Currency = Balances; - type DefaultCDNBondSize = DefaultCDNBondSize; - type DefaultCDNChillDelay = DefaultCDNChillDelay; - type DefaultStorageBondSize = DefaultStorageBondSize; - type DefaultStorageChillDelay = DefaultStorageChillDelay; type RuntimeEvent = RuntimeEvent; type StakersPayoutSource = DdcCustomersPalletId; type UnixTime = Timestamp; diff --git a/traits/Cargo.toml b/traits/Cargo.toml index ef2bb96e9..b224e2d28 100644 --- a/traits/Cargo.toml +++ b/traits/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } ddc-primitives = { version = "0.1.0", default-features = false, path = "../primitives" } diff --git a/traits/src/cluster.rs b/traits/src/cluster.rs index 99cd8be6b..4a8211f79 100644 --- a/traits/src/cluster.rs +++ b/traits/src/cluster.rs @@ -1,5 +1,6 @@ use ddc_primitives::{ClusterId, NodePubKey, NodeType}; use frame_system::Config; +use sp_staking::EraIndex; pub trait ClusterVisitor { fn cluster_has_node(cluster_id: &ClusterId, node_pub_key: &NodePubKey) -> bool; @@ -10,6 +11,11 @@ pub trait ClusterVisitor { cluster_id: &ClusterId, node_type: NodeType, ) -> Result; + + fn get_chill_delay( + cluster_id: &ClusterId, + node_type: NodeType, + ) -> Result; } pub enum ClusterVisitorError { From 8dac72e7e81a318b21a6069e970b5f3fc5e95be2 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 8 Nov 2023 18:47:12 +0100 Subject: [PATCH 477/583] replace era index with block number for ddc staking; cleanup code --- pallets/ddc-clusters/src/cluster.rs | 14 +- pallets/ddc-clusters/src/lib.rs | 19 +- pallets/ddc-customers/src/lib.rs | 6 +- pallets/ddc-staking/src/lib.rs | 332 ++++++---------------------- pallets/ddc-staking/src/mock.rs | 1 - pallets/ddc-staking/src/tests.rs | 6 +- runtime/cere-dev/src/lib.rs | 3 - traits/src/cluster.rs | 8 +- 8 files changed, 94 insertions(+), 295 deletions(-) diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index 7274fbf16..f940ce57e 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -4,7 +4,6 @@ use ddc_primitives::ClusterId; use frame_support::{pallet_prelude::*, parameter_types, BoundedVec}; use scale_info::TypeInfo; use sp_runtime::Perbill; -use sp_staking::EraIndex; use sp_std::vec::Vec; parameter_types! { @@ -35,18 +34,17 @@ pub struct ClusterParams { // ClusterGovParams includes Governance sensetive parameters #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct ClusterGovParams { +#[scale_info(skip_type_params(Balance, BlockNumber, T))] +pub struct ClusterGovParams { pub treasury_share: Perbill, pub validators_share: Perbill, pub cluster_reserve_share: Perbill, - #[codec(compact)] pub cdn_bond_size: Balance, - pub cdn_chill_delay: EraIndex, - pub cdn_unbonding_delay: EraIndex, - #[codec(compact)] + pub cdn_chill_delay: BlockNumber, + pub cdn_unbonding_delay: BlockNumber, pub storage_bond_size: Balance, - pub storage_chill_delay: EraIndex, - pub storage_unbonding_delay: EraIndex, + pub storage_chill_delay: BlockNumber, + pub storage_unbonding_delay: BlockNumber, pub unit_per_mb_stored: u128, pub unit_per_mb_streamed: u128, pub unit_per_put_request: u128, diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 6a3954652..78b79ca77 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -32,7 +32,6 @@ use frame_system::pallet_prelude::*; pub use pallet::*; use pallet_ddc_nodes::{NodeRepository, NodeTrait}; use sp_runtime::SaturatedConversion; -use sp_staking::EraIndex; use sp_std::prelude::*; mod cluster; @@ -96,7 +95,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn clusters_gov_params)] pub type ClustersGovParams = - StorageMap<_, Twox64Concat, ClusterId, ClusterGovParams>>; + StorageMap<_, Twox64Concat, ClusterId, ClusterGovParams, T::BlockNumber>>; #[pallet::storage] #[pallet::getter(fn clusters_nodes)] @@ -226,7 +225,7 @@ pub mod pallet { pub fn set_cluster_gov_params( origin: OriginFor, cluster_id: ClusterId, - cluster_gov_params: ClusterGovParams>, + cluster_gov_params: ClusterGovParams, T::BlockNumber>, ) -> DispatchResult { let caller_id = ensure_signed(origin)?; let cluster = @@ -266,7 +265,7 @@ pub mod pallet { fn get_chill_delay( cluster_id: &ClusterId, node_type: NodeType, - ) -> Result { + ) -> Result { let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; match node_type { @@ -274,6 +273,18 @@ pub mod pallet { NodeType::CDN => Ok(cluster_gov_params.cdn_chill_delay), } } + + fn get_unbonding_delay( + cluster_id: &ClusterId, + node_type: NodeType, + ) -> Result { + let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) + .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; + match node_type { + NodeType::Storage => Ok(cluster_gov_params.storage_unbonding_delay), + NodeType::CDN => Ok(cluster_gov_params.cdn_unbonding_delay), + } + } } impl From for Error { diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index ce6bbb037..e3efdc5b1 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -376,8 +376,7 @@ pub mod pallet { ledger.active = Zero::zero(); } - let current_era = ddc_staking::pallet::Pallet::::current_era() - .ok_or(Error::::DDCEraNotSet)?; + let current_era = 0; // Note: locking for extra era to allow for accounting let era = current_era + ::LockingDuration::get(); log::debug!("Era for the unlock: {:?}", era); @@ -416,8 +415,7 @@ pub mod pallet { let owner = ensure_signed(origin)?; let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; let (owner, old_total) = (ledger.owner.clone(), ledger.total); - let current_era = - ddc_staking::pallet::Pallet::::current_era().ok_or(Error::::DDCEraNotSet)?; + let current_era = 0; ledger = ledger.consolidate_unlocked(current_era); log::debug!("Current era: {:?}", current_era); diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index a4ab54c0c..26fac2f84 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -41,7 +41,7 @@ use frame_support::{ parameter_types, traits::{ Currency, DefensiveSaturating, ExistenceRequirement, LockIdentifier, LockableCurrency, - UnixTime, WithdrawReasons, + WithdrawReasons, }, BoundedVec, PalletId, }; @@ -51,24 +51,12 @@ use sp_runtime::{ traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, StaticLookup, Zero}, RuntimeDebug, SaturatedConversion, }; -use sp_staking::EraIndex; use sp_std::{collections::btree_map::BTreeMap, prelude::*}; pub use pallet::*; -/// Two minutes. -/// -/// If you are changing this, check `on_finalize` hook to ensure `CurrentEra` is capable to hold the -/// value with the new era duration. -pub const DDC_ERA_DURATION_MS: u128 = 120_000; - -/// 2023-01-01 00:00:00 UTC -pub const DDC_ERA_START_MS: u128 = 1_672_531_200_000; const DDC_STAKING_ID: LockIdentifier = *b"ddcstake"; // DDC maintainer's stake -/// Counter for the number of "reward" points earned by a given staker. -pub type RewardPoint = u64; - /// The balance type of this pallet. pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; @@ -78,52 +66,21 @@ parameter_types! { pub MaxUnlockingChunks: u32 = 32; } -/// Reward points of an era. Used to split era total payout between stakers. -#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Clone)] -pub struct EraRewardPoints { - /// Total number of points. Equals the sum of reward points for each staker. - pub total: RewardPoint, - /// The reward points earned by a given staker. - pub individual: BTreeMap, -} - -/// Reward points for particular era. To be used in a mapping. -#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Clone)] -pub struct EraRewardPointsPerNode { - /// Era points accrued - pub era: EraIndex, - /// Total number of points for node - pub points: RewardPoint, -} - -/// Reward paid for some era. -#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Clone)] -pub struct EraRewardsPaid { - /// Era number - pub era: EraIndex, - /// Cere tokens paid - pub reward: Balance, -} - -impl Default for EraRewardPoints { - fn default() -> Self { - EraRewardPoints { total: Default::default(), individual: BTreeMap::new() } - } -} - /// Just a Balance/BlockNumber tuple to encode when a chunk of funds will be unlocked. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct UnlockChunk { +#[scale_info(skip_type_params(T))] +pub struct UnlockChunk { /// Amount of funds to be unlocked. #[codec(compact)] value: Balance, - /// Era number at which point it'll be unlocked. + /// Block number at which point it'll be unlocked. #[codec(compact)] - era: EraIndex, + block: T::BlockNumber, } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct StakingLedger { +#[scale_info(skip_type_params(T))] +pub struct StakingLedger { /// The stash account whose balance is actually locked and at stake. pub stash: AccountId, /// The total amount of the stash's balance that we are currently accounting for. @@ -134,16 +91,19 @@ pub struct StakingLedger { /// rounds. #[codec(compact)] pub active: Balance, - /// Era number at which chilling will be allowed. - pub chilling: Option, + /// Block number at which chilling will be allowed. + pub chilling: Option, /// Any balance that is becoming free, which may eventually be transferred out of the stash /// (assuming it doesn't get slashed first). It is assumed that this will be treated as a first - /// in, first out queue where the new (higher value) eras get pushed on the back. - pub unlocking: BoundedVec, MaxUnlockingChunks>, + /// in, first out queue where the new (higher value) blocks get pushed on the back. + pub unlocking: BoundedVec, MaxUnlockingChunks>, } -impl - StakingLedger +impl< + AccountId, + Balance: HasCompact + Copy + Saturating + AtLeast32BitUnsigned + Zero, + T: Config, + > StakingLedger { /// Initializes the default object using the given stash. pub fn default_from(stash: AccountId) -> Self { @@ -158,13 +118,13 @@ impl Self { + fn consolidate_unlocked(self, current_block: T::BlockNumber) -> Self { let mut total = self.total; let unlocking: BoundedVec<_, _> = self .unlocking .into_iter() .filter(|chunk| { - if chunk.era > current_era { + if chunk.block > current_block { true } else { total = total.saturating_sub(chunk.value); @@ -195,18 +155,10 @@ pub mod pallet { type Currency: LockableCurrency; type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// Number of eras that staked funds must remain bonded for. - #[pallet::constant] - type BondingDuration: Get; - /// To derive an account for withdrawing CDN rewards. - type StakersPayoutSource: Get; + /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; - /// Time used for computing era index. It is guaranteed to start being called from the first - /// `on_finalize`. - type UnixTime: UnixTime; - type ClusterVisitor: ClusterVisitor; } @@ -219,7 +171,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn ledger)] pub type Ledger = - StorageMap<_, Blake2_128Concat, T::AccountId, StakingLedger>>; + StorageMap<_, Blake2_128Concat, T::AccountId, StakingLedger, T>>; /// The map of (wannabe) CDN participants stash keys to the DDC cluster ID they wish to /// participate into. @@ -233,59 +185,6 @@ pub mod pallet { #[pallet::getter(fn storages)] pub type Storages = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; - /// Map from all "stash" accounts to the total paid out rewards - /// - /// P.S. Not part of Mainnet - #[pallet::storage] - #[pallet::getter(fn rewards)] - pub type Rewards = StorageMap<_, Identity, T::AccountId, BalanceOf, ValueQuery>; - - /// Map from all "stash" accounts to the paid out rewards per era - /// - /// P.S. Not part of Mainnet - #[pallet::storage] - #[pallet::getter(fn paid_eras_per_node)] - pub type PaidErasPerNode = - StorageMap<_, Identity, T::AccountId, Vec>>, ValueQuery>; - - /// Map to check if CDN participants received payments for specific era - /// - /// Used to avoid double-spend in method [payout_stakers] - #[pallet::storage] - #[pallet::getter(fn paid_eras)] - pub(super) type PaidEras = StorageMap<_, Twox64Concat, EraIndex, bool, ValueQuery>; - - /// The current era index. - /// - /// This is the latest planned era, depending on how the Session pallet queues the validator - /// set, it might be active or not. - #[pallet::storage] - #[pallet::getter(fn current_era)] - pub type CurrentEra = StorageValue<_, EraIndex>; - - /// The reward each CDN participant earned in the era. - /// Mapping from Era to vector of CDN participants and respective rewards - /// - /// See also [`pallet_staking::ErasRewardPoints`]. - #[pallet::storage] - #[pallet::getter(fn eras_cdns_reward_points)] - pub type ErasCDNsRewardPoints = - StorageMap<_, Twox64Concat, EraIndex, EraRewardPoints, ValueQuery>; - - /// The reward each CDN participant earned in the era. - /// Mapping from each CDN participant to vector of eras and rewards - /// - /// P.S. Not part of Mainnet - #[pallet::storage] - #[pallet::getter(fn eras_cdns_reward_points_per_node)] - pub type ErasCDNsRewardPointsPerNode = - StorageMap<_, Identity, T::AccountId, Vec, ValueQuery>; - - /// Price per byte of the bucket traffic in smallest units of the currency. - #[pallet::storage] - #[pallet::getter(fn pricing)] - pub type Pricing = StorageValue<_, u128>; - /// Map from DDC node ID to the node operator stash account. #[pallet::storage] #[pallet::getter(fn nodes)] @@ -362,10 +261,8 @@ pub mod pallet { /// \[stash\] Chilled(T::AccountId), /// An account has declared desire to stop participating in CDN or storage network soon. - /// \[stash, cluster, era\] - ChillSoon(T::AccountId, ClusterId, EraIndex), - // Payout CDN nodes' stash accounts - PayoutNodes(EraIndex, EraRewardPoints, u128), + /// \[stash, cluster, block\] + ChillSoon(T::AccountId, ClusterId, T::BlockNumber), } #[pallet::error] @@ -391,18 +288,6 @@ pub mod pallet { AlreadyInRole, /// Action is allowed at some point of time in future not reached yet. TooEarly, - /// We are not yet sure that era has been valdiated by this time - EraNotValidated, - /// Attempt to assign reward point for some era more than once - DuplicateRewardPoints, - /// Attempt to double spend the assigned rewards per era - DoubleSpendRewards, - /// Pricing has not been set by sudo - PricingNotSet, - /// Payout amount overflows - BudgetOverflow, - /// Current era not set during runtime - DDCEraNotSet, /// Origin of the call is not a controller of the stake associated with the provided node. NotNodeController, /// No stake found associated with the provided node. @@ -413,21 +298,6 @@ pub mod pallet { FastChillProhibited, } - #[pallet::hooks] - impl Hooks> for Pallet { - fn on_finalize(_n: BlockNumberFor) { - // Check if we have a new era and if so bump the current era index. - let now_as_millis = T::UnixTime::now().as_millis(); - let computed_era: EraIndex = - ((now_as_millis - DDC_ERA_START_MS) / DDC_ERA_DURATION_MS) as u32; // saturated - if Self::current_era() >= Some(computed_era) { - return - } - CurrentEra::::put(computed_era); - // ToDo: add `on_initialize` hook to track `on_finalize` weight - } - } - #[pallet::call] impl Pallet { /// Take the origin account as a stash and lock up `value` of its balance. `controller` will @@ -548,17 +418,29 @@ pub mod pallet { // cluster. If a user runs into this error, they should chill first. ensure!(ledger.active >= min_active_bond, Error::::InsufficientBond); - // Note: in case there is no current era it is fine to bond one era more. - let era = Self::current_era().unwrap_or(0) + T::BondingDuration::get(); - if let Some(chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) { - // To keep the chunk count down, we only keep one chunk per era. Since - // `unlocking` is a FiFo queue, if a chunk exists for `era` we know that it will - // be the last one. + let unbonding_delay_in_blocks = if let Some(cluster_id) = Self::cdns(&ledger.stash) + { + T::ClusterVisitor::get_unbonding_delay(&cluster_id, NodeType::CDN) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))? + } else if let Some(cluster_id) = Self::storages(&ledger.stash) { + T::ClusterVisitor::get_unbonding_delay(&cluster_id, NodeType::Storage) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))? + } else { + T::BlockNumber::from(100_00u32) + }; + + let block = >::block_number() + unbonding_delay_in_blocks; + if let Some(chunk) = + ledger.unlocking.last_mut().filter(|chunk| chunk.block == block) + { + // To keep the chunk count down, we only keep one chunk per block. Since + // `unlocking` is a FiFo queue, if a chunk exists for `block` we know that it + // will be the last one. chunk.value = chunk.value.defensive_saturating_add(value) } else { ledger .unlocking - .try_push(UnlockChunk { value, era }) + .try_push(UnlockChunk { value, block }) .map_err(|_| Error::::NoMoreChunks)?; }; @@ -584,9 +466,8 @@ pub mod pallet { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; let (stash, old_total) = (ledger.stash.clone(), ledger.total); - if let Some(current_era) = Self::current_era() { - ledger = ledger.consolidate_unlocked(current_era) - } + + ledger = ledger.consolidate_unlocked(>::block_number()); if ledger.unlocking.is_empty() && ledger.active < T::Currency::minimum_balance() { // This account must have called `unbond()` with some value that caused the active @@ -698,13 +579,13 @@ pub mod pallet { /// Only in case the delay for the role _origin_ maintains in the cluster is set to zero in /// cluster settings, it removes the participant immediately. Otherwise, it requires at /// least two invocations to effectively remove the participant. The first invocation only - /// updates the [`Ledger`] to note the DDC era at which the participant may "chill" (current - /// era + the delay from the cluster settings). The second invocation made at the noted era - /// (or any further era) will remove the participant from the list of CDN or storage network - /// participants. If the cluster settings updated significantly decreasing the delay, one - /// may invoke it again to decrease the era at with the participant may "chill". But it - /// never increases the era at which the participant may "chill" even when the cluster - /// settings updated increasing the delay. + /// updates the [`Ledger`] to note the block number at which the participant may "chill" + /// (current block + the delay from the cluster settings). The second invocation made at the + /// noted block (or any further block) will remove the participant from the list of CDN or + /// storage network participants. If the cluster settings updated significantly decreasing + /// the delay, one may invoke it again to decrease the block at with the participant may + /// "chill". But it never increases the block at which the participant may "chill" even when + /// the cluster settings updated increasing the delay. /// /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. /// @@ -713,10 +594,7 @@ pub mod pallet { pub fn chill(origin: OriginFor) -> DispatchResult { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - let current_era = match Self::current_era() { - Some(era) => era, - None => Err(Error::::TooEarly)?, // can't chill before the first era - }; + let current_block = >::block_number(); // Extract delay from the cluster settings. let (cluster, delay) = if let Some(cluster) = Self::cdns(&ledger.stash) { @@ -732,13 +610,13 @@ pub mod pallet { return Ok(()) // already chilled }; - if delay == 0 { + if delay == T::BlockNumber::from(0u32) { // No delay is set, so we can chill right away. Self::chill_stash(&ledger.stash); return Ok(()) } - let can_chill_from = current_era.defensive_saturating_add(delay); + let can_chill_from = current_block.defensive_saturating_add(delay); match ledger.chilling { None => { // No previous declarations of desire to chill. Note it to allow chilling soon. @@ -751,7 +629,7 @@ pub mod pallet { Self::chill_stash_soon(&ledger.stash, &controller, cluster, can_chill_from); return Ok(()) }, - Some(chilling) if chilling > current_era => Err(Error::::TooEarly)?, + Some(chilling) if chilling > current_block => Err(Error::::TooEarly)?, Some(_) => (), } @@ -764,7 +642,7 @@ pub mod pallet { /// (Re-)set the controller of a stash. /// - /// Effects will be felt at the beginning of the next era. + /// Effects will be felt at the beginning of the next block. /// /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. #[pallet::weight(T::WeightInfo::set_controller())] @@ -787,22 +665,6 @@ pub mod pallet { Ok(()) } - /// Pay out all the stakers for a single era. - #[pallet::weight(100_000)] - pub fn payout_stakers(origin: OriginFor, era: EraIndex) -> DispatchResult { - ensure_signed(origin)?; - let current_era = Self::current_era().ok_or(Error::::DDCEraNotSet)?; - - // Makes sure this era hasn't been paid out yet - ensure!(!Self::paid_eras(era), Error::::DoubleSpendRewards); - - // This should be adjusted based on the finality of validation - ensure!(current_era >= era + 2, Error::::EraNotValidated); - - PaidEras::::insert(era, true); - Self::do_payout_stakers(era) - } - /// (Re-)set the DDC node of a node operator stash account. Requires to chill first. /// /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. @@ -816,7 +678,7 @@ pub mod pallet { } } - // Ensure only one node per stash during the DDC era. + // Ensure only one node per stash. ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); @@ -825,7 +687,7 @@ pub mod pallet { Ok(()) } - /// Allow cluster node candidate to chill in the next DDC era. + /// Allow cluster node candidate to chill in the next block. /// /// The dispatch origin for this call must be _Signed_ by the controller. #[pallet::weight(10_000)] @@ -843,7 +705,8 @@ pub mod pallet { let is_cluster_node = T::ClusterVisitor::cluster_has_node(&cluster_id, &node_pub_key); ensure!(!is_cluster_node, Error::::FastChillProhibited); - let can_chill_from = Self::current_era().unwrap_or(0) + 1; + let can_chill_from = + >::block_number() + T::BlockNumber::from(1u32); Self::chill_stash_soon(&stash, &controller, cluster_id, can_chill_from); Ok(()) @@ -851,71 +714,12 @@ pub mod pallet { } impl Pallet { - pub fn do_payout_stakers(era: EraIndex) -> DispatchResult { - // ToDo: check that validation is finalised for era - - let era_reward_points: EraRewardPoints = - >::get(&era); - - let price_per_byte: u128 = match Self::pricing() { - Some(pricing) => pricing, - None => Err(Error::::PricingNotSet)?, - }; - - // An account we withdraw the funds from and the amount of funds to withdraw. - let payout_source_account: T::AccountId = - T::StakersPayoutSource::get().into_account_truncating(); - - // Transfer a part of the budget to each CDN participant rewarded this era. - for (stash, points) in era_reward_points.clone().individual { - let reward: BalanceOf = match (points as u128 * price_per_byte).try_into() { - Ok(value) => value, - Err(_) => Err(Error::::BudgetOverflow)?, - }; - log::debug!( - "Rewarding {:?} with {:?} points, reward size {:?}, balance \ - on payout source account {:?}", - stash, - points, - reward, - T::Currency::free_balance(&payout_source_account) - ); - T::Currency::transfer( - &payout_source_account, - &stash, - reward, - ExistenceRequirement::AllowDeath, - )?; // ToDo: all success or noop - Rewards::::mutate(&stash, |current_balance| { - *current_balance += reward; - }); - log::debug!("Total rewards to be inserted: {:?}", Self::rewards(&stash)); - PaidErasPerNode::::mutate(&stash, |current_rewards| { - let rewards = EraRewardsPaid { era, reward }; - current_rewards.push(rewards); - }); - } - Self::deposit_event(Event::::PayoutNodes( - era, - era_reward_points.clone(), - price_per_byte, - )); - log::debug!("Payout event executed"); - - log::debug!( - "Balance left on payout source account {:?}", - T::Currency::free_balance(&payout_source_account), - ); - - Ok(()) - } - /// Update the ledger for a controller. /// /// This will also update the stash lock. fn update_ledger( controller: &T::AccountId, - ledger: &StakingLedger>, + ledger: &StakingLedger, T>, ) { T::Currency::set_lock( DDC_STAKING_ID, @@ -940,7 +744,7 @@ pub mod pallet { stash: &T::AccountId, controller: &T::AccountId, cluster: ClusterId, - can_chill_from: EraIndex, + can_chill_from: T::BlockNumber, ) { Ledger::::mutate(&controller, |maybe_ledger| { if let Some(ref mut ledger) = maybe_ledger { @@ -1003,7 +807,7 @@ pub mod pallet { Storages::::take(who).is_some() } - /// Reset the chilling era for a controller. + /// Reset the chilling block for a controller. pub fn reset_chilling(controller: &T::AccountId) { Ledger::::mutate(&controller, |maybe_ledger| { if let Some(ref mut ledger) = maybe_ledger { @@ -1011,18 +815,6 @@ pub mod pallet { } }); } - /// Add reward points to CDN participants using their stash account ID. - pub fn reward_by_ids( - era: EraIndex, - stakers_points: impl IntoIterator, - ) { - >::mutate(era, |era_rewards| { - for (staker, points) in stakers_points.into_iter() { - *era_rewards.individual.entry(staker).or_default() += points; - era_rewards.total += points; - } - }); - } } impl StakingVisitor for Pallet { diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 9d02c06aa..9c96aa000 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -17,7 +17,6 @@ use sp_runtime::{ testing::Header, traits::{BlakeTwo256, IdentityLookup}, }; -use sp_staking::EraIndex; use sp_std::collections::btree_map::BTreeMap; /// The AccountId alias in this test module. diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index 7ca84fdda..7bc66787d 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -113,9 +113,9 @@ fn staking_should_work() { assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); // Removal is scheduled, stashed value of 4 is still lock. - let chilling = DdcStaking::current_era().unwrap() + 10u32; - // ClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::CDN) - // .unwrap_or(10_u32); + let chilling = DdcStaking::current_era().unwrap() + + TestClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::CDN) + .unwrap_or(10_u32); assert_eq!( DdcStaking::ledger(&4), Some(StakingLedger { diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 43dfb06da..b8b8b52d9 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1324,11 +1324,8 @@ parameter_types! { } impl pallet_ddc_staking::Config for Runtime { - type BondingDuration = BondingDuration; type Currency = Balances; type RuntimeEvent = RuntimeEvent; - type StakersPayoutSource = DdcCustomersPalletId; - type UnixTime = Timestamp; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; type ClusterVisitor = pallet_ddc_clusters::Pallet; } diff --git a/traits/src/cluster.rs b/traits/src/cluster.rs index 4a8211f79..bbd21ed32 100644 --- a/traits/src/cluster.rs +++ b/traits/src/cluster.rs @@ -1,6 +1,5 @@ use ddc_primitives::{ClusterId, NodePubKey, NodeType}; use frame_system::Config; -use sp_staking::EraIndex; pub trait ClusterVisitor { fn cluster_has_node(cluster_id: &ClusterId, node_pub_key: &NodePubKey) -> bool; @@ -15,7 +14,12 @@ pub trait ClusterVisitor { fn get_chill_delay( cluster_id: &ClusterId, node_type: NodeType, - ) -> Result; + ) -> Result; + + fn get_unbonding_delay( + cluster_id: &ClusterId, + node_type: NodeType, + ) -> Result; } pub enum ClusterVisitorError { From 1a4fb1f9fe5f764225f3e3c85c133bd73bf9a1b0 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 8 Nov 2023 20:05:35 +0100 Subject: [PATCH 478/583] update logic for customer unlocks based on unlock delay in blocks --- Cargo.lock | 1 - pallets/ddc-customers/Cargo.toml | 1 - pallets/ddc-customers/src/lib.rs | 60 ++++++++++++++++---------------- pallets/ddc-staking/src/lib.rs | 11 +++--- runtime/cere-dev/src/lib.rs | 4 +-- 5 files changed, 36 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6661c7979..6059b927b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4943,7 +4943,6 @@ dependencies = [ "frame-support", "frame-system", "log", - "pallet-ddc-staking", "parity-scale-codec", "scale-info", "sp-io", diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 15e19a71f..48cdf287f 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -9,7 +9,6 @@ ddc-primitives = { version = "0.1.0", default-features = false, path = "../../pr ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-ddc-staking = { version = "4.7.0", default-features = false, path = "../ddc-staking" } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index e3efdc5b1..d544ced22 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -10,13 +10,11 @@ use frame_support::{ traits::{Currency, DefensiveSaturating, ExistenceRequirement}, BoundedVec, PalletId, }; -pub use pallet_ddc_staking::{self as ddc_staking}; use scale_info::TypeInfo; use sp_runtime::{ traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, Zero}, RuntimeDebug, SaturatedConversion, }; -use sp_staking::EraIndex; use sp_std::prelude::*; pub use pallet::*; @@ -32,13 +30,14 @@ parameter_types! { /// Just a Balance/BlockNumber tuple to encode when a chunk of funds will be unlocked. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct UnlockChunk { +#[scale_info(skip_type_params(T))] +pub struct UnlockChunk { /// Amount of funds to be unlocked. #[codec(compact)] value: Balance, - /// Era number at which point it'll be unlocked. + /// Block number at which point it'll be unlocked. #[codec(compact)] - era: EraIndex, + block: T::BlockNumber, } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] @@ -55,7 +54,8 @@ pub struct BucketsDetails { } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct AccountsLedger { +#[scale_info(skip_type_params(T))] +pub struct AccountsLedger { /// The owner account whose balance is actually locked and can be used for CDN usage. pub owner: AccountId, /// The total amount of the owner's balance that we are currently accounting for. @@ -70,11 +70,14 @@ pub struct AccountsLedger { /// (assuming that the content owner has to pay for network usage). It is assumed that this /// will be treated as a first in, first out queue where the new (higher value) eras get pushed /// on the back. - pub unlocking: BoundedVec, MaxUnlockingChunks>, + pub unlocking: BoundedVec, MaxUnlockingChunks>, } -impl - AccountsLedger +impl< + AccountId, + Balance: HasCompact + Copy + Saturating + AtLeast32BitUnsigned + Zero, + T: Config, + > AccountsLedger { /// Initializes the default object using the given owner. pub fn default_from(owner: AccountId) -> Self { @@ -83,14 +86,14 @@ impl Self { + fn consolidate_unlocked(self, current_block: T::BlockNumber) -> Self { let mut total = self.total; let unlocking: BoundedVec<_, _> = self .unlocking .into_iter() .filter(|chunk| { - log::debug!("Chunk era: {:?}", chunk.era); - if chunk.era > current_era { + log::debug!("Chunk era: {:?}", chunk.block); + if chunk.block > current_block { true } else { total = total.saturating_sub(chunk.value); @@ -146,7 +149,7 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config + ddc_staking::Config { + pub trait Config: frame_system::Config { /// The accounts's pallet id, used for deriving its sovereign account ID. #[pallet::constant] type PalletId: Get; @@ -154,7 +157,7 @@ pub mod pallet { type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// Number of eras that staked funds must remain locked for. #[pallet::constant] - type LockingDuration: Get; + type UnlockingDelay: Get<::BlockNumber>; type ClusterVisitor: ClusterVisitor; } @@ -162,7 +165,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn ledger)] pub type Ledger = - StorageMap<_, Identity, T::AccountId, AccountsLedger>>; + StorageMap<_, Identity, T::AccountId, AccountsLedger, T>>; #[pallet::type_value] pub fn DefaultBucketCount() -> BucketId { @@ -214,8 +217,6 @@ pub mod pallet { NoBucketWithId, /// Internal state has become somehow corrupted and the operation cannot continue. BadState, - /// Current era not set during runtime - DDCEraNotSet, /// Bucket with specified id doesn't exist BucketDoesNotExist, /// DDC Cluster with provided id doesn't exist @@ -376,12 +377,14 @@ pub mod pallet { ledger.active = Zero::zero(); } - let current_era = 0; - // Note: locking for extra era to allow for accounting - let era = current_era + ::LockingDuration::get(); - log::debug!("Era for the unlock: {:?}", era); + let current_block = >::block_number(); + // Note: locking for extra block to allow for accounting + let block = current_block + ::UnlockingDelay::get(); + log::debug!("Block for the unlock: {:?}", block); - if let Some(chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) { + if let Some(chunk) = + ledger.unlocking.last_mut().filter(|chunk| chunk.block == block) + { // To keep the chunk count down, we only keep one chunk per era. Since // `unlocking` is a FiFo queue, if a chunk exists for `era` we know that it will // be the last one. @@ -389,7 +392,7 @@ pub mod pallet { } else { ledger .unlocking - .try_push(UnlockChunk { value, era }) + .try_push(UnlockChunk { value, block }) .map_err(|_| Error::::NoMoreChunks)?; }; @@ -415,9 +418,8 @@ pub mod pallet { let owner = ensure_signed(origin)?; let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; let (owner, old_total) = (ledger.owner.clone(), ledger.total); - let current_era = 0; - ledger = ledger.consolidate_unlocked(current_era); - log::debug!("Current era: {:?}", current_era); + let current_block = >::block_number(); + ledger = ledger.consolidate_unlocked(current_block); if ledger.unlocking.is_empty() && ledger.active < ::Currency::minimum_balance() @@ -468,7 +470,7 @@ pub mod pallet { /// This will also deposit the funds to pallet. fn update_ledger_and_deposit( owner: &T::AccountId, - ledger: &AccountsLedger>, + ledger: &AccountsLedger, T>, ) -> DispatchResult { let account_id = Self::account_id(); @@ -486,7 +488,7 @@ pub mod pallet { /// Update the ledger for a owner. fn update_ledger( owner: &T::AccountId, - ledger: &AccountsLedger>, + ledger: &AccountsLedger, T>, ) { >::insert(owner, ledger); } @@ -523,7 +525,6 @@ pub mod pallet { ledger.total -= amount; ledger.active -= amount; total_charged += amount; - log::debug!("Ledger updated state: {:?}", &ledger); Self::update_ledger(&content_owner, &ledger); } else { let diff = amount - ledger.active; @@ -531,7 +532,6 @@ pub mod pallet { ledger.total -= ledger.active; ledger.active = BalanceOf::::zero(); let (ledger, charged) = ledger.charge_unlocking(diff); - log::debug!("Ledger updated state: {:?}", &ledger); Self::update_ledger(&content_owner, &ledger); total_charged += charged; } diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 26fac2f84..fbc82d69b 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -39,19 +39,16 @@ use frame_support::{ assert_ok, pallet_prelude::*, parameter_types, - traits::{ - Currency, DefensiveSaturating, ExistenceRequirement, LockIdentifier, LockableCurrency, - WithdrawReasons, - }, - BoundedVec, PalletId, + traits::{Currency, DefensiveSaturating, LockIdentifier, LockableCurrency, WithdrawReasons}, + BoundedVec, }; use frame_system::pallet_prelude::*; use scale_info::TypeInfo; use sp_runtime::{ - traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, StaticLookup, Zero}, + traits::{AtLeast32BitUnsigned, Saturating, StaticLookup, Zero}, RuntimeDebug, SaturatedConversion, }; -use sp_std::{collections::btree_map::BTreeMap, prelude::*}; +use sp_std::prelude::*; pub use pallet::*; diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index b8b8b52d9..6b2e35137 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1332,11 +1332,11 @@ impl pallet_ddc_staking::Config for Runtime { parameter_types! { pub const DdcCustomersPalletId: PalletId = PalletId(*b"accounts"); // DDC maintainer's stake - pub const LockingDuration: sp_staking::EraIndex = 30 * 24; // 1 hour * 24 = 1 day; (1 era is 2 mins) + pub const UnlockingDelay: BlockNumber = 5256000u32; // 1 hour * 24 * 365 = 1 day; (1 hour is 600 blocks) } impl pallet_ddc_customers::Config for Runtime { - type LockingDuration = LockingDuration; + type UnlockingDelay = UnlockingDelay; type Currency = Balances; type PalletId = DdcCustomersPalletId; type RuntimeEvent = RuntimeEvent; From 6521f81dc6090453ac3c9249d8e3c57d8b8cecc8 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 8 Nov 2023 20:18:32 +0100 Subject: [PATCH 479/583] update error and storage params --- pallets/ddc-nodes/src/node.rs | 6 ++--- pallets/ddc-nodes/src/storage_node.rs | 33 +++++++++++++++++++-------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 4d16b7fd8..25ab35f44 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -135,8 +135,7 @@ pub enum NodeError { InvalidCDNNodePubKey, InvalidStorageNodeParams, InvalidCDNNodeParams, - StorageNodeParamsExceedsLimit, - CDNNodeParamsExceedsLimit, + StorageHostLenExceedsLimit, CDNHostLenExceedsLimit, InvalidCDNNodeProps, InvalidStorageNodeProps, @@ -149,8 +148,7 @@ impl From for Error { NodeError::InvalidCDNNodePubKey => Error::::InvalidNodePubKey, NodeError::InvalidStorageNodeParams => Error::::InvalidNodeParams, NodeError::InvalidCDNNodeParams => Error::::InvalidNodeParams, - NodeError::StorageNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, - NodeError::CDNNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, + NodeError::StorageHostLenExceedsLimit => Error::::HostLenExceedsLimit, NodeError::CDNHostLenExceedsLimit => Error::::HostLenExceedsLimit, NodeError::InvalidStorageNodeProps => Error::::InvalidNodeParams, NodeError::InvalidCDNNodeProps => Error::::InvalidNodeParams, diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index f847c119f..578afeb09 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -8,6 +8,7 @@ use sp_std::prelude::Vec; parameter_types! { pub MaxStorageNodeParamsLen: u16 = 2048; + pub MaxHostLen: u8 = 255; } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] @@ -21,14 +22,18 @@ pub struct StorageNode { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNodeProps { - // this is a temporal way of storing node parameters as a stringified json, - // should be replaced with specific properties for this type of node once they are defined - pub params: BoundedVec, + pub host: BoundedVec, + pub http_port: u16, + pub grpc_port: u16, + pub p2p_port: u16, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNodeParams { - pub params: Vec, // should be replaced with specific parameters for this type of node + pub host: Vec, + pub http_port: u16, + pub grpc_port: u16, + pub p2p_port: u16, } impl NodeTrait for StorageNode { @@ -49,10 +54,15 @@ impl NodeTrait for StorageNode { Ok(()) } fn set_params(&mut self, node_params: NodeParams) -> Result<(), NodeError> { - self.props.params = match node_params { - NodeParams::StorageParams(cdn_params) => match cdn_params.params.try_into() { - Ok(vec) => vec, - Err(_) => return Err(NodeError::StorageNodeParamsExceedsLimit), + match node_params { + NodeParams::StorageParams(storage_params) => { + self.props.host = match storage_params.host.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::CDNHostLenExceedsLimit), + }; + self.props.http_port = storage_params.http_port; + self.props.grpc_port = storage_params.grpc_port; + self.props.p2p_port = storage_params.p2p_port; }, _ => return Err(NodeError::InvalidStorageNodeParams), }; @@ -79,10 +89,13 @@ impl NodeTrait for StorageNode { pub_key, cluster_id: None, props: StorageNodeProps { - params: match node_params.params.try_into() { + host: match node_params.host.try_into() { Ok(vec) => vec, - Err(_) => return Err(NodeError::StorageNodeParamsExceedsLimit), + Err(_) => return Err(NodeError::StorageHostLenExceedsLimit), }, + http_port: node_params.http_port, + grpc_port: node_params.grpc_port, + p2p_port: node_params.p2p_port, }, })), _ => Err(NodeError::InvalidStorageNodeParams), From 8772502458575a6fca05baf17234f353fd992a93 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 8 Nov 2023 21:01:10 +0100 Subject: [PATCH 480/583] fix bechmarks & tests --- pallets/ddc-staking/src/mock.rs | 18 ++++++++---------- pallets/ddc-staking/src/tests.rs | 8 ++++---- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 9c96aa000..041a719a3 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -91,18 +91,10 @@ impl pallet_timestamp::Config for Test { type WeightInfo = (); } -parameter_types! { - pub const BondingDuration: EraIndex = 10; - pub const DdcAccountsPalletId: PalletId = PalletId(*b"accounts"); -} - impl crate::pallet::Config for Test { - type BondingDuration = BondingDuration; type Currency = Balances; type RuntimeEvent = RuntimeEvent; - type UnixTime = Timestamp; type WeightInfo = (); - type StakersPayoutSource = DdcAccountsPalletId; type ClusterVisitor = TestClusterVisitor; } @@ -125,8 +117,14 @@ impl ClusterVisitor for TestClusterVisitor { fn get_chill_delay( _cluster_id: &ClusterId, _node_type: NodeType, - ) -> Result { - Ok(10) + ) -> Result { + Ok(T::BlockNumber::from(10u32)) + } + fn get_unbonding_delay( + _cluster_id: &ClusterId, + _node_type: NodeType, + ) -> Result { + Ok(T::BlockNumber::from(10u32)) } } pub struct ExtBuilder { diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index 7bc66787d..10f325b46 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -113,9 +113,9 @@ fn staking_should_work() { assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); // Removal is scheduled, stashed value of 4 is still lock. - let chilling = DdcStaking::current_era().unwrap() + - TestClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::CDN) - .unwrap_or(10_u32); + let chilling = System::block_number() + BlockNumber::from(10u64); + // TestClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::CDN) + // .unwrap_or(10_u64); assert_eq!( DdcStaking::ledger(&4), Some(StakingLedger { @@ -131,7 +131,7 @@ fn staking_should_work() { assert_ok!(Balances::reserve(&3, 409)); // Set `CurrentEra` to the value allows us to chill. - while DdcStaking::current_era().unwrap() < chilling { + while System::block_number() < chilling { System::set_block_number(System::block_number() + 1); Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); DdcStaking::on_finalize(System::block_number()); From f3f5f25d8b2e4a05194cc2ccc67bd256248501f6 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 8 Nov 2023 21:35:55 +0100 Subject: [PATCH 481/583] fix benchmarking for ddc-staking --- pallets/ddc-staking/src/benchmarking.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index 9e1f1510d..d682ec9c0 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -53,7 +53,7 @@ benchmarks! { let (stash, controller, _) = create_stash_controller_node::(0, 100)?; let amount = T::Currency::minimum_balance() * 5u32.into(); // Half of total DdcStaking::::unbond(RawOrigin::Signed(controller.clone()).into(), amount)?; - CurrentEra::::put(EraIndex::max_value()); + frame_system::Pallet::::set_block_number(T::BlockNumber::from(1000u32)); let ledger = Ledger::::get(&controller).ok_or("ledger not created before")?; let original_total: BalanceOf = ledger.total; whitelist_account!(controller); @@ -65,7 +65,7 @@ benchmarks! { } store { - let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultStorageBondSize::get())?; + let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(10u128).saturated_into::>())?; whitelist_account!(controller); }: _(RawOrigin::Signed(controller), ClusterId::from([1; 20])) @@ -74,7 +74,7 @@ benchmarks! { } serve { - let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultCDNBondSize::get())?; + let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(10u128).saturated_into::>())?; whitelist_account!(controller); }: _(RawOrigin::Signed(controller), ClusterId::from([1; 20])) @@ -86,12 +86,12 @@ benchmarks! { // clean up any existing state. clear_storages_and_cdns::(); - let (cdn_stash, cdn_controller, _) = create_stash_controller_node_with_balance::(0, T::DefaultCDNBondSize::get())?; + let (cdn_stash, cdn_controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(10u128).saturated_into::>())?; DdcStaking::::serve(RawOrigin::Signed(cdn_controller.clone()).into(), ClusterId::from([1; 20]))?; assert!(CDNs::::contains_key(&cdn_stash)); - CurrentEra::::put(1); + frame_system::Pallet::::set_block_number(T::BlockNumber::from(1u32)); DdcStaking::::chill(RawOrigin::Signed(cdn_controller.clone()).into())?; - CurrentEra::::put(1 + T::ClusterVisitor::get_chill_delay(ClusterId::from([1; 20]), NodeType::CDN)); + frame_system::Pallet::::set_block_number(T::BlockNumber::from(1u32) + T::ClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(T::BlockNumber::from(10u32))); whitelist_account!(cdn_controller); }: _(RawOrigin::Signed(cdn_controller)) From 03239aad5d2f3f5eecac8634a3473964a787308f Mon Sep 17 00:00:00 2001 From: Victor Genin Date: Thu, 9 Nov 2023 00:43:45 +0200 Subject: [PATCH 482/583] validation + node rewards --- pallets/ddc-payouts/src/lib.rs | 290 +++++++++++++++++++++++++++------ runtime/cere-dev/src/lib.rs | 1 + 2 files changed, 245 insertions(+), 46 deletions(-) diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index f647f7047..8f7aefa98 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -15,21 +15,62 @@ #![recursion_limit = "256"] use ddc_primitives::{ClusterId, DdcEra}; -use frame_support::{pallet_prelude::*, parameter_types, BoundedVec}; +use frame_support::{ + pallet_prelude::*, + parameter_types, + sp_runtime::SaturatedConversion, + traits::{Currency, ExistenceRequirement, LockableCurrency}, + BoundedBTreeSet, +}; use frame_system::pallet_prelude::*; pub use pallet::*; use sp_runtime::Perbill; -use sp_std::{ops::Mul, prelude::*}; +use sp_std::prelude::*; type BatchIndex = u16; +#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] +pub struct CustomerUsage { + pub transferred_bytes: u128, + pub stored_bytes: u128, + pub number_of_puts: u128, + pub number_of_gets: u128, +} + +#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] +pub struct NodeUsage { + pub transferred_bytes: u128, + pub stored_bytes: u128, + pub number_of_puts: u128, + pub number_of_gets: u128, +} + +#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] +pub struct NodeReward { + pub transfer: u128, + pub storage: u128, + pub puts: u128, + pub gets: u128, +} + +#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] +pub struct CustomerCharge { + pub transfer: u128, + pub storage: u128, + pub puts: u128, + pub gets: u128, +} + +/// The balance type of this pallet. +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + parameter_types! { pub MaxBatchesCount: u16 = 1000; } #[frame_support::pallet] pub mod pallet { - use super::*; use frame_support::PalletId; use sp_io::hashing::blake2_128; @@ -45,6 +86,8 @@ pub mod pallet { type RuntimeEvent: From> + IsType<::RuntimeEvent>; #[pallet::constant] type PalletId: Get; + + type Currency: LockableCurrency; } #[pallet::event] @@ -52,22 +95,27 @@ pub mod pallet { pub enum Event { BillingReportInitialized { cluster_id: ClusterId, era: DdcEra }, ChargingStarted { cluster_id: ClusterId, era: DdcEra }, + Charged { cluster_id: ClusterId, era: DdcEra, customer_id: T::AccountId, amount: u128 }, ChargingFinished { cluster_id: ClusterId, era: DdcEra }, RewardingStarted { cluster_id: ClusterId, era: DdcEra }, + Rewarded { cluster_id: ClusterId, era: DdcEra, node_id: T::AccountId, amount: u128 }, RewardingFinished { cluster_id: ClusterId, era: DdcEra }, BillingReportFinalized { cluster_id: ClusterId, era: DdcEra }, } #[pallet::error] + #[derive(PartialEq)] pub enum Error { BillingReportDoesNotExist, NotExpectedState, + Unauthorised, BatchIndexAlreadyProcessed, BatchIndexIsOutOfRange, BatchesMissed, NotDistributedBalance, BatchIndexOverflow, BoundedVecOverflow, + ArithmeticOverflow, } #[pallet::storage] @@ -82,19 +130,26 @@ pub mod pallet { ValueQuery, >; + #[pallet::storage] + #[pallet::getter(fn dac_account)] + pub type DACAccount = StorageValue<_, T::AccountId>; + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] #[scale_info(skip_type_params(T))] pub struct BillingReport { state: State, vault: T::AccountId, - total_balance: u128, - distributed_balance: u128, + dac_account: Option, + total_charged_balance: u128, + total_distributed_balance: u128, + total_node_expected_reward: NodeReward, + total_node_expected_usage: NodeUsage, // stage 1 charging_max_batch_index: BatchIndex, - charging_processed_batches: BoundedVec, + charging_processed_batches: BoundedBTreeSet, // stage 2 rewarding_max_batch_index: BatchIndex, - rewarding_processed_batches: BoundedVec, + rewarding_processed_batches: BoundedBTreeSet, } impl Default for BillingReport { @@ -102,12 +157,15 @@ pub mod pallet { Self { state: State::default(), vault: T::PalletId::get().into_account_truncating(), - total_balance: Zero::zero(), - distributed_balance: Zero::zero(), + dac_account: Option::None, + total_charged_balance: Zero::zero(), + total_distributed_balance: Zero::zero(), + total_node_expected_usage: NodeUsage::default(), + total_node_expected_reward: NodeReward::default(), charging_max_batch_index: Zero::zero(), - charging_processed_batches: BoundedVec::default(), + charging_processed_batches: BoundedBTreeSet::default(), rewarding_max_batch_index: Zero::zero(), - rewarding_processed_batches: BoundedVec::default(), + rewarding_processed_batches: BoundedBTreeSet::default(), } } } @@ -132,7 +190,11 @@ pub mod pallet { cluster_id: ClusterId, era: DdcEra, ) -> DispatchResult { - ensure_signed(origin)?; // todo: check that the caller is DAC account + let caller = ensure_signed(origin)?; + ensure!( + Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Error::::Unauthorised + ); let mut billing_report = BillingReport::default(); billing_report.vault = Self::sub_account_id(cluster_id.clone(), era); @@ -151,7 +213,11 @@ pub mod pallet { era: DdcEra, max_batch_index: BatchIndex, ) -> DispatchResult { - ensure_signed(origin)?; + let caller = ensure_signed(origin)?; + ensure!( + Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Error::::Unauthorised + ); ensure!( max_batch_index > 0 && max_batch_index < MaxBatchesCount::get(), @@ -178,9 +244,13 @@ pub mod pallet { cluster_id: ClusterId, era: DdcEra, batch_index: BatchIndex, - payers: Vec<(T::AccountId, u128)>, + payers: Vec<(T::AccountId, CustomerUsage)>, ) -> DispatchResult { - ensure_signed(origin)?; + let caller = ensure_signed(origin)?; + ensure!( + Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Error::::Unauthorised + ); let billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) .map_err(|_| Error::::BillingReportDoesNotExist)?; @@ -197,14 +267,31 @@ pub mod pallet { let mut updated_billing_report = billing_report.clone(); for payer in payers { - let _customer = payer.0; // todo: charge customer - let amount = payer.1; - updated_billing_report.total_balance += amount; + let customer_charge = + get_customer_charge(&payer.1).ok_or(Error::::ArithmeticOverflow)?; + let amount = (|| -> Option { + customer_charge + .transfer + .checked_add(customer_charge.storage)? + .checked_add(customer_charge.puts)? + .checked_add(customer_charge.gets) + })() + .ok_or(Error::::ArithmeticOverflow)?; + + // todo: charge customer + let customer_id = payer.0; + + updated_billing_report + .total_charged_balance + .checked_add(amount) + .ok_or(Error::::ArithmeticOverflow)?; + + Self::deposit_event(Event::::Charged { cluster_id, era, customer_id, amount }); } updated_billing_report .charging_processed_batches - .try_push(batch_index) + .try_insert(batch_index) .map_err(|_| Error::::BoundedVecOverflow)?; ActiveBillingReports::::insert(cluster_id, era, updated_billing_report); @@ -218,17 +305,20 @@ pub mod pallet { cluster_id: ClusterId, era: DdcEra, ) -> DispatchResult { - ensure_signed(origin)?; + let caller = ensure_signed(origin)?; + ensure!( + Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Error::::Unauthorised + ); let mut billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) .map_err(|_| Error::::BillingReportDoesNotExist)?; ensure!(billing_report.state == State::ChargingCustomers, Error::::NotExpectedState); - ensure!( - billing_report.charging_max_batch_index as usize == - billing_report.charging_processed_batches.len() - 1usize, - Error::::BatchesMissed - ); + validate_batches::( + &billing_report.charging_processed_batches, + &billing_report.charging_max_batch_index, + )?; billing_report.state = State::CustomersCharged; ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); @@ -244,8 +334,13 @@ pub mod pallet { cluster_id: ClusterId, era: DdcEra, max_batch_index: BatchIndex, + total_node_usage: NodeUsage, ) -> DispatchResult { - ensure_signed(origin)?; + let caller = ensure_signed(origin)?; + ensure!( + Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Error::::Unauthorised + ); ensure!( max_batch_index > 0 && max_batch_index < MaxBatchesCount::get(), @@ -257,7 +352,12 @@ pub mod pallet { ensure!(billing_report.state == State::CustomersCharged, Error::::NotExpectedState); + let total = + get_total_usage_reward(&total_node_usage).ok_or(Error::::ArithmeticOverflow)?; + + billing_report.total_node_expected_usage = total_node_usage; billing_report.rewarding_max_batch_index = max_batch_index; + billing_report.total_node_expected_reward = total; billing_report.state = State::RewardingProviders; ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); @@ -272,9 +372,13 @@ pub mod pallet { cluster_id: ClusterId, era: DdcEra, batch_index: BatchIndex, - payees: Vec<(T::AccountId, Perbill)>, + payees: Vec<(T::AccountId, NodeUsage)>, ) -> DispatchResult { - ensure_signed(origin)?; + let caller = ensure_signed(origin)?; + ensure!( + Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Error::::Unauthorised + ); let billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) .map_err(|_| Error::::BillingReportDoesNotExist)?; @@ -294,15 +398,41 @@ pub mod pallet { let mut updated_billing_report = billing_report.clone(); for payee in payees { - let _provider = payee.0; // todo: reward provider - let share = payee.1; - let amount = share.mul(billing_report.total_balance); - updated_billing_report.distributed_balance += amount; + let node_reward = get_node_reward( + &payee.1, + &billing_report.total_node_expected_usage, + &billing_report.total_node_expected_reward, + ); + let amount = (|| -> Option { + node_reward + .transfer + .checked_add(node_reward.storage)? + .checked_add(node_reward.puts)? + .checked_add(node_reward.gets) + })() + .ok_or(Error::::ArithmeticOverflow)?; + + let node_id = payee.0; + let charge: BalanceOf = amount.saturated_into::>(); + + ::Currency::transfer( + &updated_billing_report.vault, + &node_id, + charge, + ExistenceRequirement::KeepAlive, + )?; + + updated_billing_report + .total_distributed_balance + .checked_add(amount) + .ok_or(Error::::ArithmeticOverflow)?; + + Self::deposit_event(Event::::Rewarded { cluster_id, era, node_id, amount }); } updated_billing_report .rewarding_processed_batches - .try_push(batch_index) + .try_insert(batch_index) .map_err(|_| Error::::BoundedVecOverflow)?; ActiveBillingReports::::insert(cluster_id, era, updated_billing_report); @@ -316,7 +446,11 @@ pub mod pallet { cluster_id: ClusterId, era: DdcEra, ) -> DispatchResult { - ensure_signed(origin)?; + let caller = ensure_signed(origin)?; + ensure!( + Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Error::::Unauthorised + ); let mut billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) .map_err(|_| Error::::BillingReportDoesNotExist)?; @@ -325,11 +459,11 @@ pub mod pallet { billing_report.state == State::RewardingProviders, Error::::NotExpectedState ); - ensure!( - billing_report.rewarding_max_batch_index as usize == - billing_report.rewarding_processed_batches.len() - 1usize, - Error::::BatchesMissed - ); + + validate_batches::( + &billing_report.rewarding_processed_batches, + &billing_report.rewarding_max_batch_index, + )?; billing_report.state = State::ProvidersRewarded; ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); @@ -345,27 +479,91 @@ pub mod pallet { cluster_id: ClusterId, era: DdcEra, ) -> DispatchResult { - ensure_signed(origin)?; + let caller = ensure_signed(origin)?; + ensure!( + Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Error::::Unauthorised + ); - let mut billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + let billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) .map_err(|_| Error::::BillingReportDoesNotExist)?; ensure!(billing_report.state == State::ProvidersRewarded, Error::::NotExpectedState); ensure!( - billing_report.total_balance == billing_report.distributed_balance, + billing_report.total_charged_balance == billing_report.total_distributed_balance, Error::::NotDistributedBalance ); - billing_report.state = State::Finalized; - // todo: clear and archive billing_report - ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); - + ActiveBillingReports::::remove(cluster_id.clone(), era); Self::deposit_event(Event::::BillingReportFinalized { cluster_id, era }); Ok(()) } } + fn get_node_reward( + node_usage: &NodeUsage, + total_usage: &NodeUsage, + total_reward: &NodeReward, + ) -> NodeReward { + let mut node_reward = NodeReward::default(); + + let mut ratio = + Perbill::from_rational(node_usage.transferred_bytes, total_usage.transferred_bytes); + node_reward.transfer = (ratio * total_reward.transfer) as u128; + + ratio = Perbill::from_rational(node_usage.stored_bytes, total_usage.stored_bytes); + node_reward.storage = (ratio * total_reward.storage) as u128; + + ratio = Perbill::from_rational(node_usage.number_of_puts, total_usage.number_of_puts); + node_reward.puts = (ratio * total_reward.puts) as u128; + + ratio = Perbill::from_rational(node_usage.number_of_gets, total_usage.number_of_gets); + node_reward.gets = (ratio * total_reward.gets) as u128; + + node_reward + } + + // todo: to calculate actual charge based on the metrics + fn get_total_usage_reward(total_usage: &NodeUsage) -> Option { + let mut total = NodeReward::default(); + + total.transfer = 1; + total.storage = 2; + total.puts = 3; + total.gets = 4; + + Option::Some(total) + } + + // todo: to calculate actual charge based on the metrics + fn get_customer_charge(usage: &CustomerUsage) -> Option { + let mut total = CustomerCharge::default(); + + total.transfer = 1; + total.storage = 2; + total.puts = 3; + total.gets = 4; + + Option::Some(total) + } + + fn validate_batches( + batches: &BoundedBTreeSet, + max_batch_index: &BatchIndex, + ) -> DispatchResult { + // Check if the Vec contains all integers between 1 and rewarding_max_batch_index + ensure!(!batches.is_empty(), Error::::BatchesMissed); + + ensure!(*max_batch_index as usize == batches.len() - 1usize, Error::::BatchesMissed); + + for index in 0..*max_batch_index { + ensure!(batches.contains(&index), Error::::BatchesMissed); + } + + Ok(()) + } + impl Pallet { fn account_id() -> T::AccountId { T::PalletId::get().into_account_truncating() diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 886ea9f25..4a2f02f63 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1381,6 +1381,7 @@ parameter_types! { impl pallet_ddc_payouts::Config for Runtime { type RuntimeEvent = RuntimeEvent; type PalletId = PayoutsPalletId; + type Currency = Balances; } construct_runtime!( From c04b7be99e73f6d8d2d6c6f7b6a7977994a273b9 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Wed, 8 Nov 2023 23:58:28 +0100 Subject: [PATCH 483/583] chore: unused parameters removed --- runtime/cere-dev/src/lib.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 6b2e35137..810c26d37 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -77,7 +77,6 @@ use sp_runtime::{ transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedPointNumber, FixedU128, Perbill, Percent, Permill, Perquintill, }; -use sp_staking::EraIndex; use sp_std::prelude::*; #[cfg(any(feature = "std", test))] use sp_version::NativeVersion; @@ -1316,13 +1315,6 @@ impl pallet_ddc_metrics_offchain_worker::Config for Runtime { type RuntimeCall = RuntimeCall; } -parameter_types! { - pub const DefaultCDNBondSize: Balance = 100 * DOLLARS; - pub const DefaultCDNChillDelay: EraIndex = 7 * 24 * 60 / 2; // approx. 1 week with 2 min DDC era - pub const DefaultStorageBondSize: Balance = 100 * DOLLARS; - pub const DefaultStorageChillDelay: EraIndex = 7 * 24 * 60 / 2; // approx. 1 week with 2 min DDC era -} - impl pallet_ddc_staking::Config for Runtime { type Currency = Balances; type RuntimeEvent = RuntimeEvent; From 465f752ae492d112707b5c4a63b7f1dcc5885eb6 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Thu, 9 Nov 2023 01:40:19 +0100 Subject: [PATCH 484/583] feat: cluster missing parameters added --- pallets/ddc-clusters/src/cluster.rs | 18 ++++-------------- pallets/ddc-clusters/src/lib.rs | 26 +++++++++++++++++--------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index 7274fbf16..fa50f2411 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -1,11 +1,10 @@ use crate::pallet::Error; use codec::{Decode, Encode}; use ddc_primitives::ClusterId; -use frame_support::{pallet_prelude::*, parameter_types, BoundedVec}; +use frame_support::{pallet_prelude::*, parameter_types}; use scale_info::TypeInfo; use sp_runtime::Perbill; use sp_staking::EraIndex; -use sp_std::vec::Vec; parameter_types! { pub MaxClusterParamsLen: u16 = 2048; @@ -15,21 +14,18 @@ parameter_types! { pub struct Cluster { pub cluster_id: ClusterId, pub manager_id: AccountId, + pub reserve_id: AccountId, pub props: ClusterProps, } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct ClusterProps { - // this is a temporal way of storing cluster parameters as a stringified json, - // should be replaced with specific properties for cluster - pub params: BoundedVec, pub node_provider_auth_contract: AccountId, } // ClusterParams includes Governance non-sensetive parameters only #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct ClusterParams { - pub params: Vec, pub node_provider_auth_contract: AccountId, } @@ -57,16 +53,14 @@ impl Cluster { pub fn new( cluster_id: ClusterId, manager_id: AccountId, + reserve_id: AccountId, cluster_params: ClusterParams, ) -> Result, ClusterError> { Ok(Cluster { cluster_id, manager_id, + reserve_id, props: ClusterProps { - params: match cluster_params.params.try_into() { - Ok(vec) => vec, - Err(_) => return Err(ClusterError::ClusterParamsExceedsLimit), - }, node_provider_auth_contract: cluster_params.node_provider_auth_contract, }, }) @@ -77,10 +71,6 @@ impl Cluster { cluster_params: ClusterParams, ) -> Result<(), ClusterError> { self.props = ClusterProps { - params: match cluster_params.params.try_into() { - Ok(vec) => vec, - Err(_) => return Err(ClusterError::ClusterParamsExceedsLimit), - }, node_provider_auth_contract: cluster_params.node_provider_auth_contract, }; Ok(()) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 6a7c0549b..b927958e1 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -118,14 +118,25 @@ pub mod pallet { pub fn create_cluster( origin: OriginFor, cluster_id: ClusterId, + cluster_manager_id: T::AccountId, + cluster_reserve_id: T::AccountId, cluster_params: ClusterParams, + cluster_gov_params: ClusterGovParams>, ) -> DispatchResult { - let caller_id = ensure_signed(origin)?; - let cluster = Cluster::new(cluster_id.clone(), caller_id, cluster_params) - .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; + ensure_root(origin)?; // requires Governance approval + let cluster = Cluster::new( + cluster_id.clone(), + cluster_manager_id, + cluster_reserve_id, + cluster_params, + ) + .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); + Clusters::::insert(cluster_id.clone(), cluster); + ClustersGovParams::::insert(cluster_id.clone(), cluster_gov_params); Self::deposit_event(Event::::ClusterCreated { cluster_id }); + Ok(()) } @@ -220,17 +231,16 @@ pub mod pallet { Ok(()) } - // Sets Governance sensetive parameters + // Requires Governance approval #[pallet::weight(10_000)] pub fn set_cluster_gov_params( origin: OriginFor, cluster_id: ClusterId, cluster_gov_params: ClusterGovParams>, ) -> DispatchResult { - let caller_id = ensure_signed(origin)?; - let cluster = + ensure_root(origin)?; // requires Governance approval + let _cluster = Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; - ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); ClustersGovParams::::insert(cluster_id.clone(), cluster_gov_params); Self::deposit_event(Event::::ClusterGovParamsSet { cluster_id }); @@ -253,8 +263,6 @@ pub mod pallet { cluster_id: &ClusterId, node_type: NodeType, ) -> Result { - // ensure!(ClustersNodes::::contains_key(cluster_id), - // Error::::ClusterDoesNotExist); let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; match node_type { From 172ae13337aae4f79e86a1be7f491546b0486bfd Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Thu, 9 Nov 2023 19:20:46 +0100 Subject: [PATCH 485/583] add tests for ddc-node --- pallets/ddc-nodes/Cargo.toml | 2 + pallets/ddc-nodes/src/lib.rs | 5 + pallets/ddc-nodes/src/mock.rs | 114 ++++++++++++++++++++ pallets/ddc-nodes/src/tests.rs | 183 +++++++++++++++++++++++++++++++++ 4 files changed, 304 insertions(+) create mode 100644 pallets/ddc-nodes/src/mock.rs create mode 100644 pallets/ddc-nodes/src/tests.rs diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index 607ab47fa..f3cc63163 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -18,6 +18,8 @@ sp-std = { version = "4.0.0-dev", default-features = false, git = "https://githu sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } [dev-dependencies] +pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index f0e881f7f..5dc0766ce 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -14,6 +14,11 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] +#[cfg(test)] +pub(crate) mod mock; +#[cfg(test)] +mod tests; + use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey, StorageNodePubKey}; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; diff --git a/pallets/ddc-nodes/src/mock.rs b/pallets/ddc-nodes/src/mock.rs new file mode 100644 index 000000000..8a8002c0c --- /dev/null +++ b/pallets/ddc-nodes/src/mock.rs @@ -0,0 +1,114 @@ +//! Test utilities + +#![allow(dead_code)] + +use crate::{self as pallet_ddc_nodes, *}; +use frame_support::{ + construct_runtime, parameter_types, + traits::{ConstU32, ConstU64, Everything}, + weights::constants::RocksDbWeight, +}; +use frame_system::mocking::{MockBlock, MockUncheckedExtrinsic}; +use sp_core::H256; +use sp_io::TestExternalities; +use sp_runtime::{ + testing::Header, + traits::{BlakeTwo256, IdentityLookup}, +}; + +/// The AccountId alias in this test module. +pub(crate) type AccountId = u64; +pub(crate) type AccountIndex = u64; +pub(crate) type BlockNumber = u64; +pub(crate) type Balance = u128; + +type UncheckedExtrinsic = MockUncheckedExtrinsic; +type Block = MockBlock; + +construct_runtime!( + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + DdcNodes: pallet_ddc_nodes::{Pallet, Call, Storage, Event}, + } +); + +parameter_types! { + pub static ExistentialDeposit: Balance = 1; +} + +impl frame_system::Config for Test { + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type DbWeight = RocksDbWeight; + type RuntimeOrigin = RuntimeOrigin; + type Index = AccountIndex; + type BlockNumber = BlockNumber; + type RuntimeCall = RuntimeCall; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = ConstU64<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = ConstU32<16>; +} + +impl pallet_balances::Config for Test { + type MaxLocks = ConstU32<1024>; + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); +} + +impl pallet_timestamp::Config for Test { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = ConstU64<5>; + type WeightInfo = (); +} + +impl crate::pallet::Config for Test { + type RuntimeEvent = RuntimeEvent; +} + +pub(crate) type TestRuntimeCall = ::RuntimeCall; + +pub struct ExtBuilder; + +impl ExtBuilder { + fn build(self) -> TestExternalities { + sp_tracing::try_init_simple(); + let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); + + let _ = pallet_balances::GenesisConfig:: { balances: vec![(1, 100), (2, 100)] } + .assimilate_storage(&mut storage); + + TestExternalities::new(storage) + } + pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + sp_tracing::try_init_simple(); + let mut ext = self.build(); + ext.execute_with(test); + } +} diff --git a/pallets/ddc-nodes/src/tests.rs b/pallets/ddc-nodes/src/tests.rs new file mode 100644 index 000000000..9cbdc526c --- /dev/null +++ b/pallets/ddc-nodes/src/tests.rs @@ -0,0 +1,183 @@ +//! Tests for the module. + +use super::{mock::*, *}; +use crate::{cdn_node::CDNNodeParams, storage_node::StorageNodeParams}; +use ddc_primitives::NodePubKey; +use frame_support::{assert_noop, assert_ok}; +use sp_runtime::AccountId32; + +#[test] +fn create_node_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + let bytes = [0u8; 32]; + let node_pub_key = AccountId32::from(bytes); + let cdn_node_params = CDNNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + + // Node params are not valid + assert_noop!( + DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::StorageParams(StorageNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }) + ), + Error::::InvalidNodeParams + ); + + // Node created + assert_ok!(DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::CDNParams(cdn_node_params.clone()) + )); + + // Node already exists + assert_noop!( + DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::CDNParams(cdn_node_params) + ), + Error::::NodeAlreadyExists + ); + + // Checking that event was emitted + assert_eq!(System::events().len(), 1); + System::assert_last_event( + Event::NodeCreated { node_pub_key: NodePubKey::CDNPubKey(node_pub_key) }.into(), + ) + }) +} + +#[test] +fn set_node_params_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + let bytes = [0u8; 32]; + let node_pub_key = AccountId32::from(bytes); + let storage_node_params = StorageNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + let cdn_node_params = CDNNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + + // Node doesn't exist + assert_noop!( + DdcNodes::set_node_params( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::CDNParams(cdn_node_params.clone()) + ), + Error::::NodeDoesNotExist + ); + + // Node created + assert_ok!(DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::CDNParams(cdn_node_params.clone()) + )); + + // Set node params + assert_ok!(DdcNodes::set_node_params( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::CDNParams(cdn_node_params.clone()) + )); + + // Node params are not valid + assert_noop!( + DdcNodes::set_node_params( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::StorageParams(storage_node_params) + ), + Error::::InvalidNodeParams + ); + + // Only node provider can set params + assert_noop!( + DdcNodes::set_node_params( + RuntimeOrigin::signed(2), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::CDNParams(cdn_node_params.clone()) + ), + Error::::OnlyNodeProvider + ); + + // Checking that event was emitted + assert_eq!(System::events().len(), 2); + System::assert_last_event( + Event::NodeParamsChanged { node_pub_key: NodePubKey::CDNPubKey(node_pub_key) }.into(), + ) + }) +} + +#[test] +fn set_delete_node_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + let bytes = [0u8; 32]; + let node_pub_key = AccountId32::from(bytes); + let cdn_node_params = CDNNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + + // Node doesn't exist + assert_noop!( + DdcNodes::delete_node( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()) + ), + Error::::NodeDoesNotExist + ); + + // Create node + assert_ok!(DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::CDNParams(cdn_node_params.clone()) + )); + + // Only node provider can delete + assert_noop!( + DdcNodes::delete_node( + RuntimeOrigin::signed(2), + NodePubKey::CDNPubKey(node_pub_key.clone()) + ), + Error::::OnlyNodeProvider + ); + + // Delete node + assert_ok!(DdcNodes::delete_node( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()), + )); + + // Checking that event was emitted + assert_eq!(System::events().len(), 2); + System::assert_last_event( + Event::NodeDeleted { node_pub_key: NodePubKey::CDNPubKey(node_pub_key) }.into(), + ) + }) +} From 246360ce1dc1bfbe57463465622e03d08a46df1c Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Thu, 9 Nov 2023 21:20:23 +0100 Subject: [PATCH 486/583] feat: checking node cluster_id while node provider chilling --- Cargo.lock | 1 + pallets/ddc-nodes/Cargo.toml | 1 + pallets/ddc-nodes/src/lib.rs | 11 +++++++++ pallets/ddc-staking/src/lib.rs | 45 ++++++++++++++++++++++++++++------ runtime/cere-dev/src/lib.rs | 1 + traits/src/lib.rs | 1 + traits/src/node.rs | 10 ++++++++ 7 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 traits/src/node.rs diff --git a/Cargo.lock b/Cargo.lock index 6059b927b..149864ce3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4983,6 +4983,7 @@ name = "pallet-ddc-nodes" version = "4.8.1" dependencies = [ "ddc-primitives", + "ddc-traits", "frame-benchmarking", "frame-support", "frame-system", diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index 607ab47fa..65f5d098b 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } +ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index f0e881f7f..6da1c7076 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -15,6 +15,7 @@ #![recursion_limit = "256"] use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey, StorageNodePubKey}; +use ddc_traits::node::{NodeVisitor, NodeVisitorError}; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; use sp_std::prelude::*; @@ -209,4 +210,14 @@ pub mod pallet { } } } + + impl NodeVisitor for Pallet { + fn get_cluster_id( + node_pub_key: &NodePubKey, + ) -> Result, NodeVisitorError> { + let node = + Self::get(node_pub_key.clone()).map_err(|_| NodeVisitorError::NodeDoesNotExist)?; + Ok(*node.get_cluster_id()) + } + } } diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index fbc82d69b..3c00316c0 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -32,6 +32,7 @@ use codec::{Decode, Encode, HasCompact}; pub use ddc_primitives::{ClusterId, NodePubKey, NodeType}; use ddc_traits::{ cluster::{ClusterVisitor, ClusterVisitorError}, + node::NodeVisitor, staking::{StakingVisitor, StakingVisitorError}, }; @@ -157,6 +158,8 @@ pub mod pallet { type WeightInfo: WeightInfo; type ClusterVisitor: ClusterVisitor; + + type NodeVisitor: NodeVisitor; } /// Map from all locked "stash" accounts to the controller account. @@ -187,6 +190,11 @@ pub mod pallet { #[pallet::getter(fn nodes)] pub type Nodes = StorageMap<_, Twox64Concat, NodePubKey, T::AccountId>; + /// Map from operator stash account to DDC node ID. + #[pallet::storage] + #[pallet::getter(fn providers)] + pub type Providers = StorageMap<_, Twox64Concat, T::AccountId, NodePubKey>; + #[pallet::genesis_config] pub struct GenesisConfig { pub cdns: Vec<(T::AccountId, T::AccountId, NodePubKey, BalanceOf, ClusterId)>, @@ -330,13 +338,14 @@ pub mod pallet { } // Reject a bond with a known DDC node. - if Nodes::::contains_key(&node) { + if Nodes::::contains_key(&node) || Providers::::contains_key(&stash) { Err(Error::::AlreadyPaired)? } frame_system::Pallet::::inc_consumers(&stash).map_err(|_| Error::::BadState)?; Nodes::::insert(&node, &stash); + Providers::::insert(&stash, &node); // You're auto-bonded forever, here. We might improve this by only bonding when // you actually store/serve and remove once you unbond __everything__. @@ -423,7 +432,27 @@ pub mod pallet { T::ClusterVisitor::get_unbonding_delay(&cluster_id, NodeType::Storage) .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))? } else { - T::BlockNumber::from(100_00u32) + let node_pub_key = + >::get(&ledger.stash).ok_or(Error::::BadState)?; + + match T::NodeVisitor::get_cluster_id(&node_pub_key) { + // If node is chilling within some cluster, the unbonding period should be + // set according to the cluster's settings + Ok(Some(cluster_id)) => match node_pub_key { + NodePubKey::CDNPubKey(_) => + T::ClusterVisitor::get_unbonding_delay(&cluster_id, NodeType::CDN) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?, + NodePubKey::StoragePubKey(_) => T::ClusterVisitor::get_unbonding_delay( + &cluster_id, + NodeType::Storage, + ) + .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?, + }, + // If node is not a member of any cluster, allow immediate unbonding. + // It is possible if node provider hasn't called 'store/serve' yet, or after + // the 'fast_chill' and subsequent 'chill' calls. + _ => T::BlockNumber::from(0u32), + } }; let block = >::block_number() + unbonding_delay_in_blocks; @@ -679,7 +708,8 @@ pub mod pallet { ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); - >::insert(new_node, stash); + >::insert(new_node.clone(), stash.clone()); + >::insert(stash, new_node); Ok(()) } @@ -688,10 +718,11 @@ pub mod pallet { /// /// The dispatch origin for this call must be _Signed_ by the controller. #[pallet::weight(10_000)] - pub fn fast_chill(origin: OriginFor, node_pub_key: NodePubKey) -> DispatchResult { + pub fn fast_chill(origin: OriginFor) -> DispatchResult { let controller = ensure_signed(origin)?; let stash = >::get(&controller).ok_or(Error::::NotController)?.stash; + let node_pub_key = >::get(&stash).ok_or(Error::::BadState)?; let node_stash = >::get(&node_pub_key).ok_or(Error::::BadState)?; ensure!(stash == node_stash, Error::::NotNodeController); @@ -764,9 +795,9 @@ pub mod pallet { >::remove(stash); >::remove(&controller); - if let Some((node, _)) = >::iter().find(|(_, v)| v == stash) { - >::remove(node); - } + if let Some(node_pub_key) = >::take(stash) { + >::remove(node_pub_key); + }; Self::do_remove_storage(stash); Self::do_remove_cdn(stash); diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 810c26d37..83331e687 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1320,6 +1320,7 @@ impl pallet_ddc_staking::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; type ClusterVisitor = pallet_ddc_clusters::Pallet; + type NodeVisitor = pallet_ddc_nodes::Pallet; } parameter_types! { diff --git a/traits/src/lib.rs b/traits/src/lib.rs index f6eb2b0a4..35d286602 100644 --- a/traits/src/lib.rs +++ b/traits/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(not(feature = "std"), no_std)] pub mod cluster; +pub mod node; pub mod staking; diff --git a/traits/src/node.rs b/traits/src/node.rs new file mode 100644 index 000000000..af22b5a8b --- /dev/null +++ b/traits/src/node.rs @@ -0,0 +1,10 @@ +use ddc_primitives::{ClusterId, NodePubKey}; +use frame_system::Config; + +pub trait NodeVisitor { + fn get_cluster_id(node_pub_key: &NodePubKey) -> Result, NodeVisitorError>; +} + +pub enum NodeVisitorError { + NodeDoesNotExist, +} From 0f8b9b34877eae8a62896981cd77b8d9517c117d Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Thu, 9 Nov 2023 21:24:25 +0100 Subject: [PATCH 487/583] chore: version bump --- runtime/cere-dev/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 83331e687..7e8be086a 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -129,7 +129,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: 48012, + spec_version: 48013, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, From ab6ee75a9437576a4a80ff60cc9fbdbd4d0b388f Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Thu, 9 Nov 2023 22:36:21 +0100 Subject: [PATCH 488/583] fix: test compilation error is fixed --- pallets/ddc-staking/src/mock.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 041a719a3..c76b90dcb 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -4,7 +4,11 @@ use crate::{self as pallet_ddc_staking, *}; use ddc_primitives::{CDNNodePubKey, StorageNodePubKey}; -use ddc_traits::cluster::{ClusterVisitor, ClusterVisitorError}; +use ddc_traits::{ + cluster::{ClusterVisitor, ClusterVisitorError}, + node::{NodeVisitor, NodeVisitorError}, +}; + use frame_support::{ construct_runtime, traits::{ConstU32, ConstU64, Everything, GenesisBuild}, @@ -96,6 +100,7 @@ impl crate::pallet::Config for Test { type RuntimeEvent = RuntimeEvent; type WeightInfo = (); type ClusterVisitor = TestClusterVisitor; + type NodeVisitor = TestNodeVisitor; } pub(crate) type DdcStakingCall = crate::Call; @@ -127,6 +132,14 @@ impl ClusterVisitor for TestClusterVisitor { Ok(T::BlockNumber::from(10u32)) } } + +pub struct TestNodeVisitor; +impl NodeVisitor for TestNodeVisitor { + fn get_cluster_id(_node_pub_key: &NodePubKey) -> Result, NodeVisitorError> { + Ok(None) + } +} + pub struct ExtBuilder { has_cdns: bool, has_storages: bool, From 894f0fd11f1fe308ecb6196a1fe2438007a1d106 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Fri, 10 Nov 2023 12:40:08 +0300 Subject: [PATCH 489/583] Rerun cargo clippy fix --- .github/workflows/check.yaml | 2 +- pallets/ddc-clusters/src/lib.rs | 50 +++++++--------- pallets/ddc-customers/src/lib.rs | 4 +- pallets/ddc-nodes/src/lib.rs | 18 +++--- pallets/ddc-staking/src/lib.rs | 47 +++++++-------- pallets/ddc-staking/src/tests.rs | 10 ++-- pallets/ddc-staking/src/weights.rs | 96 +++++++++++++++--------------- runtime/cere-dev/src/lib.rs | 28 ++++----- runtime/cere/src/lib.rs | 28 ++++----- 9 files changed, 134 insertions(+), 149 deletions(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 27070bd99..1ecb04c4b 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -37,7 +37,7 @@ jobs: - name: Check with Clippy run: | - cargo clippy --all --all-targets -- -D warnings + cargo clippy --no-deps --all-targets --features runtime-benchmarks --workspace -- --deny warnings - name: Check Build run: | diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index cb4aafb7b..55d668f69 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -16,7 +16,7 @@ #![feature(is_some_and)] // ToDo: delete at rustc > 1.70 use crate::{ - cluster::{Cluster, ClusterError, ClusterGovParams, ClusterParams}, + cluster::{Cluster, ClusterGovParams, ClusterParams}, node_provider_auth::{NodeProviderAuthContract, NodeProviderAuthContractError}, }; use ddc_primitives::{ClusterId, NodePubKey, NodeType}; @@ -124,17 +124,13 @@ pub mod pallet { cluster_gov_params: ClusterGovParams, T::BlockNumber>, ) -> DispatchResult { ensure_root(origin)?; // requires Governance approval - let cluster = Cluster::new( - cluster_id.clone(), - cluster_manager_id, - cluster_reserve_id, - cluster_params, - ) - .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; - ensure!(!Clusters::::contains_key(&cluster_id), Error::::ClusterAlreadyExists); - - Clusters::::insert(cluster_id.clone(), cluster); - ClustersGovParams::::insert(cluster_id.clone(), cluster_gov_params); + let cluster = + Cluster::new(cluster_id, cluster_manager_id, cluster_reserve_id, cluster_params) + .map_err(Into::>::into)?; + ensure!(!Clusters::::contains_key(cluster_id), Error::::ClusterAlreadyExists); + + Clusters::::insert(cluster_id, cluster); + ClustersGovParams::::insert(cluster_id, cluster_gov_params); Self::deposit_event(Event::::ClusterCreated { cluster_id }); Ok(()) @@ -148,7 +144,7 @@ pub mod pallet { ) -> DispatchResult { let caller_id = ensure_signed(origin)?; let cluster = - Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; + Clusters::::try_get(cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); // Node with this node with this public key exists. @@ -158,12 +154,12 @@ pub mod pallet { // Sufficient funds are locked at the DDC Staking module. let has_stake = T::StakingVisitor::node_has_stake(&node_pub_key, &cluster_id) - .map_err(|e| Into::>::into(StakingVisitorError::from(e)))?; + .map_err(Into::>::into)?; ensure!(has_stake, Error::::NodeHasNoStake); // Candidate is not planning to pause operations any time soon. let is_chilling = T::StakingVisitor::node_is_chilling(&node_pub_key) - .map_err(|e| Into::>::into(StakingVisitorError::from(e)))?; + .map_err(Into::>::into)?; ensure!(!is_chilling, Error::::NodeChillingIsProhibited); // Cluster extension smart contract allows joining. @@ -177,13 +173,13 @@ pub mod pallet { node.get_pub_key().to_owned(), node.get_type(), ) - .map_err(|e| Into::>::into(NodeProviderAuthContractError::from(e)))?; + .map_err(Into::>::into)?; ensure!(is_authorized, Error::::NodeIsNotAuthorized); // Add node to the cluster. - node.set_cluster_id(Some(cluster_id.clone())); + node.set_cluster_id(Some(cluster_id)); T::NodeRepository::update(node).map_err(|_| Error::::AttemptToAddNonExistentNode)?; - ClustersNodes::::insert(cluster_id.clone(), node_pub_key.clone(), true); + ClustersNodes::::insert(cluster_id, node_pub_key.clone(), true); Self::deposit_event(Event::::ClusterNodeAdded { cluster_id, node_pub_key }); Ok(()) @@ -197,7 +193,7 @@ pub mod pallet { ) -> DispatchResult { let caller_id = ensure_signed(origin)?; let cluster = - Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; + Clusters::::try_get(cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); let mut node = T::NodeRepository::get(node_pub_key.clone()) .map_err(|_| Error::::AttemptToRemoveNonExistentNode)?; @@ -205,7 +201,7 @@ pub mod pallet { node.set_cluster_id(None); T::NodeRepository::update(node) .map_err(|_| Error::::AttemptToRemoveNonExistentNode)?; - ClustersNodes::::remove(cluster_id.clone(), node_pub_key.clone()); + ClustersNodes::::remove(cluster_id, node_pub_key.clone()); Self::deposit_event(Event::::ClusterNodeRemoved { cluster_id, node_pub_key }); Ok(()) @@ -220,12 +216,10 @@ pub mod pallet { ) -> DispatchResult { let caller_id = ensure_signed(origin)?; let mut cluster = - Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; + Clusters::::try_get(cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); - cluster - .set_params(cluster_params) - .map_err(|e: ClusterError| Into::>::into(ClusterError::from(e)))?; - Clusters::::insert(cluster_id.clone(), cluster); + cluster.set_params(cluster_params).map_err(Into::>::into)?; + Clusters::::insert(cluster_id, cluster); Self::deposit_event(Event::::ClusterParamsSet { cluster_id }); Ok(()) @@ -240,8 +234,8 @@ pub mod pallet { ) -> DispatchResult { ensure_root(origin)?; // requires Governance approval let _cluster = - Clusters::::try_get(&cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; - ClustersGovParams::::insert(cluster_id.clone(), cluster_gov_params); + Clusters::::try_get(cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; + ClustersGovParams::::insert(cluster_id, cluster_gov_params); Self::deposit_event(Event::::ClusterGovParamsSet { cluster_id }); Ok(()) @@ -254,7 +248,7 @@ pub mod pallet { } fn ensure_cluster(cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { - Clusters::::get(&cluster_id) + Clusters::::get(cluster_id) .map(|_| ()) .ok_or(ClusterVisitorError::ClusterDoesNotExist) } diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index d544ced22..f807f0985 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -333,7 +333,7 @@ pub mod pallet { Self::update_ledger_and_deposit(&owner, &ledger)?; - Self::deposit_event(Event::::Deposited(owner.clone(), extra)); + Self::deposit_event(Event::::Deposited(owner, extra)); Ok(()) } @@ -500,7 +500,7 @@ pub mod pallet { /// This is called: /// - after a `withdraw_unlocked_deposit()` call that frees all of a owner's locked balance. fn kill_owner(owner: &T::AccountId) -> DispatchResult { - >::remove(&owner); + >::remove(owner); frame_system::Pallet::::dec_consumers(owner); diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index f0e881f7f..433aa114f 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -83,8 +83,8 @@ pub mod pallet { ) -> DispatchResult { let caller_id = ensure_signed(origin)?; let node = Node::::new(node_pub_key.clone(), caller_id, node_params) - .map_err(|e| Into::>::into(NodeError::from(e)))?; - Self::create(node).map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + .map_err(Into::>::into)?; + Self::create(node).map_err(Into::>::into)?; Self::deposit_event(Event::::NodeCreated { node_pub_key }); Ok(()) } @@ -92,12 +92,10 @@ pub mod pallet { #[pallet::weight(10_000)] pub fn delete_node(origin: OriginFor, node_pub_key: NodePubKey) -> DispatchResult { let caller_id = ensure_signed(origin)?; - let node = Self::get(node_pub_key.clone()) - .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + let node = Self::get(node_pub_key.clone()).map_err(Into::>::into)?; ensure!(node.get_provider_id() == &caller_id, Error::::OnlyNodeProvider); ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAssignedToCluster); - Self::delete(node_pub_key.clone()) - .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + Self::delete(node_pub_key.clone()).map_err(Into::>::into)?; Self::deposit_event(Event::::NodeDeleted { node_pub_key }); Ok(()) } @@ -109,12 +107,10 @@ pub mod pallet { node_params: NodeParams, ) -> DispatchResult { let caller_id = ensure_signed(origin)?; - let mut node = Self::get(node_pub_key.clone()) - .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + let mut node = Self::get(node_pub_key.clone()).map_err(Into::>::into)?; ensure!(node.get_provider_id() == &caller_id, Error::::OnlyNodeProvider); - node.set_params(node_params) - .map_err(|e| Into::>::into(NodeError::from(e)))?; - Self::update(node).map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + node.set_params(node_params).map_err(Into::>::into)?; + Self::update(node).map_err(Into::>::into)?; Self::deposit_event(Event::::NodeParamsChanged { node_pub_key }); Ok(()) } diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index fbc82d69b..1eb4176a8 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -206,7 +206,7 @@ pub mod pallet { // Add initial CDN participants for &(ref stash, ref controller, ref node, balance, cluster) in &self.cdns { assert!( - T::Currency::free_balance(&stash) >= balance, + T::Currency::free_balance(stash) >= balance, "Stash do not have enough balance to participate in CDN." ); assert_ok!(Pallet::::bond( @@ -224,7 +224,7 @@ pub mod pallet { // Add initial storage network participants for &(ref stash, ref controller, ref node, balance, cluster) in &self.storages { assert!( - T::Currency::free_balance(&stash) >= balance, + T::Currency::free_balance(stash) >= balance, "Stash do not have enough balance to participate in storage network." ); assert_ok!(Pallet::::bond( @@ -400,12 +400,12 @@ pub mod pallet { let min_active_bond = if let Some(cluster_id) = Self::cdns(&ledger.stash) { let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, NodeType::CDN) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + .map_err(Into::>::into)?; bond_size.saturated_into::>() } else if let Some(cluster_id) = Self::storages(&ledger.stash) { let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, NodeType::Storage) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + .map_err(Into::>::into)?; bond_size.saturated_into::>() } else { Zero::zero() @@ -418,12 +418,12 @@ pub mod pallet { let unbonding_delay_in_blocks = if let Some(cluster_id) = Self::cdns(&ledger.stash) { T::ClusterVisitor::get_unbonding_delay(&cluster_id, NodeType::CDN) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))? + .map_err(Into::>::into)? } else if let Some(cluster_id) = Self::storages(&ledger.stash) { T::ClusterVisitor::get_unbonding_delay(&cluster_id, NodeType::Storage) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))? + .map_err(Into::>::into)? } else { - T::BlockNumber::from(100_00u32) + T::BlockNumber::from(10_000_u32) }; let block = >::block_number() + unbonding_delay_in_blocks; @@ -500,13 +500,12 @@ pub mod pallet { pub fn serve(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let controller = ensure_signed(origin)?; - T::ClusterVisitor::ensure_cluster(&cluster_id) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + T::ClusterVisitor::ensure_cluster(&cluster_id).map_err(Into::>::into)?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; // Retrieve the respective bond size from Cluster Visitor let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, NodeType::CDN) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + .map_err(Into::>::into)?; ensure!( ledger.active >= bond_size.saturated_into::>(), @@ -515,10 +514,10 @@ pub mod pallet { let stash = &ledger.stash; // Can't participate in CDN if already participating in storage network. - ensure!(!Storages::::contains_key(&stash), Error::::AlreadyInRole); + ensure!(!Storages::::contains_key(stash), Error::::AlreadyInRole); // Is it an attempt to cancel a previous "chill"? - if let Some(current_cluster) = Self::cdns(&stash) { + if let Some(current_cluster) = Self::cdns(stash) { // Switching the cluster is prohibited. The user should chill first. ensure!(current_cluster == cluster_id, Error::::AlreadyInRole); // Cancel previous "chill" attempts @@ -541,13 +540,12 @@ pub mod pallet { pub fn store(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let controller = ensure_signed(origin)?; - T::ClusterVisitor::ensure_cluster(&cluster_id) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + T::ClusterVisitor::ensure_cluster(&cluster_id).map_err(Into::>::into)?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; // Retrieve the respective bond size from Cluster Visitor let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, NodeType::Storage) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + .map_err(Into::>::into)?; ensure!( ledger.active >= bond_size.saturated_into::>(), Error::::InsufficientBond @@ -555,10 +553,10 @@ pub mod pallet { let stash = &ledger.stash; // Can't participate in storage network if already participating in CDN. - ensure!(!CDNs::::contains_key(&stash), Error::::AlreadyInRole); + ensure!(!CDNs::::contains_key(stash), Error::::AlreadyInRole); // Is it an attempt to cancel a previous "chill"? - if let Some(current_cluster) = Self::storages(&stash) { + if let Some(current_cluster) = Self::storages(stash) { // Switching the cluster is prohibited. The user should chill first. ensure!(current_cluster == cluster_id, Error::::AlreadyInRole); // Cancel previous "chill" attempts @@ -596,12 +594,11 @@ pub mod pallet { // Extract delay from the cluster settings. let (cluster, delay) = if let Some(cluster) = Self::cdns(&ledger.stash) { let chill_delay = T::ClusterVisitor::get_chill_delay(&cluster, NodeType::CDN) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + .map_err(Into::>::into)?; (cluster, chill_delay) } else if let Some(cluster) = Self::storages(&ledger.stash) { - let chill_delay = - T::ClusterVisitor::get_chill_delay(&cluster, NodeType::Storage) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?; + let chill_delay = T::ClusterVisitor::get_chill_delay(&cluster, NodeType::Storage) + .map_err(Into::>::into)?; (cluster, chill_delay) } else { return Ok(()) // already chilled @@ -743,7 +740,7 @@ pub mod pallet { cluster: ClusterId, can_chill_from: T::BlockNumber, ) { - Ledger::::mutate(&controller, |maybe_ledger| { + Ledger::::mutate(controller, |maybe_ledger| { if let Some(ref mut ledger) = maybe_ledger { ledger.chilling = Some(can_chill_from) } @@ -806,7 +803,7 @@ pub mod pallet { /// Reset the chilling block for a controller. pub fn reset_chilling(controller: &T::AccountId) { - Ledger::::mutate(&controller, |maybe_ledger| { + Ledger::::mutate(controller, |maybe_ledger| { if let Some(ref mut ledger) = maybe_ledger { ledger.chilling = None } @@ -820,7 +817,7 @@ pub mod pallet { cluster_id: &ClusterId, ) -> Result { let stash = - >::get(&node_pub_key).ok_or(StakingVisitorError::NodeStakeDoesNotExist)?; + >::get(node_pub_key).ok_or(StakingVisitorError::NodeStakeDoesNotExist)?; let maybe_cdn_in_cluster = CDNs::::get(&stash); let maybe_storage_in_cluster = Storages::::get(&stash); @@ -833,7 +830,7 @@ pub mod pallet { fn node_is_chilling(node_pub_key: &NodePubKey) -> Result { let stash = - >::get(&node_pub_key).ok_or(StakingVisitorError::NodeStakeDoesNotExist)?; + >::get(node_pub_key).ok_or(StakingVisitorError::NodeStakeDoesNotExist)?; let controller = >::get(&stash).ok_or(StakingVisitorError::NodeStakeIsInBadState)?; diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index 10f325b46..37d971bca 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -1,11 +1,9 @@ //! Tests for the module. use super::{mock::*, *}; -use ddc_primitives::{CDNNodePubKey, NodeType}; -use ddc_traits::cluster::{ClusterVisitor, ClusterVisitorError}; -use frame_support::{ - assert_noop, assert_ok, assert_storage_noop, error::BadOrigin, traits::ReservableCurrency, -}; +use ddc_primitives::CDNNodePubKey; + +use frame_support::{assert_noop, assert_ok, traits::ReservableCurrency}; use pallet_balances::Error as BalancesError; pub const BLOCK_TIME: u64 = 1000; @@ -113,7 +111,7 @@ fn staking_should_work() { assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); // Removal is scheduled, stashed value of 4 is still lock. - let chilling = System::block_number() + BlockNumber::from(10u64); + let chilling = System::block_number() + 10u64; // TestClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::CDN) // .unwrap_or(10_u64); assert_eq!( diff --git a/pallets/ddc-staking/src/weights.rs b/pallets/ddc-staking/src/weights.rs index 969385330..efca88632 100644 --- a/pallets/ddc-staking/src/weights.rs +++ b/pallets/ddc-staking/src/weights.rs @@ -46,9 +46,9 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcStaking Nodes (r:1 w:1) // Storage: Balances Locks (r:1 w:1) fn bond() -> Weight { - Weight::from_ref_time(55_007_000 as u64) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(4 as u64)) + Weight::from_ref_time(55_007_000_u64) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CDNs (r:1 w:0) @@ -57,36 +57,36 @@ impl WeightInfo for SubstrateWeight { // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn unbond() -> Weight { - Weight::from_ref_time(47_727_000 as u64) - .saturating_add(T::DbWeight::get().reads(6 as u64)) - .saturating_add(T::DbWeight::get().writes(3 as u64)) + Weight::from_ref_time(47_727_000_u64) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CurrentEra (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unbonded() -> Weight { - Weight::from_ref_time(69_750_000 as u64) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(3 as u64)) + Weight::from_ref_time(69_750_000_u64) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:1) fn store() -> Weight { - Weight::from_ref_time(26_112_000 as u64) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) + Weight::from_ref_time(26_112_000_u64) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) // Storage: DdcStaking CDNs (r:1 w:1) fn serve() -> Weight { - Weight::from_ref_time(19_892_000 as u64) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) + Weight::from_ref_time(19_892_000_u64) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CurrentEra (r:1 w:0) @@ -94,22 +94,22 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) fn chill() -> Weight { - Weight::from_ref_time(77_450_000 as u64) - .saturating_add(T::DbWeight::get().reads(5 as u64)) - .saturating_add(T::DbWeight::get().writes(2 as u64)) + Weight::from_ref_time(77_450_000_u64) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:2 w:2) fn set_controller() -> Weight { - Weight::from_ref_time(38_521_000 as u64) - .saturating_add(T::DbWeight::get().reads(3 as u64)) - .saturating_add(T::DbWeight::get().writes(3 as u64)) + Weight::from_ref_time(38_521_000_u64) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } // Storage: DdcStaking Nodes (r:1 w:1) fn set_node() -> Weight { - Weight::from_ref_time(21_779_000 as u64) - .saturating_add(T::DbWeight::get().reads(1 as u64)) - .saturating_add(T::DbWeight::get().writes(1 as u64)) + Weight::from_ref_time(21_779_000_u64) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } } @@ -120,9 +120,9 @@ impl WeightInfo for () { // Storage: DdcStaking Nodes (r:1 w:1) // Storage: Balances Locks (r:1 w:1) fn bond() -> Weight { - Weight::from_ref_time(55_007_000 as u64) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(4 as u64)) + Weight::from_ref_time(55_007_000_u64) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CDNs (r:1 w:0) @@ -131,36 +131,36 @@ impl WeightInfo for () { // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn unbond() -> Weight { - Weight::from_ref_time(47_727_000 as u64) - .saturating_add(RocksDbWeight::get().reads(6 as u64)) - .saturating_add(RocksDbWeight::get().writes(3 as u64)) + Weight::from_ref_time(47_727_000_u64) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CurrentEra (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unbonded() -> Weight { - Weight::from_ref_time(69_750_000 as u64) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(3 as u64)) + Weight::from_ref_time(69_750_000_u64) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:1) fn store() -> Weight { - Weight::from_ref_time(26_112_000 as u64) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + Weight::from_ref_time(26_112_000_u64) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) // Storage: DdcStaking CDNs (r:1 w:1) fn serve() -> Weight { - Weight::from_ref_time(19_892_000 as u64) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + Weight::from_ref_time(19_892_000_u64) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CurrentEra (r:1 w:0) @@ -168,21 +168,21 @@ impl WeightInfo for () { // Storage: DdcStaking Settings (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) fn chill() -> Weight { - Weight::from_ref_time(77_450_000 as u64) - .saturating_add(RocksDbWeight::get().reads(5 as u64)) - .saturating_add(RocksDbWeight::get().writes(2 as u64)) + Weight::from_ref_time(77_450_000_u64) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:2 w:2) fn set_controller() -> Weight { - Weight::from_ref_time(38_521_000 as u64) - .saturating_add(RocksDbWeight::get().reads(3 as u64)) - .saturating_add(RocksDbWeight::get().writes(3 as u64)) + Weight::from_ref_time(38_521_000_u64) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } // Storage: DdcStaking Nodes (r:1 w:1) fn set_node() -> Weight { - Weight::from_ref_time(21_779_000 as u64) - .saturating_add(RocksDbWeight::get().reads(1 as u64)) - .saturating_add(RocksDbWeight::get().writes(1 as u64)) + Weight::from_ref_time(21_779_000_u64) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } } diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 810c26d37..d81288bfa 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -405,7 +405,7 @@ impl pallet_indices::Config for Runtime { } parameter_types! { - pub const ExistentialDeposit: Balance = 1 * DOLLARS; + pub const ExistentialDeposit: Balance = DOLLARS; // For weight estimation, we assume that the most locks on an individual account will be 50. // This number may need to be adjusted in the future if this assumption no longer holds true. pub const MaxLocks: u32 = 50; @@ -565,9 +565,9 @@ parameter_types! { pub const UnsignedPhase: u32 = EPOCH_DURATION_IN_BLOCKS / 4; // signed config - pub const SignedRewardBase: Balance = 1 * DOLLARS; - pub const SignedDepositBase: Balance = 1 * DOLLARS; - pub const SignedDepositByte: Balance = 1 * CENTS; + pub const SignedRewardBase: Balance = DOLLARS; + pub const SignedDepositBase: Balance = DOLLARS; + pub const SignedDepositByte: Balance = CENTS; pub BetterUnsignedThreshold: Perbill = Perbill::from_rational(1u32, 10_000); @@ -722,11 +722,11 @@ impl pallet_bags_list::Config for Runtime { } parameter_types! { - pub const LaunchPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; - pub const VotingPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; + pub const LaunchPeriod: BlockNumber = 24 * 60 * MINUTES; + pub const VotingPeriod: BlockNumber = 24 * 60 * MINUTES; pub const FastTrackVotingPeriod: BlockNumber = 3 * 60 * MINUTES; pub const MinimumDeposit: Balance = 50_000 * DOLLARS; - pub const EnactmentPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; + pub const EnactmentPeriod: BlockNumber = 24 * 60 * MINUTES; pub const CooloffPeriod: BlockNumber = 7 * 24 * 60 * MINUTES; pub const MaxProposals: u32 = 100; } @@ -804,7 +804,7 @@ parameter_types! { pub const CandidacyBond: Balance = 5_000_000 * DOLLARS; // 1 storage item created, key size is 32 bytes, value size is 16+16. pub const VotingBondBase: Balance = deposit(1, 64); - pub const VotingBondFactor: Balance = 1 * DOLLARS; + pub const VotingBondFactor: Balance = DOLLARS; pub const TermDuration: BlockNumber = 182 * DAYS; pub const DesiredMembers: u32 = 13; pub const DesiredRunnersUp: u32 = 20; @@ -876,12 +876,12 @@ impl pallet_membership::Config for Runtime { parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); pub const ProposalBondMinimum: Balance = 50_000 * DOLLARS; - pub const SpendPeriod: BlockNumber = 1 * DAYS; + pub const SpendPeriod: BlockNumber = DAYS; pub const Burn: Permill = Permill::from_percent(0); - pub const TipCountdown: BlockNumber = 1 * DAYS; + pub const TipCountdown: BlockNumber = DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); pub const TipReportDepositBase: Balance = 50_000 * DOLLARS; - pub const DataDepositPerByte: Balance = 1 * DOLLARS; + pub const DataDepositPerByte: Balance = DOLLARS; pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub const MaximumReasonLength: u32 = 16384; pub const MaxApprovals: u32 = 100; @@ -917,7 +917,7 @@ parameter_types! { pub const BountyValueMinimum: Balance = 10 * DOLLARS; pub const BountyDepositBase: Balance = 50_000 * DOLLARS; pub const CuratorDepositMultiplier: Permill = Permill::from_percent(50); - pub const CuratorDepositMin: Balance = 1 * DOLLARS; + pub const CuratorDepositMin: Balance = DOLLARS; pub const CuratorDepositMax: Balance = 100 * DOLLARS; pub const BountyDepositPayoutDelay: BlockNumber = 8 * DAYS; pub const BountyUpdatePeriod: BlockNumber = 90 * DAYS; @@ -939,7 +939,7 @@ impl pallet_bounties::Config for Runtime { } parameter_types! { - pub const ChildBountyValueMinimum: Balance = 1 * DOLLARS; + pub const ChildBountyValueMinimum: Balance = DOLLARS; } impl pallet_child_bounties::Config for Runtime { @@ -1192,7 +1192,7 @@ impl pallet_society::Config for Runtime { } parameter_types! { - pub const MinVestedTransfer: Balance = 1 * DOLLARS; + pub const MinVestedTransfer: Balance = DOLLARS; } impl pallet_vesting::Config for Runtime { diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index be5ab085d..984ffb7bc 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -401,7 +401,7 @@ impl pallet_indices::Config for Runtime { } parameter_types! { - pub const ExistentialDeposit: Balance = 1 * DOLLARS; + pub const ExistentialDeposit: Balance = DOLLARS; // For weight estimation, we assume that the most locks on an individual account will be 50. // This number may need to be adjusted in the future if this assumption no longer holds true. pub const MaxLocks: u32 = 50; @@ -562,9 +562,9 @@ parameter_types! { pub const UnsignedPhase: u32 = EPOCH_DURATION_IN_BLOCKS / 4; // signed config - pub const SignedRewardBase: Balance = 1 * DOLLARS; - pub const SignedDepositBase: Balance = 1 * DOLLARS; - pub const SignedDepositByte: Balance = 1 * CENTS; + pub const SignedRewardBase: Balance = DOLLARS; + pub const SignedDepositBase: Balance = DOLLARS; + pub const SignedDepositByte: Balance = CENTS; pub BetterUnsignedThreshold: Perbill = Perbill::from_rational(1u32, 10_000); @@ -719,11 +719,11 @@ impl pallet_bags_list::Config for Runtime { } parameter_types! { - pub const LaunchPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; - pub const VotingPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; + pub const LaunchPeriod: BlockNumber = 24 * 60 * MINUTES; + pub const VotingPeriod: BlockNumber = 24 * 60 * MINUTES; pub const FastTrackVotingPeriod: BlockNumber = 3 * 60 * MINUTES; pub const MinimumDeposit: Balance = 50_000 * DOLLARS; - pub const EnactmentPeriod: BlockNumber = 1 * 24 * 60 * MINUTES; + pub const EnactmentPeriod: BlockNumber = 24 * 60 * MINUTES; pub const CooloffPeriod: BlockNumber = 7 * 24 * 60 * MINUTES; pub const MaxProposals: u32 = 100; } @@ -801,7 +801,7 @@ parameter_types! { pub const CandidacyBond: Balance = 5_000_000 * DOLLARS; // 1 storage item created, key size is 32 bytes, value size is 16+16. pub const VotingBondBase: Balance = deposit(1, 64); - pub const VotingBondFactor: Balance = 1 * DOLLARS; + pub const VotingBondFactor: Balance = DOLLARS; pub const TermDuration: BlockNumber = 182 * DAYS; pub const DesiredMembers: u32 = 13; pub const DesiredRunnersUp: u32 = 20; @@ -873,12 +873,12 @@ impl pallet_membership::Config for Runtime { parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); pub const ProposalBondMinimum: Balance = 50_000 * DOLLARS; - pub const SpendPeriod: BlockNumber = 1 * DAYS; + pub const SpendPeriod: BlockNumber = DAYS; pub const Burn: Permill = Permill::from_percent(0); - pub const TipCountdown: BlockNumber = 1 * DAYS; + pub const TipCountdown: BlockNumber = DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); pub const TipReportDepositBase: Balance = 50_000 * DOLLARS; - pub const DataDepositPerByte: Balance = 1 * DOLLARS; + pub const DataDepositPerByte: Balance = DOLLARS; pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub const MaximumReasonLength: u32 = 16384; pub const MaxApprovals: u32 = 100; @@ -914,7 +914,7 @@ parameter_types! { pub const BountyValueMinimum: Balance = 10 * DOLLARS; pub const BountyDepositBase: Balance = 50_000 * DOLLARS; pub const CuratorDepositMultiplier: Permill = Permill::from_percent(50); - pub const CuratorDepositMin: Balance = 1 * DOLLARS; + pub const CuratorDepositMin: Balance = DOLLARS; pub const CuratorDepositMax: Balance = 100 * DOLLARS; pub const BountyDepositPayoutDelay: BlockNumber = 8 * DAYS; pub const BountyUpdatePeriod: BlockNumber = 90 * DAYS; @@ -936,7 +936,7 @@ impl pallet_bounties::Config for Runtime { } parameter_types! { - pub const ChildBountyValueMinimum: Balance = 1 * DOLLARS; + pub const ChildBountyValueMinimum: Balance = DOLLARS; } impl pallet_child_bounties::Config for Runtime { @@ -1189,7 +1189,7 @@ impl pallet_society::Config for Runtime { } parameter_types! { - pub const MinVestedTransfer: Balance = 1 * DOLLARS; + pub const MinVestedTransfer: Balance = DOLLARS; } impl pallet_vesting::Config for Runtime { From e136d0227379c373b3531d8d8d7f2a14fad1b7d2 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 10 Nov 2023 11:58:27 +0100 Subject: [PATCH 490/583] chore: using if/else instead of match --- pallets/ddc-staking/src/lib.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 3c00316c0..786962dd8 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -435,10 +435,8 @@ pub mod pallet { let node_pub_key = >::get(&ledger.stash).ok_or(Error::::BadState)?; - match T::NodeVisitor::get_cluster_id(&node_pub_key) { - // If node is chilling within some cluster, the unbonding period should be - // set according to the cluster's settings - Ok(Some(cluster_id)) => match node_pub_key { + if let Ok(Some(cluster_id)) = T::NodeVisitor::get_cluster_id(&node_pub_key) { + match node_pub_key { NodePubKey::CDNPubKey(_) => T::ClusterVisitor::get_unbonding_delay(&cluster_id, NodeType::CDN) .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?, @@ -447,11 +445,10 @@ pub mod pallet { NodeType::Storage, ) .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?, - }, + } + } else { // If node is not a member of any cluster, allow immediate unbonding. - // It is possible if node provider hasn't called 'store/serve' yet, or after - // the 'fast_chill' and subsequent 'chill' calls. - _ => T::BlockNumber::from(0u32), + T::BlockNumber::from(0u32) } }; From 192baa2387e95a764bdd37768a7c86543675024f Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Fri, 10 Nov 2023 14:10:50 +0300 Subject: [PATCH 491/583] Refactor new method and remove lifetimes --- pallets/ddc-clusters/src/lib.rs | 2 +- pallets/ddc-nodes/src/cdn_node.rs | 65 ++++++++++++++------------- pallets/ddc-nodes/src/node.rs | 60 +++++++++---------------- pallets/ddc-nodes/src/storage_node.rs | 65 ++++++++++++++------------- primitives/src/lib.rs | 6 +-- 5 files changed, 93 insertions(+), 105 deletions(-) diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 55d668f69..4c52afd96 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -170,7 +170,7 @@ pub mod pallet { let is_authorized = auth_contract .is_authorized( node.get_provider_id().to_owned(), - node.get_pub_key().to_owned(), + node.get_pub_key(), node.get_type(), ) .map_err(Into::>::into)?; diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 5b3954953..1c8f19de1 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -1,4 +1,4 @@ -use crate::node::{Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait}; +use crate::node::{NodeError, NodeParams, NodeProps, NodePropsRef, NodeTrait}; use codec::{Decode, Encode}; use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey, NodeType}; use frame_support::{parameter_types, BoundedVec}; @@ -36,15 +36,44 @@ pub struct CDNNodeParams { pub p2p_port: u16, } +impl CDNNode { + pub fn new( + node_pub_key: NodePubKey, + provider_id: T::AccountId, + node_params: NodeParams, + ) -> Result { + match node_pub_key { + NodePubKey::CDNPubKey(pub_key) => match node_params { + NodeParams::CDNParams(node_params) => Ok(CDNNode:: { + provider_id, + pub_key, + cluster_id: None, + props: CDNNodeProps { + host: match node_params.host.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::CDNHostLenExceedsLimit), + }, + http_port: node_params.http_port, + grpc_port: node_params.grpc_port, + p2p_port: node_params.p2p_port, + }, + }), + _ => Err(NodeError::InvalidCDNNodeParams), + }, + _ => Err(NodeError::InvalidCDNNodePubKey), + } + } +} + impl NodeTrait for CDNNode { - fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { - NodePubKeyRef::CDNPubKeyRef(&self.pub_key) + fn get_pub_key(&self) -> NodePubKey { + NodePubKey::CDNPubKey(self.pub_key.clone()) } fn get_provider_id(&self) -> &T::AccountId { &self.provider_id } - fn get_props<'a>(&'a self) -> NodePropsRef<'a> { - NodePropsRef::CDNPropsRef(&self.props) + fn get_props(&self) -> NodePropsRef { + NodePropsRef::CDNPropsRef(self.props.clone()) } fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError> { self.props = match props { @@ -77,30 +106,4 @@ impl NodeTrait for CDNNode { fn get_type(&self) -> NodeType { NodeType::CDN } - fn new( - node_pub_key: NodePubKey, - provider_id: T::AccountId, - node_params: NodeParams, - ) -> Result, NodeError> { - match node_pub_key { - NodePubKey::CDNPubKey(pub_key) => match node_params { - NodeParams::CDNParams(node_params) => Ok(Node::CDN(CDNNode:: { - provider_id, - pub_key, - cluster_id: None, - props: CDNNodeProps { - host: match node_params.host.try_into() { - Ok(vec) => vec, - Err(_) => return Err(NodeError::CDNHostLenExceedsLimit), - }, - http_port: node_params.http_port, - grpc_port: node_params.grpc_port, - p2p_port: node_params.p2p_port, - }, - })), - _ => Err(NodeError::InvalidCDNNodeParams), - }, - _ => Err(NodeError::InvalidCDNNodePubKey), - } - } } diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 3ea06bcf7..fbf962d1f 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -7,7 +7,7 @@ use crate::{ ClusterId, }; use codec::{Decode, Encode}; -use ddc_primitives::{CDNNodePubKey, NodePubKey, NodeType, StorageNodePubKey}; +use ddc_primitives::{NodePubKey, NodeType}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; @@ -32,46 +32,39 @@ pub enum NodeProps { } #[derive(Clone, RuntimeDebug, PartialEq)] -pub enum NodePubKeyRef<'a> { - StoragePubKeyRef(&'a StorageNodePubKey), - CDNPubKeyRef(&'a CDNNodePubKey), -} - -impl<'a> NodePubKeyRef<'a> { - pub fn to_owned(&self) -> NodePubKey { - match &self { - NodePubKeyRef::StoragePubKeyRef(pub_key_ref) => - NodePubKey::StoragePubKey((**pub_key_ref).clone()), - NodePubKeyRef::CDNPubKeyRef(pub_key_ref) => - NodePubKey::CDNPubKey((**pub_key_ref).clone()), - } - } -} - -#[derive(Clone, RuntimeDebug, PartialEq)] -pub enum NodePropsRef<'a> { - StoragePropsRef(&'a StorageNodeProps), - CDNPropsRef(&'a CDNNodeProps), +pub enum NodePropsRef { + StoragePropsRef(StorageNodeProps), + CDNPropsRef(CDNNodeProps), } pub trait NodeTrait { - fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; + fn get_pub_key(&self) -> NodePubKey; fn get_provider_id(&self) -> &T::AccountId; - fn get_props<'a>(&'a self) -> NodePropsRef<'a>; + fn get_props(&self) -> NodePropsRef; fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError>; fn set_params(&mut self, props: NodeParams) -> Result<(), NodeError>; fn get_cluster_id(&self) -> &Option; fn set_cluster_id(&mut self, cluster_id: Option); fn get_type(&self) -> NodeType; - fn new( +} + +impl Node { + pub fn new( node_pub_key: NodePubKey, provider_id: T::AccountId, - params: NodeParams, - ) -> Result, NodeError>; + node_params: NodeParams, + ) -> Result { + match node_pub_key { + NodePubKey::StoragePubKey(_) => + StorageNode::new(node_pub_key, provider_id, node_params).map(|n| Node::Storage(n)), + NodePubKey::CDNPubKey(_) => + CDNNode::new(node_pub_key, provider_id, node_params).map(|n| Node::CDN(n)), + } + } } impl NodeTrait for Node { - fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { + fn get_pub_key(&self) -> NodePubKey { match &self { Node::Storage(node) => node.get_pub_key(), Node::CDN(node) => node.get_pub_key(), @@ -83,7 +76,7 @@ impl NodeTrait for Node { Node::CDN(node) => node.get_provider_id(), } } - fn get_props<'a>(&'a self) -> NodePropsRef<'a> { + fn get_props(&self) -> NodePropsRef { match &self { Node::Storage(node) => node.get_props(), Node::CDN(node) => node.get_props(), @@ -119,17 +112,6 @@ impl NodeTrait for Node { Node::CDN(node) => node.get_type(), } } - fn new( - node_pub_key: NodePubKey, - provider_id: T::AccountId, - node_params: NodeParams, - ) -> Result, NodeError> { - match node_pub_key { - NodePubKey::StoragePubKey(_) => - StorageNode::new(node_pub_key, provider_id, node_params), - NodePubKey::CDNPubKey(_) => CDNNode::new(node_pub_key, provider_id, node_params), - } - } } pub enum NodeError { diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 578afeb09..83fd2b11f 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,4 +1,4 @@ -use crate::node::{Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait}; +use crate::node::{NodeError, NodeParams, NodeProps, NodePropsRef, NodeTrait}; use codec::{Decode, Encode}; use ddc_primitives::{ClusterId, NodePubKey, NodeType, StorageNodePubKey}; use frame_support::{parameter_types, BoundedVec}; @@ -36,15 +36,44 @@ pub struct StorageNodeParams { pub p2p_port: u16, } +impl StorageNode { + pub fn new( + node_pub_key: NodePubKey, + provider_id: T::AccountId, + node_params: NodeParams, + ) -> Result { + match node_pub_key { + NodePubKey::StoragePubKey(pub_key) => match node_params { + NodeParams::StorageParams(node_params) => Ok(StorageNode:: { + provider_id, + pub_key, + cluster_id: None, + props: StorageNodeProps { + host: match node_params.host.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::StorageHostLenExceedsLimit), + }, + http_port: node_params.http_port, + grpc_port: node_params.grpc_port, + p2p_port: node_params.p2p_port, + }, + }), + _ => Err(NodeError::InvalidStorageNodeParams), + }, + _ => Err(NodeError::InvalidStorageNodePubKey), + } + } +} + impl NodeTrait for StorageNode { - fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a> { - NodePubKeyRef::StoragePubKeyRef(&self.pub_key) + fn get_pub_key(&self) -> NodePubKey { + NodePubKey::StoragePubKey(self.pub_key.clone()) } fn get_provider_id(&self) -> &T::AccountId { &self.provider_id } - fn get_props<'a>(&'a self) -> NodePropsRef<'a> { - NodePropsRef::StoragePropsRef(&self.props) + fn get_props(&self) -> NodePropsRef { + NodePropsRef::StoragePropsRef(self.props.clone()) } fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError> { self.props = match props { @@ -77,30 +106,4 @@ impl NodeTrait for StorageNode { fn get_type(&self) -> NodeType { NodeType::Storage } - fn new( - node_pub_key: NodePubKey, - provider_id: T::AccountId, - node_params: NodeParams, - ) -> Result, NodeError> { - match node_pub_key { - NodePubKey::StoragePubKey(pub_key) => match node_params { - NodeParams::StorageParams(node_params) => Ok(Node::Storage(StorageNode:: { - provider_id, - pub_key, - cluster_id: None, - props: StorageNodeProps { - host: match node_params.host.try_into() { - Ok(vec) => vec, - Err(_) => return Err(NodeError::StorageHostLenExceedsLimit), - }, - http_port: node_params.http_port, - grpc_port: node_params.grpc_port, - p2p_port: node_params.p2p_port, - }, - })), - _ => Err(NodeError::InvalidStorageNodeParams), - }, - _ => Err(NodeError::InvalidStorageNodePubKey), - } - } } diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index a3abee7c4..0564f3c16 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -11,6 +11,9 @@ use sp_runtime::{AccountId32, RuntimeDebug}; pub type ClusterId = H160; pub type BucketId = u64; +pub type StorageNodePubKey = AccountId32; +pub type CDNNodePubKey = AccountId32; + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodePubKey { @@ -18,9 +21,6 @@ pub enum NodePubKey { CDNPubKey(CDNNodePubKey), } -pub type StorageNodePubKey = AccountId32; -pub type CDNNodePubKey = AccountId32; - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodeType { Storage = 1, From b7bf64374c18be5b9b41ce13173a600a3932cdf4 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Fri, 10 Nov 2023 14:11:02 +0300 Subject: [PATCH 492/583] Resolve clippy warnings --- node/service/src/lib.rs | 2 ++ pallets/ddc-staking/src/benchmarking.rs | 4 ++-- pallets/ddc-staking/src/lib.rs | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 68e5386a6..ee62d08d1 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -103,6 +103,7 @@ where Ok(Basics { task_manager, client, backend, keystore_container, telemetry }) } +#[allow(clippy::type_complexity)] fn new_partial( config: &Configuration, Basics { task_manager, backend, client, keystore_container, telemetry }: Basics< @@ -628,6 +629,7 @@ macro_rules! chain_ops { }}; } +#[allow(clippy::type_complexity)] pub fn new_chain_ops( config: &Configuration, ) -> Result< diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index d682ec9c0..6353e4a5d 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -5,7 +5,7 @@ use crate::Pallet as DdcStaking; use ddc_primitives::{CDNNodePubKey, NodeType}; use testing_utils::*; -use frame_support::traits::{Currency, Get}; +use frame_support::traits::Currency; use sp_runtime::traits::StaticLookup; use sp_std::prelude::*; @@ -91,7 +91,7 @@ benchmarks! { assert!(CDNs::::contains_key(&cdn_stash)); frame_system::Pallet::::set_block_number(T::BlockNumber::from(1u32)); DdcStaking::::chill(RawOrigin::Signed(cdn_controller.clone()).into())?; - frame_system::Pallet::::set_block_number(T::BlockNumber::from(1u32) + T::ClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(T::BlockNumber::from(10u32))); + frame_system::Pallet::::set_block_number(T::BlockNumber::from(1u32) + T::ClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or_else(|_| T::BlockNumber::from(10u32))); whitelist_account!(cdn_controller); }: _(RawOrigin::Signed(cdn_controller)) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 1eb4176a8..9c270570c 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -189,7 +189,9 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { + #[allow(clippy::type_complexity)] pub cdns: Vec<(T::AccountId, T::AccountId, NodePubKey, BalanceOf, ClusterId)>, + #[allow(clippy::type_complexity)] pub storages: Vec<(T::AccountId, T::AccountId, NodePubKey, BalanceOf, ClusterId)>, } @@ -693,7 +695,7 @@ pub mod pallet { ensure!(stash == node_stash, Error::::NotNodeController); let cluster_id = >::get(&stash) - .or(>::get(&stash)) + .or_else(|| >::get(&stash)) .ok_or(Error::::NodeHasNoStake)?; let is_cluster_node = T::ClusterVisitor::cluster_has_node(&cluster_id, &node_pub_key); From 377b00661a1838fd413813cb1b81ab1333f1e11a Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Fri, 10 Nov 2023 14:44:49 +0300 Subject: [PATCH 493/583] Check for unused dependencies --- .github/workflows/check.yaml | 3 + Cargo.lock | 73 ------------------- Cargo.toml | 1 - node/client/Cargo.toml | 3 - node/service/Cargo.toml | 8 +- pallets/chainbridge/Cargo.toml | 8 -- pallets/ddc-clusters/Cargo.toml | 9 --- pallets/ddc-customers/Cargo.toml | 4 - .../ddc-metrics-offchain-worker/Cargo.toml | 4 - pallets/ddc-nodes/Cargo.toml | 9 --- pallets/ddc-staking/Cargo.toml | 3 - pallets/ddc/Cargo.toml | 3 + pallets/erc20/Cargo.toml | 9 +-- pallets/erc721/Cargo.toml | 6 -- runtime/cere-dev/Cargo.toml | 2 - runtime/cere-dev/constants/Cargo.toml | 3 +- runtime/cere/Cargo.toml | 3 +- runtime/cere/constants/Cargo.toml | 3 +- traits/Cargo.toml | 4 - 19 files changed, 13 insertions(+), 145 deletions(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 1ecb04c4b..9bdc50136 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -32,6 +32,9 @@ jobs: run: | cargo fmt -- --check + - name: Unused dependencies + uses: bnjbvr/cargo-machete@main + - name: Rust Cache uses: Swatinem/rust-cache@v2 diff --git a/Cargo.lock b/Cargo.lock index 6059b927b..861333611 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -759,7 +759,6 @@ version = "4.8.1" dependencies = [ "cere-cli", "sc-cli", - "ss58-registry", "substrate-build-script-utils", ] @@ -785,7 +784,6 @@ dependencies = [ "cere-dev-runtime", "cere-runtime", "frame-benchmarking", - "frame-benchmarking-cli", "frame-system", "frame-system-rpc-runtime-api", "node-primitives", @@ -801,10 +799,8 @@ dependencies = [ "sp-blockchain", "sp-consensus", "sp-consensus-babe", - "sp-core", "sp-finality-grandpa", "sp-inherents", - "sp-keyring", "sp-offchain", "sp-runtime", "sp-session", @@ -880,7 +876,6 @@ dependencies = [ "pallet-tips", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", - "pallet-transaction-storage", "pallet-treasury", "pallet-utility", "pallet-vesting", @@ -909,7 +904,6 @@ name = "cere-dev-runtime-constants" version = "4.8.1" dependencies = [ "node-primitives", - "sp-runtime", ] [[package]] @@ -1005,7 +999,6 @@ dependencies = [ "pallet-tips", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", - "pallet-transaction-storage", "pallet-treasury", "pallet-utility", "pallet-vesting", @@ -1044,7 +1037,6 @@ name = "cere-runtime-constants" version = "4.8.1" dependencies = [ "node-primitives", - "sp-runtime", ] [[package]] @@ -1056,17 +1048,14 @@ dependencies = [ "cere-dev-runtime-constants", "cere-rpc", "cere-runtime", - "cere-runtime-constants", "futures", "jsonrpsee", "node-primitives", "pallet-im-online", - "parity-scale-codec", "rand 0.8.5", "sc-authority-discovery", "sc-basic-authorship", "sc-chain-spec", - "sc-cli", "sc-client-api", "sc-consensus", "sc-consensus-babe", @@ -1087,7 +1076,6 @@ dependencies = [ "sp-authority-discovery", "sp-authorship", "sp-blockchain", - "sp-consensus", "sp-consensus-babe", "sp-core", "sp-finality-grandpa", @@ -1651,11 +1639,7 @@ name = "ddc-traits" version = "0.1.0" dependencies = [ "ddc-primitives", - "frame-support", "frame-system", - "sp-core", - "sp-staking", - "sp-std", ] [[package]] @@ -4045,24 +4029,6 @@ version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" -[[package]] -name = "lite-json" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0e787ffe1153141a0f6f6d759fdf1cc34b1226e088444523812fd412a5cca2" -dependencies = [ - "lite-parser", -] - -[[package]] -name = "lite-parser" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d5f9dc37c52d889a21fd701983d02bb6a84f852c5140a6c80ef4557f7dc29e" -dependencies = [ - "paste", -] - [[package]] name = "lock_api" version = "0.4.11" @@ -4778,16 +4744,13 @@ dependencies = [ name = "pallet-chainbridge" version = "4.8.1" dependencies = [ - "frame-benchmarking", "frame-support", "frame-system", - "lite-json", "pallet-balances", "parity-scale-codec", "scale-info", "sp-core", "sp-io", - "sp-keystore", "sp-runtime", "sp-std", ] @@ -4917,18 +4880,14 @@ version = "4.8.1" dependencies = [ "ddc-primitives", "ddc-traits", - "frame-benchmarking", "frame-support", "frame-system", - "log", "pallet-contracts", "pallet-ddc-nodes", "parity-scale-codec", "scale-info", "sp-core", - "sp-io", "sp-runtime", - "sp-staking", "sp-std", "sp-tracing", "substrate-test-utils", @@ -4945,9 +4904,7 @@ dependencies = [ "log", "parity-scale-codec", "scale-info", - "sp-io", "sp-runtime", - "sp-staking", "sp-std", "substrate-test-utils", ] @@ -4961,7 +4918,6 @@ dependencies = [ "frame-system", "hex", "hex-literal", - "lite-json", "pallet-balances", "pallet-contracts", "pallet-randomness-collective-flip", @@ -4969,7 +4925,6 @@ dependencies = [ "parity-scale-codec", "pretty_assertions", "scale-info", - "serde", "serde_json 1.0.44", "sp-core", "sp-io", @@ -4983,16 +4938,12 @@ name = "pallet-ddc-nodes" version = "4.8.1" dependencies = [ "ddc-primitives", - "frame-benchmarking", "frame-support", "frame-system", - "log", "parity-scale-codec", "scale-info", "sp-core", - "sp-io", "sp-runtime", - "sp-staking", "sp-std", "sp-tracing", "substrate-test-utils", @@ -5007,7 +4958,6 @@ dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "log", "pallet-balances", "pallet-timestamp", "parity-scale-codec", @@ -5015,7 +4965,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-staking", "sp-std", "sp-tracing", "substrate-test-utils", @@ -5096,7 +5045,6 @@ dependencies = [ name = "pallet-erc20" version = "4.8.1" dependencies = [ - "frame-benchmarking", "frame-support", "frame-system", "pallet-balances", @@ -5104,7 +5052,6 @@ dependencies = [ "pallet-erc721", "parity-scale-codec", "scale-info", - "serde", "sp-arithmetic", "sp-core", "sp-io", @@ -5116,14 +5063,12 @@ dependencies = [ name = "pallet-erc721" version = "4.8.1" dependencies = [ - "frame-benchmarking", "frame-support", "frame-system", "pallet-balances", "pallet-chainbridge", "parity-scale-codec", "scale-info", - "serde", "sp-core", "sp-io", "sp-runtime", @@ -5584,24 +5529,6 @@ dependencies = [ "sp-runtime", ] -[[package]] -name = "pallet-transaction-storage" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" -dependencies = [ - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-std", - "sp-transaction-storage-proof", -] - [[package]] name = "pallet-treasury" version = "4.0.0-dev" diff --git a/Cargo.toml b/Cargo.toml index 3d7599231..27cff6711 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,6 @@ build = "build.rs" [dependencies] cere-cli = { path = "cli", features = [ "cere-dev-native" ] } sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -ss58-registry = { version = "1.38.0", default-features = false } [build-dependencies] substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/node/client/Cargo.toml b/node/client/Cargo.toml index dbafa5fa8..d83bb5b03 100644 --- a/node/client/Cargo.toml +++ b/node/client/Cargo.toml @@ -8,7 +8,6 @@ sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/subs sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -29,8 +28,6 @@ sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/su sp-storage = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sp-inherents = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-keyring = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } # Local cere-runtime = { path = "../../runtime/cere", optional = true } diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index d444e3244..c6c8abdfb 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -4,13 +4,10 @@ version = "4.8.1" edition = "2021" [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5" } serde = { version = "1.0.136", features = ["derive"] } rand = "0.8" futures = "0.3.21" jsonrpsee = { version = "0.15.1", features = ["server"] } - -sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } @@ -18,7 +15,6 @@ sc-telemetry = { version = "4.0.0-dev", git = "https://github.com/paritytech/sub sc-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -47,8 +43,6 @@ sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/su # Local cere-client = { path = "../client", default-features = false, optional = true } cere-rpc = { path = "../../rpc" } - -cere-runtime-constants = { path = "../../runtime/cere/constants", optional = true } cere-dev-runtime-constants = { path = "../../runtime/cere-dev/constants", optional = true } cere-runtime = { path = "../../runtime/cere", optional = true } @@ -57,7 +51,7 @@ cere-dev-runtime = { path = "../../runtime/cere-dev", optional = true } [features] default = ["cere-native"] -cere-native = [ "cere-runtime", "cere-runtime-constants", "cere-client/cere" ] +cere-native = [ "cere-runtime", "cere-client/cere" ] cere-dev-native = [ "cere-dev-runtime", "cere-dev-runtime-constants", "cere-client/cere-dev" ] runtime-benchmarks = [ diff --git a/pallets/chainbridge/Cargo.toml b/pallets/chainbridge/Cargo.toml index de714f861..455a0aa8a 100644 --- a/pallets/chainbridge/Cargo.toml +++ b/pallets/chainbridge/Cargo.toml @@ -20,26 +20,18 @@ sp-core = { version = "6.0.0", default-features = false, git = "https://github.c sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -lite-json = { version = "0.2.0", default-features = false } -sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } - [features] default = ["std"] std = [ "codec/std", "sp-runtime/std", - "frame-benchmarking/std", "frame-support/std", "frame-system/std", "pallet-balances/std", "sp-io/std", "sp-std/std", "sp-core/std", - "lite-json/std", - "sp-keystore", ] -runtime-benchmarks = ["frame-benchmarking"] diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index 62f59dd67..0ef556a69 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -7,16 +7,11 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -log = { version = "0.4.17", default-features = false } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } @@ -32,14 +27,10 @@ std = [ "ddc-primitives/std", "frame-support/std", "frame-system/std", - "frame-benchmarking/std", "pallet-contracts/std", "pallet-ddc-nodes/std", "scale-info/std", "sp-core/std", - "sp-io/std", "sp-runtime/std", - "sp-staking/std", "sp-std/std", ] -runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 48cdf287f..8d60ba44f 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -10,9 +10,7 @@ ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } log = { version = "0.4.17", default-features = false } @@ -27,8 +25,6 @@ std = [ "frame-support/std", "frame-system/std", "scale-info/std", - "sp-io/std", "sp-runtime/std", - "sp-staking/std", "sp-std/std", ] diff --git a/pallets/ddc-metrics-offchain-worker/Cargo.toml b/pallets/ddc-metrics-offchain-worker/Cargo.toml index 74747a397..3ab61de26 100644 --- a/pallets/ddc-metrics-offchain-worker/Cargo.toml +++ b/pallets/ddc-metrics-offchain-worker/Cargo.toml @@ -16,14 +16,12 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["full"] } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -serde = { version = "1.0.136", optional = true } sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-contracts = { version = '4.0.0-dev', default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -lite-json = { version = "0.2.0", default-features = false } alt_serde = { version = "1", default-features = false, features = ["derive"] } serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } # pallet-contracts-rpc-runtime-api = { version = "0.8.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -38,8 +36,6 @@ std = [ "sp-keystore", "frame-support/std", "frame-system/std", - "serde", - "lite-json/std", "sp-core/std", "sp-io/std", "sp-runtime/std", diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index 607ab47fa..54bc35070 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -6,16 +6,11 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -log = { version = "0.4.17", default-features = false } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } [dev-dependencies] sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -29,12 +24,8 @@ std = [ "ddc-primitives/std", "frame-support/std", "frame-system/std", - "frame-benchmarking/std", "scale-info/std", - "sp-io/std", "sp-runtime/std", - "sp-staking/std", "sp-std/std", "sp-core/std", ] -runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] diff --git a/pallets/ddc-staking/Cargo.toml b/pallets/ddc-staking/Cargo.toml index 9fbcc154e..0f9c57433 100644 --- a/pallets/ddc-staking/Cargo.toml +++ b/pallets/ddc-staking/Cargo.toml @@ -10,11 +10,9 @@ ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -log = { version = "0.4.17", default-features = false } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [dev-dependencies] @@ -35,7 +33,6 @@ std = [ "scale-info/std", "sp-io/std", "sp-runtime/std", - "sp-staking/std", "sp-std/std", ] runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] diff --git a/pallets/ddc/Cargo.toml b/pallets/ddc/Cargo.toml index 9c89014d1..867c36f52 100644 --- a/pallets/ddc/Cargo.toml +++ b/pallets/ddc/Cargo.toml @@ -35,3 +35,6 @@ std = [ 'frame-support/std', 'frame-system/std', ] + +[package.metadata.cargo-machete] +ignored = ["scale-info", "codec"] diff --git a/pallets/erc20/Cargo.toml b/pallets/erc20/Cargo.toml index 6cce2c8d4..3bf27fea6 100644 --- a/pallets/erc20/Cargo.toml +++ b/pallets/erc20/Cargo.toml @@ -13,7 +13,6 @@ readme = "README.md" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.136", optional = true } codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -27,15 +26,11 @@ pallet-chainbridge = { version = "4.2.0", default-features = false, path = "../c pallet-erc721 = { version = "4.2.0", default-features = false, path = "../erc721" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } - [features] default = ["std"] std = [ - "serde", "codec/std", "sp-runtime/std", - "frame-benchmarking/std", "frame-support/std", "frame-system/std", "pallet-balances/std", @@ -46,4 +41,6 @@ std = [ "pallet-chainbridge/std", "pallet-erc721/std" ] -runtime-benchmarks = ["frame-benchmarking"] + +[package.metadata.cargo-machete] +ignored = ["scale-info"] diff --git a/pallets/erc721/Cargo.toml b/pallets/erc721/Cargo.toml index 3f586f103..e6e12c37f 100644 --- a/pallets/erc721/Cargo.toml +++ b/pallets/erc721/Cargo.toml @@ -13,7 +13,6 @@ readme = "README.md" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.136", optional = true } codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -25,15 +24,11 @@ sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.gi pallet-chainbridge = { version = "4.2.0", default-features = false, path = "../chainbridge" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } - [features] default = ["std"] std = [ - "serde", "codec/std", "sp-runtime/std", - "frame-benchmarking/std", "frame-support/std", "frame-system/std", "pallet-balances/std", @@ -42,4 +37,3 @@ std = [ "sp-core/std", "pallet-chainbridge/std" ] -runtime-benchmarks = ["frame-benchmarking"] diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index f5ba45aba..e78c7dd17 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -92,7 +92,6 @@ pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "http pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-storage = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } cere-runtime-common = { path = "../common", default-features = false } cere-dev-runtime-constants = { path = "./constants", default-features = false } @@ -197,7 +196,6 @@ runtime-benchmarks = [ "pallet-bags-list/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-bounties/runtime-benchmarks", - "pallet-chainbridge/runtime-benchmarks", "pallet-child-bounties/runtime-benchmarks", "pallet-collective/runtime-benchmarks", "pallet-contracts/runtime-benchmarks", diff --git a/runtime/cere-dev/constants/Cargo.toml b/runtime/cere-dev/constants/Cargo.toml index 5fdb89737..201630962 100644 --- a/runtime/cere-dev/constants/Cargo.toml +++ b/runtime/cere-dev/constants/Cargo.toml @@ -6,10 +6,9 @@ edition = "2021" [dependencies] node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } [features] default = ["std"] std = [ - "sp-runtime/std" + "node-primitives/std" ] diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index 59a2668cd..698fa079b 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -92,7 +92,6 @@ pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "http pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-storage = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } cere-runtime-common = { path = "../common", default-features = false } cere-runtime-constants = { path = "./constants", default-features = false } @@ -189,7 +188,6 @@ runtime-benchmarks = [ "pallet-bags-list/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-bounties/runtime-benchmarks", - "pallet-chainbridge/runtime-benchmarks", "pallet-child-bounties/runtime-benchmarks", "pallet-collective/runtime-benchmarks", "pallet-contracts/runtime-benchmarks", @@ -260,3 +258,4 @@ try-runtime = [ "pallet-utility/try-runtime", "pallet-vesting/try-runtime", ] + diff --git a/runtime/cere/constants/Cargo.toml b/runtime/cere/constants/Cargo.toml index 2188486ef..629d01bcb 100644 --- a/runtime/cere/constants/Cargo.toml +++ b/runtime/cere/constants/Cargo.toml @@ -6,10 +6,9 @@ edition = "2021" [dependencies] node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } [features] default = ["std"] std = [ - "sp-runtime/std" + "node-primitives/std" ] diff --git a/traits/Cargo.toml b/traits/Cargo.toml index b224e2d28..202996ef0 100644 --- a/traits/Cargo.toml +++ b/traits/Cargo.toml @@ -4,9 +4,5 @@ version = "0.1.0" edition = "2021" [dependencies] -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } ddc-primitives = { version = "0.1.0", default-features = false, path = "../primitives" } From 7b116fc6824ef8b586507257a57907d1876d383c Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Fri, 10 Nov 2023 14:56:10 +0300 Subject: [PATCH 494/583] Cargo machete does not support --locked install yet --- .github/workflows/check.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 9bdc50136..1ecb04c4b 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -32,9 +32,6 @@ jobs: run: | cargo fmt -- --check - - name: Unused dependencies - uses: bnjbvr/cargo-machete@main - - name: Rust Cache uses: Swatinem/rust-cache@v2 From 441d3ebe443964eb6536f60f5f96634e0cdd6ae4 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Fri, 10 Nov 2023 15:01:20 +0300 Subject: [PATCH 495/583] Fix clippy warning --- pallets/ddc-staking/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 93a23f324..587f2d6c5 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -441,12 +441,12 @@ pub mod pallet { match node_pub_key { NodePubKey::CDNPubKey(_) => T::ClusterVisitor::get_unbonding_delay(&cluster_id, NodeType::CDN) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?, + .map_err(|e| Into::>::into(e))?, NodePubKey::StoragePubKey(_) => T::ClusterVisitor::get_unbonding_delay( &cluster_id, NodeType::Storage, ) - .map_err(|e| Into::>::into(ClusterVisitorError::from(e)))?, + .map_err(|e| Into::>::into(e))?, } } else { // If node is not a member of any cluster, allow immediate unbonding. From cf003ff0e20b812e09f8af95a51d8c7d31d84145 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Fri, 10 Nov 2023 15:10:51 +0300 Subject: [PATCH 496/583] Resolve redundancy --- pallets/ddc-staking/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 587f2d6c5..9c8469785 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -441,12 +441,12 @@ pub mod pallet { match node_pub_key { NodePubKey::CDNPubKey(_) => T::ClusterVisitor::get_unbonding_delay(&cluster_id, NodeType::CDN) - .map_err(|e| Into::>::into(e))?, + .map_err(Into::>::into)?, NodePubKey::StoragePubKey(_) => T::ClusterVisitor::get_unbonding_delay( &cluster_id, NodeType::Storage, ) - .map_err(|e| Into::>::into(e))?, + .map_err(Into::>::into)?, } } else { // If node is not a member of any cluster, allow immediate unbonding. From 43300d21c810bcc018abca722d41ceeec438aee2 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Fri, 10 Nov 2023 16:01:12 +0300 Subject: [PATCH 497/583] Increase call_size for tests --- runtime/cere/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 984ffb7bc..6e68d7106 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -1844,7 +1844,7 @@ mod tests { fn call_size() { let size = core::mem::size_of::(); assert!( - size <= 208, + size <= 256, "size of RuntimeCall {} is more than 208 bytes: some calls have too big arguments, use Box to reduce the size of RuntimeCall. If the limit is too strong, maybe consider increase the limit to 300.", From 94c8446866ef886763bbcc3c1db4b5c186242e65 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 10 Nov 2023 15:03:23 +0100 Subject: [PATCH 498/583] chore: unused node related type removed --- pallets/ddc-nodes/src/cdn_node.rs | 6 +++--- pallets/ddc-nodes/src/node.rs | 10 ++-------- pallets/ddc-nodes/src/storage_node.rs | 6 +++--- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 1c8f19de1..eafe6cd27 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -1,4 +1,4 @@ -use crate::node::{NodeError, NodeParams, NodeProps, NodePropsRef, NodeTrait}; +use crate::node::{NodeError, NodeParams, NodeProps, NodeTrait}; use codec::{Decode, Encode}; use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey, NodeType}; use frame_support::{parameter_types, BoundedVec}; @@ -72,8 +72,8 @@ impl NodeTrait for CDNNode { fn get_provider_id(&self) -> &T::AccountId { &self.provider_id } - fn get_props(&self) -> NodePropsRef { - NodePropsRef::CDNPropsRef(self.props.clone()) + fn get_props(&self) -> NodeProps { + NodeProps::CDNProps(self.props.clone()) } fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError> { self.props = match props { diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index fbf962d1f..042d13be3 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -31,16 +31,10 @@ pub enum NodeProps { CDNProps(CDNNodeProps), } -#[derive(Clone, RuntimeDebug, PartialEq)] -pub enum NodePropsRef { - StoragePropsRef(StorageNodeProps), - CDNPropsRef(CDNNodeProps), -} - pub trait NodeTrait { fn get_pub_key(&self) -> NodePubKey; fn get_provider_id(&self) -> &T::AccountId; - fn get_props(&self) -> NodePropsRef; + fn get_props(&self) -> NodeProps; fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError>; fn set_params(&mut self, props: NodeParams) -> Result<(), NodeError>; fn get_cluster_id(&self) -> &Option; @@ -76,7 +70,7 @@ impl NodeTrait for Node { Node::CDN(node) => node.get_provider_id(), } } - fn get_props(&self) -> NodePropsRef { + fn get_props(&self) -> NodeProps { match &self { Node::Storage(node) => node.get_props(), Node::CDN(node) => node.get_props(), diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 83fd2b11f..902739771 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,4 +1,4 @@ -use crate::node::{NodeError, NodeParams, NodeProps, NodePropsRef, NodeTrait}; +use crate::node::{NodeError, NodeParams, NodeProps, NodeTrait}; use codec::{Decode, Encode}; use ddc_primitives::{ClusterId, NodePubKey, NodeType, StorageNodePubKey}; use frame_support::{parameter_types, BoundedVec}; @@ -72,8 +72,8 @@ impl NodeTrait for StorageNode { fn get_provider_id(&self) -> &T::AccountId { &self.provider_id } - fn get_props(&self) -> NodePropsRef { - NodePropsRef::StoragePropsRef(self.props.clone()) + fn get_props(&self) -> NodeProps { + NodeProps::StorageProps(self.props.clone()) } fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError> { self.props = match props { From 3a6cfb3b90e799f2716c73c4c51a8080777e0bbd Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Fri, 10 Nov 2023 17:56:34 +0300 Subject: [PATCH 499/583] Update both runtimes --- runtime/cere-dev/src/lib.rs | 4 ++-- runtime/cere/src/lib.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 518b398dc..fb260b4ed 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1898,8 +1898,8 @@ mod tests { fn call_size() { let size = core::mem::size_of::(); assert!( - size <= 208, - "size of RuntimeCall {} is more than 208 bytes: some calls have too big arguments, use Box to reduce the + size <= 256, + "size of RuntimeCall {} is more than 256 bytes: some calls have too big arguments, use Box to reduce the size of RuntimeCall. If the limit is too strong, maybe consider increase the limit to 300.", size, diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 6e68d7106..f7eef4df6 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -1845,7 +1845,7 @@ mod tests { let size = core::mem::size_of::(); assert!( size <= 256, - "size of RuntimeCall {} is more than 208 bytes: some calls have too big arguments, use Box to reduce the + "size of RuntimeCall {} is more than 256 bytes: some calls have too big arguments, use Box to reduce the size of RuntimeCall. If the limit is too strong, maybe consider increase the limit to 300.", size, From 01f7ba2cd0ece9799cd429bd5d805442c3069c65 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 10 Nov 2023 17:21:21 +0100 Subject: [PATCH 500/583] add tests for ddc-clusters --- Cargo.lock | 7 +++++++ pallets/ddc-clusters/Cargo.toml | 5 +++++ pallets/ddc-clusters/src/lib.rs | 5 +++++ pallets/ddc-nodes/src/lib.rs | 2 +- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 6059b927b..c427ac8e1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4920,9 +4920,14 @@ dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "hex", + "hex-literal", "log", + "pallet-balances", "pallet-contracts", "pallet-ddc-nodes", + "pallet-randomness-collective-flip", + "pallet-timestamp", "parity-scale-codec", "scale-info", "sp-core", @@ -4987,6 +4992,8 @@ dependencies = [ "frame-support", "frame-system", "log", + "pallet-balances", + "pallet-timestamp", "parity-scale-codec", "scale-info", "sp-core", diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index 62f59dd67..42673b26c 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -19,11 +19,16 @@ sp-std = { version = "4.0.0-dev", default-features = false, git = "https://githu sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } +hex-literal = "^0.3.1" +hex = { version = "0.4", default-features = false } [dev-dependencies] +pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index cb4aafb7b..f7c543954 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -15,6 +15,11 @@ #![recursion_limit = "256"] #![feature(is_some_and)] // ToDo: delete at rustc > 1.70 +#[cfg(test)] +pub(crate) mod mock; +#[cfg(test)] +mod tests; + use crate::{ cluster::{Cluster, ClusterError, ClusterGovParams, ClusterParams}, node_provider_auth::{NodeProviderAuthContract, NodeProviderAuthContractError}, diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 5dc0766ce..42d45be03 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -30,7 +30,7 @@ mod node; mod storage_node; pub use crate::{ - cdn_node::CDNNode, + cdn_node::{CDNNode, CDNNodeParams}, node::{Node, NodeError, NodeParams, NodeTrait}, storage_node::StorageNode, }; From fba99826ef0684112c02bfe3b4c6dbf61604f324 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Fri, 10 Nov 2023 17:31:54 +0100 Subject: [PATCH 501/583] added missing files --- pallets/ddc-clusters/src/mock.rs | 232 ++++++++++ .../ddc-clusters/src/test_data/metadata.json | 365 ++++++++++++++++ .../node_provider_auth_white_list.wasm | Bin 0 -> 4489 bytes pallets/ddc-clusters/src/tests.rs | 412 ++++++++++++++++++ 4 files changed, 1009 insertions(+) create mode 100644 pallets/ddc-clusters/src/mock.rs create mode 100644 pallets/ddc-clusters/src/test_data/metadata.json create mode 100644 pallets/ddc-clusters/src/test_data/node_provider_auth_white_list.wasm create mode 100644 pallets/ddc-clusters/src/tests.rs diff --git a/pallets/ddc-clusters/src/mock.rs b/pallets/ddc-clusters/src/mock.rs new file mode 100644 index 000000000..ceaa921a5 --- /dev/null +++ b/pallets/ddc-clusters/src/mock.rs @@ -0,0 +1,232 @@ +//! Test utilities + +#![allow(dead_code)] + +use crate::{self as pallet_ddc_clusters, *}; +use ddc_primitives::{ClusterId, NodePubKey}; +use ddc_traits::staking::{StakingVisitor, StakingVisitorError}; +use frame_support::{ + construct_runtime, parameter_types, + traits::{ConstU32, ConstU64, Everything, Nothing}, + weights::constants::RocksDbWeight, +}; +use frame_system::mocking::{MockBlock, MockUncheckedExtrinsic}; +use pallet_contracts as contracts; +use sp_core::H256; +use sp_io::TestExternalities; +use sp_runtime::{ + testing::{Header, TestXt}, + traits::{ + BlakeTwo256, Convert, Extrinsic as ExtrinsicT, IdentifyAccount, IdentityLookup, Verify, + }, + MultiSignature, +}; + +/// The AccountId alias in this test module. +pub type AccountId = <::Signer as IdentifyAccount>::AccountId; +pub(crate) type AccountIndex = u64; +pub(crate) type BlockNumber = u64; +pub(crate) type Balance = u128; + +pub type Signature = MultiSignature; +type UncheckedExtrinsic = MockUncheckedExtrinsic; +type Block = MockBlock; + +construct_runtime!( + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + Contracts: contracts::{Pallet, Call, Storage, Event}, + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + DdcNodes: pallet_ddc_nodes::{Pallet, Call, Storage, Event}, + DdcClusters: pallet_ddc_clusters::{Pallet, Call, Storage, Event}, + Randomness: pallet_randomness_collective_flip::{Pallet, Storage}, + } +); + +parameter_types! { + pub const DepositPerItem: Balance = 0; + pub const DepositPerByte: Balance = 0; + pub const SignedClaimHandicap: BlockNumber = 2; + pub const TombstoneDeposit: Balance = 16; + pub const StorageSizeOffset: u32 = 8; + pub const RentByteFee: Balance = 4; + pub const RentDepositOffset: Balance = 10_000; + pub const SurchargeReward: Balance = 150; + pub const MaxDepth: u32 = 100; + pub const MaxValueSize: u32 = 16_384; + pub Schedule: pallet_contracts::Schedule = Default::default(); +} + +impl Convert> for Test { + fn convert(w: Weight) -> BalanceOf { + w.ref_time().into() + } +} + +use contracts::Config as contractsConfig; + +type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + +impl contracts::Config for Test { + type Time = Timestamp; + type Randomness = Randomness; + type Currency = Balances; + type RuntimeEvent = RuntimeEvent; + type CallStack = [pallet_contracts::Frame; 31]; + type WeightPrice = Self; //pallet_transaction_payment::Module; + type WeightInfo = (); + type ChainExtension = (); + type DeletionQueueDepth = (); + type DeletionWeightLimit = (); + type Schedule = Schedule; + type RuntimeCall = RuntimeCall; + type CallFilter = Nothing; + type DepositPerByte = DepositPerByte; + type DepositPerItem = DepositPerItem; + type AddressGenerator = pallet_contracts::DefaultAddressGenerator; + type ContractAccessWeight = (); + type MaxCodeLen = ConstU32<{ 128 * 1024 }>; + type MaxStorageKeyLen = ConstU32<128>; +} + +use frame_system::offchain::{ + AppCrypto, CreateSignedTransaction, SendTransactionTypes, SigningTypes, +}; + +pub type Extrinsic = TestXt; + +impl SigningTypes for Test { + type Public = ::Signer; + type Signature = Signature; +} + +impl SendTransactionTypes for Test +where + RuntimeCall: From, +{ + type OverarchingCall = RuntimeCall; + type Extrinsic = Extrinsic; +} +impl pallet_randomness_collective_flip::Config for Test {} + +impl CreateSignedTransaction for Test +where + RuntimeCall: From, +{ + fn create_transaction>( + call: RuntimeCall, + _public: ::Signer, + _account: AccountId, + nonce: u64, + ) -> Option<(RuntimeCall, ::SignaturePayload)> { + Some((call, (nonce, ()))) + } +} + +parameter_types! { + pub static ExistentialDeposit: Balance = 1; +} + +impl frame_system::Config for Test { + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type DbWeight = RocksDbWeight; + type RuntimeOrigin = RuntimeOrigin; + type Index = AccountIndex; + type BlockNumber = BlockNumber; + type RuntimeCall = RuntimeCall; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = ConstU64<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = ConstU32<16>; +} + +impl pallet_balances::Config for Test { + type MaxLocks = ConstU32<1024>; + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); +} + +impl pallet_timestamp::Config for Test { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = ConstU64<5>; + type WeightInfo = (); +} + +impl pallet_ddc_nodes::Config for Test { + type RuntimeEvent = RuntimeEvent; +} + +impl crate::pallet::Config for Test { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type NodeRepository = DdcNodes; + type StakingVisitor = TestStakingVisitor; +} + +pub(crate) type DdcStakingCall = crate::Call; +pub(crate) type TestRuntimeCall = ::RuntimeCall; +pub struct TestStakingVisitor; +impl StakingVisitor for TestStakingVisitor { + fn node_has_stake( + _node_pub_key: &NodePubKey, + _cluster_id: &ClusterId, + ) -> Result { + Ok(true) + } + fn node_is_chilling(_node_pub_key: &NodePubKey) -> Result { + Ok(false) + } +} + +pub struct ExtBuilder; + +impl ExtBuilder { + fn build(self) -> TestExternalities { + sp_tracing::try_init_simple(); + let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); + + let _ = pallet_balances::GenesisConfig:: { + balances: vec![ + (AccountId::from([1; 32]), 100), + (AccountId::from([2; 32]), 100), + (AccountId::from([3; 32]), 100), + (AccountId::from([4; 32]), 100), + ], + } + .assimilate_storage(&mut storage); + + TestExternalities::new(storage) + } + pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + sp_tracing::try_init_simple(); + let mut ext = self.build(); + ext.execute_with(test); + } +} diff --git a/pallets/ddc-clusters/src/test_data/metadata.json b/pallets/ddc-clusters/src/test_data/metadata.json new file mode 100644 index 000000000..4ffe526d6 --- /dev/null +++ b/pallets/ddc-clusters/src/test_data/metadata.json @@ -0,0 +1,365 @@ +{ + "source": { + "hash": "0x26d3338336a945f457e19992f37947659b0b7e4b2962369fe2f97ca7ebb95a09", + "language": "ink! 3.4.0", + "compiler": "rustc 1.69.0-nightly" + }, + "contract": { + "name": "node_provider_auth_white_list", + "version": "0.1.0", + "authors": [ + "Yahor Tsaryk " + ], + "description": "Node provider authorization layer based on admin approval", + "license": "Apache-2.0" + }, + "V3": { + "spec": { + "constructors": [ + { + "args": [], + "docs": [], + "label": "new", + "payable": false, + "selector": "0x9bae9d5e" + } + ], + "docs": [], + "events": [], + "messages": [ + { + "args": [ + { + "label": "_node_provider", + "type": { + "displayName": [ + "AccountId" + ], + "type": 0 + } + }, + { + "label": "node_pub_key", + "type": { + "displayName": [ + "NodePubKey" + ], + "type": 4 + } + }, + { + "label": "_node_variant", + "type": { + "displayName": [ + "NodeType" + ], + "type": 2 + } + } + ], + "docs": [], + "label": "is_authorized", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "bool" + ], + "type": 5 + }, + "selector": "0x96b0453e" + }, + { + "args": [ + { + "label": "node_pub_key", + "type": { + "displayName": [ + "NodePubKey" + ], + "type": 4 + } + } + ], + "docs": [], + "label": "add_node_pub_key", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "Result" + ], + "type": 7 + }, + "selector": "0x7a04093d" + }, + { + "args": [ + { + "label": "node_pub_key", + "type": { + "displayName": [ + "NodePubKey" + ], + "type": 4 + } + } + ], + "docs": [], + "label": "remove_node_pub_key", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "Result" + ], + "type": 7 + }, + "selector": "0xed3668b6" + }, + { + "args": [ + { + "label": "node_pub_key", + "type": { + "displayName": [ + "NodePubKey" + ], + "type": 4 + } + } + ], + "docs": [], + "label": "has_node_pub_key", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "bool" + ], + "type": 5 + }, + "selector": "0x9b868ecf" + }, + { + "args": [], + "docs": [], + "label": "get_admin", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "AccountId" + ], + "type": 0 + }, + "selector": "0x57b8a8a7" + } + ] + }, + "storage": { + "struct": { + "fields": [ + { + "layout": { + "cell": { + "key": "0x0000000000000000000000000000000000000000000000000000000000000000", + "ty": 0 + } + }, + "name": "admin" + }, + { + "layout": { + "cell": { + "key": "0x0100000000000000000000000000000000000000000000000000000000000000", + "ty": 3 + } + }, + "name": "list" + } + ] + } + }, + "types": [ + { + "id": 0, + "type": { + "def": { + "composite": { + "fields": [ + { + "type": 1, + "typeName": "[u8; 32]" + } + ] + } + }, + "path": [ + "ink_env", + "types", + "AccountId" + ] + } + }, + { + "id": 1, + "type": { + "def": { + "array": { + "len": 32, + "type": 2 + } + } + } + }, + { + "id": 2, + "type": { + "def": { + "primitive": "u8" + } + } + }, + { + "id": 3, + "type": { + "def": { + "composite": { + "fields": [ + { + "name": "offset_key", + "type": 6, + "typeName": "Key" + } + ] + } + }, + "params": [ + { + "name": "K", + "type": 4 + }, + { + "name": "V", + "type": 5 + } + ], + "path": [ + "ink_storage", + "lazy", + "mapping", + "Mapping" + ] + } + }, + { + "id": 4, + "type": { + "def": { + "sequence": { + "type": 2 + } + } + } + }, + { + "id": 5, + "type": { + "def": { + "primitive": "bool" + } + } + }, + { + "id": 6, + "type": { + "def": { + "composite": { + "fields": [ + { + "type": 1, + "typeName": "[u8; 32]" + } + ] + } + }, + "path": [ + "ink_primitives", + "Key" + ] + } + }, + { + "id": 7, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 8 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 9 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 8 + }, + { + "name": "E", + "type": 9 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 8, + "type": { + "def": { + "tuple": [] + } + } + }, + { + "id": 9, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 0, + "name": "OnlyAdmin" + } + ] + } + }, + "path": [ + "node_provider_auth_white_list", + "node_provider_auth_white_list", + "Error" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/pallets/ddc-clusters/src/test_data/node_provider_auth_white_list.wasm b/pallets/ddc-clusters/src/test_data/node_provider_auth_white_list.wasm new file mode 100644 index 0000000000000000000000000000000000000000..39d305f7f09c5124a444c92f60f9e84e42604e4a GIT binary patch literal 4489 zcmaJ^O^94s6+ZXpRln|6)wzkCOePcYzGov9B%~R%qdll~!z4Xn2x&1&c1bx?&dlph zCtclX7zkGRgSe6igPYm75S>|w5kzKoS&T3{XCdfDa5)=6MMOkszwh2xRo#-AZm4(v z-ud~?Ip4WY`nz|Oh^TY9pnI*6v_$x}gqlymDy6q>Y96#%tU6?(d1D zr6Mj32YdI2+tR$h6xUwu@4kBLn_KHA!&sl9-Ilu|yu`T9~>(dH#A)n4Ksf(sd z(Bgp{Vk4w0USEnJe-3*Z{zK;?2Ea#mweZI}?({Zc#CKK+&qUF;EWrA6^@c@=lr<;qQ0+_ACf7MRV`=xFhI-%F(B&>jWOPC=94l{X9oy7ye zwBamMdZ`1qFQ~JSeW0#kqLT>y(IQs$VG$N0w6|SN5ulu_m^Cs`5<1xH9hFcp0h@6w zRn|oS5DqwC8&I-ffh+MHj6!c}=3n~&5&dCcM8-6;5ZUNHBk<6Q` zSo&F9@)_d=w+;+;g4^%mR2W@>N-XVovp($Lh2Zw^at5Ujb{Yv8CHO2FgY-&bvx2J9 zs=3?&qOh#YNMzZI9i(B3D(rCcWec9c=*Bb9Z1fDi#l-O~ra_!Z8$e4y5!l2n907XJ z!*a~3AG2h=Tu>k`9$XWIw6rll5d0kg5;L)4f)WMduhNo=Wf7SPe&+imc9zWaERv_f z3y2AF@$fsaiMbfDxd4{}EAxgHK zW1>izMf2yN_CW2RHs(;G2mvc8s4PfPAr(@aoe@oIN;E*7z_KeX z3*06{kO9G#;3RiSiUI)89hXUQW7-;MBcll{@e0r&MxYW}fGTSALhDQ^)}F|2UnFH9 z05KS;qs6K|T=)%~v@PWUtd`>IQ(jasN6 z2t#_a5j+vuyb&#S9X!UWsmUY;6sicBL9IP)xDuA5Y zY8|(rIQ*Tg`&Rh!`f%v;;IEQnX}~fnAgN!D>P?vAT@#F8E};Fv)HWJ29(jq`d9g4G z=m>Mt)$SAY^+wgYOmSVk#OEBSdk6uTZ5W(55c2zrkXRNLdeLDspIU1g>!>`A-xhP5~>+tTOX}1oKr&AN} z@)fG>oY|-r`MCF>a(?l~FCSEkEN|o;2&p>eJAUySSnO~y_c<1^bd2YYMH*nG)7ZBg z;m47N4sOt3CLTiu2Jz`MSjk6G624ITs3{&_Va2Qoon65P(WFFm&lkLTS)-NMVpg%l z0?6UFTl1?V5)yF5f}bq_bu8fW+?=4Fv@P*;B$ZU{&Z|jN<;MUr1UI*s5^fP!TM$eh zS%$rBW&~X0P534r;D#G`#LPm$3_4WCDZKRPP>Q54=V;A8A1P-s-@TF{Q} z{FKK6A;C}E>2_=C=9P}YZ6L6PpPW6Rbs@oo3mIXW2RH?S&_j@#7M{Q z-8ez)::ClusterAlreadyExists + ); + + // Checking that event was emitted + assert_eq!(System::events().len(), 1); + System::assert_last_event( + Event::ClusterCreated { cluster_id: ClusterId::from([1; 20]) }.into(), + ) + }) +} + +#[test] +fn add_and_delete_node_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let contract_id = deploy_contract(); + + // Cluster doesn't exist + assert_noop!( + DdcClusters::add_node( + RuntimeOrigin::signed(AccountId::from([2; 32])), + ClusterId::from([1; 20]), + NodePubKey::CDNPubKey(AccountId::from([4; 32])), + ), + Error::::ClusterDoesNotExist + ); + + // Creating 1 cluster should work fine + assert_ok!(DdcClusters::create_cluster( + RuntimeOrigin::root(), + ClusterId::from([1; 20]), + AccountId::from([1; 32]), + AccountId::from([2; 32]), + ClusterParams { node_provider_auth_contract: AccountId::from([1; 32]) }, + ClusterGovParams { + treasury_share: Perbill::from_float(0.05), + validators_share: Perbill::from_float(0.01), + cluster_reserve_share: Perbill::from_float(0.02), + cdn_bond_size: 100, + cdn_chill_delay: 50, + cdn_unbonding_delay: 50, + storage_bond_size: 100, + storage_chill_delay: 50, + storage_unbonding_delay: 50, + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + } + )); + + // Not Cluster Manager + assert_noop!( + DdcClusters::add_node( + RuntimeOrigin::signed(AccountId::from([2; 32])), + ClusterId::from([1; 20]), + NodePubKey::CDNPubKey(AccountId::from([4; 32])), + ), + Error::::OnlyClusterManager + ); + + // Node doesn't exist + assert_noop!( + DdcClusters::add_node( + RuntimeOrigin::signed(AccountId::from([1; 32])), + ClusterId::from([1; 20]), + NodePubKey::CDNPubKey(AccountId::from([4; 32])), + ), + Error::::AttemptToAddNonExistentNode + ); + + // Create node + let bytes = [4u8; 32]; + let node_pub_key = AccountId32::from(bytes); + + let cdn_node_params = CDNNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + + // Node created + assert_ok!(DdcNodes::create_node( + RuntimeOrigin::signed(AccountId::from([1; 32])), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::CDNParams(cdn_node_params.clone()) + )); + + // Node doesn't exist + assert_noop!( + DdcClusters::add_node( + RuntimeOrigin::signed(AccountId::from([1; 32])), + ClusterId::from([1; 20]), + NodePubKey::CDNPubKey(AccountId::from([4; 32])), + ), + Error::::NodeAuthContractCallFailed + ); + + // Set the correct address for auth contract + assert_ok!(DdcClusters::set_cluster_params( + RuntimeOrigin::signed(AccountId::from([1; 32])), + ClusterId::from([1; 20]), + cluster::ClusterParams { node_provider_auth_contract: contract_id }, + )); + + // Node doesn't exist + assert_ok!(DdcClusters::add_node( + RuntimeOrigin::signed(AccountId::from([1; 32])), + ClusterId::from([1; 20]), + NodePubKey::CDNPubKey(AccountId::from([4; 32])), + )); + + // Node already assigned + assert_noop!( + DdcClusters::add_node( + RuntimeOrigin::signed(AccountId::from([1; 32])), + ClusterId::from([1; 20]), + NodePubKey::CDNPubKey(AccountId::from([4; 32])), + ), + Error::::NodeIsAlreadyAssigned + ); + + // Checking that event was emitted + System::assert_last_event( + Event::ClusterNodeAdded { + cluster_id: ClusterId::from([1; 20]), + node_pub_key: NodePubKey::CDNPubKey(AccountId::from([4; 32])), + } + .into(), + ); + + // Remove node + assert_ok!(DdcClusters::remove_node( + RuntimeOrigin::signed(AccountId::from([1; 32])), + ClusterId::from([1; 20]), + NodePubKey::CDNPubKey(AccountId::from([4; 32])), + )); + + // Checking that event was emitted + System::assert_last_event( + Event::ClusterNodeRemoved { + cluster_id: ClusterId::from([1; 20]), + node_pub_key: NodePubKey::CDNPubKey(AccountId::from([4; 32])), + } + .into(), + ); + + // Remove node should fail + assert_noop!( + DdcClusters::remove_node( + RuntimeOrigin::signed(AccountId::from([1; 32])), + ClusterId::from([1; 20]), + NodePubKey::CDNPubKey(AccountId::from([4; 32])), + ), + Error::::NodeIsNotAssigned + ); + + pub const CTOR_SELECTOR: [u8; 4] = hex!("9bae9d5e"); + + fn encode_constructor() -> Vec { + let mut call_data = CTOR_SELECTOR.to_vec(); + let x = 0 as u128; + for _ in 0..9 { + x.encode_to(&mut call_data); + } + call_data + } + + fn deploy_contract() -> AccountId { + // Admin account who deploys the contract. + let alice = AccountId::from([1; 32]); + let _ = Balances::deposit_creating(&alice, 1_000_000_000_000); + + // Load the contract code. + let wasm = &include_bytes!("./test_data/node_provider_auth_white_list.wasm")[..]; + let wasm_hash = ::Hashing::hash(wasm); + let contract_args = encode_constructor(); + + // Deploy the contract. + const GAS_LIMIT: frame_support::weights::Weight = + Weight::from_ref_time(100_000_000_000); + const ENDOWMENT: Balance = 0; + Contracts::instantiate_with_code( + RuntimeOrigin::signed(alice.clone()), + ENDOWMENT, + GAS_LIMIT, + None, + wasm.to_vec(), + contract_args.clone(), + vec![], + ) + .unwrap(); + + // Configure worker with the contract address. + let contract_id = Contracts::contract_address(&alice, &wasm_hash, &vec![]); + + pub const ADD_DDC_NODE_SELECTOR: [u8; 4] = hex!("7a04093d"); + let node_pub_key = NodePubKey::CDNPubKey(AccountId::from([4; 32])); + + let call_data = { + // is_authorized(node_provider: AccountId, node: Vec, node_variant: u8) -> bool + let args: ([u8; 4], Vec) = + (ADD_DDC_NODE_SELECTOR, node_pub_key.encode()[1..].to_vec()); + args.encode() + }; + + let results = Contracts::call( + RuntimeOrigin::signed(alice.clone()), + contract_id.clone(), + 0, + Weight::from_ref_time(1_000_000_000_000), + None, + call_data, + ); + + results.unwrap(); + + contract_id + } + }) +} + +#[test] +fn set_cluster_params_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + // Cluster doesn't exist + assert_noop!( + DdcClusters::set_cluster_params( + RuntimeOrigin::signed(AccountId::from([2; 32])), + ClusterId::from([2; 20]), + ClusterParams { node_provider_auth_contract: AccountId::from([2; 32]) }, + ), + Error::::ClusterDoesNotExist + ); + + // Creating 1 cluster should work fine + assert_ok!(DdcClusters::create_cluster( + RuntimeOrigin::root(), + ClusterId::from([1; 20]), + AccountId::from([1; 32]), + AccountId::from([2; 32]), + ClusterParams { node_provider_auth_contract: AccountId::from([1; 32]) }, + ClusterGovParams { + treasury_share: Perbill::from_float(0.05), + validators_share: Perbill::from_float(0.01), + cluster_reserve_share: Perbill::from_float(0.02), + cdn_bond_size: 100, + cdn_chill_delay: 50, + cdn_unbonding_delay: 50, + storage_bond_size: 100, + storage_chill_delay: 50, + storage_unbonding_delay: 50, + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + } + )); + + assert_noop!( + DdcClusters::set_cluster_params( + RuntimeOrigin::signed(AccountId::from([2; 32])), + ClusterId::from([1; 20]), + ClusterParams { node_provider_auth_contract: AccountId::from([2; 32]) }, + ), + Error::::OnlyClusterManager + ); + + assert_ok!(DdcClusters::set_cluster_params( + RuntimeOrigin::signed(AccountId::from([1; 32])), + ClusterId::from([1; 20]), + ClusterParams { node_provider_auth_contract: AccountId::from([2; 32]) }, + )); + + // Checking that event was emitted + assert_eq!(System::events().len(), 2); + System::assert_last_event( + Event::ClusterParamsSet { cluster_id: ClusterId::from([1; 20]) }.into(), + ) + }) +} + +#[test] +fn set_cluster_gov_params_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let cluster_gov_params = ClusterGovParams { + treasury_share: Perbill::from_float(0.05), + validators_share: Perbill::from_float(0.01), + cluster_reserve_share: Perbill::from_float(0.02), + cdn_bond_size: 100, + cdn_chill_delay: 50, + cdn_unbonding_delay: 50, + storage_bond_size: 100, + storage_chill_delay: 50, + storage_unbonding_delay: 50, + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + }; + + // Cluster doesn't exist + assert_noop!( + DdcClusters::set_cluster_gov_params( + RuntimeOrigin::root(), + ClusterId::from([2; 20]), + cluster_gov_params.clone() + ), + Error::::ClusterDoesNotExist + ); + + assert_ok!(DdcClusters::create_cluster( + RuntimeOrigin::root(), + ClusterId::from([1; 20]), + AccountId::from([1; 32]), + AccountId::from([2; 32]), + ClusterParams { node_provider_auth_contract: AccountId::from([1; 32]) }, + cluster_gov_params.clone() + )); + + assert_noop!( + DdcClusters::set_cluster_gov_params( + RuntimeOrigin::signed(AccountId::from([1; 32])), + ClusterId::from([1; 20]), + cluster_gov_params.clone() + ), + BadOrigin + ); + + assert_ok!(DdcClusters::set_cluster_gov_params( + RuntimeOrigin::root(), + ClusterId::from([1; 20]), + cluster_gov_params + )); + + // Checking that event was emitted + assert_eq!(System::events().len(), 2); + System::assert_last_event( + Event::ClusterGovParamsSet { cluster_id: ClusterId::from([1; 20]) }.into(), + ) + }) +} From f659c4b94f816c9af264f86e899122440a119629 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Sun, 12 Nov 2023 14:05:09 +0300 Subject: [PATCH 502/583] dprint fmt --- .cargo/config.toml | 32 +- Cargo.toml | 38 +- cli/Cargo.toml | 18 +- dprint.json | 11 + node/client/Cargo.toml | 28 +- node/service/Cargo.toml | 69 ++-- pallets/chainbridge/Cargo.toml | 24 +- pallets/ddc-clusters/Cargo.toml | 4 +- pallets/ddc-customers/Cargo.toml | 2 +- .../ddc-metrics-offchain-worker/Cargo.toml | 42 +- pallets/ddc/Cargo.toml | 28 +- pallets/erc20/Cargo.toml | 36 +- pallets/erc721/Cargo.toml | 30 +- primitives/Cargo.toml | 12 +- rpc/Cargo.toml | 28 +- runtime/cere-dev/Cargo.toml | 374 +++++++++--------- runtime/cere-dev/constants/Cargo.toml | 2 +- runtime/cere/Cargo.toml | 357 +++++++++-------- runtime/cere/constants/Cargo.toml | 2 +- runtime/common/Cargo.toml | 4 +- rust-toolchain.toml | 4 +- rustfmt.toml | 10 +- traits/Cargo.toml | 2 +- .../0000-block-building/block-building.toml | 8 +- .../0001-ddc-validation/ddc-validation.toml | 26 +- 25 files changed, 596 insertions(+), 595 deletions(-) create mode 100644 dprint.json diff --git a/.cargo/config.toml b/.cargo/config.toml index fc82ca587..b283a2801 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -11,21 +11,21 @@ rustflags = [ "-Aclippy::if-same-then-else", "-Aclippy::clone-double-ref", "-Dclippy::complexity", - "-Aclippy::zero-prefixed-literal", # 00_1000_000 - "-Aclippy::type_complexity", # raison d'etre - "-Aclippy::nonminimal-bool", # maybe - "-Aclippy::borrowed-box", # Reasonable to fix this one - "-Aclippy::too-many-arguments", # (Turning this on would lead to) - "-Aclippy::unnecessary_cast", # Types may change - "-Aclippy::identity-op", # One case where we do 0 + - "-Aclippy::useless_conversion", # Types may change - "-Aclippy::unit_arg", # styalistic. - "-Aclippy::option-map-unit-fn", # styalistic - "-Aclippy::bind_instead_of_map", # styalistic - "-Aclippy::erasing_op", # E.g. 0 * DOLLARS - "-Aclippy::eq_op", # In tests we test equality. + "-Aclippy::zero-prefixed-literal", # 00_1000_000 + "-Aclippy::type_complexity", # raison d'etre + "-Aclippy::nonminimal-bool", # maybe + "-Aclippy::borrowed-box", # Reasonable to fix this one + "-Aclippy::too-many-arguments", # (Turning this on would lead to) + "-Aclippy::unnecessary_cast", # Types may change + "-Aclippy::identity-op", # One case where we do 0 + + "-Aclippy::useless_conversion", # Types may change + "-Aclippy::unit_arg", # styalistic. + "-Aclippy::option-map-unit-fn", # styalistic + "-Aclippy::bind_instead_of_map", # styalistic + "-Aclippy::erasing_op", # E.g. 0 * DOLLARS + "-Aclippy::eq_op", # In tests we test equality. "-Aclippy::while_immutable_condition", # false positives - "-Aclippy::needless_option_as_deref", # false positives - "-Aclippy::derivable_impls", # false positives - "-Aclippy::stable_sort_primitive", # prefer stable sort + "-Aclippy::needless_option_as_deref", # false positives + "-Aclippy::derivable_impls", # false positives + "-Aclippy::stable_sort_primitive", # prefer stable sort ] diff --git a/Cargo.toml b/Cargo.toml index 27cff6711..a9da35ba1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,13 +4,13 @@ path = "src/main.rs" [package] name = "cere" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" version = "4.8.1" -edition = "2021" build = "build.rs" +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] -cere-cli = { path = "cli", features = [ "cere-dev-native" ] } +cere-cli = { path = "cli", features = ["cere-dev-native"] } sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } [build-dependencies] @@ -18,22 +18,22 @@ substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/pa [workspace] members = [ - "cli", - "node/client", - "node/service", - "rpc", - "runtime/cere", - "runtime/cere-dev", - "pallets/chainbridge", - "pallets/ddc", - "pallets/ddc-staking", - "pallets/erc721", - "pallets/erc20", - "pallets/ddc-metrics-offchain-worker", - "pallets/ddc-customers", - "pallets/ddc-nodes", - "pallets/ddc-clusters", - "primitives", + "cli", + "node/client", + "node/service", + "rpc", + "runtime/cere", + "runtime/cere-dev", + "pallets/chainbridge", + "pallets/ddc", + "pallets/ddc-staking", + "pallets/erc721", + "pallets/erc20", + "pallets/ddc-metrics-offchain-worker", + "pallets/ddc-customers", + "pallets/ddc-nodes", + "pallets/ddc-clusters", + "primitives", ] [profile.release] diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 77f4d290d..648c6e2fa 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -13,15 +13,15 @@ crate-type = ["cdylib", "rlib"] [dependencies] clap = { version = "3.1", features = ["derive"], optional = true } +frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } -frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } -try-runtime-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true , branch = "polkadot-v0.9.30" } +try-runtime-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } url = "2.4.1" # Local -cere-service = { path = "../node/service", default-features = false, optional = true } cere-client = { path = "../node/client", optional = true } +cere-service = { path = "../node/service", default-features = false, optional = true } [build-dependencies] substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } @@ -29,12 +29,12 @@ substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/pa [features] default = ["cli", "cere-native"] cli = [ - "clap", - "sc-cli", - "sc-service", - "frame-benchmarking-cli", - "try-runtime-cli", - "cere-client", + "clap", + "sc-cli", + "sc-service", + "frame-benchmarking-cli", + "try-runtime-cli", + "cere-client", ] runtime-benchmarks = ["cere-service/runtime-benchmarks"] try-runtime = ["cere-service/try-runtime"] diff --git a/dprint.json b/dprint.json new file mode 100644 index 000000000..82c59d3ee --- /dev/null +++ b/dprint.json @@ -0,0 +1,11 @@ +{ + "includes": [ + "**/*.{toml}" + ], + "excludes": [ + "**/target" + ], + "plugins": [ + "https://plugins.dprint.dev/toml-0.5.3.wasm" + ] + } \ No newline at end of file diff --git a/node/client/Cargo.toml b/node/client/Cargo.toml index d83bb5b03..e310ce7d1 100644 --- a/node/client/Cargo.toml +++ b/node/client/Cargo.toml @@ -4,34 +4,34 @@ version = "4.8.1" edition = "2021" [dependencies] -sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-offchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-storage = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-inherents = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-offchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-storage = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } # Local -cere-runtime = { path = "../../runtime/cere", optional = true } cere-dev-runtime = { path = "../../runtime/cere-dev", optional = true } +cere-runtime = { path = "../../runtime/cere", optional = true } [features] default = ["cere"] diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index c6c8abdfb..dbde60843 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -4,63 +4,62 @@ version = "4.8.1" edition = "2021" [dependencies] -serde = { version = "1.0.136", features = ["derive"] } -rand = "0.8" futures = "0.3.21" jsonrpsee = { version = "0.15.1", features = ["server"] } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } -sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } -sc-telemetry = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-sysinfo = { version = "6.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +rand = "0.8" +sc-authority-discovery = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-basic-authorship = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-consensus-slots = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-consensus-uncles = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-authority-discovery = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } +sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-network = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-network-common = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-transaction-storage-proof = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-authorship = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-basic-authorship = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } +sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-sysinfo = { version = "6.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-telemetry = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +serde = { version = "1.0.136", features = ["derive"] } sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-trie = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-authorship = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-transaction-storage-proof = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-trie = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } # Local cere-client = { path = "../client", default-features = false, optional = true } -cere-rpc = { path = "../../rpc" } cere-dev-runtime-constants = { path = "../../runtime/cere-dev/constants", optional = true } +cere-rpc = { path = "../../rpc" } -cere-runtime = { path = "../../runtime/cere", optional = true } cere-dev-runtime = { path = "../../runtime/cere-dev", optional = true } - +cere-runtime = { path = "../../runtime/cere", optional = true } [features] default = ["cere-native"] -cere-native = [ "cere-runtime", "cere-client/cere" ] -cere-dev-native = [ "cere-dev-runtime", "cere-dev-runtime-constants", "cere-client/cere-dev" ] +cere-native = ["cere-runtime", "cere-client/cere"] +cere-dev-native = ["cere-dev-runtime", "cere-dev-runtime-constants", "cere-client/cere-dev"] runtime-benchmarks = [ - "cere-runtime/runtime-benchmarks", - "cere-dev-runtime/runtime-benchmarks", - "sc-service/runtime-benchmarks", + "cere-runtime/runtime-benchmarks", + "cere-dev-runtime/runtime-benchmarks", + "sc-service/runtime-benchmarks", ] try-runtime = [ - "cere-runtime/try-runtime", - "cere-dev-runtime/try-runtime", + "cere-runtime/try-runtime", + "cere-dev-runtime/try-runtime", ] diff --git a/pallets/chainbridge/Cargo.toml b/pallets/chainbridge/Cargo.toml index 455a0aa8a..617e76b9b 100644 --- a/pallets/chainbridge/Cargo.toml +++ b/pallets/chainbridge/Cargo.toml @@ -3,11 +3,11 @@ name = "pallet-chainbridge" version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" -license = "Unlicense" homepage = "https://substrate.io" +license = "Unlicense" +readme = "README.md" repository = "https://github.com/paritytech/substrate/" description = "" -readme = "README.md" [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] @@ -16,22 +16,22 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } [features] default = ["std"] std = [ - "codec/std", - "sp-runtime/std", - "frame-support/std", - "frame-system/std", - "pallet-balances/std", - "sp-io/std", - "sp-std/std", - "sp-core/std", + "codec/std", + "sp-runtime/std", + "frame-support/std", + "frame-system/std", + "pallet-balances/std", + "sp-io/std", + "sp-std/std", + "sp-core/std", ] diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index 0ef556a69..7bd5018b4 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -9,11 +9,11 @@ ddc-primitives = { version = "0.1.0", default-features = false, path = "../../pr ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } [dev-dependencies] sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 8d60ba44f..89faf08a5 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -9,10 +9,10 @@ ddc-primitives = { version = "0.1.0", default-features = false, path = "../../pr ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +log = { version = "0.4.17", default-features = false } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -log = { version = "0.4.17", default-features = false } [dev-dependencies] substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-metrics-offchain-worker/Cargo.toml b/pallets/ddc-metrics-offchain-worker/Cargo.toml index 3ab61de26..d56726763 100644 --- a/pallets/ddc-metrics-offchain-worker/Cargo.toml +++ b/pallets/ddc-metrics-offchain-worker/Cargo.toml @@ -3,49 +3,49 @@ name = "pallet-ddc-metrics-offchain-worker" version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" -license = "Unlicense" homepage = "https://substrate.dev" +license = "Unlicense" +readme = "README.md" repository = "https://github.com/paritytech/substrate/" description = "FRAME example pallet for offchain worker" -readme = "README.md" [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] [dependencies] +alt_serde = { version = "1", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["full"] } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +hex = { version = "0.4", default-features = false } +# pallet-contracts-rpc-runtime-api = { version = "0.8.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +hex-literal = "^0.3.1" +pallet-contracts = { version = '4.0.0-dev', default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts = { version = '4.0.0-dev', default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -alt_serde = { version = "1", default-features = false, features = ["derive"] } -serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } -# pallet-contracts-rpc-runtime-api = { version = "0.8.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -hex-literal = "^0.3.1" -hex = { version = "0.4", default-features = false } -scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } [features] default = ["std"] std = [ - "codec/std", - "sp-keystore", - "frame-support/std", - "frame-system/std", - "sp-core/std", - "sp-io/std", - "sp-runtime/std", - "sp-std/std", - "pallet-contracts/std", - # "pallet-contracts-rpc-runtime-api/std", + "codec/std", + "sp-keystore", + "frame-support/std", + "frame-system/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "pallet-contracts/std", + # "pallet-contracts-rpc-runtime-api/std", ] [dev-dependencies] pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pretty_assertions = "0.6.1" diff --git a/pallets/ddc/Cargo.toml b/pallets/ddc/Cargo.toml index 867c36f52..f25de5056 100644 --- a/pallets/ddc/Cargo.toml +++ b/pallets/ddc/Cargo.toml @@ -1,13 +1,13 @@ [package] +name = 'pallet-cere-ddc' +version = '4.8.1' authors = ['Substrate DevHub '] -description = 'FRAME pallet template for defining custom runtime logic.' edition = '2021' homepage = 'https://www.cere.network/' license = 'Unlicense' -name = 'pallet-cere-ddc' -repository = 'https://github.com/Cerebellum-Network/ddc-pallet' -version = '4.8.1' readme = 'README.md' +repository = 'https://github.com/Cerebellum-Network/ddc-pallet' +description = 'FRAME pallet template for defining custom runtime logic.' [package.metadata.docs.rs] targets = ['x86_64-unknown-linux-gnu'] @@ -16,24 +16,24 @@ targets = ['x86_64-unknown-linux-gnu'] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [dev-dependencies] -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } serde = { version = "1.0.101" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ['std'] std = [ - 'codec/std', - 'sp-io/std', - 'sp-std/std', - 'sp-runtime/std', - 'frame-support/std', - 'frame-system/std', + 'codec/std', + 'sp-io/std', + 'sp-std/std', + 'sp-runtime/std', + 'frame-support/std', + 'frame-system/std', ] [package.metadata.cargo-machete] diff --git a/pallets/erc20/Cargo.toml b/pallets/erc20/Cargo.toml index 3bf27fea6..580ba103f 100644 --- a/pallets/erc20/Cargo.toml +++ b/pallets/erc20/Cargo.toml @@ -3,11 +3,11 @@ name = "pallet-erc20" version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" -license = "Unlicense" homepage = "https://substrate.dev" +license = "Unlicense" +readme = "README.md" repository = "https://github.com/paritytech/substrate/" description = "FRAME example pallet" -readme = "README.md" [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] @@ -17,29 +17,29 @@ codec = { package = "parity-scale-codec", version = "3.1.5", default-features = frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } -sp-arithmetic = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-chainbridge = { version = "4.2.0", default-features = false, path = "../chainbridge" } pallet-erc721 = { version = "4.2.0", default-features = false, path = "../erc721" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +sp-arithmetic = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] std = [ - "codec/std", - "sp-runtime/std", - "frame-support/std", - "frame-system/std", - "pallet-balances/std", - "sp-io/std", - "sp-std/std", - "sp-core/std", - "sp-arithmetic/std", - "pallet-chainbridge/std", - "pallet-erc721/std" + "codec/std", + "sp-runtime/std", + "frame-support/std", + "frame-system/std", + "pallet-balances/std", + "sp-io/std", + "sp-std/std", + "sp-core/std", + "sp-arithmetic/std", + "pallet-chainbridge/std", + "pallet-erc721/std", ] [package.metadata.cargo-machete] diff --git a/pallets/erc721/Cargo.toml b/pallets/erc721/Cargo.toml index e6e12c37f..08e9b531a 100644 --- a/pallets/erc721/Cargo.toml +++ b/pallets/erc721/Cargo.toml @@ -3,11 +3,11 @@ name = "pallet-erc721" version = "4.8.1" authors = ["Parity Technologies "] edition = "2021" -license = "Unlicense" homepage = "https://substrate.dev" +license = "Unlicense" +readme = "README.md" repository = "https://github.com/paritytech/substrate/" description = "FRAME example pallet" -readme = "README.md" [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] @@ -17,23 +17,23 @@ codec = { package = "parity-scale-codec", version = "3.1.5", default-features = frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false,git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-chainbridge = { version = "4.2.0", default-features = false, path = "../chainbridge" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] std = [ - "codec/std", - "sp-runtime/std", - "frame-support/std", - "frame-system/std", - "pallet-balances/std", - "sp-io/std", - "sp-std/std", - "sp-core/std", - "pallet-chainbridge/std" + "codec/std", + "sp-runtime/std", + "frame-support/std", + "frame-system/std", + "pallet-balances/std", + "sp-io/std", + "sp-std/std", + "sp-core/std", + "pallet-chainbridge/std", ] diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 178800a4b..607c87512 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -serde = { version = "1.0.136", default-features = false, features = [ "derive" ], optional = true } +serde = { version = "1.0.136", default-features = false, features = ["derive"], optional = true } sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -14,10 +14,10 @@ sp-runtime = { version = "6.0.0", default-features = false, git = "https://githu [features] default = ["std"] std = [ - "codec/std", - "scale-info/std", - "serde", - "sp-core/std", - "sp-runtime/std", + "codec/std", + "scale-info/std", + "serde", + "sp-core/std", + "sp-runtime/std", ] runtime-benchmarks = [] diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index e037f35f4..92f3e9a6f 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -5,26 +5,26 @@ edition = "2021" [dependencies] jsonrpsee = { version = "0.15.1", features = ["server"] } -sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-rpc-api = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-consensus-babe-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-consensus-epochs = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-finality-grandpa-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-rpc-api = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -substrate-frame-rpc-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -pallet-transaction-payment-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +substrate-frame-rpc-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } substrate-state-trie-migration-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index e78c7dd17..9d47b5f64 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -2,51 +2,49 @@ name = "cere-dev-runtime" version = "4.8.1" authors = ["Parity Technologies "] -edition = "2021" build = "build.rs" -license = "Apache-2.0" +edition = "2021" homepage = "https://substrate.io" +license = "Apache-2.0" repository = "https://github.com/paritytech/substrate/" [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] [dependencies] - # third-party dependencies -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = [ - "derive", - "max-encoded-len", -] } -scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -static_assertions = "1.1.0" +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.16", default-features = false } +scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +static_assertions = "1.1.0" # primitives +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, version = "4.0.0-dev" } +sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } # frame dependencies -frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +cere-dev-runtime-constants = { path = "./constants", default-features = false } +cere-runtime-common = { path = "../common", default-features = false } frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -55,55 +53,53 @@ pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https:// pallet-bags-list = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } +pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-ddc-clusters = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-clusters" } +pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } +pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } +pallet-ddc-nodes = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-nodes" } +pallet-ddc-staking = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-staking" } pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } pallet-elections-phragmen = { version = "5.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } +pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } +pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } +pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-indices = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-membership = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-multisig = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true , branch = "polkadot-v0.9.30" } +pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } +pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "polkadot-v0.9.30" } +pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } pallet-offences = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-offences-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } pallet-proxy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-recovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-session = { version = "4.0.0-dev", features = ["historical"], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-session-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } +pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-tips = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -cere-runtime-common = { path = "../common", default-features = false } -cere-dev-runtime-constants = { path = "./constants", default-features = false } -pallet-ddc-staking = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-staking" } -pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } -pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } -pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } -pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } -pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } -pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } -pallet-ddc-nodes = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-nodes" } -pallet-ddc-clusters = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-clusters" } [build-dependencies] substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -112,158 +108,158 @@ substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/pari default = ["std"] with-tracing = ["frame-executive/with-tracing"] std = [ - "sp-authority-discovery/std", - "pallet-authority-discovery/std", - "pallet-authorship/std", - "sp-consensus-babe/std", - "pallet-babe/std", - "pallet-bags-list/std", - "pallet-balances/std", - "pallet-bounties/std", - "sp-block-builder/std", - "codec/std", - "scale-info/std", - "pallet-collective/std", - "pallet-contracts/std", - "pallet-contracts-primitives/std", - "pallet-contracts-rpc-runtime-api/std", - "pallet-democracy/std", - "pallet-fast-unstake/std", - "pallet-elections-phragmen/std", - "frame-executive/std", - "pallet-cere-ddc/std", - "pallet-chainbridge/std", - "pallet-erc721/std", - "pallet-erc20/std", - "pallet-grandpa/std", - "pallet-im-online/std", - "pallet-indices/std", - "sp-inherents/std", - "pallet-membership/std", - "pallet-multisig/std", - "pallet-nomination-pools/std", - "pallet-nomination-pools-runtime-api/std", - "pallet-identity/std", - "pallet-scheduler/std", - "node-primitives/std", - "sp-offchain/std", - "pallet-offences/std", - "pallet-proxy/std", - "sp-core/std", - "pallet-randomness-collective-flip/std", - "sp-std/std", - "pallet-session/std", - "sp-api/std", - "sp-runtime/std", - "sp-staking/std", - "pallet-staking/std", - "sp-session/std", - "pallet-sudo/std", - "frame-support/std", - "frame-benchmarking/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "pallet-election-provider-multi-phase/std", - "pallet-timestamp/std", - "pallet-tips/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-treasury/std", - "sp-transaction-pool/std", - "pallet-utility/std", - "sp-version/std", - "pallet-society/std", - "pallet-recovery/std", - "pallet-vesting/std", - "log/std", - "frame-try-runtime/std", - "sp-io/std", - "pallet-child-bounties/std", - "pallet-ddc-metrics-offchain-worker/std", - "pallet-ddc-staking/std", - "cere-runtime-common/std", - "cere-dev-runtime-constants/std", - "pallet-ddc-customers/std", - "pallet-ddc-nodes/std", - "pallet-ddc-clusters/std", + "sp-authority-discovery/std", + "pallet-authority-discovery/std", + "pallet-authorship/std", + "sp-consensus-babe/std", + "pallet-babe/std", + "pallet-bags-list/std", + "pallet-balances/std", + "pallet-bounties/std", + "sp-block-builder/std", + "codec/std", + "scale-info/std", + "pallet-collective/std", + "pallet-contracts/std", + "pallet-contracts-primitives/std", + "pallet-contracts-rpc-runtime-api/std", + "pallet-democracy/std", + "pallet-fast-unstake/std", + "pallet-elections-phragmen/std", + "frame-executive/std", + "pallet-cere-ddc/std", + "pallet-chainbridge/std", + "pallet-erc721/std", + "pallet-erc20/std", + "pallet-grandpa/std", + "pallet-im-online/std", + "pallet-indices/std", + "sp-inherents/std", + "pallet-membership/std", + "pallet-multisig/std", + "pallet-nomination-pools/std", + "pallet-nomination-pools-runtime-api/std", + "pallet-identity/std", + "pallet-scheduler/std", + "node-primitives/std", + "sp-offchain/std", + "pallet-offences/std", + "pallet-proxy/std", + "sp-core/std", + "pallet-randomness-collective-flip/std", + "sp-std/std", + "pallet-session/std", + "sp-api/std", + "sp-runtime/std", + "sp-staking/std", + "pallet-staking/std", + "sp-session/std", + "pallet-sudo/std", + "frame-support/std", + "frame-benchmarking/std", + "frame-system-rpc-runtime-api/std", + "frame-system/std", + "pallet-election-provider-multi-phase/std", + "pallet-timestamp/std", + "pallet-tips/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + "pallet-treasury/std", + "sp-transaction-pool/std", + "pallet-utility/std", + "sp-version/std", + "pallet-society/std", + "pallet-recovery/std", + "pallet-vesting/std", + "log/std", + "frame-try-runtime/std", + "sp-io/std", + "pallet-child-bounties/std", + "pallet-ddc-metrics-offchain-worker/std", + "pallet-ddc-staking/std", + "cere-runtime-common/std", + "cere-dev-runtime-constants/std", + "pallet-ddc-customers/std", + "pallet-ddc-nodes/std", + "pallet-ddc-clusters/std", ] runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "pallet-babe/runtime-benchmarks", - "pallet-bags-list/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-bounties/runtime-benchmarks", - "pallet-child-bounties/runtime-benchmarks", - "pallet-collective/runtime-benchmarks", - "pallet-contracts/runtime-benchmarks", - "pallet-democracy/runtime-benchmarks", - "pallet-election-provider-multi-phase/runtime-benchmarks", - "pallet-election-provider-support-benchmarking/runtime-benchmarks", - "pallet-elections-phragmen/runtime-benchmarks", - "pallet-fast-unstake/runtime-benchmarks", - "pallet-grandpa/runtime-benchmarks", - "pallet-identity/runtime-benchmarks", - "pallet-im-online/runtime-benchmarks", - "pallet-indices/runtime-benchmarks", - "pallet-membership/runtime-benchmarks", - "pallet-multisig/runtime-benchmarks", - "pallet-nomination-pools/runtime-benchmarks", - "pallet-nomination-pools-benchmarking/runtime-benchmarks", - "pallet-offences-benchmarking/runtime-benchmarks", - "pallet-proxy/runtime-benchmarks", - "pallet-scheduler/runtime-benchmarks", - "pallet-session-benchmarking/runtime-benchmarks", - "pallet-society/runtime-benchmarks", - "pallet-staking/runtime-benchmarks", - "pallet-ddc-staking/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-tips/runtime-benchmarks", - "pallet-treasury/runtime-benchmarks", - "pallet-utility/runtime-benchmarks", - "pallet-vesting/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "hex-literal", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "pallet-babe/runtime-benchmarks", + "pallet-bags-list/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-bounties/runtime-benchmarks", + "pallet-child-bounties/runtime-benchmarks", + "pallet-collective/runtime-benchmarks", + "pallet-contracts/runtime-benchmarks", + "pallet-democracy/runtime-benchmarks", + "pallet-election-provider-multi-phase/runtime-benchmarks", + "pallet-election-provider-support-benchmarking/runtime-benchmarks", + "pallet-elections-phragmen/runtime-benchmarks", + "pallet-fast-unstake/runtime-benchmarks", + "pallet-grandpa/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-im-online/runtime-benchmarks", + "pallet-indices/runtime-benchmarks", + "pallet-membership/runtime-benchmarks", + "pallet-multisig/runtime-benchmarks", + "pallet-nomination-pools/runtime-benchmarks", + "pallet-nomination-pools-benchmarking/runtime-benchmarks", + "pallet-offences-benchmarking/runtime-benchmarks", + "pallet-proxy/runtime-benchmarks", + "pallet-scheduler/runtime-benchmarks", + "pallet-session-benchmarking/runtime-benchmarks", + "pallet-society/runtime-benchmarks", + "pallet-staking/runtime-benchmarks", + "pallet-ddc-staking/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-tips/runtime-benchmarks", + "pallet-treasury/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", + "pallet-vesting/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "hex-literal", ] try-runtime = [ - "frame-executive/try-runtime", - "frame-try-runtime", - "frame-system/try-runtime", - "pallet-authority-discovery/try-runtime", - "pallet-authorship/try-runtime", - "pallet-babe/try-runtime", - "pallet-bags-list/try-runtime", - "pallet-balances/try-runtime", - "pallet-bounties/try-runtime", - "pallet-child-bounties/try-runtime", - "pallet-collective/try-runtime", - "pallet-contracts/try-runtime", - "pallet-democracy/try-runtime", - "pallet-election-provider-multi-phase/try-runtime", - "pallet-elections-phragmen/try-runtime", - "pallet-fast-unstake/try-runtime", - "pallet-grandpa/try-runtime", - "pallet-identity/try-runtime", - "pallet-im-online/try-runtime", - "pallet-indices/try-runtime", - "pallet-membership/try-runtime", - "pallet-multisig/try-runtime", - "pallet-nomination-pools/try-runtime", - "pallet-offences/try-runtime", - "pallet-proxy/try-runtime", - "pallet-randomness-collective-flip/try-runtime", - "pallet-recovery/try-runtime", - "pallet-scheduler/try-runtime", - "pallet-session/try-runtime", - "pallet-society/try-runtime", - "pallet-staking/try-runtime", - "pallet-sudo/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-tips/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-treasury/try-runtime", - "pallet-utility/try-runtime", - "pallet-vesting/try-runtime", + "frame-executive/try-runtime", + "frame-try-runtime", + "frame-system/try-runtime", + "pallet-authority-discovery/try-runtime", + "pallet-authorship/try-runtime", + "pallet-babe/try-runtime", + "pallet-bags-list/try-runtime", + "pallet-balances/try-runtime", + "pallet-bounties/try-runtime", + "pallet-child-bounties/try-runtime", + "pallet-collective/try-runtime", + "pallet-contracts/try-runtime", + "pallet-democracy/try-runtime", + "pallet-election-provider-multi-phase/try-runtime", + "pallet-elections-phragmen/try-runtime", + "pallet-fast-unstake/try-runtime", + "pallet-grandpa/try-runtime", + "pallet-identity/try-runtime", + "pallet-im-online/try-runtime", + "pallet-indices/try-runtime", + "pallet-membership/try-runtime", + "pallet-multisig/try-runtime", + "pallet-nomination-pools/try-runtime", + "pallet-offences/try-runtime", + "pallet-proxy/try-runtime", + "pallet-randomness-collective-flip/try-runtime", + "pallet-recovery/try-runtime", + "pallet-scheduler/try-runtime", + "pallet-session/try-runtime", + "pallet-society/try-runtime", + "pallet-staking/try-runtime", + "pallet-sudo/try-runtime", + "pallet-timestamp/try-runtime", + "pallet-tips/try-runtime", + "pallet-transaction-payment/try-runtime", + "pallet-treasury/try-runtime", + "pallet-utility/try-runtime", + "pallet-vesting/try-runtime", ] diff --git a/runtime/cere-dev/constants/Cargo.toml b/runtime/cere-dev/constants/Cargo.toml index 201630962..d42c6c5b2 100644 --- a/runtime/cere-dev/constants/Cargo.toml +++ b/runtime/cere-dev/constants/Cargo.toml @@ -10,5 +10,5 @@ node-primitives = { version = "2.0.0", default-features = false, git = "https:// [features] default = ["std"] std = [ - "node-primitives/std" + "node-primitives/std", ] diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index 698fa079b..95cfa8a4b 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -2,51 +2,49 @@ name = "cere-runtime" version = "4.8.1" authors = ["Parity Technologies "] -edition = "2021" build = "build.rs" -license = "Apache-2.0" +edition = "2021" homepage = "https://substrate.io" +license = "Apache-2.0" repository = "https://github.com/paritytech/substrate/" [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] [dependencies] - # third-party dependencies -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = [ - "derive", - "max-encoded-len", -] } -scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -static_assertions = "1.1.0" +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.3.4", optional = true } log = { version = "0.4.16", default-features = false } +scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +static_assertions = "1.1.0" # primitives +node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, version = "4.0.0-dev" } +sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } # frame dependencies -frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +cere-runtime-common = { path = "../common", default-features = false } +cere-runtime-constants = { path = "./constants", default-features = false } frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -55,51 +53,49 @@ pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https:// pallet-bags-list = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } +pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } pallet-elections-phragmen = { version = "5.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } +pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } +pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } +pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-indices = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-membership = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-multisig = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } -pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true , branch = "polkadot-v0.9.30" } +pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } +pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "polkadot-v0.9.30" } +pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } pallet-offences = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-offences-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } pallet-proxy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-recovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-session = { version = "4.0.0-dev", features = [ "historical" ], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-session = { version = "4.0.0-dev", features = ["historical"], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } pallet-session-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } +pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-tips = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -cere-runtime-common = { path = "../common", default-features = false } -cere-runtime-constants = { path = "./constants", default-features = false } -pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } -pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } -pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } -pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } -pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } [build-dependencies] substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -108,154 +104,153 @@ substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/pari default = ["std"] with-tracing = ["frame-executive/with-tracing"] std = [ - "sp-authority-discovery/std", - "pallet-authority-discovery/std", - "pallet-authorship/std", - "sp-consensus-babe/std", - "pallet-babe/std", - "pallet-bags-list/std", - "pallet-balances/std", - "pallet-bounties/std", - "sp-block-builder/std", - "codec/std", - "scale-info/std", - "pallet-collective/std", - "pallet-contracts/std", - "pallet-contracts-primitives/std", - "pallet-contracts-rpc-runtime-api/std", - "pallet-democracy/std", - "pallet-fast-unstake/std", - "pallet-elections-phragmen/std", - "frame-executive/std", - "pallet-cere-ddc/std", - "pallet-chainbridge/std", - "pallet-erc721/std", - "pallet-erc20/std", - "pallet-grandpa/std", - "pallet-im-online/std", - "pallet-indices/std", - "sp-inherents/std", - "pallet-membership/std", - "pallet-multisig/std", - "pallet-nomination-pools/std", - "pallet-nomination-pools-runtime-api/std", - "pallet-identity/std", - "pallet-scheduler/std", - "node-primitives/std", - "sp-offchain/std", - "pallet-offences/std", - "pallet-proxy/std", - "sp-core/std", - "pallet-randomness-collective-flip/std", - "sp-std/std", - "pallet-session/std", - "sp-api/std", - "sp-runtime/std", - "sp-staking/std", - "pallet-staking/std", - "sp-session/std", - "pallet-sudo/std", - "frame-support/std", - "frame-benchmarking/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "pallet-election-provider-multi-phase/std", - "pallet-timestamp/std", - "pallet-tips/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-treasury/std", - "sp-transaction-pool/std", - "pallet-utility/std", - "sp-version/std", - "pallet-society/std", - "pallet-recovery/std", - "pallet-vesting/std", - "log/std", - "frame-try-runtime/std", - "sp-io/std", - "pallet-child-bounties/std", - "pallet-ddc-metrics-offchain-worker/std", - "cere-runtime-common/std", - "cere-runtime-constants/std" + "sp-authority-discovery/std", + "pallet-authority-discovery/std", + "pallet-authorship/std", + "sp-consensus-babe/std", + "pallet-babe/std", + "pallet-bags-list/std", + "pallet-balances/std", + "pallet-bounties/std", + "sp-block-builder/std", + "codec/std", + "scale-info/std", + "pallet-collective/std", + "pallet-contracts/std", + "pallet-contracts-primitives/std", + "pallet-contracts-rpc-runtime-api/std", + "pallet-democracy/std", + "pallet-fast-unstake/std", + "pallet-elections-phragmen/std", + "frame-executive/std", + "pallet-cere-ddc/std", + "pallet-chainbridge/std", + "pallet-erc721/std", + "pallet-erc20/std", + "pallet-grandpa/std", + "pallet-im-online/std", + "pallet-indices/std", + "sp-inherents/std", + "pallet-membership/std", + "pallet-multisig/std", + "pallet-nomination-pools/std", + "pallet-nomination-pools-runtime-api/std", + "pallet-identity/std", + "pallet-scheduler/std", + "node-primitives/std", + "sp-offchain/std", + "pallet-offences/std", + "pallet-proxy/std", + "sp-core/std", + "pallet-randomness-collective-flip/std", + "sp-std/std", + "pallet-session/std", + "sp-api/std", + "sp-runtime/std", + "sp-staking/std", + "pallet-staking/std", + "sp-session/std", + "pallet-sudo/std", + "frame-support/std", + "frame-benchmarking/std", + "frame-system-rpc-runtime-api/std", + "frame-system/std", + "pallet-election-provider-multi-phase/std", + "pallet-timestamp/std", + "pallet-tips/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + "pallet-treasury/std", + "sp-transaction-pool/std", + "pallet-utility/std", + "sp-version/std", + "pallet-society/std", + "pallet-recovery/std", + "pallet-vesting/std", + "log/std", + "frame-try-runtime/std", + "sp-io/std", + "pallet-child-bounties/std", + "pallet-ddc-metrics-offchain-worker/std", + "cere-runtime-common/std", + "cere-runtime-constants/std", ] runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "pallet-babe/runtime-benchmarks", - "pallet-bags-list/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-bounties/runtime-benchmarks", - "pallet-child-bounties/runtime-benchmarks", - "pallet-collective/runtime-benchmarks", - "pallet-contracts/runtime-benchmarks", - "pallet-democracy/runtime-benchmarks", - "pallet-election-provider-multi-phase/runtime-benchmarks", - "pallet-election-provider-support-benchmarking/runtime-benchmarks", - "pallet-elections-phragmen/runtime-benchmarks", - "pallet-fast-unstake/runtime-benchmarks", - "pallet-grandpa/runtime-benchmarks", - "pallet-identity/runtime-benchmarks", - "pallet-im-online/runtime-benchmarks", - "pallet-indices/runtime-benchmarks", - "pallet-membership/runtime-benchmarks", - "pallet-multisig/runtime-benchmarks", - "pallet-nomination-pools/runtime-benchmarks", - "pallet-nomination-pools-benchmarking/runtime-benchmarks", - "pallet-offences-benchmarking/runtime-benchmarks", - "pallet-proxy/runtime-benchmarks", - "pallet-scheduler/runtime-benchmarks", - "pallet-session-benchmarking/runtime-benchmarks", - "pallet-society/runtime-benchmarks", - "pallet-staking/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-tips/runtime-benchmarks", - "pallet-treasury/runtime-benchmarks", - "pallet-utility/runtime-benchmarks", - "pallet-vesting/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "hex-literal", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "pallet-babe/runtime-benchmarks", + "pallet-bags-list/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-bounties/runtime-benchmarks", + "pallet-child-bounties/runtime-benchmarks", + "pallet-collective/runtime-benchmarks", + "pallet-contracts/runtime-benchmarks", + "pallet-democracy/runtime-benchmarks", + "pallet-election-provider-multi-phase/runtime-benchmarks", + "pallet-election-provider-support-benchmarking/runtime-benchmarks", + "pallet-elections-phragmen/runtime-benchmarks", + "pallet-fast-unstake/runtime-benchmarks", + "pallet-grandpa/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-im-online/runtime-benchmarks", + "pallet-indices/runtime-benchmarks", + "pallet-membership/runtime-benchmarks", + "pallet-multisig/runtime-benchmarks", + "pallet-nomination-pools/runtime-benchmarks", + "pallet-nomination-pools-benchmarking/runtime-benchmarks", + "pallet-offences-benchmarking/runtime-benchmarks", + "pallet-proxy/runtime-benchmarks", + "pallet-scheduler/runtime-benchmarks", + "pallet-session-benchmarking/runtime-benchmarks", + "pallet-society/runtime-benchmarks", + "pallet-staking/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-tips/runtime-benchmarks", + "pallet-treasury/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", + "pallet-vesting/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "hex-literal", ] try-runtime = [ - "frame-executive/try-runtime", - "frame-try-runtime", - "frame-system/try-runtime", - "pallet-authority-discovery/try-runtime", - "pallet-authorship/try-runtime", - "pallet-babe/try-runtime", - "pallet-bags-list/try-runtime", - "pallet-balances/try-runtime", - "pallet-bounties/try-runtime", - "pallet-child-bounties/try-runtime", - "pallet-collective/try-runtime", - "pallet-contracts/try-runtime", - "pallet-democracy/try-runtime", - "pallet-election-provider-multi-phase/try-runtime", - "pallet-elections-phragmen/try-runtime", - "pallet-fast-unstake/try-runtime", - "pallet-grandpa/try-runtime", - "pallet-identity/try-runtime", - "pallet-im-online/try-runtime", - "pallet-indices/try-runtime", - "pallet-membership/try-runtime", - "pallet-multisig/try-runtime", - "pallet-nomination-pools/try-runtime", - "pallet-offences/try-runtime", - "pallet-proxy/try-runtime", - "pallet-randomness-collective-flip/try-runtime", - "pallet-recovery/try-runtime", - "pallet-scheduler/try-runtime", - "pallet-session/try-runtime", - "pallet-society/try-runtime", - "pallet-staking/try-runtime", - "pallet-sudo/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-tips/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-treasury/try-runtime", - "pallet-utility/try-runtime", - "pallet-vesting/try-runtime", + "frame-executive/try-runtime", + "frame-try-runtime", + "frame-system/try-runtime", + "pallet-authority-discovery/try-runtime", + "pallet-authorship/try-runtime", + "pallet-babe/try-runtime", + "pallet-bags-list/try-runtime", + "pallet-balances/try-runtime", + "pallet-bounties/try-runtime", + "pallet-child-bounties/try-runtime", + "pallet-collective/try-runtime", + "pallet-contracts/try-runtime", + "pallet-democracy/try-runtime", + "pallet-election-provider-multi-phase/try-runtime", + "pallet-elections-phragmen/try-runtime", + "pallet-fast-unstake/try-runtime", + "pallet-grandpa/try-runtime", + "pallet-identity/try-runtime", + "pallet-im-online/try-runtime", + "pallet-indices/try-runtime", + "pallet-membership/try-runtime", + "pallet-multisig/try-runtime", + "pallet-nomination-pools/try-runtime", + "pallet-offences/try-runtime", + "pallet-proxy/try-runtime", + "pallet-randomness-collective-flip/try-runtime", + "pallet-recovery/try-runtime", + "pallet-scheduler/try-runtime", + "pallet-session/try-runtime", + "pallet-society/try-runtime", + "pallet-staking/try-runtime", + "pallet-sudo/try-runtime", + "pallet-timestamp/try-runtime", + "pallet-tips/try-runtime", + "pallet-transaction-payment/try-runtime", + "pallet-treasury/try-runtime", + "pallet-utility/try-runtime", + "pallet-vesting/try-runtime", ] - diff --git a/runtime/cere/constants/Cargo.toml b/runtime/cere/constants/Cargo.toml index 629d01bcb..592358dfa 100644 --- a/runtime/cere/constants/Cargo.toml +++ b/runtime/cere/constants/Cargo.toml @@ -10,5 +10,5 @@ node-primitives = { version = "2.0.0", default-features = false, git = "https:// [features] default = ["std"] std = [ - "node-primitives/std" + "node-primitives/std", ] diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 15c08df07..5aff0c986 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -10,7 +10,7 @@ no_std = [] std = [] [dependencies] -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.30" } frame-support = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } -sp-core = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } node-primitives = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } +sp-core = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index bcf909e27..7e60322a9 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] channel = "nightly-2022-10-09" -components = [ "clippy", "rustfmt" ] -targets = [ "wasm32-unknown-unknown" ] +components = ["clippy", "rustfmt"] +targets = ["wasm32-unknown-unknown"] diff --git a/rustfmt.toml b/rustfmt.toml index f58198d98..2797c252b 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -23,9 +23,9 @@ trailing_semicolon = false use_field_init_shorthand = true ignore = [ - "pallets/chainbridge", - "pallets/ddc-metrics-offchain-worker", - "pallets/ddc", - "pallets/erc20", - "pallets/erc721", + "pallets/chainbridge", + "pallets/ddc-metrics-offchain-worker", + "pallets/ddc", + "pallets/erc20", + "pallets/erc721", ] diff --git a/traits/Cargo.toml b/traits/Cargo.toml index 202996ef0..63f8cbd4e 100644 --- a/traits/Cargo.toml +++ b/traits/Cargo.toml @@ -4,5 +4,5 @@ version = "0.1.0" edition = "2021" [dependencies] -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } ddc-primitives = { version = "0.1.0", default-features = false, path = "../primitives" } +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/zombienet/0000-block-building/block-building.toml b/zombienet/0000-block-building/block-building.toml index b9d662117..10b9955de 100644 --- a/zombienet/0000-block-building/block-building.toml +++ b/zombienet/0000-block-building/block-building.toml @@ -2,8 +2,8 @@ default_command = "./target/release/cere" chain = "local" - [[relaychain.nodes]] - name = "alice" +[[relaychain.nodes]] +name = "alice" - [[relaychain.nodes]] - name = "bob" +[[relaychain.nodes]] +name = "bob" diff --git a/zombienet/0001-ddc-validation/ddc-validation.toml b/zombienet/0001-ddc-validation/ddc-validation.toml index 64b4111ed..e5d7ae40a 100644 --- a/zombienet/0001-ddc-validation/ddc-validation.toml +++ b/zombienet/0001-ddc-validation/ddc-validation.toml @@ -3,21 +3,21 @@ default_command = "./target/release/cere" default_args = ["--enable-ddc-validation --dac-url {{DAC_URL}}"] chain = "local" - [[relaychain.nodes]] - name = "alice" +[[relaychain.nodes]] +name = "alice" - [[relaychain.nodes]] - name = "bob" +[[relaychain.nodes]] +name = "bob" - [[relaychain.nodes]] - name = "charlie" +[[relaychain.nodes]] +name = "charlie" - [[relaychain.nodes]] - name = "dave" +[[relaychain.nodes]] +name = "dave" - [[relaychain.nodes]] - name = "eve" +[[relaychain.nodes]] +name = "eve" - [[relaychain.nodes]] - name = "ferdie" - validator = false +[[relaychain.nodes]] +name = "ferdie" +validator = false From 3773f0fc631ac04be437fc3589c90afc6fc3c90f Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Sun, 12 Nov 2023 14:07:05 +0300 Subject: [PATCH 503/583] Add github action --- .github/workflows/check.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 1ecb04c4b..04af2420e 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -28,6 +28,9 @@ jobs: rustup update stable --no-self-update rustup target add wasm32-unknown-unknown + - name: Check TOML + uses: dprint/check@v2.2 + - name: Check Format run: | cargo fmt -- --check From 299048b5ebd6df9656e1bbab18a9f796f17772ee Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Sun, 12 Nov 2023 14:17:35 +0300 Subject: [PATCH 504/583] Fix clippy for MinVestedTransfer --- runtime/cere-dev/src/lib.rs | 2 +- runtime/cere/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index e51ec4611..cb40e59a5 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1196,7 +1196,7 @@ impl pallet_society::Config for Runtime { } parameter_types! { - pub const MinVestedTransfer: Balance = 1 * DOLLARS; + pub const MinVestedTransfer: Balance = DOLLARS; pub UnvestedFundsAllowedWithdrawReasons: WithdrawReasons = WithdrawReasons::except(WithdrawReasons::TRANSFER | WithdrawReasons::RESERVE); } diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 31a964a4b..127a97846 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -1193,7 +1193,7 @@ impl pallet_society::Config for Runtime { } parameter_types! { - pub const MinVestedTransfer: Balance = 1 * DOLLARS; + pub const MinVestedTransfer: Balance = DOLLARS; pub UnvestedFundsAllowedWithdrawReasons: WithdrawReasons = WithdrawReasons::except(WithdrawReasons::TRANSFER | WithdrawReasons::RESERVE); } From f113ac816160bbbed99456894c95f502d247dcb4 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Sun, 12 Nov 2023 14:37:18 +0300 Subject: [PATCH 505/583] Fix indent --- pallets/ddc-clusters/src/mock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-clusters/src/mock.rs b/pallets/ddc-clusters/src/mock.rs index ceaa921a5..c4055dfbc 100644 --- a/pallets/ddc-clusters/src/mock.rs +++ b/pallets/ddc-clusters/src/mock.rs @@ -42,7 +42,7 @@ construct_runtime!( System: frame_system::{Pallet, Call, Config, Storage, Event}, Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - DdcNodes: pallet_ddc_nodes::{Pallet, Call, Storage, Event}, + DdcNodes: pallet_ddc_nodes::{Pallet, Call, Storage, Event}, DdcClusters: pallet_ddc_clusters::{Pallet, Call, Storage, Event}, Randomness: pallet_randomness_collective_flip::{Pallet, Storage}, } From e46cedf6ff800e125510348a6694a8fa6df1a508 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Mon, 13 Nov 2023 14:29:11 +0300 Subject: [PATCH 506/583] Add auto-assign to github PRs --- .github/auto_assign.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/auto_assign.yml diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml new file mode 100644 index 000000000..ab48497b9 --- /dev/null +++ b/.github/auto_assign.yml @@ -0,0 +1,12 @@ +addReviewers: true +addAssignees: author +reviewers: + - rakanalh + - MRamanenkau + - Raid5594 + - aie0 + - yahortsaryk + - khssnv +skipKeywords: + - wip +numberOfReviewers: 2 From 7a97d2b7f6558b195ba49bf0669a222c90be2900 Mon Sep 17 00:00:00 2001 From: Victor Genin Date: Mon, 13 Nov 2023 14:41:15 +0200 Subject: [PATCH 507/583] payout<->customers --- Cargo.lock | 2 + pallets/ddc-customers/src/lib.rs | 84 +++++++++++--------- pallets/ddc-payouts/Cargo.toml | 1 + pallets/ddc-payouts/src/lib.rs | 132 ++++++++++++++++++++++++------- primitives/Cargo.toml | 1 - primitives/src/lib.rs | 1 - runtime/cere-dev/src/lib.rs | 2 + traits/Cargo.toml | 1 + traits/src/customer.rs | 8 ++ traits/src/lib.rs | 1 + 10 files changed, 163 insertions(+), 70 deletions(-) create mode 100644 traits/src/customer.rs diff --git a/Cargo.lock b/Cargo.lock index f38bc9c18..1505a42b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1655,6 +1655,7 @@ dependencies = [ "frame-support", "frame-system", "sp-core", + "sp-runtime", "sp-staking", "sp-std", ] @@ -5004,6 +5005,7 @@ name = "pallet-ddc-payouts" version = "4.8.1" dependencies = [ "ddc-primitives", + "ddc-traits", "frame-benchmarking", "frame-support", "frame-system", diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index d544ced22..e29902af8 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -4,7 +4,7 @@ use codec::{Decode, Encode, HasCompact}; use ddc_primitives::{BucketId, ClusterId}; -use ddc_traits::cluster::ClusterVisitor; +use ddc_traits::{cluster::ClusterVisitor, customer::CustomerCharger}; use frame_support::{ parameter_types, traits::{Currency, DefensiveSaturating, ExistenceRequirement}, @@ -171,6 +171,11 @@ pub mod pallet { pub fn DefaultBucketCount() -> BucketId { 0 } + + #[pallet::storage] + #[pallet::getter(fn dac_account)] + pub type DACAccount = StorageValue<_, T::AccountId>; + #[pallet::storage] #[pallet::getter(fn buckets_count)] pub type BucketsCount = @@ -191,12 +196,12 @@ pub mod pallet { /// it will not be emitted for staking rewards when they are added to stake. Deposited(T::AccountId, BalanceOf), /// An account has initiated unlock for amount. \[owner, amount\] - InitiatDepositUnlock(T::AccountId, BalanceOf), + InitialDepositUnlock(T::AccountId, BalanceOf), /// An account has called `withdraw_unlocked_deposit` and removed unlocking chunks worth /// `Balance` from the unlocking queue. \[owner, amount\] Withdrawn(T::AccountId, BalanceOf), - /// Total amount charged from all accounts to pay CDN nodes - Charged(BalanceOf), + /// The acconut has been charged for the usage + Charged(T::AccountId, BalanceOf), /// Bucket with specific id created BucketCreated(BucketId), } @@ -221,6 +226,10 @@ pub mod pallet { BucketDoesNotExist, /// DDC Cluster with provided id doesn't exist ClusterDoesNotExist, + // unauthorised operation + Unauthorised, + // Arithmetic underflow + ArithmeticUnderflow, } #[pallet::genesis_config] @@ -351,7 +360,7 @@ pub mod pallet { /// can co-exists at the same time. In that case, [`Call::withdraw_unlocked_deposit`] need /// to be called first to remove some of the chunks (if possible). /// - /// Emits `InitiatDepositUnlock`. + /// Emits `InitialDepositUnlock`. /// /// See also [`Call::withdraw_unlocked_deposit`]. #[pallet::weight(10_000)] @@ -380,7 +389,6 @@ pub mod pallet { let current_block = >::block_number(); // Note: locking for extra block to allow for accounting let block = current_block + ::UnlockingDelay::get(); - log::debug!("Block for the unlock: {:?}", block); if let Some(chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.block == block) @@ -398,7 +406,7 @@ pub mod pallet { Self::update_ledger(&owner, &ledger); - Self::deposit_event(Event::::InitiatDepositUnlock(ledger.owner, value)); + Self::deposit_event(Event::::InitialDepositUnlock(ledger.owner, value)); } Ok(()) } @@ -451,7 +459,7 @@ pub mod pallet { ::Currency::transfer( &account_id, &owner, - value, + value.clone(), ExistenceRequirement::KeepAlive, )?; Self::deposit_event(Event::::Withdrawn(owner, value)); @@ -506,40 +514,38 @@ pub mod pallet { Ok(()) } + } - // Charge payments from content owners - pub fn charge_content_owners( - paying_accounts: Vec>>, - pricing: u128, + impl CustomerCharger for Pallet { + fn charge_content_owner( + content_owner: T::AccountId, + billing_vault: T::AccountId, + amount: u128, ) -> DispatchResult { - let mut total_charged = BalanceOf::::zero(); - - for bucket_details in paying_accounts.iter() { - let bucket: Bucket = Self::buckets(bucket_details.bucket_id) - .ok_or(Error::::BucketDoesNotExist)?; - let content_owner = bucket.owner_id; - let amount = bucket_details.amount * pricing.saturated_into::>(); - - let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotOwner)?; - if ledger.active >= amount { - ledger.total -= amount; - ledger.active -= amount; - total_charged += amount; - Self::update_ledger(&content_owner, &ledger); - } else { - let diff = amount - ledger.active; - total_charged += ledger.active; - ledger.total -= ledger.active; - ledger.active = BalanceOf::::zero(); - let (ledger, charged) = ledger.charge_unlocking(diff); - Self::update_ledger(&content_owner, &ledger); - total_charged += charged; - } - } - log::debug!("Total charged: {:?}", &total_charged); + let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotOwner)?; + let mut amount_to_deduct = amount.saturated_into::>(); + + ensure!(ledger.total >= ledger.active, Error::::ArithmeticUnderflow); + if ledger.active >= amount_to_deduct { + ledger.active -= amount_to_deduct; + ledger.total -= amount_to_deduct; + Self::update_ledger(&content_owner, &ledger); + } else { + let diff = amount_to_deduct - ledger.active; + ledger.total -= ledger.active; + amount_to_deduct = ledger.active; + ledger.active = BalanceOf::::zero(); + let (ledger, _charged) = ledger.charge_unlocking(diff); + Self::update_ledger(&content_owner, &ledger); + }; - Self::deposit_event(Event::::Charged(total_charged)); - log::debug!("Deposit event executed"); + ::Currency::transfer( + &Self::account_id(), + &billing_vault, + amount_to_deduct, + ExistenceRequirement::KeepAlive, + )?; + Self::deposit_event(Event::::Charged(content_owner, amount_to_deduct)); Ok(()) } diff --git a/pallets/ddc-payouts/Cargo.toml b/pallets/ddc-payouts/Cargo.toml index 8f171e21b..ffba7a6d5 100644 --- a/pallets/ddc-payouts/Cargo.toml +++ b/pallets/ddc-payouts/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } +ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index 8f7aefa98..e44d93de3 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -15,6 +15,7 @@ #![recursion_limit = "256"] use ddc_primitives::{ClusterId, DdcEra}; +use ddc_traits::customer::CustomerCharger; use frame_support::{ pallet_prelude::*, parameter_types, @@ -88,19 +89,55 @@ pub mod pallet { type PalletId: Get; type Currency: LockableCurrency; + + type CustomerCharger: CustomerCharger; } #[pallet::event] #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { - BillingReportInitialized { cluster_id: ClusterId, era: DdcEra }, - ChargingStarted { cluster_id: ClusterId, era: DdcEra }, - Charged { cluster_id: ClusterId, era: DdcEra, customer_id: T::AccountId, amount: u128 }, - ChargingFinished { cluster_id: ClusterId, era: DdcEra }, - RewardingStarted { cluster_id: ClusterId, era: DdcEra }, - Rewarded { cluster_id: ClusterId, era: DdcEra, node_id: T::AccountId, amount: u128 }, - RewardingFinished { cluster_id: ClusterId, era: DdcEra }, - BillingReportFinalized { cluster_id: ClusterId, era: DdcEra }, + BillingReportInitialized { + cluster_id: ClusterId, + era: DdcEra, + }, + ChargingStarted { + cluster_id: ClusterId, + era: DdcEra, + }, + Charged { + cluster_id: ClusterId, + era: DdcEra, + customer_id: T::AccountId, + amount: u128, + }, + ChargeFailed { + cluster_id: ClusterId, + era: DdcEra, + customer_id: T::AccountId, + amount: u128, + }, + ChargingFinished { + cluster_id: ClusterId, + era: DdcEra, + }, + RewardingStarted { + cluster_id: ClusterId, + era: DdcEra, + }, + Rewarded { + cluster_id: ClusterId, + era: DdcEra, + node_provider_id: T::AccountId, + amount: u128, + }, + RewardingFinished { + cluster_id: ClusterId, + era: DdcEra, + }, + BillingReportFinalized { + cluster_id: ClusterId, + era: DdcEra, + }, } #[pallet::error] @@ -131,7 +168,7 @@ pub mod pallet { >; #[pallet::storage] - #[pallet::getter(fn dac_account)] + #[pallet::getter(fn authorised_caller)] pub type DACAccount = StorageValue<_, T::AccountId>; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] @@ -139,7 +176,7 @@ pub mod pallet { pub struct BillingReport { state: State, vault: T::AccountId, - dac_account: Option, + authorised_caller: Option, total_charged_balance: u128, total_distributed_balance: u128, total_node_expected_reward: NodeReward, @@ -157,7 +194,7 @@ pub mod pallet { Self { state: State::default(), vault: T::PalletId::get().into_account_truncating(), - dac_account: Option::None, + authorised_caller: Option::None, total_charged_balance: Zero::zero(), total_distributed_balance: Zero::zero(), total_node_expected_usage: NodeUsage::default(), @@ -192,7 +229,7 @@ pub mod pallet { ) -> DispatchResult { let caller = ensure_signed(origin)?; ensure!( - Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, Error::::Unauthorised ); @@ -215,7 +252,7 @@ pub mod pallet { ) -> DispatchResult { let caller = ensure_signed(origin)?; ensure!( - Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, Error::::Unauthorised ); @@ -248,7 +285,7 @@ pub mod pallet { ) -> DispatchResult { let caller = ensure_signed(origin)?; ensure!( - Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, Error::::Unauthorised ); @@ -278,15 +315,45 @@ pub mod pallet { })() .ok_or(Error::::ArithmeticOverflow)?; - // todo: charge customer let customer_id = payer.0; - updated_billing_report - .total_charged_balance - .checked_add(amount) - .ok_or(Error::::ArithmeticOverflow)?; - - Self::deposit_event(Event::::Charged { cluster_id, era, customer_id, amount }); + // todo: decouple AccountId from [u8; 32] + let vault_temp: Vec = vec![0; 32]; + let customer_temp: Vec = vec![0; 32]; + let mut customer_addr: [u8; 32] = [0; 32]; + customer_addr.copy_from_slice(&customer_temp[0..32]); + let mut vault_addr: [u8; 32] = [0; 32]; + vault_addr.copy_from_slice(&vault_temp[0..32]); + + match T::CustomerCharger::charge_content_owner( + customer_id.clone(), + updated_billing_report.vault.clone(), + amount, + ) { + Ok(_) => { + updated_billing_report + .total_charged_balance + .checked_add(amount) + .ok_or(Error::::ArithmeticOverflow)?; + + Self::deposit_event(Event::::Charged { + cluster_id, + era, + customer_id, + amount, + }); + }, + Err(e) => { + // todo: save problematic charge + // todo: add logs + Self::deposit_event(Event::::ChargeFailed { + cluster_id, + era, + customer_id, + amount, + }); + }, + } } updated_billing_report @@ -307,7 +374,7 @@ pub mod pallet { ) -> DispatchResult { let caller = ensure_signed(origin)?; ensure!( - Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, Error::::Unauthorised ); @@ -338,7 +405,7 @@ pub mod pallet { ) -> DispatchResult { let caller = ensure_signed(origin)?; ensure!( - Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, Error::::Unauthorised ); @@ -376,7 +443,7 @@ pub mod pallet { ) -> DispatchResult { let caller = ensure_signed(origin)?; ensure!( - Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, Error::::Unauthorised ); @@ -412,12 +479,12 @@ pub mod pallet { })() .ok_or(Error::::ArithmeticOverflow)?; - let node_id = payee.0; + let node_provider_id = payee.0; let charge: BalanceOf = amount.saturated_into::>(); ::Currency::transfer( &updated_billing_report.vault, - &node_id, + &node_provider_id, charge, ExistenceRequirement::KeepAlive, )?; @@ -427,7 +494,12 @@ pub mod pallet { .checked_add(amount) .ok_or(Error::::ArithmeticOverflow)?; - Self::deposit_event(Event::::Rewarded { cluster_id, era, node_id, amount }); + Self::deposit_event(Event::::Rewarded { + cluster_id, + era, + node_provider_id, + amount, + }); } updated_billing_report @@ -448,7 +520,7 @@ pub mod pallet { ) -> DispatchResult { let caller = ensure_signed(origin)?; ensure!( - Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, Error::::Unauthorised ); @@ -481,7 +553,7 @@ pub mod pallet { ) -> DispatchResult { let caller = ensure_signed(origin)?; ensure!( - Self::dac_account().ok_or(Error::::Unauthorised)? == caller, + Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, Error::::Unauthorised ); @@ -574,6 +646,8 @@ pub mod pallet { bytes.extend_from_slice(&cluster_id[..]); bytes.extend_from_slice(&era.encode()); let hash = blake2_128(&bytes); + // todo: assumes AccountId is 32 bytes, which is not ideal + // "modl" + "payouts_" + hash is 28 bytes, the T::AccountId is 32 bytes, so we should be // safe from the truncation and possible collisions caused by it. The rest 4 bytes will // be fulfilled with trailing zeros. diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 178800a4b..2656e5487 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -7,7 +7,6 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } serde = { version = "1.0.136", default-features = false, features = [ "derive" ], optional = true } - sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 16998c344..f9732f7ce 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -4,7 +4,6 @@ use codec::{Decode, Encode}; use scale_info::TypeInfo; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; - use sp_core::hash::H160; use sp_runtime::{AccountId32, RuntimeDebug}; diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 1e24cd1ae..f0274265c 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1355,6 +1355,8 @@ impl pallet_ddc_payouts::Config for Runtime { type RuntimeEvent = RuntimeEvent; type PalletId = PayoutsPalletId; type Currency = Balances; + + type CustomerCharger = DdcCustomers; } construct_runtime!( diff --git a/traits/Cargo.toml b/traits/Cargo.toml index b224e2d28..cf6f08ee7 100644 --- a/traits/Cargo.toml +++ b/traits/Cargo.toml @@ -10,3 +10,4 @@ sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://g frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } ddc-primitives = { version = "0.1.0", default-features = false, path = "../primitives" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/traits/src/customer.rs b/traits/src/customer.rs new file mode 100644 index 000000000..73bbf784a --- /dev/null +++ b/traits/src/customer.rs @@ -0,0 +1,8 @@ +pub trait CustomerCharger { + // todo: WIP for decoupling payout and customers + fn charge_content_owner( + content_owner: T::AccountId, + billing_vault: T::AccountId, + amount: u128, + ) -> sp_runtime::DispatchResult; +} diff --git a/traits/src/lib.rs b/traits/src/lib.rs index f6eb2b0a4..b3b4f9787 100644 --- a/traits/src/lib.rs +++ b/traits/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(not(feature = "std"), no_std)] pub mod cluster; +pub mod customer; pub mod staking; From 07361a85785a563489e58ffc84e3b52b65ff59cc Mon Sep 17 00:00:00 2001 From: Victor Genin Date: Mon, 13 Nov 2023 19:03:29 +0200 Subject: [PATCH 508/583] payout <> clusters --- Cargo.lock | 16 ++ pallets/ddc-clusters/src/cluster.rs | 7 +- pallets/ddc-clusters/src/lib.rs | 10 +- pallets/ddc-payouts/Cargo.toml | 15 +- pallets/ddc-payouts/src/lib.rs | 243 +++++++++++++++++++--------- primitives/src/lib.rs | 7 + runtime/cere-dev/src/lib.rs | 2 +- traits/src/cluster.rs | 6 +- 8 files changed, 206 insertions(+), 100 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1505a42b9..204e0fe17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -689,6 +689,15 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" +[[package]] +name = "byte-unit" +version = "4.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da78b32057b8fdfc352504708feeba7216dcd65a2c9ab02978cbd288d1279b6c" +dependencies = [ + "utf8-width", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -5004,6 +5013,7 @@ dependencies = [ name = "pallet-ddc-payouts" version = "4.8.1" dependencies = [ + "byte-unit", "ddc-primitives", "ddc-traits", "frame-benchmarking", @@ -9804,6 +9814,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf8-width" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1" + [[package]] name = "valuable" version = "0.1.0" diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index 4be19d73f..7fc6e07e4 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -1,6 +1,6 @@ use crate::pallet::Error; use codec::{Decode, Encode}; -use ddc_primitives::ClusterId; +use ddc_primitives::{ClusterId, ClusterPricingParams}; use frame_support::{pallet_prelude::*, parameter_types}; use scale_info::TypeInfo; use sp_runtime::Perbill; @@ -41,10 +41,7 @@ pub struct ClusterGovParams { pub storage_bond_size: Balance, pub storage_chill_delay: BlockNumber, pub storage_unbonding_delay: BlockNumber, - pub unit_per_mb_stored: u128, - pub unit_per_mb_streamed: u128, - pub unit_per_put_request: u128, - pub unit_per_get_request: u128, + pub pricing: ClusterPricingParams, } impl Cluster { diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index cb4aafb7b..ee410b7db 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -19,7 +19,7 @@ use crate::{ cluster::{Cluster, ClusterError, ClusterGovParams, ClusterParams}, node_provider_auth::{NodeProviderAuthContract, NodeProviderAuthContractError}, }; -use ddc_primitives::{ClusterId, NodePubKey, NodeType}; +use ddc_primitives::{ClusterId, ClusterPricingParams, NodePubKey, NodeType}; use ddc_traits::{ cluster::{ClusterVisitor, ClusterVisitorError}, staking::{StakingVisitor, StakingVisitorError}, @@ -272,6 +272,14 @@ pub mod pallet { } } + fn get_pricing_params( + cluster_id: &ClusterId, + ) -> Result { + let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) + .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; + Ok(cluster_gov_params.pricing) + } + fn get_chill_delay( cluster_id: &ClusterId, node_type: NodeType, diff --git a/pallets/ddc-payouts/Cargo.toml b/pallets/ddc-payouts/Cargo.toml index ffba7a6d5..d10c1b690 100644 --- a/pallets/ddc-payouts/Cargo.toml +++ b/pallets/ddc-payouts/Cargo.toml @@ -17,6 +17,7 @@ sp-runtime = { version = "6.0.0", default-features = false, git = "https://githu sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +byte-unit = { version = "4.0.19", default-features = false, features = ["u128"] } [dev-dependencies] sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -25,17 +26,5 @@ substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/parity [features] default = ["std"] -std = [ - "codec/std", - "ddc-primitives/std", - "frame-support/std", - "frame-system/std", - "frame-benchmarking/std", - "scale-info/std", - "sp-io/std", - "sp-runtime/std", - "sp-staking/std", - "sp-std/std", - "sp-core/std", -] +std = ["codec/std", "ddc-primitives/std", "frame-support/std", "frame-system/std", "frame-benchmarking/std", "scale-info/std", "sp-io/std", "sp-runtime/std", "sp-staking/std", "sp-std/std", "sp-core/std"] runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index e44d93de3..77a66aa45 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -15,13 +15,13 @@ #![recursion_limit = "256"] use ddc_primitives::{ClusterId, DdcEra}; -use ddc_traits::customer::CustomerCharger; +use ddc_traits::{cluster::ClusterVisitor, customer::CustomerCharger}; use frame_support::{ pallet_prelude::*, parameter_types, sp_runtime::SaturatedConversion, traits::{Currency, ExistenceRequirement, LockableCurrency}, - BoundedBTreeSet, + BoundedBTreeMap, BoundedBTreeSet, }; use frame_system::pallet_prelude::*; pub use pallet::*; @@ -54,6 +54,14 @@ pub struct NodeReward { pub gets: u128, } +#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] +pub struct BillingReportDebt { + pub cluster_id: ClusterId, + pub era: DdcEra, + pub batch_index: BatchIndex, + pub amount: u128, +} + #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] pub struct CustomerCharge { pub transfer: u128, @@ -91,6 +99,7 @@ pub mod pallet { type Currency: LockableCurrency; type CustomerCharger: CustomerCharger; + type ClusterVisitor: ClusterVisitor; } #[pallet::event] @@ -153,6 +162,7 @@ pub mod pallet { BatchIndexOverflow, BoundedVecOverflow, ArithmeticOverflow, + NotExpectedClusterState, } #[pallet::storage] @@ -171,16 +181,25 @@ pub mod pallet { #[pallet::getter(fn authorised_caller)] pub type DACAccount = StorageValue<_, T::AccountId>; + #[pallet::storage] + #[pallet::getter(fn debtor_customers)] + pub type DebtorCustomers = StorageMap< + _, + Blake2_128Concat, + T::AccountId, + BoundedBTreeMap, + ValueQuery, + >; + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] #[scale_info(skip_type_params(T))] pub struct BillingReport { state: State, vault: T::AccountId, authorised_caller: Option, - total_charged_balance: u128, - total_distributed_balance: u128, - total_node_expected_reward: NodeReward, - total_node_expected_usage: NodeUsage, + total_customer_charge: CustomerCharge, + total_distributed_reward: u128, + total_node_usage: NodeUsage, // stage 1 charging_max_batch_index: BatchIndex, charging_processed_batches: BoundedBTreeSet, @@ -195,10 +214,9 @@ pub mod pallet { state: State::default(), vault: T::PalletId::get().into_account_truncating(), authorised_caller: Option::None, - total_charged_balance: Zero::zero(), - total_distributed_balance: Zero::zero(), - total_node_expected_usage: NodeUsage::default(), - total_node_expected_reward: NodeReward::default(), + total_customer_charge: CustomerCharge::default(), + total_distributed_reward: Zero::zero(), + total_node_usage: NodeUsage::default(), charging_max_batch_index: Zero::zero(), charging_processed_batches: BoundedBTreeSet::default(), rewarding_max_batch_index: Zero::zero(), @@ -233,6 +251,11 @@ pub mod pallet { Error::::Unauthorised ); + ensure!( + ActiveBillingReports::::try_get(cluster_id.clone(), era).is_ok() == false, + Error::::NotExpectedState + ); + let mut billing_report = BillingReport::default(); billing_report.vault = Self::sub_account_id(cluster_id.clone(), era); billing_report.state = State::Initialized; @@ -304,9 +327,8 @@ pub mod pallet { let mut updated_billing_report = billing_report.clone(); for payer in payers { - let customer_charge = - get_customer_charge(&payer.1).ok_or(Error::::ArithmeticOverflow)?; - let amount = (|| -> Option { + let customer_charge = get_customer_charge::(cluster_id, &payer.1)?; + let total_customer_charge = (|| -> Option { customer_charge .transfer .checked_add(customer_charge.storage)? @@ -315,42 +337,82 @@ pub mod pallet { })() .ok_or(Error::::ArithmeticOverflow)?; - let customer_id = payer.0; + let temp_total_customer_storage_charge = updated_billing_report + .total_customer_charge + .storage + .checked_add(customer_charge.storage) + .ok_or(Error::::ArithmeticOverflow)?; + + let temp_total_customer_transfer_charge = updated_billing_report + .total_customer_charge + .transfer + .checked_add(customer_charge.transfer) + .ok_or(Error::::ArithmeticOverflow)?; + + let temp_total_customer_puts_charge = updated_billing_report + .total_customer_charge + .puts + .checked_add(customer_charge.puts) + .ok_or(Error::::ArithmeticOverflow)?; - // todo: decouple AccountId from [u8; 32] - let vault_temp: Vec = vec![0; 32]; - let customer_temp: Vec = vec![0; 32]; - let mut customer_addr: [u8; 32] = [0; 32]; - customer_addr.copy_from_slice(&customer_temp[0..32]); - let mut vault_addr: [u8; 32] = [0; 32]; - vault_addr.copy_from_slice(&vault_temp[0..32]); + let temp_total_customer_gets_charge = updated_billing_report + .total_customer_charge + .gets + .checked_add(customer_charge.gets) + .ok_or(Error::::ArithmeticOverflow)?; + let customer_id = payer.0; match T::CustomerCharger::charge_content_owner( customer_id.clone(), updated_billing_report.vault.clone(), - amount, + total_customer_charge, ) { Ok(_) => { - updated_billing_report - .total_charged_balance - .checked_add(amount) - .ok_or(Error::::ArithmeticOverflow)?; + updated_billing_report.total_customer_charge.storage = + temp_total_customer_storage_charge; + updated_billing_report.total_customer_charge.transfer = + temp_total_customer_transfer_charge; + updated_billing_report.total_customer_charge.puts = + temp_total_customer_puts_charge; + updated_billing_report.total_customer_charge.gets = + temp_total_customer_gets_charge; Self::deposit_event(Event::::Charged { cluster_id, era, customer_id, - amount, + amount: total_customer_charge, }); }, Err(e) => { // todo: save problematic charge // todo: add logs + updated_billing_report + .charging_processed_batches + .try_insert(batch_index) + .map_err(|_| Error::::BoundedVecOverflow)?; + + /* --- + DebtorCustomers = StorageMap< + _, + Blake2_128Concat, + T::AccountId, + BoundedBTreeMap, + let mut debtor_customers = DebtorCustomers::::try_get(cluster_id.clone(), era) + .map_err(|_| Error::::BillingReportDoesNotExist)?; + + ensure!(billing_report.state == State::Initialized, Error::::NotExpectedState); + + billing_report.charging_max_batch_index = max_batch_index; + billing_report.state = State::ChargingCustomers; + ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); + --- */ + Self::deposit_event(Event::::ChargeFailed { cluster_id, era, customer_id, - amount, + amount: total_customer_charge, }); }, } @@ -419,12 +481,8 @@ pub mod pallet { ensure!(billing_report.state == State::CustomersCharged, Error::::NotExpectedState); - let total = - get_total_usage_reward(&total_node_usage).ok_or(Error::::ArithmeticOverflow)?; - - billing_report.total_node_expected_usage = total_node_usage; + billing_report.total_node_usage = total_node_usage; billing_report.rewarding_max_batch_index = max_batch_index; - billing_report.total_node_expected_reward = total; billing_report.state = State::RewardingProviders; ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); @@ -465,12 +523,13 @@ pub mod pallet { let mut updated_billing_report = billing_report.clone(); for payee in payees { - let node_reward = get_node_reward( + let node_reward = get_node_reward::( &payee.1, - &billing_report.total_node_expected_usage, - &billing_report.total_node_expected_reward, - ); - let amount = (|| -> Option { + &billing_report.total_node_usage, + &billing_report.total_customer_charge, + ) + .ok_or(Error::::ArithmeticOverflow)?; + let amount_to_reward = (|| -> Option { node_reward .transfer .checked_add(node_reward.storage)? @@ -480,25 +539,25 @@ pub mod pallet { .ok_or(Error::::ArithmeticOverflow)?; let node_provider_id = payee.0; - let charge: BalanceOf = amount.saturated_into::>(); + let reward: BalanceOf = amount_to_reward.saturated_into::>(); ::Currency::transfer( &updated_billing_report.vault, &node_provider_id, - charge, + reward, ExistenceRequirement::KeepAlive, )?; updated_billing_report - .total_distributed_balance - .checked_add(amount) + .total_distributed_reward + .checked_add(amount_to_reward) .ok_or(Error::::ArithmeticOverflow)?; Self::deposit_event(Event::::Rewarded { cluster_id, era, node_provider_id, - amount, + amount: amount_to_reward, }); } @@ -561,8 +620,18 @@ pub mod pallet { .map_err(|_| Error::::BillingReportDoesNotExist)?; ensure!(billing_report.state == State::ProvidersRewarded, Error::::NotExpectedState); + let expected_amount_to_reward = (|| -> Option { + billing_report + .total_customer_charge + .transfer + .checked_add(billing_report.total_customer_charge.storage)? + .checked_add(billing_report.total_customer_charge.puts)? + .checked_add(billing_report.total_customer_charge.gets) + })() + .ok_or(Error::::ArithmeticOverflow)?; + ensure!( - billing_report.total_charged_balance == billing_report.total_distributed_balance, + expected_amount_to_reward == billing_report.total_distributed_reward, Error::::NotDistributedBalance ); @@ -573,51 +642,67 @@ pub mod pallet { } } - fn get_node_reward( + fn get_node_reward( node_usage: &NodeUsage, - total_usage: &NodeUsage, - total_reward: &NodeReward, - ) -> NodeReward { + total_nodes_usage: &NodeUsage, + total_customer_charge: &CustomerCharge, + ) -> Option { let mut node_reward = NodeReward::default(); - let mut ratio = - Perbill::from_rational(node_usage.transferred_bytes, total_usage.transferred_bytes); - node_reward.transfer = (ratio * total_reward.transfer) as u128; - - ratio = Perbill::from_rational(node_usage.stored_bytes, total_usage.stored_bytes); - node_reward.storage = (ratio * total_reward.storage) as u128; + let mut ratio = Perbill::from_rational( + node_usage.transferred_bytes, + total_nodes_usage.transferred_bytes, + ); + node_reward.transfer = (ratio * total_customer_charge.transfer) as u128; - ratio = Perbill::from_rational(node_usage.number_of_puts, total_usage.number_of_puts); - node_reward.puts = (ratio * total_reward.puts) as u128; + ratio = Perbill::from_rational(node_usage.stored_bytes, total_nodes_usage.stored_bytes); + node_reward.storage = (ratio * total_customer_charge.storage) as u128; - ratio = Perbill::from_rational(node_usage.number_of_gets, total_usage.number_of_gets); - node_reward.gets = (ratio * total_reward.gets) as u128; + ratio = Perbill::from_rational(node_usage.number_of_puts, total_nodes_usage.number_of_puts); + node_reward.puts = (ratio * total_customer_charge.puts) as u128; - node_reward - } - - // todo: to calculate actual charge based on the metrics - fn get_total_usage_reward(total_usage: &NodeUsage) -> Option { - let mut total = NodeReward::default(); + ratio = Perbill::from_rational(node_usage.number_of_gets, total_nodes_usage.number_of_gets); + node_reward.gets = (ratio * total_customer_charge.gets) as u128; - total.transfer = 1; - total.storage = 2; - total.puts = 3; - total.gets = 4; - - Option::Some(total) + Some(node_reward) } - // todo: to calculate actual charge based on the metrics - fn get_customer_charge(usage: &CustomerUsage) -> Option { + fn get_customer_charge( + cluster_id: ClusterId, + usage: &CustomerUsage, + ) -> Result> { let mut total = CustomerCharge::default(); - total.transfer = 1; - total.storage = 2; - total.puts = 3; - total.gets = 4; - - Option::Some(total) + let pricing = T::ClusterVisitor::get_pricing_params(&cluster_id) + .map_err(|_| Error::::NotExpectedClusterState)?; + + total.transfer = (|| -> Option { + usage + .transferred_bytes + .checked_mul(pricing.unit_per_mb_streamed)? + .checked_div(byte_unit::MEBIBYTE) + })() + .ok_or(Error::::ArithmeticOverflow)?; + + total.storage = (|| -> Option { + usage + .stored_bytes + .checked_mul(pricing.unit_per_mb_stored)? + .checked_div(byte_unit::MEBIBYTE) + })() + .ok_or(Error::::ArithmeticOverflow)?; + + total.gets = usage + .number_of_gets + .checked_mul(pricing.unit_per_get_request) + .ok_or(Error::::ArithmeticOverflow)?; + + total.puts = usage + .number_of_puts + .checked_mul(pricing.unit_per_put_request) + .ok_or(Error::::ArithmeticOverflow)?; + + Ok(total) } fn validate_batches( @@ -646,7 +731,7 @@ pub mod pallet { bytes.extend_from_slice(&cluster_id[..]); bytes.extend_from_slice(&era.encode()); let hash = blake2_128(&bytes); - // todo: assumes AccountId is 32 bytes, which is not ideal + // todo: assumes AccountId is 32 bytes, which is not ideal -> rewrite it // "modl" + "payouts_" + hash is 28 bytes, the T::AccountId is 32 bytes, so we should be // safe from the truncation and possible collisions caused by it. The rest 4 bytes will diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index f9732f7ce..0ec6c6924 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -11,6 +11,13 @@ pub type ClusterId = H160; pub type DdcEra = u32; pub type BucketId = u64; +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct ClusterPricingParams { + pub unit_per_mb_stored: u128, + pub unit_per_mb_streamed: u128, + pub unit_per_put_request: u128, + pub unit_per_get_request: u128, +} #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodePubKey { diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index f0274265c..dcac54c46 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1355,8 +1355,8 @@ impl pallet_ddc_payouts::Config for Runtime { type RuntimeEvent = RuntimeEvent; type PalletId = PayoutsPalletId; type Currency = Balances; - type CustomerCharger = DdcCustomers; + type ClusterVisitor = DdcClusters; } construct_runtime!( diff --git a/traits/src/cluster.rs b/traits/src/cluster.rs index bbd21ed32..cdb3a5e21 100644 --- a/traits/src/cluster.rs +++ b/traits/src/cluster.rs @@ -1,4 +1,4 @@ -use ddc_primitives::{ClusterId, NodePubKey, NodeType}; +use ddc_primitives::{ClusterId, ClusterPricingParams, NodePubKey, NodeType}; use frame_system::Config; pub trait ClusterVisitor { @@ -11,6 +11,10 @@ pub trait ClusterVisitor { node_type: NodeType, ) -> Result; + fn get_pricing_params( + cluster_id: &ClusterId, + ) -> Result; + fn get_chill_delay( cluster_id: &ClusterId, node_type: NodeType, From 5649efa1500e37fa2d4ccb1019ee841512f6a349 Mon Sep 17 00:00:00 2001 From: Victor Genin Date: Mon, 13 Nov 2023 20:16:44 +0200 Subject: [PATCH 509/583] customer debtors --- pallets/ddc-payouts/src/lib.rs | 48 ++++++++++++++++------------------ 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index 77a66aa45..bf1a286dc 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -183,11 +183,13 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn debtor_customers)] - pub type DebtorCustomers = StorageMap< + pub type DebtorCustomers = StorageDoubleMap< _, Blake2_128Concat, + ClusterId, + Blake2_128Concat, T::AccountId, - BoundedBTreeMap, + u128, ValueQuery, >; @@ -361,7 +363,7 @@ pub mod pallet { .checked_add(customer_charge.gets) .ok_or(Error::::ArithmeticOverflow)?; - let customer_id = payer.0; + let customer_id = payer.0.clone(); match T::CustomerCharger::charge_content_owner( customer_id.clone(), updated_billing_report.vault.clone(), @@ -385,28 +387,24 @@ pub mod pallet { }); }, Err(e) => { - // todo: save problematic charge - // todo: add logs - updated_billing_report - .charging_processed_batches - .try_insert(batch_index) - .map_err(|_| Error::::BoundedVecOverflow)?; - - /* --- - DebtorCustomers = StorageMap< - _, - Blake2_128Concat, - T::AccountId, - BoundedBTreeMap, - let mut debtor_customers = DebtorCustomers::::try_get(cluster_id.clone(), era) - .map_err(|_| Error::::BillingReportDoesNotExist)?; - - ensure!(billing_report.state == State::Initialized, Error::::NotExpectedState); - - billing_report.charging_max_batch_index = max_batch_index; - billing_report.state = State::ChargingCustomers; - ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); - --- */ + let customer_debt = BillingReportDebt { + cluster_id, + era, + batch_index, + amount: total_customer_charge, + }; + let mut customer_dept = + DebtorCustomers::::try_get(cluster_id, customer_id.clone()) + .unwrap_or(Zero::zero()); + + customer_dept = customer_dept + .checked_add(total_customer_charge) + .ok_or(Error::::ArithmeticOverflow)?; + DebtorCustomers::::insert( + cluster_id, + customer_id.clone(), + customer_dept, + ); Self::deposit_event(Event::::ChargeFailed { cluster_id, From f5088de62bf29b9adab68b041a400ac54d01219d Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Mon, 13 Nov 2023 20:41:38 +0100 Subject: [PATCH 510/583] fix(pallet_ddc_staking): checking node type before making node active for specific ddc action --- pallets/ddc-staking/src/lib.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 9c8469785..d68cadab8 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -303,6 +303,10 @@ pub mod pallet { NoClusterGovParams, /// Conditions for fast chill are not met, try the regular `chill` from FastChillProhibited, + /// Serving operation is called for non-CDN node + ServingProhibited, + /// Storing operation is called for non-Storage node + StoringProhibited, } #[pallet::call] @@ -544,6 +548,13 @@ pub mod pallet { // Can't participate in CDN if already participating in storage network. ensure!(!Storages::::contains_key(stash), Error::::AlreadyInRole); + // Only CDN node can perform serving (i.e. streaming content) + let node_pub_key = >::get(&stash).ok_or(Error::::BadState)?; + ensure!( + matches!(node_pub_key, NodePubKey::CDNPubKey(_)), + Error::::ServingProhibited + ); + // Is it an attempt to cancel a previous "chill"? if let Some(current_cluster) = Self::cdns(stash) { // Switching the cluster is prohibited. The user should chill first. @@ -583,6 +594,13 @@ pub mod pallet { // Can't participate in storage network if already participating in CDN. ensure!(!CDNs::::contains_key(stash), Error::::AlreadyInRole); + // Only Storage node can perform storing (i.e. saving content) + let node_pub_key = >::get(&stash).ok_or(Error::::BadState)?; + ensure!( + matches!(node_pub_key, NodePubKey::StoragePubKey(_)), + Error::::StoringProhibited + ); + // Is it an attempt to cancel a previous "chill"? if let Some(current_cluster) = Self::storages(stash) { // Switching the cluster is prohibited. The user should chill first. From faee278863c9a64e41388d9e1150b288b80f5dbd Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Mon, 13 Nov 2023 21:07:59 +0100 Subject: [PATCH 511/583] fix: clippy issue is fixed and runtime version is upgraded --- pallets/ddc-staking/src/lib.rs | 4 ++-- runtime/cere-dev/src/lib.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index d68cadab8..6ccaabfd0 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -549,7 +549,7 @@ pub mod pallet { ensure!(!Storages::::contains_key(stash), Error::::AlreadyInRole); // Only CDN node can perform serving (i.e. streaming content) - let node_pub_key = >::get(&stash).ok_or(Error::::BadState)?; + let node_pub_key = >::get(stash).ok_or(Error::::BadState)?; ensure!( matches!(node_pub_key, NodePubKey::CDNPubKey(_)), Error::::ServingProhibited @@ -595,7 +595,7 @@ pub mod pallet { ensure!(!CDNs::::contains_key(stash), Error::::AlreadyInRole); // Only Storage node can perform storing (i.e. saving content) - let node_pub_key = >::get(&stash).ok_or(Error::::BadState)?; + let node_pub_key = >::get(stash).ok_or(Error::::BadState)?; ensure!( matches!(node_pub_key, NodePubKey::StoragePubKey(_)), Error::::StoringProhibited diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index fb260b4ed..d584730e4 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -129,7 +129,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: 48013, + spec_version: 48014, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, From 57aa4364740e7a9f632439c9c4a50107ed9ff93c Mon Sep 17 00:00:00 2001 From: Victor Genin Date: Mon, 13 Nov 2023 22:53:57 +0200 Subject: [PATCH 512/583] dprint fmt --- Cargo.toml | 34 ++++---- pallets/ddc-payouts/Cargo.toml | 18 +++- primitives/Cargo.toml | 2 +- runtime/cere-dev/Cargo.toml | 152 ++++++++++++++++----------------- traits/Cargo.toml | 2 +- 5 files changed, 110 insertions(+), 98 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index aa71105e8..aacb4cf63 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,23 +18,23 @@ substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/pa [workspace] members = [ - "cli", - "node/client", - "node/service", - "rpc", - "runtime/cere", - "runtime/cere-dev", - "pallets/chainbridge", - "pallets/ddc", - "pallets/ddc-staking", - "pallets/erc721", - "pallets/erc20", - "pallets/ddc-metrics-offchain-worker", - "pallets/ddc-customers", - "pallets/ddc-nodes", - "pallets/ddc-clusters", - "pallets/ddc-payouts", - "primitives", + "cli", + "node/client", + "node/service", + "rpc", + "runtime/cere", + "runtime/cere-dev", + "pallets/chainbridge", + "pallets/ddc", + "pallets/ddc-staking", + "pallets/erc721", + "pallets/erc20", + "pallets/ddc-metrics-offchain-worker", + "pallets/ddc-customers", + "pallets/ddc-nodes", + "pallets/ddc-clusters", + "pallets/ddc-payouts", + "primitives", ] [profile.release] diff --git a/pallets/ddc-payouts/Cargo.toml b/pallets/ddc-payouts/Cargo.toml index d10c1b690..ed77fa188 100644 --- a/pallets/ddc-payouts/Cargo.toml +++ b/pallets/ddc-payouts/Cargo.toml @@ -4,6 +4,7 @@ version = "4.8.1" edition = "2021" [dependencies] +byte-unit = { version = "4.0.19", default-features = false, features = ["u128"] } codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } @@ -12,12 +13,11 @@ frame-support = { version = "4.0.0-dev", default-features = false, git = "https: frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } -byte-unit = { version = "4.0.19", default-features = false, features = ["u128"] } [dev-dependencies] sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -26,5 +26,17 @@ substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/parity [features] default = ["std"] -std = ["codec/std", "ddc-primitives/std", "frame-support/std", "frame-system/std", "frame-benchmarking/std", "scale-info/std", "sp-io/std", "sp-runtime/std", "sp-staking/std", "sp-std/std", "sp-core/std"] +std = [ + "codec/std", + "ddc-primitives/std", + "frame-support/std", + "frame-system/std", + "frame-benchmarking/std", + "scale-info/std", + "sp-io/std", + "sp-runtime/std", + "sp-staking/std", + "sp-std/std", + "sp-core/std", +] runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index a7b80e589..3986f6b98 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -serde = { version = "1.0.136", default-features = false, features = [ "derive" ], optional = true } +serde = { version = "1.0.136", default-features = false, features = ["derive"], optional = true } sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 88c42e493..dc83eeb30 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -64,6 +64,7 @@ pallet-ddc-clusters = { version = "4.8.1", default-features = false, path = "../ pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } pallet-ddc-nodes = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-nodes" } +pallet-ddc-payouts = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-payouts" } pallet-ddc-staking = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-staking" } pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -100,7 +101,6 @@ pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-fe pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-ddc-payouts = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-payouts" } [build-dependencies] substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -109,81 +109,81 @@ substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/pari default = ["std"] with-tracing = ["frame-executive/with-tracing"] std = [ - "sp-authority-discovery/std", - "pallet-authority-discovery/std", - "pallet-authorship/std", - "sp-consensus-babe/std", - "pallet-babe/std", - "pallet-bags-list/std", - "pallet-balances/std", - "pallet-bounties/std", - "sp-block-builder/std", - "codec/std", - "scale-info/std", - "pallet-collective/std", - "pallet-contracts/std", - "pallet-contracts-primitives/std", - "pallet-contracts-rpc-runtime-api/std", - "pallet-democracy/std", - "pallet-fast-unstake/std", - "pallet-elections-phragmen/std", - "frame-executive/std", - "pallet-cere-ddc/std", - "pallet-chainbridge/std", - "pallet-erc721/std", - "pallet-erc20/std", - "pallet-grandpa/std", - "pallet-im-online/std", - "pallet-indices/std", - "sp-inherents/std", - "pallet-membership/std", - "pallet-multisig/std", - "pallet-nomination-pools/std", - "pallet-nomination-pools-runtime-api/std", - "pallet-identity/std", - "pallet-scheduler/std", - "node-primitives/std", - "sp-offchain/std", - "pallet-offences/std", - "pallet-proxy/std", - "sp-core/std", - "pallet-randomness-collective-flip/std", - "sp-std/std", - "pallet-session/std", - "sp-api/std", - "sp-runtime/std", - "sp-staking/std", - "pallet-staking/std", - "sp-session/std", - "pallet-sudo/std", - "frame-support/std", - "frame-benchmarking/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "pallet-election-provider-multi-phase/std", - "pallet-timestamp/std", - "pallet-tips/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-treasury/std", - "sp-transaction-pool/std", - "pallet-utility/std", - "sp-version/std", - "pallet-society/std", - "pallet-recovery/std", - "pallet-vesting/std", - "log/std", - "frame-try-runtime/std", - "sp-io/std", - "pallet-child-bounties/std", - "pallet-ddc-metrics-offchain-worker/std", - "pallet-ddc-staking/std", - "cere-runtime-common/std", - "cere-dev-runtime-constants/std", - "pallet-ddc-customers/std", - "pallet-ddc-nodes/std", - "pallet-ddc-clusters/std", - "pallet-ddc-payouts/std", + "sp-authority-discovery/std", + "pallet-authority-discovery/std", + "pallet-authorship/std", + "sp-consensus-babe/std", + "pallet-babe/std", + "pallet-bags-list/std", + "pallet-balances/std", + "pallet-bounties/std", + "sp-block-builder/std", + "codec/std", + "scale-info/std", + "pallet-collective/std", + "pallet-contracts/std", + "pallet-contracts-primitives/std", + "pallet-contracts-rpc-runtime-api/std", + "pallet-democracy/std", + "pallet-fast-unstake/std", + "pallet-elections-phragmen/std", + "frame-executive/std", + "pallet-cere-ddc/std", + "pallet-chainbridge/std", + "pallet-erc721/std", + "pallet-erc20/std", + "pallet-grandpa/std", + "pallet-im-online/std", + "pallet-indices/std", + "sp-inherents/std", + "pallet-membership/std", + "pallet-multisig/std", + "pallet-nomination-pools/std", + "pallet-nomination-pools-runtime-api/std", + "pallet-identity/std", + "pallet-scheduler/std", + "node-primitives/std", + "sp-offchain/std", + "pallet-offences/std", + "pallet-proxy/std", + "sp-core/std", + "pallet-randomness-collective-flip/std", + "sp-std/std", + "pallet-session/std", + "sp-api/std", + "sp-runtime/std", + "sp-staking/std", + "pallet-staking/std", + "sp-session/std", + "pallet-sudo/std", + "frame-support/std", + "frame-benchmarking/std", + "frame-system-rpc-runtime-api/std", + "frame-system/std", + "pallet-election-provider-multi-phase/std", + "pallet-timestamp/std", + "pallet-tips/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + "pallet-treasury/std", + "sp-transaction-pool/std", + "pallet-utility/std", + "sp-version/std", + "pallet-society/std", + "pallet-recovery/std", + "pallet-vesting/std", + "log/std", + "frame-try-runtime/std", + "sp-io/std", + "pallet-child-bounties/std", + "pallet-ddc-metrics-offchain-worker/std", + "pallet-ddc-staking/std", + "cere-runtime-common/std", + "cere-dev-runtime-constants/std", + "pallet-ddc-customers/std", + "pallet-ddc-nodes/std", + "pallet-ddc-clusters/std", + "pallet-ddc-payouts/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/traits/Cargo.toml b/traits/Cargo.toml index aa4110332..21512a39f 100644 --- a/traits/Cargo.toml +++ b/traits/Cargo.toml @@ -5,5 +5,5 @@ edition = "2021" [dependencies] ddc-primitives = { version = "0.1.0", default-features = false, path = "../primitives" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } From bb380f9d2a2eca1593846d90838565c80aaa1dfa Mon Sep 17 00:00:00 2001 From: Victor Genin Date: Tue, 14 Nov 2023 01:54:40 +0200 Subject: [PATCH 513/583] clippy --- pallets/ddc-customers/src/lib.rs | 2 +- pallets/ddc-payouts/src/lib.rs | 66 +++++++++++++++----------------- pallets/ddc-staking/src/mock.rs | 13 ++++++- 3 files changed, 43 insertions(+), 38 deletions(-) diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 94255b20c..2454eae19 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -459,7 +459,7 @@ pub mod pallet { ::Currency::transfer( &account_id, &owner, - value.clone(), + value, ExistenceRequirement::KeepAlive, )?; Self::deposit_event(Event::::Withdrawn(owner, value)); diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index bf1a286dc..60cc3ab75 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -15,13 +15,13 @@ #![recursion_limit = "256"] use ddc_primitives::{ClusterId, DdcEra}; -use ddc_traits::{cluster::ClusterVisitor, customer::CustomerCharger}; +use ddc_traits::{cluster::ClusterVisitor, customer::CustomerCharger as ICustomerCharger}; use frame_support::{ pallet_prelude::*, parameter_types, sp_runtime::SaturatedConversion, traits::{Currency, ExistenceRequirement, LockableCurrency}, - BoundedBTreeMap, BoundedBTreeSet, + BoundedBTreeSet, }; use frame_system::pallet_prelude::*; pub use pallet::*; @@ -98,7 +98,7 @@ pub mod pallet { type Currency: LockableCurrency; - type CustomerCharger: CustomerCharger; + type CustomerCharger: ICustomerCharger; type ClusterVisitor: ClusterVisitor; } @@ -254,14 +254,18 @@ pub mod pallet { ); ensure!( - ActiveBillingReports::::try_get(cluster_id.clone(), era).is_ok() == false, + ActiveBillingReports::::try_get(cluster_id, era).is_err(), Error::::NotExpectedState ); - let mut billing_report = BillingReport::default(); - billing_report.vault = Self::sub_account_id(cluster_id.clone(), era); + let mut billing_report = BillingReport:: { + vault: Self::sub_account_id(cluster_id, era), + state: State::Initialized, + ..Default::default() + }; + billing_report.vault = Self::sub_account_id(cluster_id, era); billing_report.state = State::Initialized; - ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); + ActiveBillingReports::::insert(cluster_id, era, billing_report); Self::deposit_event(Event::::BillingReportInitialized { cluster_id, era }); @@ -286,14 +290,14 @@ pub mod pallet { Error::::BatchIndexOverflow ); - let mut billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + let mut billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; ensure!(billing_report.state == State::Initialized, Error::::NotExpectedState); billing_report.charging_max_batch_index = max_batch_index; billing_report.state = State::ChargingCustomers; - ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); + ActiveBillingReports::::insert(cluster_id, era, billing_report); Self::deposit_event(Event::::ChargingStarted { cluster_id, era }); @@ -314,7 +318,7 @@ pub mod pallet { Error::::Unauthorised ); - let billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + let billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; ensure!(billing_report.state == State::ChargingCustomers, Error::::NotExpectedState); @@ -327,7 +331,7 @@ pub mod pallet { Error::::BatchIndexAlreadyProcessed ); - let mut updated_billing_report = billing_report.clone(); + let mut updated_billing_report = billing_report; for payer in payers { let customer_charge = get_customer_charge::(cluster_id, &payer.1)?; let total_customer_charge = (|| -> Option { @@ -386,16 +390,10 @@ pub mod pallet { amount: total_customer_charge, }); }, - Err(e) => { - let customer_debt = BillingReportDebt { - cluster_id, - era, - batch_index, - amount: total_customer_charge, - }; + Err(_e) => { let mut customer_dept = DebtorCustomers::::try_get(cluster_id, customer_id.clone()) - .unwrap_or(Zero::zero()); + .unwrap_or_else(|_| Zero::zero()); customer_dept = customer_dept .checked_add(total_customer_charge) @@ -438,7 +436,7 @@ pub mod pallet { Error::::Unauthorised ); - let mut billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + let mut billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; ensure!(billing_report.state == State::ChargingCustomers, Error::::NotExpectedState); @@ -448,7 +446,7 @@ pub mod pallet { )?; billing_report.state = State::CustomersCharged; - ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); + ActiveBillingReports::::insert(cluster_id, era, billing_report); Self::deposit_event(Event::::ChargingFinished { cluster_id, era }); @@ -474,7 +472,7 @@ pub mod pallet { Error::::BatchIndexOverflow ); - let mut billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + let mut billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; ensure!(billing_report.state == State::CustomersCharged, Error::::NotExpectedState); @@ -482,7 +480,7 @@ pub mod pallet { billing_report.total_node_usage = total_node_usage; billing_report.rewarding_max_batch_index = max_batch_index; billing_report.state = State::RewardingProviders; - ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); + ActiveBillingReports::::insert(cluster_id, era, billing_report); Self::deposit_event(Event::::RewardingStarted { cluster_id, era }); @@ -503,7 +501,7 @@ pub mod pallet { Error::::Unauthorised ); - let billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + let billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; ensure!( @@ -581,7 +579,7 @@ pub mod pallet { Error::::Unauthorised ); - let mut billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + let mut billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; ensure!( @@ -595,7 +593,7 @@ pub mod pallet { )?; billing_report.state = State::ProvidersRewarded; - ActiveBillingReports::::insert(cluster_id.clone(), era, billing_report); + ActiveBillingReports::::insert(cluster_id, era, billing_report); Self::deposit_event(Event::::RewardingFinished { cluster_id, era }); @@ -614,7 +612,7 @@ pub mod pallet { Error::::Unauthorised ); - let billing_report = ActiveBillingReports::::try_get(cluster_id.clone(), era) + let billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; ensure!(billing_report.state == State::ProvidersRewarded, Error::::NotExpectedState); @@ -633,7 +631,7 @@ pub mod pallet { Error::::NotDistributedBalance ); - ActiveBillingReports::::remove(cluster_id.clone(), era); + ActiveBillingReports::::remove(cluster_id, era); Self::deposit_event(Event::::BillingReportFinalized { cluster_id, era }); Ok(()) @@ -651,16 +649,16 @@ pub mod pallet { node_usage.transferred_bytes, total_nodes_usage.transferred_bytes, ); - node_reward.transfer = (ratio * total_customer_charge.transfer) as u128; + node_reward.transfer = ratio * total_customer_charge.transfer; ratio = Perbill::from_rational(node_usage.stored_bytes, total_nodes_usage.stored_bytes); - node_reward.storage = (ratio * total_customer_charge.storage) as u128; + node_reward.storage = ratio * total_customer_charge.storage; ratio = Perbill::from_rational(node_usage.number_of_puts, total_nodes_usage.number_of_puts); - node_reward.puts = (ratio * total_customer_charge.puts) as u128; + node_reward.puts = ratio * total_customer_charge.puts; ratio = Perbill::from_rational(node_usage.number_of_gets, total_nodes_usage.number_of_gets); - node_reward.gets = (ratio * total_customer_charge.gets) as u128; + node_reward.gets = ratio * total_customer_charge.gets; Some(node_reward) } @@ -720,10 +718,6 @@ pub mod pallet { } impl Pallet { - fn account_id() -> T::AccountId { - T::PalletId::get().into_account_truncating() - } - fn sub_account_id(cluster_id: ClusterId, era: DdcEra) -> T::AccountId { let mut bytes = Vec::new(); bytes.extend_from_slice(&cluster_id[..]); diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 549653b92..a047f30c1 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -3,7 +3,7 @@ #![allow(dead_code)] use crate::{self as pallet_ddc_staking, *}; -use ddc_primitives::{CDNNodePubKey, StorageNodePubKey}; +use ddc_primitives::{CDNNodePubKey, ClusterPricingParams, StorageNodePubKey}; use ddc_traits::{ cluster::{ClusterVisitor, ClusterVisitorError}, node::{NodeVisitor, NodeVisitorError}, @@ -131,6 +131,17 @@ impl ClusterVisitor for TestClusterVisitor { ) -> Result { Ok(T::BlockNumber::from(10u32)) } + + fn get_pricing_params( + _cluster_id: &ClusterId, + ) -> Result { + Ok(ClusterPricingParams { + unit_per_mb_stored: 2, + unit_per_mb_streamed: 3, + unit_per_put_request: 4, + unit_per_get_request: 5, + }) + } } pub struct TestNodeVisitor; From 579d54ebf98b54899f12e8e46230b92ec5afe589 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Tue, 14 Nov 2023 01:49:09 +0100 Subject: [PATCH 514/583] feat: adding an event that indicates the stake as active --- pallets/ddc-staking/src/lib.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 6ccaabfd0..d773f6130 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -173,14 +173,14 @@ pub mod pallet { pub type Ledger = StorageMap<_, Blake2_128Concat, T::AccountId, StakingLedger, T>>; - /// The map of (wannabe) CDN participants stash keys to the DDC cluster ID they wish to + /// The map of (wannable) CDN participants stash keys to the DDC cluster ID they wish to /// participate into. #[pallet::storage] #[pallet::getter(fn cdns)] pub type CDNs = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; - /// The map of (wannabe) storage network participants stash keys to the DDC cluster ID they wish - /// to participate into. + /// The map of (wannable) storage network participants stash keys to the DDC cluster ID they + /// wish to participate into. #[pallet::storage] #[pallet::getter(fn storages)] pub type Storages = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; @@ -270,6 +270,9 @@ pub mod pallet { /// An account has declared desire to stop participating in CDN or storage network soon. /// \[stash, cluster, block\] ChillSoon(T::AccountId, ClusterId, T::BlockNumber), + /// An account that started participating as either a storage network or CDN participant. + /// \[stash\] + Activated(T::AccountId), } #[pallet::error] @@ -564,7 +567,9 @@ pub mod pallet { return Ok(()) } - Self::do_add_cdn(stash, cluster_id); + Self::do_add_cdn(&stash, cluster_id); + Self::deposit_event(Event::::Activated(stash.clone())); + Ok(()) } @@ -610,7 +615,8 @@ pub mod pallet { return Ok(()) } - Self::do_add_storage(stash, cluster_id); + Self::do_add_storage(&stash, cluster_id); + Self::deposit_event(Event::::Activated(stash.clone())); Ok(()) } From ec2693f07201e8e1b6246284e7f3493fe3aea4be Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Tue, 14 Nov 2023 01:58:33 +0100 Subject: [PATCH 515/583] fix: clippy --- pallets/ddc-staking/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index d773f6130..10ba3ff36 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -567,7 +567,7 @@ pub mod pallet { return Ok(()) } - Self::do_add_cdn(&stash, cluster_id); + Self::do_add_cdn(stash, cluster_id); Self::deposit_event(Event::::Activated(stash.clone())); Ok(()) @@ -615,7 +615,7 @@ pub mod pallet { return Ok(()) } - Self::do_add_storage(&stash, cluster_id); + Self::do_add_storage(stash, cluster_id); Self::deposit_event(Event::::Activated(stash.clone())); Ok(()) From 4aa2636400f836d15622432b77746c1775dbce12 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 14 Nov 2023 11:26:59 +0100 Subject: [PATCH 516/583] add unit tests for customers --- Cargo.lock | 5 + pallets/ddc-customers/Cargo.toml | 5 + pallets/ddc-customers/src/lib.rs | 5 + pallets/ddc-customers/src/mock.rs | 154 +++++++++++++++ pallets/ddc-customers/src/tests.rs | 290 +++++++++++++++++++++++++++++ 5 files changed, 459 insertions(+) create mode 100644 pallets/ddc-customers/src/mock.rs create mode 100644 pallets/ddc-customers/src/tests.rs diff --git a/Cargo.lock b/Cargo.lock index 025b489bf..5ae2e22e1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4902,10 +4902,15 @@ dependencies = [ "frame-support", "frame-system", "log", + "pallet-balances", + "pallet-timestamp", "parity-scale-codec", "scale-info", + "sp-core", + "sp-io", "sp-runtime", "sp-std", + "sp-tracing", "substrate-test-utils", ] diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 89faf08a5..580ca33a0 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -11,10 +11,15 @@ frame-support = { version = "4.0.0-dev", default-features = false, git = "https: frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [dev-dependencies] +pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index f807f0985..c010b0b2f 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -1,6 +1,11 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] +#[cfg(test)] +pub(crate) mod mock; +#[cfg(test)] +mod tests; + use codec::{Decode, Encode, HasCompact}; use ddc_primitives::{BucketId, ClusterId}; diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs new file mode 100644 index 000000000..589e76f31 --- /dev/null +++ b/pallets/ddc-customers/src/mock.rs @@ -0,0 +1,154 @@ +//! Test utilities + +#![allow(dead_code)] + +use crate::{self as pallet_ddc_customers, *}; +use ddc_primitives::{NodePubKey, NodeType}; +use ddc_traits::cluster::{ClusterVisitor, ClusterVisitorError}; + +use frame_support::{ + construct_runtime, parameter_types, + traits::{ConstU32, ConstU64, Everything}, + weights::constants::RocksDbWeight, +}; +use frame_system::mocking::{MockBlock, MockUncheckedExtrinsic}; +use sp_core::H256; +use sp_io::TestExternalities; +use sp_runtime::{ + testing::Header, + traits::{BlakeTwo256, IdentityLookup}, +}; + +/// The AccountId alias in this test module. +pub(crate) type AccountId = u64; +pub(crate) type AccountIndex = u64; +pub(crate) type BlockNumber = u64; +pub(crate) type Balance = u128; + +type UncheckedExtrinsic = MockUncheckedExtrinsic; +type Block = MockBlock; + +construct_runtime!( + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + DdcCustomers: pallet_ddc_customers::{Pallet, Call, Storage, Config, Event}, + } +); + +parameter_types! { + pub static ExistentialDeposit: Balance = 1; +} + +impl frame_system::Config for Test { + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type DbWeight = RocksDbWeight; + type RuntimeOrigin = RuntimeOrigin; + type Index = AccountIndex; + type BlockNumber = BlockNumber; + type RuntimeCall = RuntimeCall; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = ConstU64<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = ConstU32<16>; +} + +impl pallet_balances::Config for Test { + type MaxLocks = ConstU32<1024>; + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); +} + +impl pallet_timestamp::Config for Test { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = ConstU64<5>; + type WeightInfo = (); +} + +parameter_types! { + pub const DdcCustomersPalletId: PalletId = PalletId(*b"accounts"); // DDC maintainer's stake + pub const UnlockingDelay: BlockNumber = 10u64; // 10 blocks for test +} + +impl crate::pallet::Config for Test { + type UnlockingDelay = UnlockingDelay; + type Currency = Balances; + type PalletId = DdcCustomersPalletId; + type RuntimeEvent = RuntimeEvent; + type ClusterVisitor = TestClusterVisitor; +} + +pub struct TestClusterVisitor; +impl ClusterVisitor for TestClusterVisitor { + fn cluster_has_node(_cluster_id: &ClusterId, _node_pub_key: &NodePubKey) -> bool { + true + } + fn ensure_cluster(_cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { + Ok(()) + } + fn get_bond_size( + _cluster_id: &ClusterId, + _node_type: NodeType, + ) -> Result { + Ok(10) + } + fn get_chill_delay( + _cluster_id: &ClusterId, + _node_type: NodeType, + ) -> Result { + Ok(T::BlockNumber::from(10u32)) + } + fn get_unbonding_delay( + _cluster_id: &ClusterId, + _node_type: NodeType, + ) -> Result { + Ok(T::BlockNumber::from(10u32)) + } +} + +pub(crate) type TestRuntimeCall = ::RuntimeCall; + +pub struct ExtBuilder; + +impl ExtBuilder { + fn build(self) -> TestExternalities { + sp_tracing::try_init_simple(); + let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); + + let _ = pallet_balances::GenesisConfig:: { balances: vec![(1, 100), (2, 100)] } + .assimilate_storage(&mut storage); + + TestExternalities::new(storage) + } + pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + sp_tracing::try_init_simple(); + let mut ext = self.build(); + ext.execute_with(test); + } +} diff --git a/pallets/ddc-customers/src/tests.rs b/pallets/ddc-customers/src/tests.rs new file mode 100644 index 000000000..43bc29c55 --- /dev/null +++ b/pallets/ddc-customers/src/tests.rs @@ -0,0 +1,290 @@ +//! Tests for the module. + +use super::{mock::*, *}; +use ddc_primitives::ClusterId; + +use frame_support::{assert_noop, assert_ok}; +use pallet_balances::Error as BalancesError; + +#[test] +fn create_bucket_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let cluster_id = ClusterId::from([1; 20]); + + // Bucket created + assert_ok!(DdcCustomers::create_bucket(RuntimeOrigin::signed(1), cluster_id.clone())); + + // Check storage + assert_eq!(DdcCustomers::buckets_count(), 1); + assert_eq!( + DdcCustomers::buckets(&1), + Some(Bucket { bucket_id: 1, owner_id: 1, cluster_id }) + ); + + // Checking that event was emitted + assert_eq!(System::events().len(), 1); + System::assert_last_event(Event::BucketCreated { 0: 1u64.into() }.into()) + + // let bytes = [0u8; 32]; + // let node_pub_key = AccountId32::from(bytes); + // let cdn_node_params = CDNNodeParams { + // host: vec![1u8, 255], + // http_port: 35000u16, + // grpc_port: 25000u16, + // p2p_port: 15000u16, + // }; + + // // Node params are not valid + // assert_noop!( + // DdcNodes::create_node( + // RuntimeOrigin::signed(1), + // NodePubKey::CDNPubKey(node_pub_key.clone()), + // NodeParams::StorageParams(StorageNodeParams { + // host: vec![1u8, 255], + // http_port: 35000u16, + // grpc_port: 25000u16, + // p2p_port: 15000u16, + // }) + // ), + // Error::::InvalidNodeParams + // ); + + // // Node already exists + // assert_noop!( + // DdcNodes::create_node( + // RuntimeOrigin::signed(1), + // NodePubKey::CDNPubKey(node_pub_key.clone()), + // NodeParams::CDNParams(cdn_node_params) + // ), + // Error::::NodeAlreadyExists + // ); + + // // Checking that event was emitted + // assert_eq!(System::events().len(), 1); + // System::assert_last_event( + // Event::NodeCreated { node_pub_key: NodePubKey::CDNPubKey(node_pub_key) }.into(), + // ) + }) +} + +#[test] +fn deposit_and_deposit_extra_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + // let bytes = [0u8; 32]; + // let node_pub_key = AccountId32::from(bytes); + // let storage_node_params = StorageNodeParams { + // host: vec![1u8, 255], + // http_port: 35000u16, + // grpc_port: 25000u16, + // p2p_port: 15000u16, + // }; + // let cdn_node_params = CDNNodeParams { + // host: vec![1u8, 255], + // http_port: 35000u16, + // grpc_port: 25000u16, + // p2p_port: 15000u16, + // }; + + // Deposit dust + assert_noop!( + DdcCustomers::deposit(RuntimeOrigin::signed(1), 0_u128.into()), + Error::::InsufficientDeposit + ); + + // Deposit all tokens fails (should not kill account) + assert_noop!( + DdcCustomers::deposit(RuntimeOrigin::signed(1), 100_u128.into()), + BalancesError::::KeepAlive + ); + + // Deposited + assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(1), 10_u128.into())); + + // Check storage + assert_eq!( + DdcCustomers::ledger(&1), + Some(AccountsLedger { + owner: 1, + total: 10_u128.into(), + active: 10_u128.into(), + unlocking: Default::default(), + }) + ); + + // Checking that event was emitted + System::assert_last_event(Event::Deposited { 0: 1, 1: 10 }.into()); + + // Deposit should fail when called the second time + assert_noop!( + DdcCustomers::deposit(RuntimeOrigin::signed(1), 10_u128.into()), + Error::::AlreadyPaired + ); + + // Deposit extra fails if not owner + assert_noop!( + DdcCustomers::deposit_extra(RuntimeOrigin::signed(2), 10_u128.into()), + Error::::NotOwner + ); + + // Deposited extra + assert_ok!(DdcCustomers::deposit_extra(RuntimeOrigin::signed(1), 20_u128.into())); + + // Check storage + assert_eq!( + DdcCustomers::ledger(&1), + Some(AccountsLedger { + owner: 1, + total: 30_u128.into(), + active: 30_u128.into(), + unlocking: Default::default(), + }) + ); + + // Checking that event was emitted + System::assert_last_event(Event::Deposited { 0: 1, 1: 20 }.into()); + + // // Set node params + // assert_ok!(DdcNodes::set_node_params( + // RuntimeOrigin::signed(1), + // NodePubKey::CDNPubKey(node_pub_key.clone()), + // NodeParams::CDNParams(cdn_node_params.clone()) + // )); + + // // Node params are not valid + // assert_noop!( + // DdcNodes::set_node_params( + // RuntimeOrigin::signed(1), + // NodePubKey::CDNPubKey(node_pub_key.clone()), + // NodeParams::StorageParams(storage_node_params) + // ), + // Error::::InvalidNodeParams + // ); + + // // Only node provider can set params + // assert_noop!( + // DdcNodes::set_node_params( + // RuntimeOrigin::signed(2), + // NodePubKey::CDNPubKey(node_pub_key.clone()), + // NodeParams::CDNParams(cdn_node_params.clone()) + // ), + // Error::::OnlyNodeProvider + // ); + }) +} + +#[test] +fn unlock_and_withdraw_deposit_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + // Deposited + assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(1), 35_u128.into())); + // So there is always positive balance within pallet + assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(2), 10_u128.into())); + + // Unlock chunk + assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 1_u128.into())); + System::set_block_number(2); + + let mut unlocking_chunks: BoundedVec, MaxUnlockingChunks> = + Default::default(); + match unlocking_chunks.try_push(UnlockChunk { value: 1, block: 11 }) { + Ok(_) => (), + Err(_) => println!("No more chunks"), + }; + // Check storage + assert_eq!( + DdcCustomers::ledger(&1), + Some(AccountsLedger { + owner: 1, + total: 35_u128.into(), + active: 34_u128.into(), + unlocking: unlocking_chunks.clone(), + }) + ); + + // Reach max unlock chunks + for i in 1..32 { + assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 1_u128.into())); + System::set_block_number(i + 2); + } + + // No more chunks can be added + assert_noop!( + DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 1_u128.into()), + Error::::NoMoreChunks + ); + + // Set the block to withdraw all unlocked chunks + System::set_block_number(42); + + assert_ok!(DdcCustomers::withdraw_unlocked_deposit(RuntimeOrigin::signed(1))); + // Check storage + assert_eq!( + DdcCustomers::ledger(&1), + Some(AccountsLedger { + owner: 1, + total: 3_u128.into(), + active: 3_u128.into(), + unlocking: Default::default(), + }) + ); + + // Unlock remaining chuncks & withdraw + assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 3_u128.into())); + System::set_block_number(52); + assert_ok!(DdcCustomers::withdraw_unlocked_deposit(RuntimeOrigin::signed(1))); + + // Check storage + assert_eq!(DdcCustomers::ledger(&1), None); + + // let bytes = [0u8; 32]; + // let node_pub_key = AccountId32::from(bytes); + // let cdn_node_params = CDNNodeParams { + // host: vec![1u8, 255], + // http_port: 35000u16, + // grpc_port: 25000u16, + // p2p_port: 15000u16, + // }; + + // // Node doesn't exist + // assert_noop!( + // DdcNodes::delete_node( + // RuntimeOrigin::signed(1), + // NodePubKey::CDNPubKey(node_pub_key.clone()) + // ), + // Error::::NodeDoesNotExist + // ); + + // // Create node + // assert_ok!(DdcNodes::create_node( + // RuntimeOrigin::signed(1), + // NodePubKey::CDNPubKey(node_pub_key.clone()), + // NodeParams::CDNParams(cdn_node_params.clone()) + // )); + + // // Only node provider can delete + // assert_noop!( + // DdcNodes::delete_node( + // RuntimeOrigin::signed(2), + // NodePubKey::CDNPubKey(node_pub_key.clone()) + // ), + // Error::::OnlyNodeProvider + // ); + + // // Delete node + // assert_ok!(DdcNodes::delete_node( + // RuntimeOrigin::signed(1), + // NodePubKey::CDNPubKey(node_pub_key.clone()), + // )); + + // // Checking that event was emitted + // assert_eq!(System::events().len(), 2); + // System::assert_last_event( + // Event::NodeDeleted { node_pub_key: NodePubKey::CDNPubKey(node_pub_key) }.into(), + // ) + }) +} From 2ee51219cbbf0477a19c277fa25648eced17bada Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Tue, 14 Nov 2023 11:47:43 +0100 Subject: [PATCH 517/583] docs(pallet_ddc_staking): comments improved --- pallets/ddc-staking/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 10ba3ff36..005b39c8d 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -173,13 +173,13 @@ pub mod pallet { pub type Ledger = StorageMap<_, Blake2_128Concat, T::AccountId, StakingLedger, T>>; - /// The map of (wannable) CDN participants stash keys to the DDC cluster ID they wish to + /// The map of (wannabe) CDN nodes participants stash keys to the DDC cluster ID they wish to /// participate into. #[pallet::storage] #[pallet::getter(fn cdns)] pub type CDNs = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; - /// The map of (wannable) storage network participants stash keys to the DDC cluster ID they + /// The map of (wannabe) Storage nodes participants stash keys to the DDC cluster ID they /// wish to participate into. #[pallet::storage] #[pallet::getter(fn storages)] From 3b181b771283aae309a08ea85bec4f10338d3903 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 14 Nov 2023 12:42:58 +0100 Subject: [PATCH 518/583] remove irrelevant comments & improve formatting (clippy) --- pallets/ddc-customers/src/mock.rs | 2 +- pallets/ddc-customers/src/tests.rs | 177 ++++------------------------- 2 files changed, 26 insertions(+), 153 deletions(-) diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index 589e76f31..7a097ea67 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -146,7 +146,7 @@ impl ExtBuilder { TestExternalities::new(storage) } - pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + pub fn build_and_execute(self, test: impl FnOnce()) { sp_tracing::try_init_simple(); let mut ext = self.build(); ext.execute_with(test); diff --git a/pallets/ddc-customers/src/tests.rs b/pallets/ddc-customers/src/tests.rs index 43bc29c55..032351e4d 100644 --- a/pallets/ddc-customers/src/tests.rs +++ b/pallets/ddc-customers/src/tests.rs @@ -14,58 +14,18 @@ fn create_bucket_works() { let cluster_id = ClusterId::from([1; 20]); // Bucket created - assert_ok!(DdcCustomers::create_bucket(RuntimeOrigin::signed(1), cluster_id.clone())); + assert_ok!(DdcCustomers::create_bucket(RuntimeOrigin::signed(1), cluster_id)); // Check storage assert_eq!(DdcCustomers::buckets_count(), 1); assert_eq!( - DdcCustomers::buckets(&1), + DdcCustomers::buckets(1), Some(Bucket { bucket_id: 1, owner_id: 1, cluster_id }) ); // Checking that event was emitted assert_eq!(System::events().len(), 1); - System::assert_last_event(Event::BucketCreated { 0: 1u64.into() }.into()) - - // let bytes = [0u8; 32]; - // let node_pub_key = AccountId32::from(bytes); - // let cdn_node_params = CDNNodeParams { - // host: vec![1u8, 255], - // http_port: 35000u16, - // grpc_port: 25000u16, - // p2p_port: 15000u16, - // }; - - // // Node params are not valid - // assert_noop!( - // DdcNodes::create_node( - // RuntimeOrigin::signed(1), - // NodePubKey::CDNPubKey(node_pub_key.clone()), - // NodeParams::StorageParams(StorageNodeParams { - // host: vec![1u8, 255], - // http_port: 35000u16, - // grpc_port: 25000u16, - // p2p_port: 15000u16, - // }) - // ), - // Error::::InvalidNodeParams - // ); - - // // Node already exists - // assert_noop!( - // DdcNodes::create_node( - // RuntimeOrigin::signed(1), - // NodePubKey::CDNPubKey(node_pub_key.clone()), - // NodeParams::CDNParams(cdn_node_params) - // ), - // Error::::NodeAlreadyExists - // ); - - // // Checking that event was emitted - // assert_eq!(System::events().len(), 1); - // System::assert_last_event( - // Event::NodeCreated { node_pub_key: NodePubKey::CDNPubKey(node_pub_key) }.into(), - // ) + System::assert_last_event(Event::BucketCreated(1u64).into()) }) } @@ -73,105 +33,64 @@ fn create_bucket_works() { fn deposit_and_deposit_extra_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); - // let bytes = [0u8; 32]; - // let node_pub_key = AccountId32::from(bytes); - // let storage_node_params = StorageNodeParams { - // host: vec![1u8, 255], - // http_port: 35000u16, - // grpc_port: 25000u16, - // p2p_port: 15000u16, - // }; - // let cdn_node_params = CDNNodeParams { - // host: vec![1u8, 255], - // http_port: 35000u16, - // grpc_port: 25000u16, - // p2p_port: 15000u16, - // }; // Deposit dust assert_noop!( - DdcCustomers::deposit(RuntimeOrigin::signed(1), 0_u128.into()), + DdcCustomers::deposit(RuntimeOrigin::signed(1), 0_u128), Error::::InsufficientDeposit ); // Deposit all tokens fails (should not kill account) assert_noop!( - DdcCustomers::deposit(RuntimeOrigin::signed(1), 100_u128.into()), + DdcCustomers::deposit(RuntimeOrigin::signed(1), 100_u128), BalancesError::::KeepAlive ); // Deposited - assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(1), 10_u128.into())); + assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(1), 10_u128)); // Check storage assert_eq!( DdcCustomers::ledger(&1), Some(AccountsLedger { owner: 1, - total: 10_u128.into(), - active: 10_u128.into(), + total: 10_u128, + active: 10_u128, unlocking: Default::default(), }) ); // Checking that event was emitted - System::assert_last_event(Event::Deposited { 0: 1, 1: 10 }.into()); + System::assert_last_event(Event::Deposited(1, 10).into()); // Deposit should fail when called the second time assert_noop!( - DdcCustomers::deposit(RuntimeOrigin::signed(1), 10_u128.into()), + DdcCustomers::deposit(RuntimeOrigin::signed(1), 10_u128), Error::::AlreadyPaired ); // Deposit extra fails if not owner assert_noop!( - DdcCustomers::deposit_extra(RuntimeOrigin::signed(2), 10_u128.into()), + DdcCustomers::deposit_extra(RuntimeOrigin::signed(2), 10_u128), Error::::NotOwner ); // Deposited extra - assert_ok!(DdcCustomers::deposit_extra(RuntimeOrigin::signed(1), 20_u128.into())); + assert_ok!(DdcCustomers::deposit_extra(RuntimeOrigin::signed(1), 20_u128)); // Check storage assert_eq!( DdcCustomers::ledger(&1), Some(AccountsLedger { owner: 1, - total: 30_u128.into(), - active: 30_u128.into(), + total: 30_u128, + active: 30_u128, unlocking: Default::default(), }) ); // Checking that event was emitted - System::assert_last_event(Event::Deposited { 0: 1, 1: 20 }.into()); - - // // Set node params - // assert_ok!(DdcNodes::set_node_params( - // RuntimeOrigin::signed(1), - // NodePubKey::CDNPubKey(node_pub_key.clone()), - // NodeParams::CDNParams(cdn_node_params.clone()) - // )); - - // // Node params are not valid - // assert_noop!( - // DdcNodes::set_node_params( - // RuntimeOrigin::signed(1), - // NodePubKey::CDNPubKey(node_pub_key.clone()), - // NodeParams::StorageParams(storage_node_params) - // ), - // Error::::InvalidNodeParams - // ); - - // // Only node provider can set params - // assert_noop!( - // DdcNodes::set_node_params( - // RuntimeOrigin::signed(2), - // NodePubKey::CDNPubKey(node_pub_key.clone()), - // NodeParams::CDNParams(cdn_node_params.clone()) - // ), - // Error::::OnlyNodeProvider - // ); + System::assert_last_event(Event::Deposited(1, 20).into()); }) } @@ -181,12 +100,12 @@ fn unlock_and_withdraw_deposit_works() { System::set_block_number(1); // Deposited - assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(1), 35_u128.into())); + assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(1), 35_u128)); // So there is always positive balance within pallet - assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(2), 10_u128.into())); + assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(2), 10_u128)); // Unlock chunk - assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 1_u128.into())); + assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 1_u128)); System::set_block_number(2); let mut unlocking_chunks: BoundedVec, MaxUnlockingChunks> = @@ -200,21 +119,21 @@ fn unlock_and_withdraw_deposit_works() { DdcCustomers::ledger(&1), Some(AccountsLedger { owner: 1, - total: 35_u128.into(), - active: 34_u128.into(), + total: 35_u128, + active: 34_u128, unlocking: unlocking_chunks.clone(), }) ); // Reach max unlock chunks for i in 1..32 { - assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 1_u128.into())); + assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 1_u128)); System::set_block_number(i + 2); } // No more chunks can be added assert_noop!( - DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 1_u128.into()), + DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 1_u128), Error::::NoMoreChunks ); @@ -227,64 +146,18 @@ fn unlock_and_withdraw_deposit_works() { DdcCustomers::ledger(&1), Some(AccountsLedger { owner: 1, - total: 3_u128.into(), - active: 3_u128.into(), + total: 3_u128, + active: 3_u128, unlocking: Default::default(), }) ); // Unlock remaining chuncks & withdraw - assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 3_u128.into())); + assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 3_u128)); System::set_block_number(52); assert_ok!(DdcCustomers::withdraw_unlocked_deposit(RuntimeOrigin::signed(1))); // Check storage assert_eq!(DdcCustomers::ledger(&1), None); - - // let bytes = [0u8; 32]; - // let node_pub_key = AccountId32::from(bytes); - // let cdn_node_params = CDNNodeParams { - // host: vec![1u8, 255], - // http_port: 35000u16, - // grpc_port: 25000u16, - // p2p_port: 15000u16, - // }; - - // // Node doesn't exist - // assert_noop!( - // DdcNodes::delete_node( - // RuntimeOrigin::signed(1), - // NodePubKey::CDNPubKey(node_pub_key.clone()) - // ), - // Error::::NodeDoesNotExist - // ); - - // // Create node - // assert_ok!(DdcNodes::create_node( - // RuntimeOrigin::signed(1), - // NodePubKey::CDNPubKey(node_pub_key.clone()), - // NodeParams::CDNParams(cdn_node_params.clone()) - // )); - - // // Only node provider can delete - // assert_noop!( - // DdcNodes::delete_node( - // RuntimeOrigin::signed(2), - // NodePubKey::CDNPubKey(node_pub_key.clone()) - // ), - // Error::::OnlyNodeProvider - // ); - - // // Delete node - // assert_ok!(DdcNodes::delete_node( - // RuntimeOrigin::signed(1), - // NodePubKey::CDNPubKey(node_pub_key.clone()), - // )); - - // // Checking that event was emitted - // assert_eq!(System::events().len(), 2); - // System::assert_last_event( - // Event::NodeDeleted { node_pub_key: NodePubKey::CDNPubKey(node_pub_key) }.into(), - // ) }) } From 573de96f1ec79e7b73be0b985a7ce9a9c4c678dd Mon Sep 17 00:00:00 2001 From: Victor Genin Date: Tue, 14 Nov 2023 19:30:24 +0200 Subject: [PATCH 519/583] cluster payment refactoring --- pallets/ddc-clusters/src/cluster.rs | 7 +++++-- pallets/ddc-clusters/src/lib.rs | 7 ++++++- pallets/ddc-customers/src/lib.rs | 2 +- pallets/ddc-payouts/src/lib.rs | 1 + 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index 7fc6e07e4..4be19d73f 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -1,6 +1,6 @@ use crate::pallet::Error; use codec::{Decode, Encode}; -use ddc_primitives::{ClusterId, ClusterPricingParams}; +use ddc_primitives::ClusterId; use frame_support::{pallet_prelude::*, parameter_types}; use scale_info::TypeInfo; use sp_runtime::Perbill; @@ -41,7 +41,10 @@ pub struct ClusterGovParams { pub storage_bond_size: Balance, pub storage_chill_delay: BlockNumber, pub storage_unbonding_delay: BlockNumber, - pub pricing: ClusterPricingParams, + pub unit_per_mb_stored: u128, + pub unit_per_mb_streamed: u128, + pub unit_per_put_request: u128, + pub unit_per_get_request: u128, } impl Cluster { diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 121640d84..a8cbf3535 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -271,7 +271,12 @@ pub mod pallet { ) -> Result { let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; - Ok(cluster_gov_params.pricing) + Ok(ClusterPricingParams { + unit_per_mb_stored: cluster_gov_params.unit_per_mb_stored, + unit_per_mb_streamed: cluster_gov_params.unit_per_mb_streamed, + unit_per_put_request: cluster_gov_params.unit_per_put_request, + unit_per_get_request: cluster_gov_params.unit_per_get_request, + }) } fn get_chill_delay( diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 2454eae19..30a2b9d36 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -200,7 +200,7 @@ pub mod pallet { /// An account has called `withdraw_unlocked_deposit` and removed unlocking chunks worth /// `Balance` from the unlocking queue. \[owner, amount\] Withdrawn(T::AccountId, BalanceOf), - /// The acconut has been charged for the usage + /// The account has been charged for the usage Charged(T::AccountId, BalanceOf), /// Bucket with specific id created BucketCreated(BucketId), diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index 60cc3ab75..bc8aa5d50 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -234,6 +234,7 @@ pub mod pallet { Initialized, ChargingCustomers, CustomersCharged, + DeductingFees, RewardingProviders, ProvidersRewarded, Finalized, From fb63d2f826f0341eee4e9ce9c0dd6caccaaeb92d Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 14 Nov 2023 18:55:49 +0100 Subject: [PATCH 520/583] add extra tests & checks --- pallets/ddc-staking/src/tests.rs | 144 ++++++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index 37d971bca..d0756f3d4 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -70,14 +70,117 @@ fn change_controller_works() { }) } +#[test] +fn not_enough_inital_bond_flow() { + ExtBuilder::default().build_and_execute(|| { + System::set_block_number(1); + + // Add new CDN participant, account 3 controlled by 4 with node 5. + assert_ok!(DdcStaking::bond( + RuntimeOrigin::signed(3), + 4, + NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + 5 + )); + + // Not enough tokens bonded to serve + assert_noop!( + DdcStaking::serve(RuntimeOrigin::signed(4), ClusterId::from([1; 20])), + Error::::InsufficientBond + ); + + // Can not bond extra + assert_noop!( + DdcStaking::bond( + RuntimeOrigin::signed(3), + 4, + NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + 5 + ), + Error::::AlreadyBonded + ); + + // Unbond all bonded amount + assert_ok!(DdcStaking::unbond(RuntimeOrigin::signed(4), 5)); + System::assert_last_event(Event::Unbonded(3, 5).into()); + System::set_block_number(11); + // Withdraw unbonded tokens to clear up the stash controller pair + assert_ok!(DdcStaking::withdraw_unbonded(RuntimeOrigin::signed(4))); + System::assert_last_event(Event::Withdrawn(3, 5).into()); + + // Bond sufficient amount + assert_ok!(DdcStaking::bond( + RuntimeOrigin::signed(3), + 4, + NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + 10 + )); + + // Serving should work + assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), ClusterId::from([1; 20]))); + }) +} + +#[test] +fn set_node_works() { + ExtBuilder::default().build_and_execute(|| { + System::set_block_number(1); + // 10 and 11 are bonded as stash controller. + assert_eq!(DdcStaking::bonded(&11), Some(10)); + + // Node is already paired + assert_noop!( + DdcStaking::set_node( + RuntimeOrigin::signed(10), + NodePubKey::CDNPubKey(CDNNodePubKey::new([12; 32])) + ), + Error::::AlreadyPaired + ); + + // Node cannot be changed + assert_noop!( + DdcStaking::set_node( + RuntimeOrigin::signed(11), + NodePubKey::CDNPubKey(CDNNodePubKey::new([12; 32])) + ), + Error::::AlreadyInRole + ); + + // Schedule CDN participant removal. + assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(10))); + System::set_block_number(11); + // Actual CDN participant removal. + assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(10))); + + // Setting node should work + assert_ok!(DdcStaking::set_node( + RuntimeOrigin::signed(11), + NodePubKey::CDNPubKey(CDNNodePubKey::new([13; 32])) + )); + }) +} + #[test] fn staking_should_work() { ExtBuilder::default().build_and_execute(|| { + System::set_block_number(1); + // Put some money in account that we'll use. for i in 1..5 { let _ = Balances::make_free_balance_be(&i, 2000); } + // Bond dust should fail + assert_noop!( + DdcStaking::bond( + RuntimeOrigin::signed(3), + 4, + NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + 0 + ), + Error::::InsufficientBond + ); + // Add new CDN participant, account 3 controlled by 4 with node 5. assert_ok!(DdcStaking::bond( RuntimeOrigin::signed(3), @@ -85,7 +188,31 @@ fn staking_should_work() { NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), 1500 )); + System::assert_last_event(Event::Bonded(3, 1500).into()); assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), ClusterId::from([0; 20]))); + System::assert_last_event(Event::Activated(3).into()); + + // Controller already paired + assert_noop!( + DdcStaking::bond( + RuntimeOrigin::signed(5), + 4, + NodePubKey::CDNPubKey(CDNNodePubKey::new([10; 32])), + 10 + ), + Error::::AlreadyPaired + ); + + // Node already paired + assert_noop!( + DdcStaking::bond( + RuntimeOrigin::signed(5), + 6, + NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + 10 + ), + Error::::AlreadyPaired + ); // Account 4 controls the stash from account 3, which is 1500 units, 3 is a CDN // participant, 5 is a DDC node. @@ -103,12 +230,12 @@ fn staking_should_work() { assert_eq!(DdcStaking::cdns(3), Some(ClusterId::from([0; 20]))); assert_eq!(DdcStaking::nodes(NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32]))), Some(3)); - // Set `CurrentEra`. + // Set initial block timestamp. Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); - DdcStaking::on_finalize(System::block_number()); // Schedule CDN participant removal. assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); + System::assert_last_event(Event::ChillSoon(3, ClusterId::from([0; 20]), 11).into()); // Removal is scheduled, stashed value of 4 is still lock. let chilling = System::block_number() + 10u64; @@ -128,11 +255,19 @@ fn staking_should_work() { assert_noop!(Balances::reserve(&3, 501), BalancesError::::LiquidityRestrictions); assert_ok!(Balances::reserve(&3, 409)); - // Set `CurrentEra` to the value allows us to chill. + // Too early to call chill the second time + assert_noop!(DdcStaking::chill(RuntimeOrigin::signed(4)), Error::::TooEarly); + + // Fast chill should not be allowed + assert_noop!( + DdcStaking::fast_chill(RuntimeOrigin::signed(4)), + Error::::FastChillProhibited + ); + + // Set the block number that allows us to chill. while System::block_number() < chilling { System::set_block_number(System::block_number() + 1); Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); - DdcStaking::on_finalize(System::block_number()); } // Ledger is not changed until we make another call to `chill`. @@ -149,6 +284,7 @@ fn staking_should_work() { // Actual CDN participant removal. assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); + System::assert_last_event(Event::Chilled(3).into()); // Account 3 is no longer a CDN participant. assert_eq!(DdcStaking::cdns(3), None); From 5937073beb22cdc936c4f9e7b877701bb242ac0c Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Tue, 14 Nov 2023 19:09:48 +0100 Subject: [PATCH 521/583] resolve clippy & fix error in toml --- Cargo.lock | 2 ++ pallets/ddc-clusters/Cargo.toml | 3 +-- pallets/ddc-clusters/src/mock.rs | 2 +- pallets/ddc-clusters/src/tests.rs | 12 ++++++------ pallets/ddc-nodes/Cargo.toml | 1 + pallets/ddc-nodes/src/mock.rs | 2 +- pallets/ddc-nodes/src/tests.rs | 4 ++-- 7 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5e9a2ca07..b1d1fad6a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4892,6 +4892,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-core", + "sp-io", "sp-runtime", "sp-std", "sp-tracing", @@ -4951,6 +4952,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-core", + "sp-io", "sp-runtime", "sp-std", "sp-tracing", diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index 9b1d889b3..ea4cdf5d6 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -9,9 +9,8 @@ ddc-primitives = { version = "0.1.0", default-features = false, path = "../../pr ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-clusters/src/mock.rs b/pallets/ddc-clusters/src/mock.rs index c4055dfbc..b6c2e4fd2 100644 --- a/pallets/ddc-clusters/src/mock.rs +++ b/pallets/ddc-clusters/src/mock.rs @@ -224,7 +224,7 @@ impl ExtBuilder { TestExternalities::new(storage) } - pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + pub fn build_and_execute(self, test: impl FnOnce()) { sp_tracing::try_init_simple(); let mut ext = self.build(); ext.execute_with(test); diff --git a/pallets/ddc-clusters/src/tests.rs b/pallets/ddc-clusters/src/tests.rs index 543a4bbb2..922ad7a7a 100644 --- a/pallets/ddc-clusters/src/tests.rs +++ b/pallets/ddc-clusters/src/tests.rs @@ -148,8 +148,8 @@ fn add_and_delete_node_works() { // Node created assert_ok!(DdcNodes::create_node( RuntimeOrigin::signed(AccountId::from([1; 32])), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params.clone()) + NodePubKey::CDNPubKey(node_pub_key), + NodeParams::CDNParams(cdn_node_params) )); // Node doesn't exist @@ -225,7 +225,7 @@ fn add_and_delete_node_works() { fn encode_constructor() -> Vec { let mut call_data = CTOR_SELECTOR.to_vec(); - let x = 0 as u128; + let x = 0_u128; for _ in 0..9 { x.encode_to(&mut call_data); } @@ -252,13 +252,13 @@ fn add_and_delete_node_works() { GAS_LIMIT, None, wasm.to_vec(), - contract_args.clone(), + contract_args, vec![], ) .unwrap(); // Configure worker with the contract address. - let contract_id = Contracts::contract_address(&alice, &wasm_hash, &vec![]); + let contract_id = Contracts::contract_address(&alice, &wasm_hash, &[]); pub const ADD_DDC_NODE_SELECTOR: [u8; 4] = hex!("7a04093d"); let node_pub_key = NodePubKey::CDNPubKey(AccountId::from([4; 32])); @@ -271,7 +271,7 @@ fn add_and_delete_node_works() { }; let results = Contracts::call( - RuntimeOrigin::signed(alice.clone()), + RuntimeOrigin::signed(alice), contract_id.clone(), 0, Weight::from_ref_time(1_000_000_000_000), diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index 9ca3ff088..10bf74d9e 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -10,6 +10,7 @@ ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-nodes/src/mock.rs b/pallets/ddc-nodes/src/mock.rs index 8a8002c0c..18377ac58 100644 --- a/pallets/ddc-nodes/src/mock.rs +++ b/pallets/ddc-nodes/src/mock.rs @@ -106,7 +106,7 @@ impl ExtBuilder { TestExternalities::new(storage) } - pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + pub fn build_and_execute(self, test: impl FnOnce()) { sp_tracing::try_init_simple(); let mut ext = self.build(); ext.execute_with(test); diff --git a/pallets/ddc-nodes/src/tests.rs b/pallets/ddc-nodes/src/tests.rs index 9cbdc526c..1c5a80137 100644 --- a/pallets/ddc-nodes/src/tests.rs +++ b/pallets/ddc-nodes/src/tests.rs @@ -117,7 +117,7 @@ fn set_node_params_works() { DdcNodes::set_node_params( RuntimeOrigin::signed(2), NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params.clone()) + NodeParams::CDNParams(cdn_node_params) ), Error::::OnlyNodeProvider ); @@ -156,7 +156,7 @@ fn set_delete_node_works() { assert_ok!(DdcNodes::create_node( RuntimeOrigin::signed(1), NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params.clone()) + NodeParams::CDNParams(cdn_node_params) )); // Only node provider can delete From 19eb7e8b934a2d3e85c8628a650230389abcd528 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Tue, 14 Nov 2023 19:25:21 +0100 Subject: [PATCH 522/583] chore: runtime version for 'cere_dev' is upgraded --- runtime/cere-dev/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 2e4d8e1a0..2aeb530df 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -130,7 +130,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: 48014, + spec_version: 48015, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, From d86a57cbf225db92300462812b93c7eff88287ac Mon Sep 17 00:00:00 2001 From: deeprnd Date: Wed, 15 Nov 2023 11:07:45 +0200 Subject: [PATCH 523/583] authorise account change --- pallets/ddc-customers/src/lib.rs | 4 --- pallets/ddc-payouts/src/lib.rs | 57 ++++++++++++-------------------- 2 files changed, 21 insertions(+), 40 deletions(-) diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 30a2b9d36..058799a9f 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -172,10 +172,6 @@ pub mod pallet { 0 } - #[pallet::storage] - #[pallet::getter(fn dac_account)] - pub type DACAccount = StorageValue<_, T::AccountId>; - #[pallet::storage] #[pallet::getter(fn buckets_count)] pub type BucketsCount = diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index bc8aa5d50..c3365fcc4 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -179,7 +179,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn authorised_caller)] - pub type DACAccount = StorageValue<_, T::AccountId>; + pub type AuthorisedCaller = StorageValue<_, T::AccountId>; #[pallet::storage] #[pallet::getter(fn debtor_customers)] @@ -198,7 +198,6 @@ pub mod pallet { pub struct BillingReport { state: State, vault: T::AccountId, - authorised_caller: Option, total_customer_charge: CustomerCharge, total_distributed_reward: u128, total_node_usage: NodeUsage, @@ -215,7 +214,6 @@ pub mod pallet { Self { state: State::default(), vault: T::PalletId::get().into_account_truncating(), - authorised_caller: Option::None, total_customer_charge: CustomerCharge::default(), total_distributed_reward: Zero::zero(), total_node_usage: NodeUsage::default(), @@ -242,6 +240,18 @@ pub mod pallet { #[pallet::call] impl Pallet { + #[pallet::weight(10_000)] + pub fn set_authorised_caller( + origin: OriginFor, + authorised_caller: T::AccountId, + ) -> DispatchResult { + ensure_root(origin)?; // requires Governance approval + + AuthorisedCaller::::put(authorised_caller); + + Ok(()) + } + #[pallet::weight(10_000)] pub fn begin_billing_report( origin: OriginFor, @@ -249,10 +259,7 @@ pub mod pallet { era: DdcEra, ) -> DispatchResult { let caller = ensure_signed(origin)?; - ensure!( - Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, - Error::::Unauthorised - ); + ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); ensure!( ActiveBillingReports::::try_get(cluster_id, era).is_err(), @@ -281,10 +288,7 @@ pub mod pallet { max_batch_index: BatchIndex, ) -> DispatchResult { let caller = ensure_signed(origin)?; - ensure!( - Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, - Error::::Unauthorised - ); + ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); ensure!( max_batch_index > 0 && max_batch_index < MaxBatchesCount::get(), @@ -314,10 +318,7 @@ pub mod pallet { payers: Vec<(T::AccountId, CustomerUsage)>, ) -> DispatchResult { let caller = ensure_signed(origin)?; - ensure!( - Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, - Error::::Unauthorised - ); + ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); let billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; @@ -432,10 +433,7 @@ pub mod pallet { era: DdcEra, ) -> DispatchResult { let caller = ensure_signed(origin)?; - ensure!( - Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, - Error::::Unauthorised - ); + ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); let mut billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; @@ -463,10 +461,7 @@ pub mod pallet { total_node_usage: NodeUsage, ) -> DispatchResult { let caller = ensure_signed(origin)?; - ensure!( - Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, - Error::::Unauthorised - ); + ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); ensure!( max_batch_index > 0 && max_batch_index < MaxBatchesCount::get(), @@ -497,10 +492,7 @@ pub mod pallet { payees: Vec<(T::AccountId, NodeUsage)>, ) -> DispatchResult { let caller = ensure_signed(origin)?; - ensure!( - Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, - Error::::Unauthorised - ); + ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); let billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; @@ -575,10 +567,7 @@ pub mod pallet { era: DdcEra, ) -> DispatchResult { let caller = ensure_signed(origin)?; - ensure!( - Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, - Error::::Unauthorised - ); + ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); let mut billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; @@ -608,10 +597,7 @@ pub mod pallet { era: DdcEra, ) -> DispatchResult { let caller = ensure_signed(origin)?; - ensure!( - Self::authorised_caller().ok_or(Error::::Unauthorised)? == caller, - Error::::Unauthorised - ); + ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); let billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; @@ -724,7 +710,6 @@ pub mod pallet { bytes.extend_from_slice(&cluster_id[..]); bytes.extend_from_slice(&era.encode()); let hash = blake2_128(&bytes); - // todo: assumes AccountId is 32 bytes, which is not ideal -> rewrite it // "modl" + "payouts_" + hash is 28 bytes, the T::AccountId is 32 bytes, so we should be // safe from the truncation and possible collisions caused by it. The rest 4 bytes will From 3423beb7b1fbc0707b64d2a9467d7ce098d02a93 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 15 Nov 2023 11:52:21 +0100 Subject: [PATCH 524/583] remove old node when setting new one --- pallets/ddc-staking/src/lib.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 005b39c8d..cfd3a966f 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -724,6 +724,11 @@ pub mod pallet { } } + // Remove previously owned node from storage + if let Some(current_node) = Providers::::get(&stash) { + >::remove(current_node); + } + // Ensure only one node per stash. ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); From 2cb3a9fe36363638892c602bcb85245c3d837035 Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 15 Nov 2023 11:55:12 +0100 Subject: [PATCH 525/583] dprint fix --- pallets/ddc-clusters/Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index ea4cdf5d6..1a3e0aa16 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -9,22 +9,22 @@ ddc-primitives = { version = "0.1.0", default-features = false, path = "../../pr ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +hex = { version = "0.4", default-features = false } +hex-literal = "^0.3.1" +pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } -hex-literal = "^0.3.1" -hex = { version = "0.4", default-features = false } [dev-dependencies] pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] From e43f8d514e410265f4f05390779f57925562f285 Mon Sep 17 00:00:00 2001 From: deeprnd Date: Wed, 15 Nov 2023 17:04:33 +0200 Subject: [PATCH 526/583] code cleanup --- pallets/ddc-customers/src/lib.rs | 73 ++++++++++++++++++++++---------- pallets/ddc-payouts/src/lib.rs | 25 ++++++----- pallets/ddc-staking/src/lib.rs | 17 ++++++-- 3 files changed, 79 insertions(+), 36 deletions(-) diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 058799a9f..fb4353f35 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -12,7 +12,7 @@ use frame_support::{ }; use scale_info::TypeInfo; use sp_runtime::{ - traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, Zero}, + traits::{AccountIdConversion, AtLeast32BitUnsigned, CheckedSub, Saturating, Zero, CheckedAdd}, RuntimeDebug, SaturatedConversion, }; use sp_std::prelude::*; @@ -112,20 +112,28 @@ impl< /// Charge funds that were scheduled for unlocking. /// /// Returns the updated ledger, and the amount actually charged. - fn charge_unlocking(mut self, value: Balance) -> (Self, Balance) { + fn charge_unlocking(mut self, value: Balance) -> Result<(Self, Balance), Error> { let mut unlocking_balance = Balance::zero(); while let Some(last) = self.unlocking.last_mut() { - if unlocking_balance + last.value <= value { - unlocking_balance += last.value; - self.active -= last.value; + let temp = unlocking_balance + .checked_add(&last.value) + .ok_or(Error::::ArithmeticOverflow)?; + if temp <= value { + unlocking_balance = temp; + self.active = + self.active.checked_sub(&last.value).ok_or(Error::::ArithmeticUnderflow)?; self.unlocking.pop(); } else { - let diff = value - unlocking_balance; - - unlocking_balance += diff; - self.active -= diff; - last.value -= diff; + let diff = + value.checked_sub(&unlocking_balance).ok_or(Error::::ArithmeticUnderflow)?; + + unlocking_balance = + unlocking_balance.checked_add(&diff).ok_or(Error::::ArithmeticOverflow)?; + self.active = + self.active.checked_sub(&diff).ok_or(Error::::ArithmeticUnderflow)?; + last.value = + last.value.checked_sub(&diff).ok_or(Error::::ArithmeticUnderflow)?; } if unlocking_balance >= value { @@ -133,7 +141,7 @@ impl< } } - (self, unlocking_balance) + Ok((self, unlocking_balance)) } } @@ -224,6 +232,8 @@ pub mod pallet { ClusterDoesNotExist, // unauthorised operation Unauthorised, + // Arithmetic overflow + ArithmeticOverflow, // Arithmetic underflow ArithmeticUnderflow, } @@ -257,7 +267,8 @@ pub mod pallet { #[pallet::weight(10_000)] pub fn create_bucket(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let bucket_owner = ensure_signed(origin)?; - let cur_bucket_id = Self::buckets_count() + 1; + let cur_bucket_id = + Self::buckets_count().checked_add(1).ok_or(Error::::ArithmeticOverflow)?; ::ClusterVisitor::ensure_cluster(&cluster_id) .map_err(|_| Error::::ClusterDoesNotExist)?; @@ -328,8 +339,11 @@ pub mod pallet { let owner_balance = ::Currency::free_balance(&owner); let extra = owner_balance.min(max_additional); - ledger.total += extra; - ledger.active += extra; + ledger.total = + ledger.total.checked_add(&extra).ok_or(Error::::ArithmeticOverflow)?; + ledger.active = + ledger.active.checked_add(&extra).ok_or(Error::::ArithmeticOverflow)?; + // Last check: the new active amount of ledger must be more than ED. ensure!( ledger.active >= ::Currency::minimum_balance(), @@ -374,16 +388,19 @@ pub mod pallet { let mut value = value.min(ledger.active); if !value.is_zero() { - ledger.active -= value; + ledger.active = + ledger.active.checked_sub(&value).ok_or(Error::::ArithmeticUnderflow)?; // Avoid there being a dust balance left in the accounts system. if ledger.active < ::Currency::minimum_balance() { - value += ledger.active; + value = + value.checked_add(&ledger.active).ok_or(Error::::ArithmeticOverflow)?; ledger.active = Zero::zero(); } let current_block = >::block_number(); // Note: locking for extra block to allow for accounting + // block + configurable value - shouldn't overflow let block = current_block + ::UnlockingDelay::get(); if let Some(chunk) = @@ -448,7 +465,8 @@ pub mod pallet { if ledger.total < old_total { log::debug!("Preparing for transfer"); // Already checked that this won't overflow by entry condition. - let value = old_total - ledger.total; + let value = + old_total.checked_sub(&ledger.total).ok_or(Error::::ArithmeticUnderflow)?; let account_id = Self::account_id(); @@ -523,15 +541,26 @@ pub mod pallet { ensure!(ledger.total >= ledger.active, Error::::ArithmeticUnderflow); if ledger.active >= amount_to_deduct { - ledger.active -= amount_to_deduct; - ledger.total -= amount_to_deduct; + ledger.active = ledger + .active + .checked_sub(&amount_to_deduct) + .ok_or(Error::::ArithmeticUnderflow)?; + ledger.total = ledger + .total + .checked_sub(&amount_to_deduct) + .ok_or(Error::::ArithmeticUnderflow)?; Self::update_ledger(&content_owner, &ledger); } else { - let diff = amount_to_deduct - ledger.active; - ledger.total -= ledger.active; + let diff = amount_to_deduct + .checked_sub(&ledger.active) + .ok_or(Error::::ArithmeticUnderflow)?; + ledger.total = ledger + .total + .checked_sub(&ledger.active) + .ok_or(Error::::ArithmeticUnderflow)?; amount_to_deduct = ledger.active; ledger.active = BalanceOf::::zero(); - let (ledger, _charged) = ledger.charge_unlocking(diff); + let (ledger, _charged) = ledger.charge_unlocking(diff)?; Self::update_ledger(&content_owner, &ledger); }; diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index c3365fcc4..8143622bb 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -15,7 +15,7 @@ #![recursion_limit = "256"] use ddc_primitives::{ClusterId, DdcEra}; -use ddc_traits::{cluster::ClusterVisitor, customer::CustomerCharger as ICustomerCharger}; +use ddc_traits::{cluster::ClusterVisitor, customer::CustomerCharger as CustomerChargerType}; use frame_support::{ pallet_prelude::*, parameter_types, @@ -30,6 +30,7 @@ use sp_std::prelude::*; type BatchIndex = u16; +/// Stores usage of customers #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] pub struct CustomerUsage { pub transferred_bytes: u128, @@ -38,6 +39,7 @@ pub struct CustomerUsage { pub number_of_gets: u128, } +/// Stores usage of node provider #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] pub struct NodeUsage { pub transferred_bytes: u128, @@ -46,12 +48,13 @@ pub struct NodeUsage { pub number_of_gets: u128, } +/// Stores reward in tokens(units) of node provider as per NodeUsage #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] pub struct NodeReward { - pub transfer: u128, - pub storage: u128, - pub puts: u128, - pub gets: u128, + pub transfer: u128, // for transferred_bytes + pub storage: u128, // for stored_bytes + pub puts: u128, // for number_of_puts + pub gets: u128, // for number_of_gets } #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] @@ -62,12 +65,13 @@ pub struct BillingReportDebt { pub amount: u128, } +/// Stores charge in tokens(units) of customer as per CustomerUsage #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] pub struct CustomerCharge { - pub transfer: u128, - pub storage: u128, - pub puts: u128, - pub gets: u128, + pub transfer: u128, // for transferred_bytes + pub storage: u128, // for stored_bytes + pub puts: u128, // for number_of_puts + pub gets: u128, // for number_of_gets } /// The balance type of this pallet. @@ -98,7 +102,7 @@ pub mod pallet { type Currency: LockableCurrency; - type CustomerCharger: ICustomerCharger; + type CustomerCharger: CustomerChargerType; type ClusterVisitor: ClusterVisitor; } @@ -636,6 +640,7 @@ pub mod pallet { node_usage.transferred_bytes, total_nodes_usage.transferred_bytes, ); + // ratio multiplied by X will be > 0, < X no overflow node_reward.transfer = ratio * total_customer_charge.transfer; ratio = Perbill::from_rational(node_usage.stored_bytes, total_nodes_usage.stored_bytes); diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 005b39c8d..2e977dd1d 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -46,7 +46,7 @@ use frame_support::{ use frame_system::pallet_prelude::*; use scale_info::TypeInfo; use sp_runtime::{ - traits::{AtLeast32BitUnsigned, Saturating, StaticLookup, Zero}, + traits::{AtLeast32BitUnsigned, CheckedAdd, CheckedSub, Saturating, StaticLookup, Zero}, RuntimeDebug, SaturatedConversion, }; use sp_std::prelude::*; @@ -310,6 +310,10 @@ pub mod pallet { ServingProhibited, /// Storing operation is called for non-Storage node StoringProhibited, + /// Arithmetic overflow occurred + ArithmeticOverflow, + /// Arithmetic underflow occurred + ArithmeticUnderflow, } #[pallet::call] @@ -408,11 +412,13 @@ pub mod pallet { let mut value = value.min(ledger.active); if !value.is_zero() { - ledger.active -= value; + ledger.active = + ledger.active.checked_sub(&value).ok_or(Error::::ArithmeticUnderflow)?; // Avoid there being a dust balance left in the staking system. if ledger.active < T::Currency::minimum_balance() { - value += ledger.active; + value = + value.checked_add(&ledger.active).ok_or(Error::::ArithmeticOverflow)?; ledger.active = Zero::zero(); } @@ -461,6 +467,7 @@ pub mod pallet { } }; + // block number + configuration -> no overflow let block = >::block_number() + unbonding_delay_in_blocks; if let Some(chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.block == block) @@ -517,7 +524,8 @@ pub mod pallet { // `consolidate_unlocked` strictly subtracts balance. if ledger.total < old_total { // Already checked that this won't overflow by entry condition. - let value = old_total - ledger.total; + let value = + old_total.checked_sub(&ledger.total).ok_or(Error::::ArithmeticUnderflow)?; Self::deposit_event(Event::::Withdrawn(stash, value)); } @@ -753,6 +761,7 @@ pub mod pallet { let is_cluster_node = T::ClusterVisitor::cluster_has_node(&cluster_id, &node_pub_key); ensure!(!is_cluster_node, Error::::FastChillProhibited); + // block number + 1 => no overflow let can_chill_from = >::block_number() + T::BlockNumber::from(1u32); Self::chill_stash_soon(&stash, &controller, cluster_id, can_chill_from); From 26ef8e22b7ca9de3d0d6b26d0810f6e9584e7e48 Mon Sep 17 00:00:00 2001 From: deeprnd Date: Wed, 15 Nov 2023 17:10:55 +0200 Subject: [PATCH 527/583] formattign --- pallets/ddc-customers/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index fb4353f35..8c06fbef9 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -12,7 +12,7 @@ use frame_support::{ }; use scale_info::TypeInfo; use sp_runtime::{ - traits::{AccountIdConversion, AtLeast32BitUnsigned, CheckedSub, Saturating, Zero, CheckedAdd}, + traits::{AccountIdConversion, AtLeast32BitUnsigned, CheckedAdd, CheckedSub, Saturating, Zero}, RuntimeDebug, SaturatedConversion, }; use sp_std::prelude::*; From 94baf3ecc03b919ef811608e8c168fd5f310d29b Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 15 Nov 2023 16:19:52 +0100 Subject: [PATCH 528/583] update dev-deps; remove dead-code; add test with 2 buckets --- pallets/ddc-customers/Cargo.toml | 2 +- pallets/ddc-customers/src/mock.rs | 4 -- pallets/ddc-customers/src/tests.rs | 82 +++++++++++++++++++++--------- 3 files changed, 60 insertions(+), 28 deletions(-) diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 580ca33a0..363c47a11 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -11,13 +11,13 @@ frame-support = { version = "4.0.0-dev", default-features = false, git = "https: frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [dev-dependencies] pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index 7a097ea67..ae07269b8 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -1,7 +1,5 @@ //! Test utilities -#![allow(dead_code)] - use crate::{self as pallet_ddc_customers, *}; use ddc_primitives::{NodePubKey, NodeType}; use ddc_traits::cluster::{ClusterVisitor, ClusterVisitorError}; @@ -132,8 +130,6 @@ impl ClusterVisitor for TestClusterVisitor { } } -pub(crate) type TestRuntimeCall = ::RuntimeCall; - pub struct ExtBuilder; impl ExtBuilder { diff --git a/pallets/ddc-customers/src/tests.rs b/pallets/ddc-customers/src/tests.rs index 032351e4d..869115e3b 100644 --- a/pallets/ddc-customers/src/tests.rs +++ b/pallets/ddc-customers/src/tests.rs @@ -12,15 +12,16 @@ fn create_bucket_works() { System::set_block_number(1); let cluster_id = ClusterId::from([1; 20]); + let account_1 = 1; // Bucket created - assert_ok!(DdcCustomers::create_bucket(RuntimeOrigin::signed(1), cluster_id)); + assert_ok!(DdcCustomers::create_bucket(RuntimeOrigin::signed(account_1), cluster_id)); // Check storage assert_eq!(DdcCustomers::buckets_count(), 1); assert_eq!( DdcCustomers::buckets(1), - Some(Bucket { bucket_id: 1, owner_id: 1, cluster_id }) + Some(Bucket { bucket_id: 1, owner_id: account_1, cluster_id }) ); // Checking that event was emitted @@ -29,29 +30,61 @@ fn create_bucket_works() { }) } +#[test] +fn create_two_buckets_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let cluster_id = ClusterId::from([1; 20]); + let account_1 = 1; + + // Buckets created + assert_ok!(DdcCustomers::create_bucket(RuntimeOrigin::signed(account_1), cluster_id)); + assert_eq!(System::events().len(), 1); + System::assert_last_event(Event::BucketCreated(1u64).into()); + assert_ok!(DdcCustomers::create_bucket(RuntimeOrigin::signed(account_1), cluster_id)); + assert_eq!(System::events().len(), 2); + System::assert_last_event(Event::BucketCreated(2u64).into()); + + // Check storage + assert_eq!(DdcCustomers::buckets_count(), 2); + assert_eq!( + DdcCustomers::buckets(1), + Some(Bucket { bucket_id: 1, owner_id: account_1, cluster_id }) + ); + assert_eq!( + DdcCustomers::buckets(2), + Some(Bucket { bucket_id: 2, owner_id: account_1, cluster_id }) + ); + }) +} + #[test] fn deposit_and_deposit_extra_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); + let account_1 = 1; + let account_2 = 2; + // Deposit dust assert_noop!( - DdcCustomers::deposit(RuntimeOrigin::signed(1), 0_u128), + DdcCustomers::deposit(RuntimeOrigin::signed(account_1), 0_u128), Error::::InsufficientDeposit ); // Deposit all tokens fails (should not kill account) assert_noop!( - DdcCustomers::deposit(RuntimeOrigin::signed(1), 100_u128), + DdcCustomers::deposit(RuntimeOrigin::signed(account_1), 100_u128), BalancesError::::KeepAlive ); // Deposited - assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(1), 10_u128)); + assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(account_1), 10_u128)); // Check storage assert_eq!( - DdcCustomers::ledger(&1), + DdcCustomers::ledger(&account_1), Some(AccountsLedger { owner: 1, total: 10_u128, @@ -61,26 +94,26 @@ fn deposit_and_deposit_extra_works() { ); // Checking that event was emitted - System::assert_last_event(Event::Deposited(1, 10).into()); + System::assert_last_event(Event::Deposited(account_1, 10).into()); // Deposit should fail when called the second time assert_noop!( - DdcCustomers::deposit(RuntimeOrigin::signed(1), 10_u128), + DdcCustomers::deposit(RuntimeOrigin::signed(account_1), 10_u128), Error::::AlreadyPaired ); // Deposit extra fails if not owner assert_noop!( - DdcCustomers::deposit_extra(RuntimeOrigin::signed(2), 10_u128), + DdcCustomers::deposit_extra(RuntimeOrigin::signed(account_2), 10_u128), Error::::NotOwner ); // Deposited extra - assert_ok!(DdcCustomers::deposit_extra(RuntimeOrigin::signed(1), 20_u128)); + assert_ok!(DdcCustomers::deposit_extra(RuntimeOrigin::signed(account_1), 20_u128)); // Check storage assert_eq!( - DdcCustomers::ledger(&1), + DdcCustomers::ledger(&account_1), Some(AccountsLedger { owner: 1, total: 30_u128, @@ -90,7 +123,7 @@ fn deposit_and_deposit_extra_works() { ); // Checking that event was emitted - System::assert_last_event(Event::Deposited(1, 20).into()); + System::assert_last_event(Event::Deposited(account_1, 20).into()); }) } @@ -99,13 +132,16 @@ fn unlock_and_withdraw_deposit_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); + let account_1 = 1; + let account_2 = 2; + // Deposited - assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(1), 35_u128)); + assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(account_1), 35_u128)); // So there is always positive balance within pallet - assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(2), 10_u128)); + assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(account_2), 10_u128)); // Unlock chunk - assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 1_u128)); + assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(account_1), 1_u128)); System::set_block_number(2); let mut unlocking_chunks: BoundedVec, MaxUnlockingChunks> = @@ -118,7 +154,7 @@ fn unlock_and_withdraw_deposit_works() { assert_eq!( DdcCustomers::ledger(&1), Some(AccountsLedger { - owner: 1, + owner: account_1, total: 35_u128, active: 34_u128, unlocking: unlocking_chunks.clone(), @@ -127,25 +163,25 @@ fn unlock_and_withdraw_deposit_works() { // Reach max unlock chunks for i in 1..32 { - assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 1_u128)); + assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(account_1), 1_u128)); System::set_block_number(i + 2); } // No more chunks can be added assert_noop!( - DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 1_u128), + DdcCustomers::unlock_deposit(RuntimeOrigin::signed(account_1), 1_u128), Error::::NoMoreChunks ); // Set the block to withdraw all unlocked chunks System::set_block_number(42); - assert_ok!(DdcCustomers::withdraw_unlocked_deposit(RuntimeOrigin::signed(1))); + assert_ok!(DdcCustomers::withdraw_unlocked_deposit(RuntimeOrigin::signed(account_1))); // Check storage assert_eq!( DdcCustomers::ledger(&1), Some(AccountsLedger { - owner: 1, + owner: account_1, total: 3_u128, active: 3_u128, unlocking: Default::default(), @@ -153,11 +189,11 @@ fn unlock_and_withdraw_deposit_works() { ); // Unlock remaining chuncks & withdraw - assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(1), 3_u128)); + assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(account_1), 3_u128)); System::set_block_number(52); - assert_ok!(DdcCustomers::withdraw_unlocked_deposit(RuntimeOrigin::signed(1))); + assert_ok!(DdcCustomers::withdraw_unlocked_deposit(RuntimeOrigin::signed(account_1))); // Check storage - assert_eq!(DdcCustomers::ledger(&1), None); + assert_eq!(DdcCustomers::ledger(&account_1), None); }) } From 908a68c6ad6ae4b3c0a0330ce9da05eb11c7648e Mon Sep 17 00:00:00 2001 From: Raid Ateir Date: Wed, 15 Nov 2023 16:22:36 +0100 Subject: [PATCH 529/583] apply dprint --- pallets/ddc-customers/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 363c47a11..4a3a982c0 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -17,8 +17,8 @@ sp-std = { version = "4.0.0-dev", default-features = false, git = "https://githu [dev-dependencies] pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } From 5ae0693019e1055b85bea6ff6b00d9e19c952eac Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Thu, 16 Nov 2023 11:09:53 +0300 Subject: [PATCH 530/583] Remove redundant 0.10.0-dev versions --- cli/Cargo.toml | 6 +++--- node/client/Cargo.toml | 8 ++++---- node/service/Cargo.toml | 24 ++++++++++++------------ rpc/Cargo.toml | 18 +++++++++--------- runtime/cere-dev/Cargo.toml | 4 ++-- runtime/cere/Cargo.toml | 4 ++-- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 648c6e2fa..60b4a4624 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -14,9 +14,9 @@ crate-type = ["cdylib", "rlib"] [dependencies] clap = { version = "3.1", features = ["derive"], optional = true } frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } -sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } -sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } -try-runtime-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } +sc-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } +sc-service = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } +try-runtime-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } url = "2.4.1" # Local diff --git a/node/client/Cargo.toml b/node/client/Cargo.toml index e310ce7d1..edd3ad1ac 100644 --- a/node/client/Cargo.toml +++ b/node/client/Cargo.toml @@ -12,14 +12,14 @@ pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/parity pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } +sc-executor = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-service = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-inherents = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-offchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index dbde60843..2a5f12e0e 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -9,21 +9,21 @@ jsonrpsee = { version = "0.15.1", features = ["server"] } node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } rand = "0.8" -sc-authority-discovery = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-basic-authorship = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-authority-discovery = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-basic-authorship = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-consensus-slots = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-consensus-uncles = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } -sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-network = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus-slots = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus-uncles = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-executor = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } +sc-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-network = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-network-common = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } -sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-service = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } +sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-sysinfo = { version = "6.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-telemetry = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -32,7 +32,7 @@ sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-authorship = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 92f3e9a6f..e0e64e7f9 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -10,20 +10,20 @@ pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/parity pallet-transaction-payment-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-consensus-babe-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-consensus-epochs = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-finality-grandpa-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-consensus-babe-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-consensus-epochs = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-finality-grandpa-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-rpc-api = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-sync-state-rpc = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-rpc-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } substrate-frame-rpc-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 9d47b5f64..61e14a6a7 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -24,7 +24,7 @@ node-primitives = { version = "2.0.0", default-features = false, git = "https:// sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, version = "4.0.0-dev" } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -46,7 +46,7 @@ frame-support = { version = "4.0.0-dev", default-features = false, git = "https: frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-try-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-authorship = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index 95cfa8a4b..2ede9e2e8 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -24,7 +24,7 @@ node-primitives = { version = "2.0.0", default-features = false, git = "https:// sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, version = "4.0.0-dev" } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -46,7 +46,7 @@ frame-support = { version = "4.0.0-dev", default-features = false, git = "https: frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-try-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-authorship = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } From b4cba80272bc06bdb74b5c7dc8ee6d40be218aec Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Thu, 16 Nov 2023 11:11:35 +0300 Subject: [PATCH 531/583] Remove redundant version attributes --- Cargo.toml | 4 +- cli/Cargo.toml | 4 +- node/client/Cargo.toml | 40 +++--- node/service/Cargo.toml | 36 +++--- pallets/chainbridge/Cargo.toml | 14 +- pallets/ddc-clusters/Cargo.toml | 24 ++-- pallets/ddc-customers/Cargo.toml | 20 +-- .../ddc-metrics-offchain-worker/Cargo.toml | 23 ++-- pallets/ddc-nodes/Cargo.toml | 20 +-- pallets/ddc-staking/Cargo.toml | 22 ++-- pallets/ddc/Cargo.toml | 12 +- pallets/ddc/README.md | 2 +- pallets/erc20/Cargo.toml | 16 +-- pallets/erc721/Cargo.toml | 14 +- primitives/Cargo.toml | 4 +- rpc/Cargo.toml | 26 ++-- runtime/cere-dev/Cargo.toml | 122 +++++++++--------- runtime/cere-dev/constants/Cargo.toml | 2 +- runtime/cere/Cargo.toml | 122 +++++++++--------- runtime/cere/constants/Cargo.toml | 2 +- traits/Cargo.toml | 2 +- 21 files changed, 265 insertions(+), 266 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a9da35ba1..54d85719a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,10 +11,10 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] cere-cli = { path = "cli", features = ["cere-dev-native"] } -sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } [build-dependencies] -substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-build-script-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [workspace] members = [ diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 60b4a4624..806829886 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -13,7 +13,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] clap = { version = "3.1", features = ["derive"], optional = true } -frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } +frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } sc-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } sc-service = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } try-runtime-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } @@ -24,7 +24,7 @@ cere-client = { path = "../node/client", optional = true } cere-service = { path = "../node/service", default-features = false, optional = true } [build-dependencies] -substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } [features] default = ["cli", "cere-native"] diff --git a/node/client/Cargo.toml b/node/client/Cargo.toml index edd3ad1ac..b77734e7f 100644 --- a/node/client/Cargo.toml +++ b/node/client/Cargo.toml @@ -4,30 +4,30 @@ version = "4.8.1" edition = "2021" [dependencies] -frame-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +node-primitives = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-client-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-executor = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-service = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } -sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-authority-discovery = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-blockchain = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-consensus = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-inherents = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-offchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-storage = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-inherents = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-offchain = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-session = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-storage = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-transaction-pool = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } # Local cere-dev-runtime = { path = "../../runtime/cere-dev", optional = true } diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index 2a5f12e0e..d817c4f7d 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -6,13 +6,13 @@ edition = "2021" [dependencies] futures = "0.3.21" jsonrpsee = { version = "0.15.1", features = ["server"] } -node-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +node-primitives = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } rand = "0.8" sc-authority-discovery = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-basic-authorship = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-chain-spec = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-client-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-consensus = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-consensus-slots = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -21,24 +21,24 @@ sc-executor = { git = "https://github.com/paritytech/substrate.git", branch = "p sc-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-network = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-network-common = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-service = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-sysinfo = { version = "6.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-telemetry = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-sysinfo = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-telemetry = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-transaction-pool = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } serde = { version = "1.0.136", features = ["derive"] } -sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-authority-discovery = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-authorship = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-authority-discovery = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-authorship = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-blockchain = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-transaction-storage-proof = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-trie = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-transaction-storage-proof = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } # Local cere-client = { path = "../client", default-features = false, optional = true } diff --git a/pallets/chainbridge/Cargo.toml b/pallets/chainbridge/Cargo.toml index 617e76b9b..9664b4a6a 100644 --- a/pallets/chainbridge/Cargo.toml +++ b/pallets/chainbridge/Cargo.toml @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index 1a3e0aa16..ac1c569aa 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -7,24 +7,24 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } hex = { version = "0.4", default-features = false } hex-literal = "^0.3.1" -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [dev-dependencies] -pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 4a3a982c0..28fc87408 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -7,20 +7,20 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [dev-dependencies] -pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/pallets/ddc-metrics-offchain-worker/Cargo.toml b/pallets/ddc-metrics-offchain-worker/Cargo.toml index d56726763..99c821064 100644 --- a/pallets/ddc-metrics-offchain-worker/Cargo.toml +++ b/pallets/ddc-metrics-offchain-worker/Cargo.toml @@ -15,19 +15,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] alt_serde = { version = "1", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["full"] } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } hex = { version = "0.4", default-features = false } -# pallet-contracts-rpc-runtime-api = { version = "0.8.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } hex-literal = "^0.3.1" -pallet-contracts = { version = '4.0.0-dev', default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-keystore = { version = "0.12.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-keystore = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] @@ -45,7 +44,7 @@ std = [ ] [dev-dependencies] -pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pretty_assertions = "0.6.1" diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index 10bf74d9e..589bcc7e9 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -7,19 +7,19 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [dev-dependencies] -pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/pallets/ddc-staking/Cargo.toml b/pallets/ddc-staking/Cargo.toml index 0f9c57433..67dddf18a 100644 --- a/pallets/ddc-staking/Cargo.toml +++ b/pallets/ddc-staking/Cargo.toml @@ -7,20 +7,20 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [dev-dependencies] -pallet-balances = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-tracing = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -substrate-test-utils = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/pallets/ddc/Cargo.toml b/pallets/ddc/Cargo.toml index f25de5056..57970e3f3 100644 --- a/pallets/ddc/Cargo.toml +++ b/pallets/ddc/Cargo.toml @@ -14,16 +14,16 @@ targets = ['x86_64-unknown-linux-gnu'] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [dev-dependencies] serde = { version = "1.0.101" } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ['std'] diff --git a/pallets/ddc/README.md b/pallets/ddc/README.md index 9a6144ff4..f943ea5be 100644 --- a/pallets/ddc/README.md +++ b/pallets/ddc/README.md @@ -58,7 +58,7 @@ Import the CereDDCModule and derive your runtime configuration traits from the C 1. In ./bin/node/runtime/Cargo.toml add: ```rust - frame-executive = { version = "4.0.0-dev", default-features = false, path = "../../../frame/executive" } + frame-executive = { default-features = false, path = "../../../frame/executive" } ... pallet-cere-ddc = { version = "7.3.0", default-features = false, path = "../../../frame/ddc-pallet" } ``` diff --git a/pallets/erc20/Cargo.toml b/pallets/erc20/Cargo.toml index 580ba103f..98e88b80e 100644 --- a/pallets/erc20/Cargo.toml +++ b/pallets/erc20/Cargo.toml @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-chainbridge = { version = "4.2.0", default-features = false, path = "../chainbridge" } pallet-erc721 = { version = "4.2.0", default-features = false, path = "../erc721" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-arithmetic = { version = "5.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-arithmetic = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/pallets/erc721/Cargo.toml b/pallets/erc721/Cargo.toml index 08e9b531a..752f61229 100644 --- a/pallets/erc721/Cargo.toml +++ b/pallets/erc721/Cargo.toml @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-chainbridge = { version = "4.2.0", default-features = false, path = "../chainbridge" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 607c87512..37cf636d1 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -8,8 +8,8 @@ codec = { package = "parity-scale-codec", version = "3.1.5", default-features = scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } serde = { version = "1.0.136", default-features = false, features = ["derive"], optional = true } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index e0e64e7f9..9ec4ab69d 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -5,26 +5,26 @@ edition = "2021" [dependencies] jsonrpsee = { version = "0.15.1", features = ["server"] } -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-chain-spec = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-consensus-babe-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-consensus-epochs = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-finality-grandpa-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sc-rpc-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sp-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -substrate-frame-rpc-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -substrate-state-trie-migration-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +substrate-state-trie-migration-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 61e14a6a7..83cfc9954 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -20,89 +20,89 @@ scale-info = { version = "2.1.2", default-features = false, features = ["derive" static_assertions = "1.1.0" # primitives -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, version = "4.0.0-dev" } sp-consensus-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-inherents = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-offchain = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-session = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-transaction-pool = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-version = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } # frame dependencies cere-dev-runtime-constants = { path = "./constants", default-features = false } cere-runtime-common = { path = "../common", default-features = false } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-executive = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-system-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-try-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-authorship = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-bags-list = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-authorship = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-bags-list = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } -pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-child-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-collective = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-ddc-clusters = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-clusters" } pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } pallet-ddc-nodes = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-nodes" } pallet-ddc-staking = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-staking" } -pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -pallet-elections-phragmen = { version = "5.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-democracy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-election-provider-multi-phase = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-election-provider-support-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +pallet-elections-phragmen = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } -pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-indices = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-membership = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-multisig = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-grandpa = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-identity = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-indices = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-membership = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-multisig = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "polkadot-v0.9.30" } pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } -pallet-offences = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-offences-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } -pallet-proxy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-recovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-session = { version = "4.0.0-dev", features = ["historical"], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } -pallet-session-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } -pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-tips = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-offences = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } +pallet-proxy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-randomness-collective-flip = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-recovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-scheduler = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-session = { features = ["historical"], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } +pallet-society = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-staking-reward-curve = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-sudo = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-tips = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-treasury = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-utility = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-vesting = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [build-dependencies] -substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/runtime/cere-dev/constants/Cargo.toml b/runtime/cere-dev/constants/Cargo.toml index d42c6c5b2..fe8398eb4 100644 --- a/runtime/cere-dev/constants/Cargo.toml +++ b/runtime/cere-dev/constants/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index 2ede9e2e8..27829db86 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -20,85 +20,85 @@ scale-info = { version = "2.1.2", default-features = false, features = ["derive" static_assertions = "1.1.0" # primitives -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, version = "4.0.0-dev" } sp-consensus-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-io = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { version = "4.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-inherents = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-offchain = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-session = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-transaction-pool = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-version = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } # frame dependencies cere-runtime-common = { path = "../common", default-features = false } cere-runtime-constants = { path = "./constants", default-features = false } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-executive = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +frame-system-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } frame-try-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -pallet-authority-discovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-authorship = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-babe = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-bags-list = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-authorship = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-bags-list = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } -pallet-child-bounties = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-collective = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts-primitives = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-contracts-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-child-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-collective = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-contracts-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } -pallet-democracy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-election-provider-support-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -pallet-elections-phragmen = { version = "5.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-democracy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-election-provider-multi-phase = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-election-provider-support-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } +pallet-elections-phragmen = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } -pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-identity = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-im-online = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-indices = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-membership = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-multisig = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-grandpa = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-identity = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-indices = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-membership = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-multisig = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "polkadot-v0.9.30" } pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } -pallet-offences = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-offences-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } -pallet-proxy = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-recovery = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-scheduler = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-session = { version = "4.0.0-dev", features = ["historical"], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } -pallet-session-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } -pallet-society = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-staking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-tips = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-treasury = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-vesting = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-offences = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } +pallet-proxy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-randomness-collective-flip = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-recovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-scheduler = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-session = { features = ["historical"], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } +pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } +pallet-society = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-staking-reward-curve = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-sudo = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-timestamp = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-tips = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-treasury = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-utility = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +pallet-vesting = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [build-dependencies] -substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/runtime/cere/constants/Cargo.toml b/runtime/cere/constants/Cargo.toml index 592358dfa..fce93a1aa 100644 --- a/runtime/cere/constants/Cargo.toml +++ b/runtime/cere/constants/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2021" [dependencies] -node-primitives = { version = "2.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["std"] diff --git a/traits/Cargo.toml b/traits/Cargo.toml index 63f8cbd4e..de7fe1136 100644 --- a/traits/Cargo.toml +++ b/traits/Cargo.toml @@ -5,4 +5,4 @@ edition = "2021" [dependencies] ddc-primitives = { version = "0.1.0", default-features = false, path = "../primitives" } -frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } From a5c3330da94dabe001b0969663b579ff52da0141 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Thu, 16 Nov 2023 11:28:50 +0300 Subject: [PATCH 532/583] Use substrate.git in cargo files for consistency --- Cargo.toml | 2 +- cli/Cargo.toml | 10 +++++----- node/client/Cargo.toml | 8 ++++---- node/service/Cargo.toml | 4 ++-- rpc/Cargo.toml | 38 ++++++++++++++++++------------------- runtime/cere-dev/Cargo.toml | 8 ++++---- runtime/cere/Cargo.toml | 8 ++++---- runtime/common/Cargo.toml | 2 +- 8 files changed, 40 insertions(+), 40 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 54d85719a..0703a78a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] cere-cli = { path = "cli", features = ["cere-dev-native"] } -sc-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-cli = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [build-dependencies] substrate-build-script-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 806829886..0bf45a4db 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -13,10 +13,10 @@ crate-type = ["cdylib", "rlib"] [dependencies] clap = { version = "3.1", features = ["derive"], optional = true } -frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } -sc-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } -sc-service = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } -try-runtime-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.30" } +frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate.git", optional = true, branch = "polkadot-v0.9.30" } +sc-cli = { git = "https://github.com/paritytech/substrate.git", optional = true, branch = "polkadot-v0.9.30" } +sc-service = { git = "https://github.com/paritytech/substrate.git", optional = true, branch = "polkadot-v0.9.30" } +try-runtime-cli = { git = "https://github.com/paritytech/substrate.git", optional = true, branch = "polkadot-v0.9.30" } url = "2.4.1" # Local @@ -24,7 +24,7 @@ cere-client = { path = "../node/client", optional = true } cere-service = { path = "../node/service", default-features = false, optional = true } [build-dependencies] -substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +substrate-build-script-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } [features] default = ["cli", "cere-native"] diff --git a/node/client/Cargo.toml b/node/client/Cargo.toml index b77734e7f..f4798e201 100644 --- a/node/client/Cargo.toml +++ b/node/client/Cargo.toml @@ -12,11 +12,11 @@ pallet-contracts-rpc = { git = "https://github.com/paritytech/substrate.git", br pallet-transaction-payment = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-transaction-payment-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-client-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-executor = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-service = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } +sc-executor = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-service = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } sp-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-authority-discovery = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-blockchain = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-consensus = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -25,7 +25,7 @@ sp-inherents = { git = "https://github.com/paritytech/substrate.git", branch = " sp-offchain = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-runtime = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-session = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-storage = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-storage = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-transaction-pool = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index d817c4f7d..326461ae8 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -20,7 +20,7 @@ sc-consensus-uncles = { git = "https://github.com/paritytech/substrate.git", bra sc-executor = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } sc-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-network = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-network-common = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-network-common = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-service = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", features = ["wasmtime"] } sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } @@ -38,7 +38,7 @@ sp-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", bra sp-runtime = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sp-transaction-storage-proof = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-trie = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } # Local cere-client = { path = "../client", default-features = false, optional = true } diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 9ec4ab69d..a05ef9559 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -7,24 +7,24 @@ edition = "2021" jsonrpsee = { version = "0.15.1", features = ["server"] } node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-contracts-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-consensus-babe-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-consensus-epochs = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-finality-grandpa-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-chain-spec = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-client-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus-babe-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-consensus-epochs = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-finality-grandpa-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sc-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-rpc-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -substrate-state-trie-migration-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } +sp-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-blockchain = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-keystore = { version = "0.12.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-runtime = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +substrate-state-trie-migration-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 83cfc9954..c55e73286 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -71,16 +71,16 @@ pallet-election-provider-support-benchmarking = { default-features = false, git pallet-elections-phragmen = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } -pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } +pallet-fast-unstake = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } pallet-grandpa = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-identity = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-indices = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-membership = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-multisig = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } -pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "polkadot-v0.9.30" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } +pallet-nomination-pools = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } +pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate.git", default-features = false, optional = true, branch = "polkadot-v0.9.30" } +pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } pallet-offences = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } pallet-proxy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index 27829db86..2ce9a430f 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -67,16 +67,16 @@ pallet-election-provider-support-benchmarking = { default-features = false, git pallet-elections-phragmen = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } -pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } +pallet-fast-unstake = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } pallet-grandpa = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-identity = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-indices = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-membership = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-multisig = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } -pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "polkadot-v0.9.30" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } +pallet-nomination-pools = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } +pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate.git", default-features = false, optional = true, branch = "polkadot-v0.9.30" } +pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } pallet-offences = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false, optional = true } pallet-proxy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 5aff0c986..04ba5c0b1 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -13,4 +13,4 @@ std = [] frame-support = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } node-primitives = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } sp-core = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.30" } +sp-runtime = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.30" } From eb578f948a98d0fdded2bee0b7ce39af9d1ef164 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Thu, 16 Nov 2023 11:29:24 +0300 Subject: [PATCH 533/583] Update Cargo.lock --- Cargo.lock | 328 ++++++++++++++++++++++++++--------------------------- 1 file changed, 164 insertions(+), 164 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cf8ab1e3d..60546e115 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2115,7 +2115,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", ] @@ -2132,7 +2132,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2155,7 +2155,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "array-bytes", @@ -2206,7 +2206,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2217,7 +2217,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2233,7 +2233,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -2262,7 +2262,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2294,7 +2294,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "cfg-expr", @@ -2308,7 +2308,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2320,7 +2320,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -2330,7 +2330,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "log", @@ -2348,7 +2348,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -2363,7 +2363,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -2372,7 +2372,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "parity-scale-codec", @@ -4421,7 +4421,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system", "parity-scale-codec", @@ -4620,7 +4620,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4636,7 +4636,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -4651,7 +4651,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4675,7 +4675,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4695,7 +4695,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4710,7 +4710,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4758,7 +4758,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4777,7 +4777,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4794,7 +4794,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4822,7 +4822,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -4837,7 +4837,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -4847,7 +4847,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-contracts-primitives", @@ -4864,7 +4864,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -4988,7 +4988,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5004,7 +5004,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5028,7 +5028,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5041,7 +5041,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5093,7 +5093,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5114,7 +5114,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5137,7 +5137,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5153,7 +5153,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5173,7 +5173,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5190,7 +5190,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5207,7 +5207,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5222,7 +5222,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5239,7 +5239,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5259,7 +5259,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -5269,7 +5269,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5286,7 +5286,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5309,7 +5309,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5324,7 +5324,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5338,7 +5338,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5353,7 +5353,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5369,7 +5369,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5390,7 +5390,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5406,7 +5406,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5420,7 +5420,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5443,7 +5443,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5454,7 +5454,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5468,7 +5468,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5486,7 +5486,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5505,7 +5505,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-support", "frame-system", @@ -5521,7 +5521,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5536,7 +5536,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5547,7 +5547,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5564,7 +5564,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -5580,7 +5580,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6499,7 +6499,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "env_logger 0.9.3", "jsonrpsee", @@ -6772,7 +6772,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -6783,7 +6783,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6810,7 +6810,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -6833,7 +6833,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6849,7 +6849,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6866,7 +6866,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6877,7 +6877,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "chrono", @@ -6917,7 +6917,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fnv", "futures", @@ -6945,7 +6945,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "kvdb", @@ -6970,7 +6970,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -6994,7 +6994,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "fork-tree", @@ -7036,7 +7036,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7058,7 +7058,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -7071,7 +7071,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -7095,7 +7095,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sc-client-api", "sp-authorship", @@ -7106,7 +7106,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "lru", @@ -7133,7 +7133,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -7149,7 +7149,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7164,7 +7164,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cfg-if", "libc", @@ -7184,7 +7184,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "array-bytes", @@ -7225,7 +7225,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "futures", @@ -7246,7 +7246,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7263,7 +7263,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "async-trait", @@ -7278,7 +7278,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "async-trait", @@ -7325,7 +7325,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "cid", "futures", @@ -7345,7 +7345,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7371,7 +7371,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "futures", @@ -7389,7 +7389,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "futures", @@ -7410,7 +7410,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "fork-tree", @@ -7438,7 +7438,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "futures", @@ -7457,7 +7457,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "bytes", @@ -7487,7 +7487,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libp2p", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7509,7 +7509,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "hash-db", @@ -7539,7 +7539,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7562,7 +7562,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "jsonrpsee", @@ -7575,7 +7575,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "directories", @@ -7645,7 +7645,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -7659,7 +7659,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7678,7 +7678,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "libc", @@ -7697,7 +7697,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "chrono", "futures", @@ -7715,7 +7715,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7746,7 +7746,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7757,7 +7757,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -7783,7 +7783,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -7796,7 +7796,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "futures-timer", @@ -8209,7 +8209,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8227,7 +8227,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "proc-macro-crate", @@ -8239,7 +8239,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8252,7 +8252,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "integer-sqrt", "num-traits", @@ -8267,7 +8267,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8280,7 +8280,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "parity-scale-codec", @@ -8292,7 +8292,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-api", @@ -8304,7 +8304,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "log", @@ -8322,7 +8322,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8341,7 +8341,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "merlin", @@ -8364,7 +8364,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8378,7 +8378,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8391,7 +8391,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "array-bytes", "base58", @@ -8437,7 +8437,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "blake2", "byteorder", @@ -8451,7 +8451,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8462,7 +8462,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8471,7 +8471,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro2", "quote", @@ -8481,7 +8481,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "environmental", "parity-scale-codec", @@ -8492,7 +8492,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "finality-grandpa", "log", @@ -8510,7 +8510,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8524,7 +8524,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "futures", @@ -8550,7 +8550,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "lazy_static", "sp-core", @@ -8561,7 +8561,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures", @@ -8578,7 +8578,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "thiserror", "zstd", @@ -8587,7 +8587,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8601,7 +8601,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-core", @@ -8611,7 +8611,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "backtrace", "lazy_static", @@ -8621,7 +8621,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "rustc-hash", "serde", @@ -8631,7 +8631,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "either", "hash256-std-hasher", @@ -8654,7 +8654,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8672,7 +8672,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "Inflector", "proc-macro-crate", @@ -8684,7 +8684,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "parity-scale-codec", @@ -8698,7 +8698,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8712,7 +8712,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "scale-info", @@ -8723,7 +8723,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "hash-db", "log", @@ -8745,12 +8745,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8763,7 +8763,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "log", "sp-core", @@ -8776,7 +8776,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "futures-timer", @@ -8792,7 +8792,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "sp-std", @@ -8804,7 +8804,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "sp-api", "sp-runtime", @@ -8813,7 +8813,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "async-trait", "log", @@ -8829,7 +8829,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ahash", "hash-db", @@ -8852,7 +8852,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8869,7 +8869,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8880,7 +8880,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "log", @@ -8893,7 +8893,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -9040,7 +9040,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "platforms 2.0.0", ] @@ -9048,7 +9048,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -9069,7 +9069,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures-util", "hyper", @@ -9082,7 +9082,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "jsonrpsee", "log", @@ -9103,7 +9103,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "futures", "substrate-test-utils-derive", @@ -9113,7 +9113,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9124,7 +9124,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -9571,7 +9571,7 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.30#a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d" dependencies = [ "clap", "frame-try-runtime", From e6681beabb3dc6e6eec832f6ade0dd527c846c0b Mon Sep 17 00:00:00 2001 From: deeprnd Date: Thu, 16 Nov 2023 13:45:09 +0200 Subject: [PATCH 534/583] add missing mocks --- pallets/ddc-customers/src/mock.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index ae07269b8..025f76fa4 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -128,6 +128,17 @@ impl ClusterVisitor for TestClusterVisitor { ) -> Result { Ok(T::BlockNumber::from(10u32)) } + + fn get_pricing_params( + cluster_id: &ClusterId, + ) -> Result { + Ok(ClusterPricingParams { + unit_per_mb_stored: 1, + unit_per_mb_streamed: 2, + unit_per_put_request: 3, + unit_per_get_request: 4, + }) + } } pub struct ExtBuilder; From a10ba59c759f7f5e74727f7c560939fd7e2ae89d Mon Sep 17 00:00:00 2001 From: deeprnd Date: Thu, 16 Nov 2023 14:53:36 +0200 Subject: [PATCH 535/583] some CI fixes --- pallets/ddc-customers/src/mock.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index 025f76fa4..0ff1957d5 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -1,7 +1,7 @@ //! Test utilities use crate::{self as pallet_ddc_customers, *}; -use ddc_primitives::{NodePubKey, NodeType}; +use ddc_primitives::{NodePubKey, NodeType, ClusterPricingParams}; use ddc_traits::cluster::{ClusterVisitor, ClusterVisitorError}; use frame_support::{ @@ -130,7 +130,7 @@ impl ClusterVisitor for TestClusterVisitor { } fn get_pricing_params( - cluster_id: &ClusterId, + _cluster_id: &ClusterId, ) -> Result { Ok(ClusterPricingParams { unit_per_mb_stored: 1, From 1eb5bef1ab65841d8299cec5b129e725e5eff2c4 Mon Sep 17 00:00:00 2001 From: deeprnd Date: Thu, 16 Nov 2023 15:00:50 +0200 Subject: [PATCH 536/583] CI fixes --- pallets/ddc-customers/src/mock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index 0ff1957d5..5113b1e69 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -1,7 +1,7 @@ //! Test utilities use crate::{self as pallet_ddc_customers, *}; -use ddc_primitives::{NodePubKey, NodeType, ClusterPricingParams}; +use ddc_primitives::{ClusterPricingParams, NodePubKey, NodeType}; use ddc_traits::cluster::{ClusterVisitor, ClusterVisitorError}; use frame_support::{ From 55c4425a219526b1dbbd08e5790f48432a605d28 Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 17 Nov 2023 15:51:39 +0100 Subject: [PATCH 537/583] fix(pallet_ddc_customers): 'StorageHasher' type for Ledger map is changed to a more secure one --- pallets/ddc-customers/src/lib.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index e010065dc..1263db707 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -177,8 +177,12 @@ pub mod pallet { /// Map from all (unlocked) "owner" accounts to the info regarding the staking. #[pallet::storage] #[pallet::getter(fn ledger)] - pub type Ledger = - StorageMap<_, Identity, T::AccountId, AccountsLedger, T>>; + pub type Ledger = StorageMap< + _, + Blake2_128Concat, + T::AccountId, + AccountsLedger, T>, + >; #[pallet::type_value] pub fn DefaultBucketCount() -> BucketId { From fae52e9ee010168f32100eb01513c797ed6b02c3 Mon Sep 17 00:00:00 2001 From: rakanalh Date: Mon, 20 Nov 2023 16:12:05 +0300 Subject: [PATCH 538/583] Update rust toolchain --- rust-toolchain.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 7e60322a9..6b6e48b6f 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "nightly-2022-10-09" +channel = "nightly-2023-06-01" components = ["clippy", "rustfmt"] targets = ["wasm32-unknown-unknown"] From a558546a773532d05d03c24e8fea36473178376c Mon Sep 17 00:00:00 2001 From: rakanalh Date: Mon, 20 Nov 2023 17:22:44 +0300 Subject: [PATCH 539/583] WIP --- Cargo.lock | 132 ++++++++++++++------------------- pallets/ddc-payouts/Cargo.toml | 22 +++--- runtime/cere-dev/Cargo.toml | 2 + rust-toolchain.toml | 2 +- shell.nix | 2 +- traits/Cargo.toml | 1 + 6 files changed, 73 insertions(+), 88 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da4aa4743..094c52aa7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -144,54 +144,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "anstream" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" - -[[package]] -name = "anstyle-parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" -dependencies = [ - "anstyle", - "windows-sys 0.48.0", -] - [[package]] name = "anyhow" version = "1.0.75" @@ -754,6 +706,15 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" +[[package]] +name = "byte-unit" +version = "4.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da78b32057b8fdfc352504708feeba7216dcd65a2c9ab02978cbd288d1279b6c" +dependencies = [ + "utf8-width", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -906,6 +867,7 @@ dependencies = [ "pallet-ddc-customers", "pallet-ddc-metrics-offchain-worker", "pallet-ddc-nodes", + "pallet-ddc-payouts", "pallet-ddc-staking", "pallet-democracy", "pallet-election-provider-multi-phase", @@ -1251,49 +1213,40 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.8" +version = "4.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" +checksum = "30607dd93c420c6f1f80b544be522a0238a7db35e6a12968d28910983fee0df0" dependencies = [ - "clap_builder", + "atty", + "bitflags 1.3.2", "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" -dependencies = [ - "anstream", - "anstyle", "clap_lex", + "once_cell", "strsim", + "termcolor", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "a4a307492e1a34939f79d3b6b9650bd2b971513cd775436bf2b78defeb5af00b" dependencies = [ "heck", + "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.39", + "syn 1.0.109", ] [[package]] name = "clap_lex" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" - -[[package]] -name = "colorchoice" -version = "1.0.0" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "033f6b7a4acb1f358c742aaca805c939ee73b4c6209ae4318ec7aca81c42e646" +dependencies = [ + "os_str_bytes", +] [[package]] name = "comfy-table" @@ -1680,6 +1633,7 @@ version = "0.1.0" dependencies = [ "ddc-primitives", "frame-system", + "sp-runtime", ] [[package]] @@ -4519,6 +4473,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + [[package]] name = "output_vt100" version = "0.1.3" @@ -4829,6 +4789,28 @@ dependencies = [ "substrate-test-utils", ] +[[package]] +name = "pallet-ddc-payouts" +version = "4.8.1" +dependencies = [ + "byte-unit", + "ddc-primitives", + "ddc-traits", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", + "sp-tracing", + "substrate-test-utils", +] + [[package]] name = "pallet-ddc-staking" version = "4.8.1" @@ -9585,10 +9567,10 @@ dependencies = [ ] [[package]] -name = "utf8parse" -version = "0.2.1" +name = "utf8-width" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1" [[package]] name = "valuable" diff --git a/pallets/ddc-payouts/Cargo.toml b/pallets/ddc-payouts/Cargo.toml index 8645d9d9e..e110a36e6 100644 --- a/pallets/ddc-payouts/Cargo.toml +++ b/pallets/ddc-payouts/Cargo.toml @@ -8,21 +8,21 @@ byte-unit = { version = "4.0.19", default-features = false, features = ["u128"] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } -frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", optional = true } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30", default-features = false } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [dev-dependencies] -sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } -substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [features] default = ["std"] diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 72f099d71..7216563ef 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -63,6 +63,7 @@ pallet-ddc-clusters = { version = "4.8.1", default-features = false, path = "../ pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } pallet-ddc-nodes = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-nodes" } +pallet-ddc-payouts = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-payouts" } pallet-ddc-staking = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-staking" } pallet-democracy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-multi-phase = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -174,6 +175,7 @@ std = [ "sp-io/std", "pallet-child-bounties/std", "pallet-ddc-metrics-offchain-worker/std", + "pallet-ddc-payouts/std", "pallet-ddc-staking/std", "cere-runtime-common/std", "cere-dev-runtime-constants/std", diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 6b6e48b6f..7e60322a9 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "nightly-2023-06-01" +channel = "nightly-2022-10-09" components = ["clippy", "rustfmt"] targets = ["wasm32-unknown-unknown"] diff --git a/shell.nix b/shell.nix index d3b0c4566..7444776a7 100644 --- a/shell.nix +++ b/shell.nix @@ -13,7 +13,7 @@ let rev = "1fe6ed37fd9beb92afe90671c0c2a662a03463dd"; }; nixpkgs = import pinned { overlays = [ mozillaOverlay ]; }; - toolchain = with nixpkgs; (rustChannelOf { date = "2023-10-22"; channel = "nightly"; }); + toolchain = with nixpkgs; (rustChannelOf { date = "2022-10-09"; channel = "nightly"; }); rust-wasm = toolchain.rust.override { targets = [ "wasm32-unknown-unknown" ]; }; diff --git a/traits/Cargo.toml b/traits/Cargo.toml index a37a46b0e..406369622 100644 --- a/traits/Cargo.toml +++ b/traits/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" [dependencies] ddc-primitives = { version = "0.1.0", default-features = false, path = "../primitives" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } From d9b8c7a11a4e55aeb42414b0272db79509d87bd2 Mon Sep 17 00:00:00 2001 From: rakanalh Date: Mon, 20 Nov 2023 18:30:16 +0300 Subject: [PATCH 540/583] Fix compilation --- Cargo.lock | 5 + pallets/ddc-customers/Cargo.toml | 5 + pallets/ddc-customers/src/lib.rs | 177 +++++++++++++++++++------------ 3 files changed, 117 insertions(+), 70 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 094c52aa7..373ecb81b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4741,10 +4741,15 @@ dependencies = [ "frame-support", "frame-system", "log", + "pallet-balances", + "pallet-timestamp", "parity-scale-codec", "scale-info", + "sp-core", + "sp-io", "sp-runtime", "sp-std", + "sp-tracing", "substrate-test-utils", ] diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 95f175547..1b85d24af 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -15,6 +15,11 @@ sp-runtime = { default-features = false, git = "https://github.com/paritytech/su sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [dev-dependencies] +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [features] diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 22bc8526a..ab5d6b529 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -1,11 +1,17 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] -use codec::{Decode, Encode, HasCompact, MaxEncodedLen}; +#[cfg(test)] +pub(crate) mod mock; +#[cfg(test)] +mod tests; + use core::fmt::Debug; +use codec::{Decode, Encode, HasCompact}; + use ddc_primitives::{BucketId, ClusterId}; -use ddc_traits::cluster::ClusterVisitor; +use ddc_traits::{cluster::ClusterVisitor, customer::CustomerCharger}; use frame_support::{ parameter_types, traits::{Currency, DefensiveSaturating, ExistenceRequirement}, @@ -13,7 +19,7 @@ use frame_support::{ }; use scale_info::TypeInfo; use sp_runtime::{ - traits::{AccountIdConversion, AtLeast32BitUnsigned, Saturating, Zero}, + traits::{AccountIdConversion, AtLeast32BitUnsigned, CheckedAdd, CheckedSub, Saturating, Zero}, RuntimeDebug, SaturatedConversion, }; use sp_std::prelude::*; @@ -30,12 +36,12 @@ parameter_types! { } /// Just a Balance/BlockNumber tuple to encode when a chunk of funds will be unlocked. -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] #[scale_info(skip_type_params(T))] pub struct UnlockChunk where - Balance: HasCompact + MaxEncodedLen, - BlockNumber: HasCompact + MaxEncodedLen, + Balance: HasCompact, + BlockNumber: HasCompact, { /// Amount of funds to be unlocked. #[codec(compact)] @@ -45,26 +51,22 @@ where block: BlockNumber, } -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct Bucket { bucket_id: BucketId, owner_id: AccountId, cluster_id: ClusterId, } -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct BucketsDetails { pub bucket_id: BucketId, pub amount: Balance, } -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] #[scale_info(skip_type_params(T))] -pub struct AccountsLedger -where - Balance: HasCompact + MaxEncodedLen, - T: Config, -{ +pub struct AccountsLedger { /// The owner account whose balance is actually locked and can be used for CDN usage. pub owner: AccountId, /// The total amount of the owner's balance that we are currently accounting for. @@ -84,7 +86,7 @@ where impl< AccountId, - Balance: HasCompact + Copy + Saturating + AtLeast32BitUnsigned + Zero + MaxEncodedLen + Debug, + Balance: HasCompact + Copy + Saturating + AtLeast32BitUnsigned + Zero + Debug, T: Config, > AccountsLedger { @@ -121,20 +123,28 @@ impl< /// Charge funds that were scheduled for unlocking. /// /// Returns the updated ledger, and the amount actually charged. - fn charge_unlocking(mut self, value: Balance) -> (Self, Balance) { + fn charge_unlocking(mut self, value: Balance) -> Result<(Self, Balance), Error> { let mut unlocking_balance = Balance::zero(); while let Some(last) = self.unlocking.last_mut() { - if unlocking_balance + last.value <= value { - unlocking_balance += last.value; - self.active -= last.value; + let temp = unlocking_balance + .checked_add(&last.value) + .ok_or(Error::::ArithmeticOverflow)?; + if temp <= value { + unlocking_balance = temp; + self.active = + self.active.checked_sub(&last.value).ok_or(Error::::ArithmeticUnderflow)?; self.unlocking.pop(); } else { - let diff = value - unlocking_balance; - - unlocking_balance += diff; - self.active -= diff; - last.value -= diff; + let diff = + value.checked_sub(&unlocking_balance).ok_or(Error::::ArithmeticUnderflow)?; + + unlocking_balance = + unlocking_balance.checked_add(&diff).ok_or(Error::::ArithmeticOverflow)?; + self.active = + self.active.checked_sub(&diff).ok_or(Error::::ArithmeticUnderflow)?; + last.value = + last.value.checked_sub(&diff).ok_or(Error::::ArithmeticUnderflow)?; } if unlocking_balance >= value { @@ -142,7 +152,7 @@ impl< } } - (self, unlocking_balance) + Ok((self, unlocking_balance)) } } @@ -173,13 +183,18 @@ pub mod pallet { /// Map from all (unlocked) "owner" accounts to the info regarding the staking. #[pallet::storage] #[pallet::getter(fn ledger)] - pub type Ledger = - StorageMap<_, Identity, T::AccountId, AccountsLedger, T>>; + pub type Ledger = StorageMap< + _, + Blake2_128Concat, + T::AccountId, + AccountsLedger, T>, + >; #[pallet::type_value] pub fn DefaultBucketCount() -> BucketId { 0 } + #[pallet::storage] #[pallet::getter(fn buckets_count)] pub type BucketsCount = @@ -200,12 +215,12 @@ pub mod pallet { /// it will not be emitted for staking rewards when they are added to stake. Deposited(T::AccountId, BalanceOf), /// An account has initiated unlock for amount. \[owner, amount\] - InitiatDepositUnlock(T::AccountId, BalanceOf), + InitialDepositUnlock(T::AccountId, BalanceOf), /// An account has called `withdraw_unlocked_deposit` and removed unlocking chunks worth /// `Balance` from the unlocking queue. \[owner, amount\] Withdrawn(T::AccountId, BalanceOf), - /// Total amount charged from all accounts to pay CDN nodes - Charged(BalanceOf), + /// The account has been charged for the usage + Charged(T::AccountId, BalanceOf), /// Bucket with specific id created BucketCreated(BucketId), } @@ -230,6 +245,12 @@ pub mod pallet { BucketDoesNotExist, /// DDC Cluster with provided id doesn't exist ClusterDoesNotExist, + // unauthorised operation + Unauthorised, + // Arithmetic overflow + ArithmeticOverflow, + // Arithmetic underflow + ArithmeticUnderflow, } #[pallet::genesis_config] @@ -261,7 +282,8 @@ pub mod pallet { #[pallet::weight(10_000)] pub fn create_bucket(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let bucket_owner = ensure_signed(origin)?; - let cur_bucket_id = Self::buckets_count() + 1; + let cur_bucket_id = + Self::buckets_count().checked_add(1).ok_or(Error::::ArithmeticOverflow)?; ::ClusterVisitor::ensure_cluster(&cluster_id) .map_err(|_| Error::::ClusterDoesNotExist)?; @@ -332,8 +354,11 @@ pub mod pallet { let owner_balance = ::Currency::free_balance(&owner); let extra = owner_balance.min(max_additional); - ledger.total += extra; - ledger.active += extra; + ledger.total = + ledger.total.checked_add(&extra).ok_or(Error::::ArithmeticOverflow)?; + ledger.active = + ledger.active.checked_add(&extra).ok_or(Error::::ArithmeticOverflow)?; + // Last check: the new active amount of ledger must be more than ED. ensure!( ledger.active >= ::Currency::minimum_balance(), @@ -360,7 +385,7 @@ pub mod pallet { /// can co-exists at the same time. In that case, [`Call::withdraw_unlocked_deposit`] need /// to be called first to remove some of the chunks (if possible). /// - /// Emits `InitiatDepositUnlock`. + /// Emits `InitialDepositUnlock`. /// /// See also [`Call::withdraw_unlocked_deposit`]. #[pallet::weight(10_000)] @@ -378,18 +403,20 @@ pub mod pallet { let mut value = value.min(ledger.active); if !value.is_zero() { - ledger.active -= value; + ledger.active = + ledger.active.checked_sub(&value).ok_or(Error::::ArithmeticUnderflow)?; // Avoid there being a dust balance left in the accounts system. if ledger.active < ::Currency::minimum_balance() { - value += ledger.active; + value = + value.checked_add(&ledger.active).ok_or(Error::::ArithmeticOverflow)?; ledger.active = Zero::zero(); } let current_block = >::block_number(); // Note: locking for extra block to allow for accounting + // block + configurable value - shouldn't overflow let block = current_block + ::UnlockingDelay::get(); - log::debug!("Block for the unlock: {:?}", block); if let Some(chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.block == block) @@ -407,7 +434,7 @@ pub mod pallet { Self::update_ledger(&owner, &ledger); - Self::deposit_event(Event::::InitiatDepositUnlock(ledger.owner, value)); + Self::deposit_event(Event::::InitialDepositUnlock(ledger.owner, value)); } Ok(()) } @@ -453,7 +480,8 @@ pub mod pallet { if ledger.total < old_total { log::debug!("Preparing for transfer"); // Already checked that this won't overflow by entry condition. - let value = old_total - ledger.total; + let value = + old_total.checked_sub(&ledger.total).ok_or(Error::::ArithmeticUnderflow)?; let account_id = Self::account_id(); @@ -515,40 +543,49 @@ pub mod pallet { Ok(()) } + } - // Charge payments from content owners - pub fn charge_content_owners( - paying_accounts: Vec>>, - pricing: u128, + impl CustomerCharger for Pallet { + fn charge_content_owner( + content_owner: T::AccountId, + billing_vault: T::AccountId, + amount: u128, ) -> DispatchResult { - let mut total_charged = BalanceOf::::zero(); - - for bucket_details in paying_accounts.iter() { - let bucket: Bucket = Self::buckets(bucket_details.bucket_id) - .ok_or(Error::::BucketDoesNotExist)?; - let content_owner = bucket.owner_id; - let amount = bucket_details.amount * pricing.saturated_into::>(); - - let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotOwner)?; - if ledger.active >= amount { - ledger.total -= amount; - ledger.active -= amount; - total_charged += amount; - Self::update_ledger(&content_owner, &ledger); - } else { - let diff = amount - ledger.active; - total_charged += ledger.active; - ledger.total -= ledger.active; - ledger.active = BalanceOf::::zero(); - let (ledger, charged) = ledger.charge_unlocking(diff); - Self::update_ledger(&content_owner, &ledger); - total_charged += charged; - } - } - log::debug!("Total charged: {:?}", &total_charged); + let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotOwner)?; + let mut amount_to_deduct = amount.saturated_into::>(); + + ensure!(ledger.total >= ledger.active, Error::::ArithmeticUnderflow); + if ledger.active >= amount_to_deduct { + ledger.active = ledger + .active + .checked_sub(&amount_to_deduct) + .ok_or(Error::::ArithmeticUnderflow)?; + ledger.total = ledger + .total + .checked_sub(&amount_to_deduct) + .ok_or(Error::::ArithmeticUnderflow)?; + Self::update_ledger(&content_owner, &ledger); + } else { + let diff = amount_to_deduct + .checked_sub(&ledger.active) + .ok_or(Error::::ArithmeticUnderflow)?; + ledger.total = ledger + .total + .checked_sub(&ledger.active) + .ok_or(Error::::ArithmeticUnderflow)?; + amount_to_deduct = ledger.active; + ledger.active = BalanceOf::::zero(); + let (ledger, _charged) = ledger.charge_unlocking(diff)?; + Self::update_ledger(&content_owner, &ledger); + }; - Self::deposit_event(Event::::Charged(total_charged)); - log::debug!("Deposit event executed"); + ::Currency::transfer( + &Self::account_id(), + &billing_vault, + amount_to_deduct, + ExistenceRequirement::KeepAlive, + )?; + Self::deposit_event(Event::::Charged(content_owner, amount_to_deduct)); Ok(()) } From 04ad76469d807ece054e4c3124e472d12743a565 Mon Sep 17 00:00:00 2001 From: rakanalh Date: Mon, 20 Nov 2023 19:30:49 +0300 Subject: [PATCH 541/583] Fix clippy issues --- Cargo.lock | 8 ++++++++ pallets/ddc-clusters/Cargo.toml | 5 +++++ pallets/ddc-clusters/src/mock.rs | 1 - pallets/ddc-customers/src/lib.rs | 2 +- pallets/ddc-customers/src/tests.rs | 7 +++++-- pallets/ddc-nodes/Cargo.toml | 3 +++ 6 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 373ecb81b..0ece559ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4721,11 +4721,16 @@ dependencies = [ "ddc-traits", "frame-support", "frame-system", + "hex-literal", + "pallet-balances", "pallet-contracts", "pallet-ddc-nodes", + "pallet-randomness-collective-flip", + "pallet-timestamp", "parity-scale-codec", "scale-info", "sp-core", + "sp-io", "sp-runtime", "sp-std", "sp-tracing", @@ -4785,9 +4790,12 @@ dependencies = [ "ddc-traits", "frame-support", "frame-system", + "pallet-balances", + "pallet-timestamp", "parity-scale-codec", "scale-info", "sp-core", + "sp-io", "sp-runtime", "sp-std", "sp-tracing", diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index 93fe9b759..b49a4b665 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +hex-literal = "^0.3.1" ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -16,7 +17,11 @@ sp-runtime = { default-features = false, git = "https://github.com/paritytech/su sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [dev-dependencies] +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-io = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/pallets/ddc-clusters/src/mock.rs b/pallets/ddc-clusters/src/mock.rs index b6c2e4fd2..f7f9840bc 100644 --- a/pallets/ddc-clusters/src/mock.rs +++ b/pallets/ddc-clusters/src/mock.rs @@ -90,7 +90,6 @@ impl contracts::Config for Test { type DepositPerByte = DepositPerByte; type DepositPerItem = DepositPerItem; type AddressGenerator = pallet_contracts::DefaultAddressGenerator; - type ContractAccessWeight = (); type MaxCodeLen = ConstU32<{ 128 * 1024 }>; type MaxStorageKeyLen = ConstU32<128>; } diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index ab5d6b529..9e22c86eb 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -41,7 +41,7 @@ parameter_types! { pub struct UnlockChunk where Balance: HasCompact, - BlockNumber: HasCompact, + BlockNumber: Clone, { /// Amount of funds to be unlocked. #[codec(compact)] diff --git a/pallets/ddc-customers/src/tests.rs b/pallets/ddc-customers/src/tests.rs index 869115e3b..7e5de342e 100644 --- a/pallets/ddc-customers/src/tests.rs +++ b/pallets/ddc-customers/src/tests.rs @@ -4,6 +4,7 @@ use super::{mock::*, *}; use ddc_primitives::ClusterId; use frame_support::{assert_noop, assert_ok}; +use frame_system::Config; use pallet_balances::Error as BalancesError; #[test] @@ -144,8 +145,10 @@ fn unlock_and_withdraw_deposit_works() { assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(account_1), 1_u128)); System::set_block_number(2); - let mut unlocking_chunks: BoundedVec, MaxUnlockingChunks> = - Default::default(); + let mut unlocking_chunks: BoundedVec< + UnlockChunk::BlockNumber>, + MaxUnlockingChunks, + > = Default::default(); match unlocking_chunks.try_push(UnlockChunk { value: 1, block: 11 }) { Ok(_) => (), Err(_) => println!("No more chunks"), diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index 207e0c202..ed3d6de36 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -14,7 +14,10 @@ sp-runtime = { default-features = false, git = "https://github.com/paritytech/su sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [dev-dependencies] +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-io = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } From ac8349dad89873d25cc5c1522847a6e4fae5a429 Mon Sep 17 00:00:00 2001 From: rakanalh Date: Mon, 20 Nov 2023 19:34:26 +0300 Subject: [PATCH 542/583] dprint fmt --- pallets/ddc-clusters/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index b49a4b665..cd2ef1a2c 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -5,11 +5,11 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -hex-literal = "^0.3.1" ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +hex-literal = "^0.3.1" pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } From d9d883766f6a646b98c00e2dd7667abb41bc0083 Mon Sep 17 00:00:00 2001 From: Raid5594 <52794079+Raid5594@users.noreply.github.com> Date: Wed, 22 Nov 2023 13:14:14 +0100 Subject: [PATCH 543/583] Feature: add benchmarking for pallet-customers (#149) Co-authored-by: Rakan Alhneiti --- Cargo.lock | 3 + pallets/ddc-clusters/src/cluster.rs | 28 +--- pallets/ddc-clusters/src/lib.rs | 69 ++++++-- .../ddc-clusters/src/node_provider_auth.rs | 3 +- pallets/ddc-clusters/src/tests.rs | 8 +- pallets/ddc-customers/Cargo.toml | 25 ++- pallets/ddc-customers/src/benchmarking.rs | 153 ++++++++++++++++++ pallets/ddc-customers/src/lib.rs | 33 ++-- pallets/ddc-customers/src/mock.rs | 24 ++- pallets/ddc-customers/src/weights.rs | 132 +++++++++++++++ primitives/src/lib.rs | 29 +++- runtime/cere-dev/Cargo.toml | 1 + runtime/cere-dev/src/lib.rs | 3 + traits/Cargo.toml | 1 + traits/src/cluster.rs | 15 +- 15 files changed, 462 insertions(+), 65 deletions(-) create mode 100644 pallets/ddc-customers/src/benchmarking.rs create mode 100644 pallets/ddc-customers/src/weights.rs diff --git a/Cargo.lock b/Cargo.lock index 0ece559ff..6490578d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1632,6 +1632,7 @@ name = "ddc-traits" version = "0.1.0" dependencies = [ "ddc-primitives", + "frame-support", "frame-system", "sp-runtime", ] @@ -4743,12 +4744,14 @@ version = "0.1.0" dependencies = [ "ddc-primitives", "ddc-traits", + "frame-benchmarking", "frame-support", "frame-system", "log", "pallet-balances", "pallet-timestamp", "parity-scale-codec", + "rand_chacha 0.2.2", "scale-info", "sp-core", "sp-io", diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index 4be19d73f..d8f68a497 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -1,9 +1,8 @@ use crate::pallet::Error; use codec::{Decode, Encode}; -use ddc_primitives::ClusterId; +use ddc_primitives::{ClusterId, ClusterParams}; use frame_support::{pallet_prelude::*, parameter_types}; use scale_info::TypeInfo; -use sp_runtime::Perbill; parameter_types! { pub MaxClusterParamsLen: u16 = 2048; @@ -22,31 +21,6 @@ pub struct ClusterProps { pub node_provider_auth_contract: AccountId, } -// ClusterParams includes Governance non-sensetive parameters only -#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct ClusterParams { - pub node_provider_auth_contract: AccountId, -} - -// ClusterGovParams includes Governance sensetive parameters -#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -#[scale_info(skip_type_params(Balance, BlockNumber, T))] -pub struct ClusterGovParams { - pub treasury_share: Perbill, - pub validators_share: Perbill, - pub cluster_reserve_share: Perbill, - pub cdn_bond_size: Balance, - pub cdn_chill_delay: BlockNumber, - pub cdn_unbonding_delay: BlockNumber, - pub storage_bond_size: Balance, - pub storage_chill_delay: BlockNumber, - pub storage_unbonding_delay: BlockNumber, - pub unit_per_mb_stored: u128, - pub unit_per_mb_streamed: u128, - pub unit_per_put_request: u128, - pub unit_per_get_request: u128, -} - impl Cluster { pub fn new( cluster_id: ClusterId, diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index c7786861b..14e177f15 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -21,12 +21,14 @@ pub(crate) mod mock; mod tests; use crate::{ - cluster::{Cluster, ClusterGovParams, ClusterParams}, + cluster::Cluster, node_provider_auth::{NodeProviderAuthContract, NodeProviderAuthContractError}, }; -use ddc_primitives::{ClusterId, ClusterPricingParams, NodePubKey, NodeType}; +use ddc_primitives::{ + ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, NodePubKey, NodeType, +}; use ddc_traits::{ - cluster::{ClusterVisitor, ClusterVisitorError}, + cluster::{ClusterCreator, ClusterVisitor, ClusterVisitorError}, staking::{StakingVisitor, StakingVisitorError}, }; use frame_support::{ @@ -39,7 +41,7 @@ use pallet_ddc_nodes::{NodeRepository, NodeTrait}; use sp_runtime::SaturatedConversion; use sp_std::prelude::*; -mod cluster; +pub mod cluster; mod node_provider_auth; /// The balance type of this pallet. @@ -129,16 +131,13 @@ pub mod pallet { cluster_gov_params: ClusterGovParams, T::BlockNumber>, ) -> DispatchResult { ensure_root(origin)?; // requires Governance approval - let cluster = - Cluster::new(cluster_id, cluster_manager_id, cluster_reserve_id, cluster_params) - .map_err(Into::>::into)?; - ensure!(!Clusters::::contains_key(cluster_id), Error::::ClusterAlreadyExists); - - Clusters::::insert(cluster_id, cluster); - ClustersGovParams::::insert(cluster_id, cluster_gov_params); - Self::deposit_event(Event::::ClusterCreated { cluster_id }); - - Ok(()) + Self::do_create_cluster( + cluster_id, + cluster_manager_id, + cluster_reserve_id, + cluster_params, + cluster_gov_params, + ) } #[pallet::weight(10_000)] @@ -247,6 +246,27 @@ pub mod pallet { } } + impl Pallet { + fn do_create_cluster( + cluster_id: ClusterId, + cluster_manager_id: T::AccountId, + cluster_reserve_id: T::AccountId, + cluster_params: ClusterParams, + cluster_gov_params: ClusterGovParams, T::BlockNumber>, + ) -> DispatchResult { + let cluster = + Cluster::new(cluster_id, cluster_manager_id, cluster_reserve_id, cluster_params) + .map_err(Into::>::into)?; + ensure!(!Clusters::::contains_key(cluster_id), Error::::ClusterAlreadyExists); + + Clusters::::insert(cluster_id, cluster); + ClustersGovParams::::insert(cluster_id, cluster_gov_params); + Self::deposit_event(Event::::ClusterCreated { cluster_id }); + + Ok(()) + } + } + impl ClusterVisitor for Pallet { fn cluster_has_node(cluster_id: &ClusterId, node_pub_key: &NodePubKey) -> bool { ClustersNodes::::get(cluster_id, node_pub_key).is_some() @@ -309,6 +329,27 @@ pub mod pallet { } } + impl ClusterCreator> for Pallet + where + T::AccountId: UncheckedFrom + AsRef<[u8]>, + { + fn create_new_cluster( + cluster_id: ClusterId, + cluster_manager_id: T::AccountId, + cluster_reserve_id: T::AccountId, + cluster_params: ClusterParams, + cluster_gov_params: ClusterGovParams, T::BlockNumber>, + ) -> DispatchResult { + Self::do_create_cluster( + cluster_id, + cluster_manager_id, + cluster_reserve_id, + cluster_params, + cluster_gov_params, + ) + } + } + impl From for Error { fn from(error: StakingVisitorError) -> Self { match error { diff --git a/pallets/ddc-clusters/src/node_provider_auth.rs b/pallets/ddc-clusters/src/node_provider_auth.rs index e3f038818..48e6e2221 100644 --- a/pallets/ddc-clusters/src/node_provider_auth.rs +++ b/pallets/ddc-clusters/src/node_provider_auth.rs @@ -12,7 +12,8 @@ const INK_SELECTOR_IS_AUTHORIZED: [u8; 4] = [0x96, 0xb0, 0x45, 0x3e]; /// The maximum amount of weight that the cluster extension contract call is allowed to consume. /// See also https://github.com/paritytech/substrate/blob/a3ed0119c45cdd0d571ad34e5b3ee7518c8cef8d/frame/contracts/rpc/src/lib.rs#L63. -const EXTENSION_CALL_GAS_LIMIT: Weight = Weight::from_ref_time(5_000_000_000_000); +const EXTENSION_CALL_GAS_LIMIT: Weight = + Weight::from_ref_time(5_000_000_000_000).set_proof_size(u64::MAX); pub struct NodeProviderAuthContract { contract_id: T::AccountId, diff --git a/pallets/ddc-clusters/src/tests.rs b/pallets/ddc-clusters/src/tests.rs index 922ad7a7a..74c80643a 100644 --- a/pallets/ddc-clusters/src/tests.rs +++ b/pallets/ddc-clusters/src/tests.rs @@ -1,7 +1,7 @@ //! Tests for the module. use super::{mock::*, *}; -use ddc_primitives::{ClusterId, NodePubKey}; +use ddc_primitives::{ClusterId, ClusterParams, NodePubKey}; use frame_support::{assert_noop, assert_ok, error::BadOrigin}; use frame_system::Config; use hex_literal::hex; @@ -166,7 +166,7 @@ fn add_and_delete_node_works() { assert_ok!(DdcClusters::set_cluster_params( RuntimeOrigin::signed(AccountId::from([1; 32])), ClusterId::from([1; 20]), - cluster::ClusterParams { node_provider_auth_contract: contract_id }, + ClusterParams { node_provider_auth_contract: contract_id }, )); // Node doesn't exist @@ -244,7 +244,7 @@ fn add_and_delete_node_works() { // Deploy the contract. const GAS_LIMIT: frame_support::weights::Weight = - Weight::from_ref_time(100_000_000_000); + Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX); const ENDOWMENT: Balance = 0; Contracts::instantiate_with_code( RuntimeOrigin::signed(alice.clone()), @@ -274,7 +274,7 @@ fn add_and_delete_node_works() { RuntimeOrigin::signed(alice), contract_id.clone(), 0, - Weight::from_ref_time(1_000_000_000_000), + Weight::from_ref_time(1_000_000_000_000).set_proof_size(u64::MAX), None, call_data, ); diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 1b85d24af..7ba910a68 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -4,17 +4,24 @@ version = "0.1.0" edition = "2021" [dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } -ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +# 3rd Party +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +log = { version = "0.4.17", default-features = false } +rand_chacha = { version = "0.2", default-features = false, optional = true } +scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } + +# Cere +ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } +ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } + [dev-dependencies] +frame-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -29,7 +36,15 @@ std = [ "ddc-primitives/std", "frame-support/std", "frame-system/std", + "frame-benchmarking?/std", "scale-info/std", "sp-runtime/std", "sp-std/std", ] +runtime-benchmarks = [ + "ddc-primitives/runtime-benchmarks", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] diff --git a/pallets/ddc-customers/src/benchmarking.rs b/pallets/ddc-customers/src/benchmarking.rs new file mode 100644 index 000000000..efb11b201 --- /dev/null +++ b/pallets/ddc-customers/src/benchmarking.rs @@ -0,0 +1,153 @@ +//! DdcStaking pallet benchmarking. +#![cfg(feature = "runtime-benchmarks")] + +use super::*; +use crate::Pallet as DdcCustomers; +use ddc_primitives::{ClusterGovParams, ClusterId, ClusterParams}; +use frame_benchmarking::{account, benchmarks, whitelist_account}; +use frame_support::traits::Currency; +use sp_runtime::Perbill; +use sp_std::prelude::*; + +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + +use frame_system::{Pallet as System, RawOrigin}; + +const USER_SEED: u32 = 999666; + +benchmarks! { + create_bucket { + let cluster_id = ClusterId::from([1; 20]); + let user = account::("user", USER_SEED, 0u32); + + let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { + treasury_share: Perbill::default(), + validators_share: Perbill::default(), + cluster_reserve_share: Perbill::default(), + cdn_bond_size: 100u32.into(), + cdn_chill_delay: 50u32.into(), + cdn_unbonding_delay: 50u32.into(), + storage_bond_size: 100u32.into(), + storage_chill_delay: 50u32.into(), + storage_unbonding_delay: 50u32.into(), + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + }; + + let _ = ::ClusterCreator::create_new_cluster( + ClusterId::from([1; 20]), + user.clone(), + user.clone(), + ClusterParams { node_provider_auth_contract: user.clone() }, + cluster_gov_params + ); + + whitelist_account!(user); + }: _(RawOrigin::Signed(user), cluster_id) + verify { + assert_eq!(Pallet::::buckets_count(), 1); + } + + deposit { + let user = account::("user", USER_SEED, 0u32); + let balance = ::Currency::minimum_balance() * 100u32.into(); + let _ = ::Currency::make_free_balance_be(&user, balance); + let amount = ::Currency::minimum_balance() * 50u32.into(); + + whitelist_account!(user); + }: _(RawOrigin::Signed(user.clone()), amount) + verify { + assert!(Ledger::::contains_key(user)); + } + + deposit_extra { + let user = account::("user", USER_SEED, 0u32); + let balance = ::Currency::minimum_balance() * 200u32.into(); + let _ = ::Currency::make_free_balance_be(&user, balance); + let amount = ::Currency::minimum_balance() * 50u32.into(); + + let _ = DdcCustomers::::deposit(RawOrigin::Signed(user.clone()).into(), amount); + + whitelist_account!(user); + }: _(RawOrigin::Signed(user.clone()), amount) + verify { + assert!(Ledger::::contains_key(user)); + } + + unlock_deposit { + let user = account::("user", USER_SEED, 0u32); + let balance = ::Currency::minimum_balance() * 200u32.into(); + let _ = ::Currency::make_free_balance_be(&user, balance); + let amount = ::Currency::minimum_balance() * 50u32.into(); + + let _ = DdcCustomers::::deposit(RawOrigin::Signed(user.clone()).into(), amount); + + whitelist_account!(user); + }: unlock_deposit(RawOrigin::Signed(user.clone()), amount) + verify { + assert!(Ledger::::contains_key(user)); + } + + // Worst case scenario, 31/32 chunks unlocked after the unlocking duration + withdraw_unlocked_deposit_update { + + System::::set_block_number(1u32.into()); + + let user = account::("user", USER_SEED, 0u32); + let balance = ::Currency::minimum_balance() * 2000u32.into(); + let _ = ::Currency::make_free_balance_be(&user, balance); + let amount = ::Currency::minimum_balance() * 32u32.into(); + + let _ = DdcCustomers::::deposit(RawOrigin::Signed(user.clone()).into(), amount); + + for _k in 1 .. 32 { + let _ = DdcCustomers::::unlock_deposit(RawOrigin::Signed(user.clone()).into(), ::Currency::minimum_balance() * 1u32.into()); + } + + System::::set_block_number(5256001u32.into()); + + whitelist_account!(user); + }: withdraw_unlocked_deposit(RawOrigin::Signed(user.clone())) + verify { + let ledger = Ledger::::try_get(user).unwrap(); + assert_eq!(ledger.active, amount / 32u32.into()); + } + + // Worst case scenario, everything is removed after the unlocking duration + withdraw_unlocked_deposit_kill { + + System::::set_block_number(1u32.into()); + + let user = account::("user", USER_SEED, 0u32); + let user2 = account::("user", USER_SEED, 1u32); + let balance = ::Currency::minimum_balance() * 2000u32.into(); + let _ = ::Currency::make_free_balance_be(&user, balance); + let _ = ::Currency::make_free_balance_be(&user2, balance); + let amount = ::Currency::minimum_balance() * 32u32.into(); + + let _ = DdcCustomers::::deposit(RawOrigin::Signed(user.clone()).into(), amount); + // To keep the balance of pallet positive + let _ = DdcCustomers::::deposit(RawOrigin::Signed(user2).into(), amount); + + + for _k in 1 .. 33 { + let _ = DdcCustomers::::unlock_deposit(RawOrigin::Signed(user.clone()).into(), ::Currency::minimum_balance() * 1u32.into()); + } + + System::::set_block_number(5256001u32.into()); + + whitelist_account!(user); + }: withdraw_unlocked_deposit(RawOrigin::Signed(user.clone())) + verify { + assert!(!Ledger::::contains_key(user)); + } + + impl_benchmark_test_suite!( + DdcCustomers, + crate::mock::ExtBuilder.build(), + crate::mock::Test, + ); +} diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 9e22c86eb..564f11860 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -1,6 +1,12 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] +pub mod weights; +use crate::weights::WeightInfo; + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarking; + #[cfg(test)] pub(crate) mod mock; #[cfg(test)] @@ -11,7 +17,10 @@ use core::fmt::Debug; use codec::{Decode, Encode, HasCompact}; use ddc_primitives::{BucketId, ClusterId}; -use ddc_traits::{cluster::ClusterVisitor, customer::CustomerCharger}; +use ddc_traits::{ + cluster::{ClusterCreator, ClusterVisitor}, + customer::CustomerCharger, +}; use frame_support::{ parameter_types, traits::{Currency, DefensiveSaturating, ExistenceRequirement}, @@ -178,6 +187,8 @@ pub mod pallet { #[pallet::constant] type UnlockingDelay: Get<::BlockNumber>; type ClusterVisitor: ClusterVisitor; + type ClusterCreator: ClusterCreator>; + type WeightInfo: WeightInfo; } /// Map from all (unlocked) "owner" accounts to the info regarding the staking. @@ -279,7 +290,7 @@ pub mod pallet { /// Create new bucket with specified cluster id /// /// Anyone can create a bucket - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::create_bucket())] pub fn create_bucket(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { let bucket_owner = ensure_signed(origin)?; let cur_bucket_id = @@ -306,7 +317,7 @@ pub mod pallet { /// The dispatch origin for this call must be _Signed_ by the owner account. /// /// Emits `Deposited`. - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::deposit())] pub fn deposit( origin: OriginFor, #[pallet::compact] value: BalanceOf, @@ -343,7 +354,7 @@ pub mod pallet { /// The dispatch origin for this call must be _Signed_ by the owner. /// /// Emits `Deposited`. - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::deposit_extra())] pub fn deposit_extra( origin: OriginFor, #[pallet::compact] max_additional: BalanceOf, @@ -388,7 +399,7 @@ pub mod pallet { /// Emits `InitialDepositUnlock`. /// /// See also [`Call::withdraw_unlocked_deposit`]. - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::unlock_deposit())] pub fn unlock_deposit( origin: OriginFor, #[pallet::compact] value: BalanceOf, @@ -449,15 +460,15 @@ pub mod pallet { /// Emits `Withdrawn`. /// /// See also [`Call::unlock_deposit`]. - #[pallet::weight(10_000)] - pub fn withdraw_unlocked_deposit(origin: OriginFor) -> DispatchResult { + #[pallet::weight(T::WeightInfo::withdraw_unlocked_deposit_kill())] + pub fn withdraw_unlocked_deposit(origin: OriginFor) -> DispatchResultWithPostInfo { let owner = ensure_signed(origin)?; let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; let (owner, old_total) = (ledger.owner.clone(), ledger.total); let current_block = >::block_number(); ledger = ledger.consolidate_unlocked(current_block); - if ledger.unlocking.is_empty() && + let post_info_weight = if ledger.unlocking.is_empty() && ledger.active < ::Currency::minimum_balance() { log::debug!("Killing owner"); @@ -465,11 +476,15 @@ pub mod pallet { // active portion to fall below existential deposit + will have no more unlocking // chunks left. We can now safely remove all accounts-related information. Self::kill_owner(&owner)?; + // This is worst case scenario, so we use the full weight and return None + None } else { log::debug!("Updating ledger"); // This was the consequence of a partial deposit unlock. just update the ledger and // move on. Self::update_ledger(&owner, &ledger); + // This is only an update, so we use less overall weight. + Some(::WeightInfo::withdraw_unlocked_deposit_update()) }; log::debug!("Current total: {:?}", ledger.total); @@ -494,7 +509,7 @@ pub mod pallet { Self::deposit_event(Event::::Withdrawn(owner, value)); } - Ok(()) + Ok(post_info_weight.into()) } } diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index 5113b1e69..5f1b090a3 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -1,8 +1,10 @@ //! Test utilities use crate::{self as pallet_ddc_customers, *}; -use ddc_primitives::{ClusterPricingParams, NodePubKey, NodeType}; -use ddc_traits::cluster::{ClusterVisitor, ClusterVisitorError}; +use ddc_primitives::{ + ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, NodePubKey, NodeType, +}; +use ddc_traits::cluster::{ClusterCreator, ClusterVisitor, ClusterVisitorError}; use frame_support::{ construct_runtime, parameter_types, @@ -15,6 +17,7 @@ use sp_io::TestExternalities; use sp_runtime::{ testing::Header, traits::{BlakeTwo256, IdentityLookup}, + DispatchResult, }; /// The AccountId alias in this test module. @@ -100,6 +103,8 @@ impl crate::pallet::Config for Test { type PalletId = DdcCustomersPalletId; type RuntimeEvent = RuntimeEvent; type ClusterVisitor = TestClusterVisitor; + type ClusterCreator = TestClusterCreator; + type WeightInfo = (); } pub struct TestClusterVisitor; @@ -141,10 +146,23 @@ impl ClusterVisitor for TestClusterVisitor { } } +pub struct TestClusterCreator; +impl ClusterCreator for TestClusterCreator { + fn create_new_cluster( + _cluster_id: ClusterId, + _cluster_manager_id: T::AccountId, + _cluster_reserve_id: T::AccountId, + _cluster_params: ClusterParams, + _cluster_gov_params: ClusterGovParams, + ) -> DispatchResult { + Ok(()) + } +} + pub struct ExtBuilder; impl ExtBuilder { - fn build(self) -> TestExternalities { + pub fn build(self) -> TestExternalities { sp_tracing::try_init_simple(); let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); diff --git a/pallets/ddc-customers/src/weights.rs b/pallets/ddc-customers/src/weights.rs new file mode 100644 index 000000000..66ae43d01 --- /dev/null +++ b/pallets/ddc-customers/src/weights.rs @@ -0,0 +1,132 @@ + +//! Autogenerated weights for `pallet_ddc_customers` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-11-16, STEPS: `200`, REPEAT: 1000, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `Raids-MacBook-Pro-2.local`, CPU: `` +//! EXECUTION: None, WASM-EXECUTION: Interpreted, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// ./target/release/cere +// benchmark +// pallet +// --chain +// dev +// --pallet +// pallet_ddc_customers +// --extrinsic +// * +// --steps +// 200 +// --repeat +// 1000 +// --output +// pallets/ddc-customers/src/weights.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_ddc_nodes. +pub trait WeightInfo { + fn create_bucket() -> Weight; + fn deposit() -> Weight; + fn deposit_extra() -> Weight; + fn unlock_deposit() -> Weight; + fn withdraw_unlocked_deposit_update() -> Weight; + fn withdraw_unlocked_deposit_kill() -> Weight; +} + +/// Weight functions for `pallet_ddc_customers`. +pub struct SubstrateWeight(PhantomData); +impl WeightInfo for SubstrateWeight { + // Storage: DdcCustomers BucketsCount (r:1 w:1) + // Storage: DdcClusters Clusters (r:1 w:0) + // Storage: DdcCustomers Buckets (r:0 w:1) + fn create_bucket() -> Weight { + Weight::from_ref_time(18_000_000_u64) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + // Storage: DdcCustomers Ledger (r:1 w:1) + // Storage: System Account (r:1 w:1) + fn deposit() -> Weight { + Weight::from_ref_time(26_000_000_u64) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + // Storage: DdcCustomers Ledger (r:1 w:1) + // Storage: System Account (r:1 w:1) + fn deposit_extra() -> Weight { + Weight::from_ref_time(28_000_000_u64) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + // Storage: DdcCustomers Ledger (r:1 w:1) + fn unlock_deposit() -> Weight { + Weight::from_ref_time(16_000_000_u64) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + // Storage: DdcCustomers Ledger (r:1 w:1) + fn withdraw_unlocked_deposit_update() -> Weight { + Weight::from_ref_time(14_000_000_u64) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + // Storage: DdcCustomers Ledger (r:1 w:1) + // Storage: System Account (r:1 w:1) + fn withdraw_unlocked_deposit_kill() -> Weight { + Weight::from_ref_time(31_000_000_u64) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + // Storage: DdcCustomers BucketsCount (r:1 w:1) + // Storage: DdcClusters Clusters (r:1 w:0) + // Storage: DdcCustomers Buckets (r:0 w:1) + fn create_bucket() -> Weight { + Weight::from_ref_time(18_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + // Storage: DdcCustomers Ledger (r:1 w:1) + // Storage: System Account (r:1 w:1) + fn deposit() -> Weight { + Weight::from_ref_time(26_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + // Storage: DdcCustomers Ledger (r:1 w:1) + // Storage: System Account (r:1 w:1) + fn deposit_extra() -> Weight { + Weight::from_ref_time(28_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + // Storage: DdcCustomers Ledger (r:1 w:1) + fn unlock_deposit() -> Weight { + Weight::from_ref_time(16_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + // Storage: DdcCustomers Ledger (r:1 w:1) + fn withdraw_unlocked_deposit_update() -> Weight { + Weight::from_ref_time(14_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + // Storage: DdcCustomers Ledger (r:1 w:1) + // Storage: System Account (r:1 w:1) + fn withdraw_unlocked_deposit_kill() -> Weight { + Weight::from_ref_time(31_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } +} \ No newline at end of file diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 7ac05a660..da91f0876 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -5,12 +5,38 @@ use scale_info::TypeInfo; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; use sp_core::hash::H160; -use sp_runtime::{AccountId32, RuntimeDebug}; +use sp_runtime::{AccountId32, Perbill, RuntimeDebug}; pub type ClusterId = H160; pub type DdcEra = u32; pub type BucketId = u64; pub type StorageNodePubKey = AccountId32; pub type CDNNodePubKey = AccountId32; + +// ClusterParams includes Governance non-sensetive parameters only +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct ClusterParams { + pub node_provider_auth_contract: AccountId, +} + +// ClusterGovParams includes Governance sensetive parameters +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +#[scale_info(skip_type_params(Balance, BlockNumber, T))] +pub struct ClusterGovParams { + pub treasury_share: Perbill, + pub validators_share: Perbill, + pub cluster_reserve_share: Perbill, + pub cdn_bond_size: Balance, + pub cdn_chill_delay: BlockNumber, + pub cdn_unbonding_delay: BlockNumber, + pub storage_bond_size: Balance, + pub storage_chill_delay: BlockNumber, + pub storage_unbonding_delay: BlockNumber, + pub unit_per_mb_stored: u128, + pub unit_per_mb_streamed: u128, + pub unit_per_put_request: u128, + pub unit_per_get_request: u128, +} + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct ClusterPricingParams { pub unit_per_mb_stored: u128, @@ -18,6 +44,7 @@ pub struct ClusterPricingParams { pub unit_per_put_request: u128, pub unit_per_get_request: u128, } + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodePubKey { diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 7216563ef..fda50db6e 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -214,6 +214,7 @@ runtime-benchmarks = [ "pallet-session-benchmarking/runtime-benchmarks", "pallet-society/runtime-benchmarks", "pallet-staking/runtime-benchmarks", + "pallet-ddc-customers/runtime-benchmarks", "pallet-ddc-staking/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-tips/runtime-benchmarks", diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index c90180ee3..e71bd8be9 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1342,6 +1342,8 @@ impl pallet_ddc_customers::Config for Runtime { type PalletId = DdcCustomersPalletId; type RuntimeEvent = RuntimeEvent; type ClusterVisitor = pallet_ddc_clusters::Pallet; + type ClusterCreator = pallet_ddc_clusters::Pallet; + type WeightInfo = pallet_ddc_customers::weights::SubstrateWeight; } impl pallet_ddc_nodes::Config for Runtime { @@ -1526,6 +1528,7 @@ mod benches { [pallet_scheduler, Scheduler] [pallet_session, SessionBench::] [pallet_staking, Staking] + [pallet_ddc_customers, DdcCustomers] [pallet_ddc_staking, DdcStaking] [frame_system, SystemBench::] [pallet_timestamp, Timestamp] diff --git a/traits/Cargo.toml b/traits/Cargo.toml index 406369622..fe6938291 100644 --- a/traits/Cargo.toml +++ b/traits/Cargo.toml @@ -5,5 +5,6 @@ edition = "2021" [dependencies] ddc-primitives = { version = "0.1.0", default-features = false, path = "../primitives" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/traits/src/cluster.rs b/traits/src/cluster.rs index cdb3a5e21..921d2c0d0 100644 --- a/traits/src/cluster.rs +++ b/traits/src/cluster.rs @@ -1,4 +1,7 @@ -use ddc_primitives::{ClusterId, ClusterPricingParams, NodePubKey, NodeType}; +use ddc_primitives::{ + ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, NodePubKey, NodeType, +}; +use frame_support::dispatch::DispatchResult; use frame_system::Config; pub trait ClusterVisitor { @@ -26,6 +29,16 @@ pub trait ClusterVisitor { ) -> Result; } +pub trait ClusterCreator { + fn create_new_cluster( + cluster_id: ClusterId, + cluster_manager_id: T::AccountId, + cluster_reserve_id: T::AccountId, + cluster_params: ClusterParams, + cluster_gov_params: ClusterGovParams, + ) -> DispatchResult; +} + pub enum ClusterVisitorError { ClusterDoesNotExist, ClusterGovParamsNotSet, From 014a4fc9024cf3e68d004b53b20ac4800d8d0801 Mon Sep 17 00:00:00 2001 From: Yahor Tsaryk Date: Thu, 23 Nov 2023 15:55:20 +0100 Subject: [PATCH 544/583] Fix: Removing a node from the cluster if its stake is unbonded below min threshold (#150) This PR tries to address a missing gap in the Unbonding process and the way a node provider can leave a cluster according to the cluster's terms. ### Problem At this moment, we keep stakes of active nodes, i.e. Storage and CDN nodes that are serving a cluster, in `Storages` and `CDNs` maps accordingly. These maps are supposed to keep stakes that can be slashed in case of malicious behavior from active nodes. If an active node wants to chill, i.e. to stop serving the cluster for some time (ex. for upgrading software or hardware), it executes `chill` call. Chilling starts according to cluster's terms, i.e. an active node can be safely stopped only after the `chill_delay` period is passed. After the `chill_delay`, the node is being removed from the `Storages` / `CDNs` map and its stake is safe from the slashing. After the chilling, a node has 2 options: 1) It can continue to serve the cluster it is assigned to (i.e. execute `serve` or `store` call) and return back to the `Storages` / `CDNs` map that contains active nodes. 2) It can start unbonding process for its stake and unlock all tokens according to cluster's terms, i.e. after the `unbond_delay` period is passed. In the current implementation, there is no way to see what nodes decided to leave the cluster, as the absence of a node in `Storages` / `CDNs` map doesn't define the exact node status. It can either do chilling and return back to serving cluster later, or do unbonding and leave the cluster eventually. In the latter case, the protocol needs to remove the node from the cluster after the stake is fully withdrawn. Otherwise, we may have "dead" nodes in the cluster and its topology, that will affect the routing and other aspects of the cluster. ### Solution In this PR I introduced 2 additional maps - `LeavingStorages` and `LeavingCDNs`. These maps contain stakes of nodes that are about to leave the cluster, i.e. nodes that decided to unbond tokens below the `min_bond_size` of this cluster. After the `unbonding_delay` is passed, the node provider can withdraw all its tokens. It will automatically remove his node from the cluster based on `LeavingStorages` / `LeavingCDNs` maps. In the future, `LeavingStorages` / `LeavingCDNs` can be also used to define specific rules applied to leaving nodes during the unbonding period. I tried not to change the existing staking workflow, but extend it with additional storage items and events. So, the existing workflow should not be broken. --- Cargo.lock | 2 + pallets/ddc-clusters/src/lib.rs | 133 ++++++++++++++++++------ pallets/ddc-clusters/src/mock.rs | 8 +- pallets/ddc-clusters/src/tests.rs | 4 +- pallets/ddc-customers/src/mock.rs | 68 +++++++++++- pallets/ddc-nodes/src/lib.rs | 14 ++- pallets/ddc-nodes/src/mock.rs | 18 ++++ pallets/ddc-staking/Cargo.toml | 2 + pallets/ddc-staking/src/lib.rs | 148 +++++++++++++++++++++------ pallets/ddc-staking/src/mock.rs | 122 ++++++++++++++++++++-- pallets/ddc-staking/src/tests.rs | 165 +++++++++++++++++++++++++++++- primitives/src/lib.rs | 11 ++ runtime/cere-dev/src/lib.rs | 2 + traits/src/cluster.rs | 28 ++++- traits/src/node.rs | 1 + traits/src/staking.rs | 6 +- 16 files changed, 648 insertions(+), 84 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6490578d0..23c3fb341 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4836,9 +4836,11 @@ dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "lazy_static", "pallet-balances", "pallet-timestamp", "parity-scale-codec", + "parking_lot 0.12.1", "scale-info", "sp-core", "sp-io", diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 14e177f15..576f5ba38 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -25,7 +25,8 @@ use crate::{ node_provider_auth::{NodeProviderAuthContract, NodeProviderAuthContractError}, }; use ddc_primitives::{ - ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, NodePubKey, NodeType, + ClusterBondingParams, ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, + NodePubKey, NodeType, }; use ddc_traits::{ cluster::{ClusterCreator, ClusterVisitor, ClusterVisitorError}, @@ -51,6 +52,7 @@ pub type BalanceOf = #[frame_support::pallet] pub mod pallet { use super::*; + use ddc_traits::cluster::{ClusterManager, ClusterManagerError}; use pallet_contracts::chain_extension::UncheckedFrom; #[pallet::pallet] @@ -82,12 +84,12 @@ pub mod pallet { ClusterDoesNotExist, ClusterParamsExceedsLimit, AttemptToAddNonExistentNode, + AttemptToAddAlreadyAssignedNode, AttemptToRemoveNonExistentNode, - NodeIsAlreadyAssigned, - NodeIsNotAssigned, + AttemptToRemoveNotAssignedNode, OnlyClusterManager, NodeIsNotAuthorized, - NodeHasNoStake, + NodeHasNoActivatedStake, NodeStakeIsInvalid, /// Cluster candidate should not plan to chill. NodeChillingIsProhibited, @@ -149,28 +151,30 @@ pub mod pallet { let caller_id = ensure_signed(origin)?; let cluster = Clusters::::try_get(cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; - ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); - // Node with this node with this public key exists. - let mut node = T::NodeRepository::get(node_pub_key.clone()) - .map_err(|_| Error::::AttemptToAddNonExistentNode)?; - ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAlreadyAssigned); + ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); // Sufficient funds are locked at the DDC Staking module. - let has_stake = T::StakingVisitor::node_has_stake(&node_pub_key, &cluster_id) - .map_err(Into::>::into)?; - ensure!(has_stake, Error::::NodeHasNoStake); + let has_activated_stake = + T::StakingVisitor::has_activated_stake(&node_pub_key, &cluster_id) + .map_err(Into::>::into)?; + ensure!(has_activated_stake, Error::::NodeHasNoActivatedStake); // Candidate is not planning to pause operations any time soon. - let is_chilling = T::StakingVisitor::node_is_chilling(&node_pub_key) + let has_chilling_attempt = T::StakingVisitor::has_chilling_attempt(&node_pub_key) .map_err(Into::>::into)?; - ensure!(!is_chilling, Error::::NodeChillingIsProhibited); + ensure!(!has_chilling_attempt, Error::::NodeChillingIsProhibited); // Cluster extension smart contract allows joining. let auth_contract = NodeProviderAuthContract::::new( cluster.props.node_provider_auth_contract, caller_id, ); + + // Node with this node with this public key exists. + let node = T::NodeRepository::get(node_pub_key.clone()) + .map_err(|_| Error::::AttemptToAddNonExistentNode)?; + let is_authorized = auth_contract .is_authorized( node.get_provider_id().to_owned(), @@ -181,9 +185,8 @@ pub mod pallet { ensure!(is_authorized, Error::::NodeIsNotAuthorized); // Add node to the cluster. - node.set_cluster_id(Some(cluster_id)); - T::NodeRepository::update(node).map_err(|_| Error::::AttemptToAddNonExistentNode)?; - ClustersNodes::::insert(cluster_id, node_pub_key.clone(), true); + >::add_node(&cluster_id, &node_pub_key) + .map_err(Into::>::into)?; Self::deposit_event(Event::::ClusterNodeAdded { cluster_id, node_pub_key }); Ok(()) @@ -198,14 +201,12 @@ pub mod pallet { let caller_id = ensure_signed(origin)?; let cluster = Clusters::::try_get(cluster_id).map_err(|_| Error::::ClusterDoesNotExist)?; + ensure!(cluster.manager_id == caller_id, Error::::OnlyClusterManager); - let mut node = T::NodeRepository::get(node_pub_key.clone()) - .map_err(|_| Error::::AttemptToRemoveNonExistentNode)?; - ensure!(node.get_cluster_id() == &Some(cluster_id), Error::::NodeIsNotAssigned); - node.set_cluster_id(None); - T::NodeRepository::update(node) - .map_err(|_| Error::::AttemptToRemoveNonExistentNode)?; - ClustersNodes::::remove(cluster_id, node_pub_key.clone()); + + // Remove node from the cluster. + >::remove_node(&cluster_id, &node_pub_key) + .map_err(Into::>::into)?; Self::deposit_event(Event::::ClusterNodeRemoved { cluster_id, node_pub_key }); Ok(()) @@ -268,10 +269,6 @@ pub mod pallet { } impl ClusterVisitor for Pallet { - fn cluster_has_node(cluster_id: &ClusterId, node_pub_key: &NodePubKey) -> bool { - ClustersNodes::::get(cluster_id, node_pub_key).is_some() - } - fn ensure_cluster(cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { Clusters::::get(cluster_id) .map(|_| ()) @@ -327,6 +324,69 @@ pub mod pallet { NodeType::CDN => Ok(cluster_gov_params.cdn_unbonding_delay), } } + + fn get_bonding_params( + cluster_id: &ClusterId, + ) -> Result, ClusterVisitorError> { + let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) + .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; + Ok(ClusterBondingParams { + cdn_bond_size: cluster_gov_params.cdn_bond_size.saturated_into::(), + cdn_chill_delay: cluster_gov_params.cdn_chill_delay, + cdn_unbonding_delay: cluster_gov_params.cdn_unbonding_delay, + storage_bond_size: cluster_gov_params.storage_bond_size.saturated_into::(), + storage_chill_delay: cluster_gov_params.storage_chill_delay, + storage_unbonding_delay: cluster_gov_params.storage_unbonding_delay, + }) + } + } + + impl ClusterManager for Pallet { + fn contains_node(cluster_id: &ClusterId, node_pub_key: &NodePubKey) -> bool { + ClustersNodes::::get(cluster_id, node_pub_key).is_some() + } + + fn add_node( + cluster_id: &ClusterId, + node_pub_key: &NodePubKey, + ) -> Result<(), ClusterManagerError> { + let mut node = T::NodeRepository::get(node_pub_key.clone()) + .map_err(|_| ClusterManagerError::AttemptToAddNonExistentNode)?; + + ensure!( + node.get_cluster_id().is_none(), + ClusterManagerError::AttemptToAddAlreadyAssignedNode + ); + + node.set_cluster_id(Some(*cluster_id)); + T::NodeRepository::update(node) + .map_err(|_| ClusterManagerError::AttemptToAddNonExistentNode)?; + + ClustersNodes::::insert(cluster_id, node_pub_key.clone(), true); + + Ok(()) + } + + fn remove_node( + cluster_id: &ClusterId, + node_pub_key: &NodePubKey, + ) -> Result<(), ClusterManagerError> { + let mut node = T::NodeRepository::get(node_pub_key.clone()) + .map_err(|_| ClusterManagerError::AttemptToRemoveNonExistentNode)?; + + ensure!( + node.get_cluster_id() == &Some(*cluster_id), + ClusterManagerError::AttemptToRemoveNotAssignedNode + ); + + node.set_cluster_id(None); + T::NodeRepository::update(node) + .map_err(|_| ClusterManagerError::AttemptToRemoveNonExistentNode)?; + + ClustersNodes::::remove(cluster_id, node_pub_key.clone()); + + Ok(()) + } } impl ClusterCreator> for Pallet @@ -353,7 +413,7 @@ pub mod pallet { impl From for Error { fn from(error: StakingVisitorError) -> Self { match error { - StakingVisitorError::NodeStakeDoesNotExist => Error::::NodeHasNoStake, + StakingVisitorError::NodeStakeDoesNotExist => Error::::NodeHasNoActivatedStake, StakingVisitorError::NodeStakeIsInBadState => Error::::NodeStakeIsInvalid, } } @@ -367,4 +427,19 @@ pub mod pallet { } } } + + impl From for Error { + fn from(error: ClusterManagerError) -> Self { + match error { + ClusterManagerError::AttemptToRemoveNotAssignedNode => + Error::::AttemptToRemoveNotAssignedNode, + ClusterManagerError::AttemptToRemoveNonExistentNode => + Error::::AttemptToRemoveNonExistentNode, + ClusterManagerError::AttemptToAddNonExistentNode => + Error::::AttemptToAddNonExistentNode, + ClusterManagerError::AttemptToAddAlreadyAssignedNode => + Error::::AttemptToAddAlreadyAssignedNode, + } + } + } } diff --git a/pallets/ddc-clusters/src/mock.rs b/pallets/ddc-clusters/src/mock.rs index f7f9840bc..a69fc350c 100644 --- a/pallets/ddc-clusters/src/mock.rs +++ b/pallets/ddc-clusters/src/mock.rs @@ -180,6 +180,7 @@ impl pallet_timestamp::Config for Test { impl pallet_ddc_nodes::Config for Test { type RuntimeEvent = RuntimeEvent; + type StakingVisitor = TestStakingVisitor; } impl crate::pallet::Config for Test { @@ -193,13 +194,16 @@ pub(crate) type DdcStakingCall = crate::Call; pub(crate) type TestRuntimeCall = ::RuntimeCall; pub struct TestStakingVisitor; impl StakingVisitor for TestStakingVisitor { - fn node_has_stake( + fn has_activated_stake( _node_pub_key: &NodePubKey, _cluster_id: &ClusterId, ) -> Result { Ok(true) } - fn node_is_chilling(_node_pub_key: &NodePubKey) -> Result { + fn has_stake(_node_pub_key: &NodePubKey) -> bool { + true + } + fn has_chilling_attempt(_node_pub_key: &NodePubKey) -> Result { Ok(false) } } diff --git a/pallets/ddc-clusters/src/tests.rs b/pallets/ddc-clusters/src/tests.rs index 74c80643a..ae0b96ae2 100644 --- a/pallets/ddc-clusters/src/tests.rs +++ b/pallets/ddc-clusters/src/tests.rs @@ -183,7 +183,7 @@ fn add_and_delete_node_works() { ClusterId::from([1; 20]), NodePubKey::CDNPubKey(AccountId::from([4; 32])), ), - Error::::NodeIsAlreadyAssigned + Error::::AttemptToAddAlreadyAssignedNode ); // Checking that event was emitted @@ -218,7 +218,7 @@ fn add_and_delete_node_works() { ClusterId::from([1; 20]), NodePubKey::CDNPubKey(AccountId::from([4; 32])), ), - Error::::NodeIsNotAssigned + Error::::AttemptToRemoveNotAssignedNode ); pub const CTOR_SELECTOR: [u8; 4] = hex!("9bae9d5e"); diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index 5f1b090a3..3031c2a72 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -2,9 +2,12 @@ use crate::{self as pallet_ddc_customers, *}; use ddc_primitives::{ - ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, NodePubKey, NodeType, + ClusterBondingParams, ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, + NodePubKey, NodeType, +}; +use ddc_traits::cluster::{ + ClusterCreator, ClusterManager, ClusterManagerError, ClusterVisitor, ClusterVisitorError, }; -use ddc_traits::cluster::{ClusterCreator, ClusterVisitor, ClusterVisitorError}; use frame_support::{ construct_runtime, parameter_types, @@ -109,9 +112,6 @@ impl crate::pallet::Config for Test { pub struct TestClusterVisitor; impl ClusterVisitor for TestClusterVisitor { - fn cluster_has_node(_cluster_id: &ClusterId, _node_pub_key: &NodePubKey) -> bool { - true - } fn ensure_cluster(_cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { Ok(()) } @@ -144,6 +144,64 @@ impl ClusterVisitor for TestClusterVisitor { unit_per_get_request: 4, }) } + + fn get_bonding_params( + cluster_id: &ClusterId, + ) -> Result, ClusterVisitorError> { + Ok(ClusterBondingParams { + cdn_bond_size: >::get_bond_size( + cluster_id, + NodeType::CDN, + ) + .unwrap_or_default(), + cdn_chill_delay: >::get_chill_delay( + cluster_id, + NodeType::CDN, + ) + .unwrap_or_default(), + cdn_unbonding_delay: >::get_unbonding_delay( + cluster_id, + NodeType::CDN, + ) + .unwrap_or_default(), + storage_bond_size: >::get_bond_size( + cluster_id, + NodeType::Storage, + ) + .unwrap_or_default(), + storage_chill_delay: >::get_chill_delay( + cluster_id, + NodeType::Storage, + ) + .unwrap_or_default(), + storage_unbonding_delay: + >::get_unbonding_delay( + cluster_id, + NodeType::Storage, + ) + .unwrap_or_default(), + }) + } +} + +pub struct TestClusterManager; +impl ClusterManager for TestClusterManager { + fn contains_node(_cluster_id: &ClusterId, _node_pub_key: &NodePubKey) -> bool { + true + } + fn add_node( + _cluster_id: &ClusterId, + _node_pub_key: &NodePubKey, + ) -> Result<(), ClusterManagerError> { + Ok(()) + } + + fn remove_node( + _cluster_id: &ClusterId, + _node_pub_key: &NodePubKey, + ) -> Result<(), ClusterManagerError> { + Ok(()) + } } pub struct TestClusterCreator; diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index f18d724b7..4cea30ea7 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -20,7 +20,11 @@ pub(crate) mod mock; mod tests; use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey, StorageNodePubKey}; -use ddc_traits::node::{NodeVisitor, NodeVisitorError}; +use ddc_traits::{ + node::{NodeVisitor, NodeVisitorError}, + staking::StakingVisitor, +}; + use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; use sp_std::prelude::*; @@ -48,6 +52,7 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config { type RuntimeEvent: From> + IsType<::RuntimeEvent>; + type StakingVisitor: StakingVisitor; } #[pallet::event] @@ -68,6 +73,7 @@ pub mod pallet { OnlyNodeProvider, NodeIsAssignedToCluster, HostLenExceedsLimit, + NodeHasDanglingStake, } #[pallet::storage] @@ -101,6 +107,8 @@ pub mod pallet { let node = Self::get(node_pub_key.clone()).map_err(Into::>::into)?; ensure!(node.get_provider_id() == &caller_id, Error::::OnlyNodeProvider); ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAssignedToCluster); + let has_stake = T::StakingVisitor::has_stake(&node_pub_key); + ensure!(!has_stake, Error::::NodeHasDanglingStake); Self::delete(node_pub_key.clone()).map_err(Into::>::into)?; Self::deposit_event(Event::::NodeDeleted { node_pub_key }); Ok(()) @@ -220,5 +228,9 @@ pub mod pallet { Self::get(node_pub_key.clone()).map_err(|_| NodeVisitorError::NodeDoesNotExist)?; Ok(*node.get_cluster_id()) } + + fn exists(node_pub_key: &NodePubKey) -> bool { + Self::get(node_pub_key.clone()).is_ok() + } } } diff --git a/pallets/ddc-nodes/src/mock.rs b/pallets/ddc-nodes/src/mock.rs index 18377ac58..30cf49869 100644 --- a/pallets/ddc-nodes/src/mock.rs +++ b/pallets/ddc-nodes/src/mock.rs @@ -3,6 +3,7 @@ #![allow(dead_code)] use crate::{self as pallet_ddc_nodes, *}; +use ddc_traits::staking::{StakingVisitor, StakingVisitorError}; use frame_support::{ construct_runtime, parameter_types, traits::{ConstU32, ConstU64, Everything}, @@ -90,6 +91,23 @@ impl pallet_timestamp::Config for Test { impl crate::pallet::Config for Test { type RuntimeEvent = RuntimeEvent; + type StakingVisitor = TestStakingVisitor; +} + +pub struct TestStakingVisitor; +impl StakingVisitor for TestStakingVisitor { + fn has_activated_stake( + _node_pub_key: &NodePubKey, + _cluster_id: &ClusterId, + ) -> Result { + Ok(false) + } + fn has_stake(_node_pub_key: &NodePubKey) -> bool { + false + } + fn has_chilling_attempt(_node_pub_key: &NodePubKey) -> Result { + Ok(false) + } } pub(crate) type TestRuntimeCall = ::RuntimeCall; diff --git a/pallets/ddc-staking/Cargo.toml b/pallets/ddc-staking/Cargo.toml index 9a4b5d0da..0b4a64f1f 100644 --- a/pallets/ddc-staking/Cargo.toml +++ b/pallets/ddc-staking/Cargo.toml @@ -16,8 +16,10 @@ sp-runtime = { default-features = false, git = "https://github.com/paritytech/su sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [dev-dependencies] +lazy_static = "1.4.0" pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +parking_lot = "0.12.1" sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index dede22dd8..d32059d0f 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -151,6 +151,8 @@ impl< #[frame_support::pallet] pub mod pallet { + use ddc_traits::{cluster::ClusterManager, node::NodeVisitorError}; + use super::*; #[pallet::pallet] @@ -169,6 +171,8 @@ pub mod pallet { type ClusterVisitor: ClusterVisitor; + type ClusterManager: ClusterManager; + type NodeVisitor: NodeVisitor; } @@ -205,6 +209,16 @@ pub mod pallet { #[pallet::getter(fn providers)] pub type Providers = StorageMap<_, Twox64Concat, T::AccountId, NodePubKey>; + /// Map of Storage node provider stash accounts that aim to leave a cluster + #[pallet::storage] + #[pallet::getter(fn leaving_storages)] + pub type LeavingStorages = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; + + // Map of CDN node provider stash accounts that aim to leave a cluster + #[pallet::storage] + #[pallet::getter(fn leaving_cdns)] + pub type LeavingCDNs = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; + #[pallet::genesis_config] pub struct GenesisConfig { #[allow(clippy::type_complexity)] @@ -283,6 +297,12 @@ pub mod pallet { /// An account that started participating as either a storage network or CDN participant. /// \[stash\] Activated(T::AccountId), + /// An account that started unbonding tokens below the minimum value set for the cluster + /// his CDN or Storage node is assigned to \[stash\] + LeaveSoon(T::AccountId), + /// An account that unbonded tokens below the minimum value set for the cluster his + /// CDN or Storage node was assigned to \[stash\] + Left(T::AccountId), } #[pallet::error] @@ -312,6 +332,8 @@ pub mod pallet { NotNodeController, /// No stake found associated with the provided node. NodeHasNoStake, + /// No cluster found + NoCluster, /// No cluster governance params found for cluster NoClusterGovParams, /// Conditions for fast chill are not met, try the regular `chill` from @@ -324,6 +346,11 @@ pub mod pallet { ArithmeticOverflow, /// Arithmetic underflow occurred ArithmeticUnderflow, + /// Attempt to associate stake with non-existing node + NodeIsNotFound, + /// Action is prohibited for a node provider stash account that is in the process of + /// leaving a cluster + NodeIsLeaving, } #[pallet::call] @@ -365,6 +392,9 @@ pub mod pallet { Err(Error::::AlreadyPaired)? } + // Checks that the node is registered in the network + ensure!(T::NodeVisitor::exists(&node), Error::::NodeIsNotFound); + frame_system::Pallet::::inc_consumers(&stash).map_err(|_| Error::::BadState)?; Nodes::::insert(&node, &stash); @@ -414,6 +444,7 @@ pub mod pallet { ) -> DispatchResult { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; + ensure!( ledger.unlocking.len() < MaxUnlockingChunks::get() as usize, Error::::NoMoreChunks, @@ -442,6 +473,8 @@ pub mod pallet { .map_err(Into::>::into)?; bond_size.saturated_into::>() } else { + // If node is not assigned to a cluster or node is chilling, allow to unbond + // any available amount. Zero::zero() }; @@ -449,36 +482,50 @@ pub mod pallet { // cluster. If a user runs into this error, they should chill first. ensure!(ledger.active >= min_active_bond, Error::::InsufficientBond); - let unbonding_delay_in_blocks = if let Some(cluster_id) = Self::cdns(&ledger.stash) - { - T::ClusterVisitor::get_unbonding_delay(&cluster_id, NodeType::CDN) - .map_err(Into::>::into)? - } else if let Some(cluster_id) = Self::storages(&ledger.stash) { - T::ClusterVisitor::get_unbonding_delay(&cluster_id, NodeType::Storage) - .map_err(Into::>::into)? - } else { - let node_pub_key = - >::get(&ledger.stash).ok_or(Error::::BadState)?; + let node_pub_key = + >::get(&ledger.stash).ok_or(Error::::BadState)?; + + let unbonding_delay = if T::NodeVisitor::exists(&node_pub_key) { + let node_cluster_id = T::NodeVisitor::get_cluster_id(&node_pub_key) + .map_err(Into::>::into)?; + + if let Some(cluster_id) = node_cluster_id { + let bonding_params = T::ClusterVisitor::get_bonding_params(&cluster_id) + .map_err(Into::>::into)?; + + let min_bond_size = match node_pub_key { + NodePubKey::CDNPubKey(_) => bonding_params.cdn_bond_size, + NodePubKey::StoragePubKey(_) => bonding_params.storage_bond_size, + }; + + // If provider is trying to unbond after chilling and aims to leave the + // cluster eventually, we keep its stake till the end of unbonding period. + if ledger.active < min_bond_size.saturated_into::>() { + match node_pub_key { + NodePubKey::CDNPubKey(_) => + LeavingCDNs::::insert(ledger.stash.clone(), cluster_id), + NodePubKey::StoragePubKey(_) => + LeavingStorages::::insert(ledger.stash.clone(), cluster_id), + }; + + Self::deposit_event(Event::::LeaveSoon(ledger.stash.clone())); + }; - if let Ok(Some(cluster_id)) = T::NodeVisitor::get_cluster_id(&node_pub_key) { match node_pub_key { - NodePubKey::CDNPubKey(_) => - T::ClusterVisitor::get_unbonding_delay(&cluster_id, NodeType::CDN) - .map_err(Into::>::into)?, - NodePubKey::StoragePubKey(_) => T::ClusterVisitor::get_unbonding_delay( - &cluster_id, - NodeType::Storage, - ) - .map_err(Into::>::into)?, + NodePubKey::CDNPubKey(_) => bonding_params.cdn_unbonding_delay, + NodePubKey::StoragePubKey(_) => bonding_params.storage_unbonding_delay, } } else { // If node is not a member of any cluster, allow immediate unbonding. T::BlockNumber::from(0u32) } + } else { + // If node was deleted, allow immediate unbonding. + T::BlockNumber::from(0u32) }; // block number + configuration -> no overflow - let block = >::block_number() + unbonding_delay_in_blocks; + let block = >::block_number() + unbonding_delay; if let Some(chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.block == block) { @@ -515,6 +562,7 @@ pub mod pallet { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; let (stash, old_total) = (ledger.stash.clone(), ledger.total); + let node_pub_key = >::get(stash.clone()).ok_or(Error::::BadState)?; ledger = ledger.consolidate_unlocked(>::block_number()); @@ -536,7 +584,22 @@ pub mod pallet { // Already checked that this won't overflow by entry condition. let value = old_total.checked_sub(&ledger.total).ok_or(Error::::ArithmeticUnderflow)?; - Self::deposit_event(Event::::Withdrawn(stash, value)); + Self::deposit_event(Event::::Withdrawn(stash.clone(), value)); + + // If provider aimed to leave the cluster and the unbonding period ends, remove + // the node from the cluster + if let Some(cluster_id) = + >::get(&stash).or_else(|| >::get(&stash)) + { + // Cluster manager could remove the node from cluster by this moment already, so + // it is ok to ignore result. + let _ = T::ClusterManager::remove_node(&cluster_id, &node_pub_key); + + >::remove(&stash); + >::remove(&stash); + + Self::deposit_event(Event::::Left(stash)); + } } Ok(()) @@ -583,6 +646,10 @@ pub mod pallet { // Cancel previous "chill" attempts Self::reset_chilling(&controller); return Ok(()) + } else { + // Can't participate in new CDN network if provider hasn't left the previous cluster + // yet + ensure!(!LeavingCDNs::::contains_key(stash), Error::::NodeIsLeaving); } Self::do_add_cdn(stash, cluster_id); @@ -631,6 +698,10 @@ pub mod pallet { // Cancel previous "chill" attempts Self::reset_chilling(&controller); return Ok(()) + } else { + // Can't participate in new Storage network if provider hasn't left the previous + // cluster yet + ensure!(!LeavingStorages::::contains_key(stash), Error::::NodeIsLeaving); } Self::do_add_storage(stash, cluster_id); @@ -671,7 +742,7 @@ pub mod pallet { .map_err(Into::>::into)?; (cluster, chill_delay) } else { - return Ok(()) // already chilled + return Ok(()) // node is already chilling or leaving the cluster }; if delay == T::BlockNumber::from(0u32) { @@ -751,6 +822,11 @@ pub mod pallet { ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); + // Ensure that provider is not about leaving the cluster as it may cause the removal + // of an unexpected node after unbonding. + ensure!(!>::contains_key(&stash), Error::::NodeIsLeaving); + ensure!(!>::contains_key(&stash), Error::::NodeIsLeaving); + >::insert(new_node.clone(), stash.clone()); >::insert(stash, new_node); @@ -773,7 +849,7 @@ pub mod pallet { .or_else(|| >::get(&stash)) .ok_or(Error::::NodeHasNoStake)?; - let is_cluster_node = T::ClusterVisitor::cluster_has_node(&cluster_id, &node_pub_key); + let is_cluster_node = T::ClusterManager::contains_node(&cluster_id, &node_pub_key); ensure!(!is_cluster_node, Error::::FastChillProhibited); // block number + 1 => no overflow @@ -890,7 +966,7 @@ pub mod pallet { } impl StakingVisitor for Pallet { - fn node_has_stake( + fn has_activated_stake( node_pub_key: &NodePubKey, cluster_id: &ClusterId, ) -> Result { @@ -899,34 +975,46 @@ pub mod pallet { let maybe_cdn_in_cluster = CDNs::::get(&stash); let maybe_storage_in_cluster = Storages::::get(&stash); - let has_stake: bool = maybe_cdn_in_cluster + let has_activated_stake: bool = maybe_cdn_in_cluster .or(maybe_storage_in_cluster) .is_some_and(|staking_cluster| staking_cluster == *cluster_id); - Ok(has_stake) + Ok(has_activated_stake) + } + + fn has_stake(node_pub_key: &NodePubKey) -> bool { + >::get(node_pub_key).is_some() } - fn node_is_chilling(node_pub_key: &NodePubKey) -> Result { + fn has_chilling_attempt(node_pub_key: &NodePubKey) -> Result { let stash = >::get(node_pub_key).ok_or(StakingVisitorError::NodeStakeDoesNotExist)?; let controller = >::get(&stash).ok_or(StakingVisitorError::NodeStakeIsInBadState)?; - let is_chilling = >::get(&controller) + let is_chilling_attempt = >::get(&controller) .ok_or(StakingVisitorError::NodeStakeIsInBadState)? .chilling .is_some(); - Ok(is_chilling) + Ok(is_chilling_attempt) } } impl From for Error { fn from(error: ClusterVisitorError) -> Self { match error { - ClusterVisitorError::ClusterDoesNotExist => Error::::NodeHasNoStake, + ClusterVisitorError::ClusterDoesNotExist => Error::::NoCluster, ClusterVisitorError::ClusterGovParamsNotSet => Error::::NoClusterGovParams, } } } + + impl From for Error { + fn from(error: NodeVisitorError) -> Self { + match error { + NodeVisitorError::NodeDoesNotExist => Error::::NodeIsNotFound, + } + } + } } diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index a047f30c1..a2f2d6af2 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -3,9 +3,11 @@ #![allow(dead_code)] use crate::{self as pallet_ddc_staking, *}; -use ddc_primitives::{CDNNodePubKey, ClusterPricingParams, StorageNodePubKey}; +use ddc_primitives::{ + CDNNodePubKey, ClusterBondingParams, ClusterPricingParams, StorageNodePubKey, +}; use ddc_traits::{ - cluster::{ClusterVisitor, ClusterVisitorError}, + cluster::{ClusterManager, ClusterManagerError, ClusterVisitor, ClusterVisitorError}, node::{NodeVisitor, NodeVisitorError}, }; @@ -15,6 +17,8 @@ use frame_support::{ weights::constants::RocksDbWeight, }; use frame_system::mocking::{MockBlock, MockUncheckedExtrinsic}; +use lazy_static::lazy_static; +use parking_lot::{ReentrantMutex, ReentrantMutexGuard}; use sp_core::H256; use sp_io::TestExternalities; use sp_runtime::{ @@ -22,6 +26,7 @@ use sp_runtime::{ traits::{BlakeTwo256, IdentityLookup}, }; use sp_std::collections::btree_map::BTreeMap; +use std::cell::RefCell; /// The AccountId alias in this test module. pub(crate) type AccountId = u64; @@ -100,16 +105,14 @@ impl crate::pallet::Config for Test { type RuntimeEvent = RuntimeEvent; type WeightInfo = (); type ClusterVisitor = TestClusterVisitor; - type NodeVisitor = TestNodeVisitor; + type ClusterManager = TestClusterManager; + type NodeVisitor = MockNodeVisitor; } pub(crate) type DdcStakingCall = crate::Call; pub(crate) type TestRuntimeCall = ::RuntimeCall; pub struct TestClusterVisitor; impl ClusterVisitor for TestClusterVisitor { - fn cluster_has_node(_cluster_id: &ClusterId, _node_pub_key: &NodePubKey) -> bool { - true - } fn ensure_cluster(_cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { Ok(()) } @@ -142,12 +145,113 @@ impl ClusterVisitor for TestClusterVisitor { unit_per_get_request: 5, }) } + + fn get_bonding_params( + cluster_id: &ClusterId, + ) -> Result, ClusterVisitorError> { + Ok(ClusterBondingParams { + cdn_bond_size: >::get_bond_size( + cluster_id, + NodeType::CDN, + ) + .unwrap_or_default(), + cdn_chill_delay: >::get_chill_delay( + cluster_id, + NodeType::CDN, + ) + .unwrap_or_default(), + cdn_unbonding_delay: >::get_unbonding_delay( + cluster_id, + NodeType::CDN, + ) + .unwrap_or_default(), + storage_bond_size: >::get_bond_size( + cluster_id, + NodeType::Storage, + ) + .unwrap_or_default(), + storage_chill_delay: >::get_chill_delay( + cluster_id, + NodeType::Storage, + ) + .unwrap_or_default(), + storage_unbonding_delay: + >::get_unbonding_delay( + cluster_id, + NodeType::Storage, + ) + .unwrap_or_default(), + }) + } } -pub struct TestNodeVisitor; -impl NodeVisitor for TestNodeVisitor { +pub struct TestClusterManager; +impl ClusterManager for TestClusterManager { + fn contains_node(_cluster_id: &ClusterId, _node_pub_key: &NodePubKey) -> bool { + true + } + + fn add_node( + _cluster_id: &ClusterId, + _node_pub_key: &NodePubKey, + ) -> Result<(), ClusterManagerError> { + Ok(()) + } + + fn remove_node( + _cluster_id: &ClusterId, + _node_pub_key: &NodePubKey, + ) -> Result<(), ClusterManagerError> { + Ok(()) + } +} + +lazy_static! { + // We have to use the ReentrantMutex as every test's thread that needs to perform some configuration on the mock acquires the lock at least 2 times: + // the first time when the mock configuration happens, and + // the second time when the pallet calls the MockNodeVisitor during execution + static ref MOCK_NODE: ReentrantMutex> = + ReentrantMutex::new(RefCell::new(MockNode::default())); +} + +pub struct MockNode { + pub cluster_id: Option, + pub exists: bool, +} + +impl Default for MockNode { + fn default() -> Self { + Self { cluster_id: None, exists: true } + } +} + +pub struct MockNodeVisitor; + +impl MockNodeVisitor { + // Every test's thread must hold the lock till the end of its test + pub fn set_and_hold_lock(mock: MockNode) -> ReentrantMutexGuard<'static, RefCell> { + let lock = MOCK_NODE.lock(); + *lock.borrow_mut() = mock; + lock + } + + // Every test's thread must release the lock that it previously acquired in the end of its + // test + pub fn reset_and_release_lock(lock: ReentrantMutexGuard<'static, RefCell>) { + *lock.borrow_mut() = MockNode::default(); + } +} + +impl NodeVisitor for MockNodeVisitor { fn get_cluster_id(_node_pub_key: &NodePubKey) -> Result, NodeVisitorError> { - Ok(None) + let lock = MOCK_NODE.lock(); + let mock_ref = lock.borrow(); + Ok(mock_ref.cluster_id) + } + fn exists(_node_pub_key: &NodePubKey) -> bool { + let lock = MOCK_NODE.lock(); + let mock_ref = lock.borrow(); + mock_ref.exists } } diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index d0756f3d4..c38b36cda 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -1,7 +1,7 @@ //! Tests for the module. use super::{mock::*, *}; -use ddc_primitives::CDNNodePubKey; +use ddc_primitives::{CDNNodePubKey, StorageNodePubKey}; use frame_support::{assert_noop, assert_ok, traits::ReservableCurrency}; use pallet_balances::Error as BalancesError; @@ -290,3 +290,166 @@ fn staking_should_work() { assert_eq!(DdcStaking::cdns(3), None); }); } + +#[test] +fn cdn_full_unbonding_works() { + ExtBuilder::default().build_and_execute(|| { + System::set_block_number(1); + + let provider_stash: u64 = 1; + let provider_controller: u64 = 2; + let cluster_id = ClusterId::from([1; 20]); + let node_pub_key = NodePubKey::CDNPubKey(CDNNodePubKey::new([1; 32])); + + let lock = MockNodeVisitor::set_and_hold_lock(MockNode { + cluster_id: Some(cluster_id), + exists: true, + }); + + let cdn_bond_size = 10_u128; + let cdn_chill_delay = 10_u64; + let cdn_unbond_delay = 10_u64; + + // Put some money in account that we'll use. + let _ = Balances::make_free_balance_be(&provider_controller, 2000); + let _ = Balances::make_free_balance_be(&provider_stash, 2000); + + // Add new CDN participant, account 1 controlled by 2 with node 1. + assert_ok!(DdcStaking::bond( + RuntimeOrigin::signed(provider_stash), + provider_controller, + node_pub_key.clone(), + cdn_bond_size, // min bond size + )); + System::assert_last_event(Event::Bonded(provider_stash, cdn_bond_size).into()); + assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(provider_controller), cluster_id)); + System::assert_last_event(Event::Activated(provider_stash).into()); + + assert_eq!(DdcStaking::cdns(provider_stash), Some(cluster_id)); + assert_eq!(DdcStaking::nodes(node_pub_key), Some(provider_stash)); + + // Set block timestamp. + Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); + + // Schedule CDN participant removal. + assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(provider_controller))); + let chilling = System::block_number() + cdn_chill_delay; + System::assert_last_event(Event::ChillSoon(provider_stash, cluster_id, chilling).into()); + + // Set the block number that allows us to chill. + while System::block_number() < chilling { + System::set_block_number(System::block_number() + 1); + Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); + } + + // Actual CDN participant removal. + assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(provider_controller))); + System::assert_last_event(Event::Chilled(provider_stash).into()); + + // Account is no longer a CDN participant. + assert_eq!(DdcStaking::cdns(provider_stash), None); + + // Start unbonding all tokens + assert_ok!(DdcStaking::unbond(RuntimeOrigin::signed(provider_controller), cdn_bond_size)); + System::assert_has_event(Event::LeaveSoon(provider_stash).into()); + assert_eq!(DdcStaking::leaving_cdns(provider_stash), Some(cluster_id)); + System::assert_last_event(Event::Unbonded(provider_stash, cdn_bond_size).into()); + + let unbonding = System::block_number() + cdn_unbond_delay; + // Set the block number that allows us to chill. + while System::block_number() < unbonding { + System::set_block_number(System::block_number() + 1); + Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); + } + + assert_ok!(DdcStaking::withdraw_unbonded(RuntimeOrigin::signed(provider_controller))); + System::assert_has_event(Event::Withdrawn(provider_stash, cdn_bond_size).into()); + assert_eq!(DdcStaking::leaving_cdns(provider_stash), None); + System::assert_last_event(Event::Left(provider_stash).into()); + + MockNodeVisitor::reset_and_release_lock(lock); + }); +} + +#[test] +fn storage_full_unbonding_works() { + ExtBuilder::default().build_and_execute(|| { + System::set_block_number(1); + + let provider_stash: u64 = 3; + let provider_controller: u64 = 4; + let cluster_id = ClusterId::from([1; 20]); + let node_pub_key = NodePubKey::StoragePubKey(StorageNodePubKey::new([2; 32])); + + let lock = MockNodeVisitor::set_and_hold_lock(MockNode { + cluster_id: Some(cluster_id), + exists: true, + }); + + let storage_bond_size = 10_u128; + let storage_chill_delay = 10_u64; + let storage_unbond_delay = 10_u64; + + // Put some money in account that we'll use. + let _ = Balances::make_free_balance_be(&provider_controller, 2000); + let _ = Balances::make_free_balance_be(&provider_stash, 2000); + + // Add new Storage participant, account 1 controlled by 2 with node 1. + assert_ok!(DdcStaking::bond( + RuntimeOrigin::signed(provider_stash), + provider_controller, + node_pub_key.clone(), + storage_bond_size, // min bond size + )); + System::assert_last_event(Event::Bonded(provider_stash, storage_bond_size).into()); + assert_ok!(DdcStaking::store(RuntimeOrigin::signed(provider_controller), cluster_id)); + System::assert_last_event(Event::Activated(provider_stash).into()); + + assert_eq!(DdcStaking::storages(provider_stash), Some(cluster_id)); + assert_eq!(DdcStaking::nodes(node_pub_key), Some(provider_stash)); + + // Set block timestamp. + Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); + + // Schedule Storage participant removal. + assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(provider_controller))); + let chilling = System::block_number() + storage_chill_delay; + System::assert_last_event(Event::ChillSoon(provider_stash, cluster_id, chilling).into()); + + // Set the block number that allows us to chill. + while System::block_number() < chilling { + System::set_block_number(System::block_number() + 1); + Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); + } + + // Actual Storage participant removal. + assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(provider_controller))); + System::assert_last_event(Event::Chilled(provider_stash).into()); + + // Account is no longer a Storage participant. + assert_eq!(DdcStaking::storages(provider_stash), None); + + // Start unbonding all tokens + assert_ok!(DdcStaking::unbond( + RuntimeOrigin::signed(provider_controller), + storage_bond_size + )); + System::assert_has_event(Event::LeaveSoon(provider_stash).into()); + assert_eq!(DdcStaking::leaving_storages(provider_stash), Some(cluster_id)); + System::assert_last_event(Event::Unbonded(provider_stash, storage_bond_size).into()); + + let unbonding = System::block_number() + storage_unbond_delay; + // Set the block number that allows us to chill. + while System::block_number() < unbonding { + System::set_block_number(System::block_number() + 1); + Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); + } + + assert_ok!(DdcStaking::withdraw_unbonded(RuntimeOrigin::signed(provider_controller))); + System::assert_has_event(Event::Withdrawn(provider_stash, storage_bond_size).into()); + assert_eq!(DdcStaking::leaving_storages(provider_stash), None); + System::assert_last_event(Event::Left(provider_stash).into()); + + MockNodeVisitor::reset_and_release_lock(lock); + }); +} diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index da91f0876..b27e7235b 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -6,6 +6,7 @@ use scale_info::TypeInfo; use serde::{Deserialize, Serialize}; use sp_core::hash::H160; use sp_runtime::{AccountId32, Perbill, RuntimeDebug}; + pub type ClusterId = H160; pub type DdcEra = u32; pub type BucketId = u64; @@ -45,6 +46,16 @@ pub struct ClusterPricingParams { pub unit_per_get_request: u128, } +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct ClusterBondingParams { + pub cdn_bond_size: u128, + pub cdn_chill_delay: BlockNumber, + pub cdn_unbonding_delay: BlockNumber, + pub storage_bond_size: u128, + pub storage_chill_delay: BlockNumber, + pub storage_unbonding_delay: BlockNumber, +} + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodePubKey { diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index e71bd8be9..b64b9aaf2 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1328,6 +1328,7 @@ impl pallet_ddc_staking::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; type ClusterVisitor = pallet_ddc_clusters::Pallet; + type ClusterManager = pallet_ddc_clusters::Pallet; type NodeVisitor = pallet_ddc_nodes::Pallet; } @@ -1348,6 +1349,7 @@ impl pallet_ddc_customers::Config for Runtime { impl pallet_ddc_nodes::Config for Runtime { type RuntimeEvent = RuntimeEvent; + type StakingVisitor = pallet_ddc_staking::Pallet; } impl pallet_ddc_clusters::Config for Runtime { diff --git a/traits/src/cluster.rs b/traits/src/cluster.rs index 921d2c0d0..0cf47a1c8 100644 --- a/traits/src/cluster.rs +++ b/traits/src/cluster.rs @@ -1,12 +1,11 @@ use ddc_primitives::{ - ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, NodePubKey, NodeType, + ClusterBondingParams, ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, + NodePubKey, NodeType, }; use frame_support::dispatch::DispatchResult; use frame_system::Config; pub trait ClusterVisitor { - fn cluster_has_node(cluster_id: &ClusterId, node_pub_key: &NodePubKey) -> bool; - fn ensure_cluster(cluster_id: &ClusterId) -> Result<(), ClusterVisitorError>; fn get_bond_size( @@ -27,6 +26,10 @@ pub trait ClusterVisitor { cluster_id: &ClusterId, node_type: NodeType, ) -> Result; + + fn get_bonding_params( + cluster_id: &ClusterId, + ) -> Result, ClusterVisitorError>; } pub trait ClusterCreator { @@ -43,3 +46,22 @@ pub enum ClusterVisitorError { ClusterDoesNotExist, ClusterGovParamsNotSet, } + +pub trait ClusterManager { + fn contains_node(cluster_id: &ClusterId, node_pub_key: &NodePubKey) -> bool; + fn add_node( + cluster_id: &ClusterId, + node_pub_key: &NodePubKey, + ) -> Result<(), ClusterManagerError>; + fn remove_node( + cluster_id: &ClusterId, + node_pub_key: &NodePubKey, + ) -> Result<(), ClusterManagerError>; +} + +pub enum ClusterManagerError { + AttemptToAddNonExistentNode, + AttemptToAddAlreadyAssignedNode, + AttemptToRemoveNotAssignedNode, + AttemptToRemoveNonExistentNode, +} diff --git a/traits/src/node.rs b/traits/src/node.rs index af22b5a8b..0ab55c1d1 100644 --- a/traits/src/node.rs +++ b/traits/src/node.rs @@ -3,6 +3,7 @@ use frame_system::Config; pub trait NodeVisitor { fn get_cluster_id(node_pub_key: &NodePubKey) -> Result, NodeVisitorError>; + fn exists(node_pub_key: &NodePubKey) -> bool; } pub enum NodeVisitorError { diff --git a/traits/src/staking.rs b/traits/src/staking.rs index 5ec1e8bcf..af1a185e2 100644 --- a/traits/src/staking.rs +++ b/traits/src/staking.rs @@ -2,12 +2,14 @@ use ddc_primitives::{ClusterId, NodePubKey}; use frame_system::Config; pub trait StakingVisitor { - fn node_has_stake( + fn has_activated_stake( node_pub_key: &NodePubKey, cluster_id: &ClusterId, ) -> Result; - fn node_is_chilling(node_pub_key: &NodePubKey) -> Result; + fn has_stake(node_pub_key: &NodePubKey) -> bool; + + fn has_chilling_attempt(node_pub_key: &NodePubKey) -> Result; } pub enum StakingVisitorError { From d12295256ce32c1c0a23565aa176caab5488f6f4 Mon Sep 17 00:00:00 2001 From: Raid5594 <52794079+Raid5594@users.noreply.github.com> Date: Thu, 23 Nov 2023 19:27:49 +0100 Subject: [PATCH 545/583] benchmarking & weights for ddc-nodes (#143) 1. add benchmarking 2. add weights --- Cargo.lock | 1 + pallets/ddc-clusters/src/mock.rs | 1 + pallets/ddc-nodes/Cargo.toml | 9 +++ pallets/ddc-nodes/src/benchmarking.rs | 55 +++++++++++++++++ pallets/ddc-nodes/src/lib.rs | 15 ++++- pallets/ddc-nodes/src/mock.rs | 1 + pallets/ddc-nodes/src/testing_utils.rs | 31 ++++++++++ pallets/ddc-nodes/src/weights.rs | 83 ++++++++++++++++++++++++++ runtime/cere-dev/Cargo.toml | 2 + runtime/cere-dev/src/lib.rs | 2 + 10 files changed, 197 insertions(+), 3 deletions(-) create mode 100644 pallets/ddc-nodes/src/benchmarking.rs create mode 100644 pallets/ddc-nodes/src/testing_utils.rs create mode 100644 pallets/ddc-nodes/src/weights.rs diff --git a/Cargo.lock b/Cargo.lock index 23c3fb341..6b341a929 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4791,6 +4791,7 @@ version = "4.8.1" dependencies = [ "ddc-primitives", "ddc-traits", + "frame-benchmarking", "frame-support", "frame-system", "pallet-balances", diff --git a/pallets/ddc-clusters/src/mock.rs b/pallets/ddc-clusters/src/mock.rs index a69fc350c..efbea68fb 100644 --- a/pallets/ddc-clusters/src/mock.rs +++ b/pallets/ddc-clusters/src/mock.rs @@ -181,6 +181,7 @@ impl pallet_timestamp::Config for Test { impl pallet_ddc_nodes::Config for Test { type RuntimeEvent = RuntimeEvent; type StakingVisitor = TestStakingVisitor; + type WeightInfo = (); } impl crate::pallet::Config for Test { diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index ed3d6de36..25afc226f 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } @@ -26,6 +27,7 @@ default = ["std"] std = [ "codec/std", "ddc-primitives/std", + "frame-benchmarking/std", "frame-support/std", "frame-system/std", "scale-info/std", @@ -33,3 +35,10 @@ std = [ "sp-std/std", "sp-core/std", ] +runtime-benchmarks = [ + "ddc-primitives/runtime-benchmarks", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] diff --git a/pallets/ddc-nodes/src/benchmarking.rs b/pallets/ddc-nodes/src/benchmarking.rs new file mode 100644 index 000000000..2a9b2d9e9 --- /dev/null +++ b/pallets/ddc-nodes/src/benchmarking.rs @@ -0,0 +1,55 @@ +//! DdcStaking pallet benchmarking. + +use super::*; +use crate::{cdn_node::CDNNodeProps, Pallet as DdcNodes}; +use ddc_primitives::CDNNodePubKey; +use testing_utils::*; + +use sp_std::prelude::*; + +pub use frame_benchmarking::{ + account, benchmarks, impl_benchmark_test_suite, whitelist_account, whitelisted_caller, +}; +use frame_system::RawOrigin; + +const USER_SEED: u32 = 999666; + +benchmarks! { + create_node { + let (user, node, cdn_node_params, _) = create_user_and_config::("user", USER_SEED); + + whitelist_account!(user); + }: _(RawOrigin::Signed(user.clone()), node, cdn_node_params) + verify { + assert!(CDNNodes::::contains_key(CDNNodePubKey::new([0; 32]))); + } + + delete_node { + let (user, node, cdn_node_params, _) = create_user_and_config::("user", USER_SEED); + + DdcNodes::::create_node(RawOrigin::Signed(user.clone()).into(),node.clone(), cdn_node_params)?; + + whitelist_account!(user); + }: _(RawOrigin::Signed(user.clone()), node) + verify { + assert!(!CDNNodes::::contains_key(CDNNodePubKey::new([0; 32]))); + } + + set_node_params { + let (user, node, cdn_node_params, cdn_node_params_new) = create_user_and_config::("user", USER_SEED); + + DdcNodes::::create_node(RawOrigin::Signed(user.clone()).into(),node.clone(), cdn_node_params)?; + + whitelist_account!(user); + }: _(RawOrigin::Signed(user.clone()), node, cdn_node_params_new) + verify { + assert_eq!(CDNNodes::::try_get( + CDNNodePubKey::new([0; 32])).unwrap().props, + CDNNodeProps { + host: vec![2u8, 255].try_into().unwrap(), + http_port: 45000u16, + grpc_port: 55000u16, + p2p_port: 65000u16, + }); + } +} diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 4cea30ea7..59b40e8ed 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -19,6 +19,14 @@ pub(crate) mod mock; #[cfg(test)] mod tests; +pub mod weights; +use crate::weights::WeightInfo; + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarking; +#[cfg(any(feature = "runtime-benchmarks", test))] +pub mod testing_utils; + use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey, StorageNodePubKey}; use ddc_traits::{ node::{NodeVisitor, NodeVisitorError}, @@ -53,6 +61,7 @@ pub mod pallet { pub trait Config: frame_system::Config { type RuntimeEvent: From> + IsType<::RuntimeEvent>; type StakingVisitor: StakingVisitor; + type WeightInfo: WeightInfo; } #[pallet::event] @@ -87,7 +96,7 @@ pub mod pallet { #[pallet::call] impl Pallet { - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::create_node())] pub fn create_node( origin: OriginFor, node_pub_key: NodePubKey, @@ -101,7 +110,7 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::delete_node())] pub fn delete_node(origin: OriginFor, node_pub_key: NodePubKey) -> DispatchResult { let caller_id = ensure_signed(origin)?; let node = Self::get(node_pub_key.clone()).map_err(Into::>::into)?; @@ -114,7 +123,7 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::set_node_params())] pub fn set_node_params( origin: OriginFor, node_pub_key: NodePubKey, diff --git a/pallets/ddc-nodes/src/mock.rs b/pallets/ddc-nodes/src/mock.rs index 30cf49869..419fab3d0 100644 --- a/pallets/ddc-nodes/src/mock.rs +++ b/pallets/ddc-nodes/src/mock.rs @@ -92,6 +92,7 @@ impl pallet_timestamp::Config for Test { impl crate::pallet::Config for Test { type RuntimeEvent = RuntimeEvent; type StakingVisitor = TestStakingVisitor; + type WeightInfo = (); } pub struct TestStakingVisitor; diff --git a/pallets/ddc-nodes/src/testing_utils.rs b/pallets/ddc-nodes/src/testing_utils.rs new file mode 100644 index 000000000..432107e61 --- /dev/null +++ b/pallets/ddc-nodes/src/testing_utils.rs @@ -0,0 +1,31 @@ +//! Testing utils for ddc-staking. + +use crate::{cdn_node::CDNNodeParams, node::NodeParams, Config, NodePubKey}; +use ddc_primitives::CDNNodePubKey; +use frame_benchmarking::account; +use sp_std::vec; + +const SEED: u32 = 0; + +/// Grab a funded user. +pub fn create_user_and_config( + string: &'static str, + n: u32, +) -> (T::AccountId, NodePubKey, NodeParams, NodeParams) { + let user = account(string, n, SEED); + let node = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); + let cdn_node_params = NodeParams::CDNParams(CDNNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }); + + let cdn_node_params_new = NodeParams::CDNParams(CDNNodeParams { + host: vec![2u8, 255], + http_port: 45000u16, + grpc_port: 55000u16, + p2p_port: 65000u16, + }); + (user, node, cdn_node_params, cdn_node_params_new) +} diff --git a/pallets/ddc-nodes/src/weights.rs b/pallets/ddc-nodes/src/weights.rs new file mode 100644 index 000000000..868380f40 --- /dev/null +++ b/pallets/ddc-nodes/src/weights.rs @@ -0,0 +1,83 @@ + +//! Autogenerated weights for `pallet_ddc_nodes` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-11-16, STEPS: `200`, REPEAT: 1000, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `Raids-MBP-2`, CPU: `` +//! EXECUTION: None, WASM-EXECUTION: Interpreted, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// ./target/release/cere +// benchmark +// pallet +// --chain +// dev +// --pallet +// pallet_ddc_nodes +// --extrinsic +// * +// --steps +// 200 +// --repeat +// 1000 +// --output +// pallets/ddc-nodes/src/weights.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_ddc_nodes. +pub trait WeightInfo { + fn create_node() -> Weight; + fn delete_node() -> Weight; + fn set_node_params() -> Weight; +} + +/// Weights for pallet_ddc_nodes. +pub struct SubstrateWeight(PhantomData); +impl WeightInfo for SubstrateWeight { + // Storage: DdcNodes CDNNodes (r:1 w:1) + fn create_node() -> Weight { + Weight::from_ref_time(12_000_000u64) + .saturating_add(T::DbWeight::get().reads(1u64)) + .saturating_add(T::DbWeight::get().writes(1u64)) + } + // Storage: DdcNodes CDNNodes (r:1 w:1) + fn delete_node() -> Weight { + Weight::from_ref_time(14_000_000u64) + .saturating_add(T::DbWeight::get().reads(1u64)) + .saturating_add(T::DbWeight::get().writes(1u64)) + } + // Storage: DdcNodes CDNNodes (r:1 w:1) + fn set_node_params() -> Weight { + Weight::from_ref_time(15_000_000u64) + .saturating_add(T::DbWeight::get().reads(1u64)) + .saturating_add(T::DbWeight::get().writes(1u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + // Storage: DdcNodes CDNNodes (r:1 w:1) + fn create_node() -> Weight { + Weight::from_ref_time(12_000_000u64) + .saturating_add(RocksDbWeight::get().reads(1u64)) + .saturating_add(RocksDbWeight::get().writes(1u64)) + } + // Storage: DdcNodes CDNNodes (r:1 w:1) + fn delete_node() -> Weight { + Weight::from_ref_time(14_000_000u64) + .saturating_add(RocksDbWeight::get().reads(1u64)) + .saturating_add(RocksDbWeight::get().writes(1u64)) + } + // Storage: DdcNodes CDNNodes (r:1 w:1) + fn set_node_params() -> Weight { + Weight::from_ref_time(15_000_000u64) + .saturating_add(RocksDbWeight::get().reads(1u64)) + .saturating_add(RocksDbWeight::get().writes(1u64)) + } +} \ No newline at end of file diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index fda50db6e..d38cefcc1 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -176,6 +176,7 @@ std = [ "pallet-child-bounties/std", "pallet-ddc-metrics-offchain-worker/std", "pallet-ddc-payouts/std", + "pallet-ddc-nodes/std", "pallet-ddc-staking/std", "cere-runtime-common/std", "cere-dev-runtime-constants/std", @@ -215,6 +216,7 @@ runtime-benchmarks = [ "pallet-society/runtime-benchmarks", "pallet-staking/runtime-benchmarks", "pallet-ddc-customers/runtime-benchmarks", + "pallet-ddc-nodes/runtime-benchmarks", "pallet-ddc-staking/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-tips/runtime-benchmarks", diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index b64b9aaf2..8d5ea40bc 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1350,6 +1350,7 @@ impl pallet_ddc_customers::Config for Runtime { impl pallet_ddc_nodes::Config for Runtime { type RuntimeEvent = RuntimeEvent; type StakingVisitor = pallet_ddc_staking::Pallet; + type WeightInfo = pallet_ddc_nodes::weights::SubstrateWeight; } impl pallet_ddc_clusters::Config for Runtime { @@ -1532,6 +1533,7 @@ mod benches { [pallet_staking, Staking] [pallet_ddc_customers, DdcCustomers] [pallet_ddc_staking, DdcStaking] + [pallet_ddc_nodes, DdcNodes] [frame_system, SystemBench::] [pallet_timestamp, Timestamp] [pallet_tips, Tips] From 7ea8c4ee73908f4e05b5abb6eddfda0bc71caa0f Mon Sep 17 00:00:00 2001 From: aie0 <149175774+aie0@users.noreply.github.com> Date: Fri, 24 Nov 2023 18:17:09 +0200 Subject: [PATCH 546/583] payout debt management (#152) - management fees - node rewards --------- Co-authored-by: Victor Genin --- Cargo.lock | 333 +++--- pallets/ddc-clusters/src/lib.rs | 25 +- pallets/ddc-customers/src/lib.rs | 28 +- pallets/ddc-customers/src/mock.rs | 21 +- pallets/ddc-customers/src/tests.rs | 2 +- pallets/ddc-payouts/Cargo.toml | 3 + pallets/ddc-payouts/src/lib.rs | 324 +++-- pallets/ddc-payouts/src/mock.rs | 307 +++++ pallets/ddc-payouts/src/tests.rs | 1590 +++++++++++++++++++++++++ pallets/ddc-staking/src/mock.rs | 17 +- primitives/src/lib.rs | 8 +- runtime/cere-dev/Cargo.toml | 1 + runtime/cere-dev/constants/Cargo.toml | 1 + runtime/cere-dev/src/lib.rs | 16 +- traits/Cargo.toml | 1 + traits/src/cluster.rs | 8 +- traits/src/customer.rs | 9 +- traits/src/lib.rs | 2 + traits/src/pallet.rs | 5 + traits/src/treasury.rs | 2 + traits/src/validator.rs | 6 + 21 files changed, 2423 insertions(+), 286 deletions(-) create mode 100644 pallets/ddc-payouts/src/mock.rs create mode 100644 pallets/ddc-payouts/src/tests.rs create mode 100644 traits/src/pallet.rs create mode 100644 traits/src/treasury.rs create mode 100644 traits/src/validator.rs diff --git a/Cargo.lock b/Cargo.lock index 6b341a929..7f5aa29d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -840,6 +840,7 @@ version = "4.8.1" dependencies = [ "cere-dev-runtime-constants", "cere-runtime-common", + "ddc-traits", "frame-benchmarking", "frame-election-provider-support", "frame-executive", @@ -929,6 +930,7 @@ name = "cere-dev-runtime-constants" version = "4.8.1" dependencies = [ "node-primitives", + "sp-runtime", ] [[package]] @@ -1635,6 +1637,7 @@ dependencies = [ "frame-support", "frame-system", "sp-runtime", + "sp-std", ] [[package]] @@ -2141,7 +2144,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", ] @@ -2164,7 +2167,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -2187,7 +2190,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "array-bytes", @@ -2238,7 +2241,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2249,7 +2252,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2265,7 +2268,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -2294,7 +2297,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2326,7 +2329,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "cfg-expr", @@ -2340,7 +2343,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2352,7 +2355,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -2362,7 +2365,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "log", @@ -2380,7 +2383,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -2395,7 +2398,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -2404,7 +2407,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "parity-scale-codec", @@ -4296,7 +4299,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-system", "parity-scale-codec", @@ -4492,7 +4495,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -4508,7 +4511,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -4523,7 +4526,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4547,7 +4550,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4567,7 +4570,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4582,7 +4585,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4630,7 +4633,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4649,7 +4652,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4666,7 +4669,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4695,7 +4698,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -4707,7 +4710,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -4814,9 +4817,11 @@ dependencies = [ "ddc-primitives", "ddc-traits", "frame-benchmarking", + "frame-election-provider-support", "frame-support", "frame-system", "log", + "pallet-balances", "parity-scale-codec", "scale-info", "sp-core", @@ -4854,7 +4859,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4872,7 +4877,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4896,7 +4901,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4909,7 +4914,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4961,7 +4966,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4982,7 +4987,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5005,7 +5010,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5021,7 +5026,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5041,7 +5046,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5058,7 +5063,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5075,7 +5080,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5091,7 +5096,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5108,7 +5113,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5128,7 +5133,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -5138,7 +5143,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5155,7 +5160,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5178,7 +5183,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5193,7 +5198,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5207,7 +5212,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5222,7 +5227,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5238,7 +5243,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5259,7 +5264,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5275,7 +5280,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5289,7 +5294,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5312,7 +5317,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5323,7 +5328,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5337,7 +5342,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5355,7 +5360,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5374,7 +5379,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5390,7 +5395,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5405,7 +5410,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5416,7 +5421,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5433,7 +5438,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5449,7 +5454,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -6333,7 +6338,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "env_logger 0.9.3", "log", @@ -6597,7 +6602,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "sp-core", @@ -6608,7 +6613,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6635,7 +6640,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "futures-timer", @@ -6658,7 +6663,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6674,7 +6679,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6691,7 +6696,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6702,7 +6707,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "chrono", @@ -6742,7 +6747,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "fnv", "futures", @@ -6770,7 +6775,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "kvdb", @@ -6795,7 +6800,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6819,7 +6824,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "fork-tree", @@ -6861,7 +6866,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -6883,7 +6888,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6896,7 +6901,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6920,7 +6925,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sc-client-api", "sp-authorship", @@ -6931,7 +6936,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "lazy_static", "lru 0.7.8", @@ -6958,7 +6963,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "environmental", "parity-scale-codec", @@ -6974,7 +6979,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -6989,7 +6994,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "cfg-if", "libc", @@ -7009,7 +7014,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "array-bytes", @@ -7050,7 +7055,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "finality-grandpa", "futures", @@ -7071,7 +7076,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7088,7 +7093,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "async-trait", @@ -7103,7 +7108,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "async-trait", @@ -7150,7 +7155,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "cid", "futures", @@ -7170,7 +7175,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7196,7 +7201,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "futures", @@ -7214,7 +7219,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "futures", @@ -7235,7 +7240,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "fork-tree", @@ -7265,7 +7270,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "futures", @@ -7284,7 +7289,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "bytes", @@ -7314,7 +7319,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "libp2p", @@ -7327,7 +7332,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7336,7 +7341,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "hash-db", @@ -7366,7 +7371,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -7389,7 +7394,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -7402,7 +7407,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "hex", @@ -7421,7 +7426,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "directories", @@ -7492,7 +7497,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -7506,7 +7511,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7525,7 +7530,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "libc", @@ -7544,7 +7549,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "chrono", "futures", @@ -7562,7 +7567,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7593,7 +7598,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7604,7 +7609,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -7631,7 +7636,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -7645,7 +7650,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "futures-timer", @@ -8058,7 +8063,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "log", @@ -8076,7 +8081,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "blake2", "proc-macro-crate", @@ -8088,7 +8093,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8101,7 +8106,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "integer-sqrt", "num-traits", @@ -8116,7 +8121,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8129,7 +8134,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "parity-scale-codec", @@ -8141,7 +8146,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -8153,7 +8158,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "log", @@ -8171,7 +8176,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -8190,7 +8195,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "merlin", @@ -8213,7 +8218,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8227,7 +8232,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8240,7 +8245,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "base58", @@ -8286,7 +8291,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "blake2", "byteorder", @@ -8300,7 +8305,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -8311,7 +8316,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8320,7 +8325,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -8330,7 +8335,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "environmental", "parity-scale-codec", @@ -8341,7 +8346,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "finality-grandpa", "log", @@ -8359,7 +8364,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8373,7 +8378,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bytes", "futures", @@ -8399,7 +8404,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "lazy_static", "sp-core", @@ -8410,7 +8415,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -8427,7 +8432,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "thiserror", "zstd", @@ -8436,7 +8441,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8450,7 +8455,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sp-api", "sp-core", @@ -8460,7 +8465,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "backtrace", "lazy_static", @@ -8470,7 +8475,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "rustc-hash", "serde", @@ -8480,7 +8485,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "either", "hash256-std-hasher", @@ -8503,7 +8508,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8521,7 +8526,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "proc-macro-crate", @@ -8533,7 +8538,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -8547,7 +8552,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8561,7 +8566,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8572,7 +8577,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "log", @@ -8594,12 +8599,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8612,7 +8617,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "sp-core", @@ -8625,7 +8630,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures-timer", @@ -8641,7 +8646,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-std", @@ -8653,7 +8658,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sp-api", "sp-runtime", @@ -8662,7 +8667,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "log", @@ -8678,7 +8683,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "hash-db", @@ -8701,7 +8706,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8718,7 +8723,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8729,7 +8734,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "log", @@ -8742,7 +8747,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8889,7 +8894,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "platforms 2.0.0", ] @@ -8897,7 +8902,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -8918,7 +8923,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures-util", "hyper", @@ -8931,7 +8936,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "jsonrpsee", @@ -8944,7 +8949,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "log", @@ -8965,7 +8970,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "substrate-test-utils-derive", @@ -8975,7 +8980,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8986,7 +8991,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -9432,7 +9437,7 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "clap", "frame-try-runtime", diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 576f5ba38..1928dd620 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -25,8 +25,8 @@ use crate::{ node_provider_auth::{NodeProviderAuthContract, NodeProviderAuthContractError}, }; use ddc_primitives::{ - ClusterBondingParams, ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, - NodePubKey, NodeType, + ClusterBondingParams, ClusterFeesParams, ClusterGovParams, ClusterId, ClusterParams, + ClusterPricingParams, NodePubKey, NodeType, }; use ddc_traits::{ cluster::{ClusterCreator, ClusterVisitor, ClusterVisitorError}, @@ -301,6 +301,27 @@ pub mod pallet { }) } + fn get_fees_params( + cluster_id: &ClusterId, + ) -> Result { + let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) + .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; + + Ok(ClusterFeesParams { + treasury_share: cluster_gov_params.treasury_share, + validators_share: cluster_gov_params.validators_share, + cluster_reserve_share: cluster_gov_params.cluster_reserve_share, + }) + } + + fn get_reserve_account_id( + cluster_id: &ClusterId, + ) -> Result { + let cluster = Clusters::::try_get(cluster_id) + .map_err(|_| ClusterVisitorError::ClusterDoesNotExist)?; + Ok(cluster.reserve_id) + } + fn get_chill_delay( cluster_id: &ClusterId, node_type: NodeType, diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 564f11860..6746efb24 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -19,7 +19,7 @@ use codec::{Decode, Encode, HasCompact}; use ddc_primitives::{BucketId, ClusterId}; use ddc_traits::{ cluster::{ClusterCreator, ClusterVisitor}, - customer::CustomerCharger, + customer::{CustomerCharger, CustomerChargerError}, }; use frame_support::{ parameter_types, @@ -565,32 +565,37 @@ pub mod pallet { content_owner: T::AccountId, billing_vault: T::AccountId, amount: u128, - ) -> DispatchResult { - let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotOwner)?; + ) -> Result { + let actually_charged: BalanceOf; + let mut ledger = Self::ledger(&content_owner).ok_or(CustomerChargerError::NotOwner)?; let mut amount_to_deduct = amount.saturated_into::>(); - ensure!(ledger.total >= ledger.active, Error::::ArithmeticUnderflow); + ensure!(ledger.total >= ledger.active, CustomerChargerError::ArithmeticUnderflow); if ledger.active >= amount_to_deduct { + actually_charged = amount_to_deduct; ledger.active = ledger .active .checked_sub(&amount_to_deduct) - .ok_or(Error::::ArithmeticUnderflow)?; + .ok_or(CustomerChargerError::ArithmeticUnderflow)?; ledger.total = ledger .total .checked_sub(&amount_to_deduct) - .ok_or(Error::::ArithmeticUnderflow)?; + .ok_or(CustomerChargerError::ArithmeticUnderflow)?; Self::update_ledger(&content_owner, &ledger); } else { let diff = amount_to_deduct .checked_sub(&ledger.active) - .ok_or(Error::::ArithmeticUnderflow)?; + .ok_or(CustomerChargerError::ArithmeticUnderflow)?; + actually_charged = diff; ledger.total = ledger .total .checked_sub(&ledger.active) - .ok_or(Error::::ArithmeticUnderflow)?; + .ok_or(CustomerChargerError::ArithmeticUnderflow)?; amount_to_deduct = ledger.active; ledger.active = BalanceOf::::zero(); - let (ledger, _charged) = ledger.charge_unlocking(diff)?; + let (ledger, _charged) = ledger + .charge_unlocking(diff) + .map_err(|_| CustomerChargerError::UnlockFailed)?; Self::update_ledger(&content_owner, &ledger); }; @@ -599,10 +604,11 @@ pub mod pallet { &billing_vault, amount_to_deduct, ExistenceRequirement::KeepAlive, - )?; + ) + .map_err(|_| CustomerChargerError::TransferFailed)?; Self::deposit_event(Event::::Charged(content_owner, amount_to_deduct)); - Ok(()) + Ok(actually_charged.saturated_into::()) } } } diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index 3031c2a72..ae41179ed 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -2,13 +2,12 @@ use crate::{self as pallet_ddc_customers, *}; use ddc_primitives::{ - ClusterBondingParams, ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, - NodePubKey, NodeType, + ClusterBondingParams, ClusterFeesParams, ClusterGovParams, ClusterId, ClusterParams, + ClusterPricingParams, NodePubKey, NodeType, }; use ddc_traits::cluster::{ ClusterCreator, ClusterManager, ClusterManagerError, ClusterVisitor, ClusterVisitorError, }; - use frame_support::{ construct_runtime, parameter_types, traits::{ConstU32, ConstU64, Everything}, @@ -20,7 +19,7 @@ use sp_io::TestExternalities; use sp_runtime::{ testing::Header, traits::{BlakeTwo256, IdentityLookup}, - DispatchResult, + DispatchResult, Perbill, }; /// The AccountId alias in this test module. @@ -145,6 +144,20 @@ impl ClusterVisitor for TestClusterVisitor { }) } + fn get_fees_params(_cluster_id: &ClusterId) -> Result { + Ok(ClusterFeesParams { + treasury_share: Perbill::from_percent(1), + validators_share: Perbill::from_percent(10), + cluster_reserve_share: Perbill::from_percent(2), + }) + } + + fn get_reserve_account_id( + _cluster_id: &ClusterId, + ) -> Result { + Err(ClusterVisitorError::ClusterDoesNotExist) + } + fn get_bonding_params( cluster_id: &ClusterId, ) -> Result, ClusterVisitorError> { diff --git a/pallets/ddc-customers/src/tests.rs b/pallets/ddc-customers/src/tests.rs index 7e5de342e..9c8230bb0 100644 --- a/pallets/ddc-customers/src/tests.rs +++ b/pallets/ddc-customers/src/tests.rs @@ -191,7 +191,7 @@ fn unlock_and_withdraw_deposit_works() { }) ); - // Unlock remaining chuncks & withdraw + // Unlock remaining chunks & withdraw assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(account_1), 3_u128)); System::set_block_number(52); assert_ok!(DdcCustomers::withdraw_unlocked_deposit(RuntimeOrigin::signed(account_1))); diff --git a/pallets/ddc-payouts/Cargo.toml b/pallets/ddc-payouts/Cargo.toml index e110a36e6..406612a0c 100644 --- a/pallets/ddc-payouts/Cargo.toml +++ b/pallets/ddc-payouts/Cargo.toml @@ -9,6 +9,7 @@ codec = { package = "parity-scale-codec", version = "3.1.5", default-features = ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } +frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } log = { version = "0.4.17", default-features = false } @@ -20,6 +21,7 @@ sp-staking = { default-features = false, git = "https://github.com/paritytech/su sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [dev-dependencies] +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -38,5 +40,6 @@ std = [ "sp-staking/std", "sp-std/std", "sp-core/std", + "frame-election-provider-support/std", ] runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index 8143622bb..2786dc21b 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -14,8 +14,17 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] +#[cfg(test)] +pub(crate) mod mock; +#[cfg(test)] +mod tests; + use ddc_primitives::{ClusterId, DdcEra}; -use ddc_traits::{cluster::ClusterVisitor, customer::CustomerCharger as CustomerChargerType}; +use ddc_traits::{ + cluster::ClusterVisitor as ClusterVisitorType, + customer::CustomerCharger as CustomerChargerType, pallet::PalletVisitor as PalletVisitorType, +}; +use frame_election_provider_support::SortedListProvider; use frame_support::{ pallet_prelude::*, parameter_types, @@ -25,7 +34,7 @@ use frame_support::{ }; use frame_system::pallet_prelude::*; pub use pallet::*; -use sp_runtime::Perbill; +use sp_runtime::{PerThing, Perbill}; use sp_std::prelude::*; type BatchIndex = u16; @@ -33,8 +42,8 @@ type BatchIndex = u16; /// Stores usage of customers #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] pub struct CustomerUsage { - pub transferred_bytes: u128, - pub stored_bytes: u128, + pub transferred_bytes: u64, + pub stored_bytes: u64, pub number_of_puts: u128, pub number_of_gets: u128, } @@ -42,8 +51,8 @@ pub struct CustomerUsage { /// Stores usage of node provider #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] pub struct NodeUsage { - pub transferred_bytes: u128, - pub stored_bytes: u128, + pub transferred_bytes: u64, + pub stored_bytes: u64, pub number_of_puts: u128, pub number_of_gets: u128, } @@ -51,10 +60,10 @@ pub struct NodeUsage { /// Stores reward in tokens(units) of node provider as per NodeUsage #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] pub struct NodeReward { - pub transfer: u128, // for transferred_bytes - pub storage: u128, // for stored_bytes - pub puts: u128, // for number_of_puts - pub gets: u128, // for number_of_gets + pub transfer: u128, // tokens for transferred_bytes + pub storage: u128, // tokens for stored_bytes + pub puts: u128, // tokens for number_of_puts + pub gets: u128, // tokens for number_of_gets } #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] @@ -68,10 +77,10 @@ pub struct BillingReportDebt { /// Stores charge in tokens(units) of customer as per CustomerUsage #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] pub struct CustomerCharge { - pub transfer: u128, // for transferred_bytes - pub storage: u128, // for stored_bytes - pub puts: u128, // for number_of_puts - pub gets: u128, // for number_of_gets + pub transfer: u128, // tokens for transferred_bytes + pub storage: u128, // tokens for stored_bytes + pub puts: u128, // tokens for number_of_puts + pub gets: u128, // tokens for number_of_gets } /// The balance type of this pallet. @@ -99,11 +108,11 @@ pub mod pallet { type RuntimeEvent: From> + IsType<::RuntimeEvent>; #[pallet::constant] type PalletId: Get; - type Currency: LockableCurrency; - type CustomerCharger: CustomerChargerType; - type ClusterVisitor: ClusterVisitor; + type TreasuryVisitor: PalletVisitorType; + type ClusterVisitor: ClusterVisitorType; + type ValidatorList: SortedListProvider; } #[pallet::event] @@ -133,6 +142,21 @@ pub mod pallet { cluster_id: ClusterId, era: DdcEra, }, + TreasuryFeesCollected { + cluster_id: ClusterId, + era: DdcEra, + amount: u128, + }, + ClusterReserveFeesCollected { + cluster_id: ClusterId, + era: DdcEra, + amount: u128, + }, + ValidatorFeesCollected { + cluster_id: ClusterId, + era: DdcEra, + amount: u128, + }, RewardingStarted { cluster_id: ClusterId, era: DdcEra, @@ -151,6 +175,9 @@ pub mod pallet { cluster_id: ClusterId, era: DdcEra, }, + AuthorisedCaller { + authorised_caller: T::AccountId, + }, } #[pallet::error] @@ -178,7 +205,6 @@ pub mod pallet { Blake2_128Concat, DdcEra, BillingReport, - ValueQuery, >; #[pallet::storage] @@ -187,30 +213,23 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn debtor_customers)] - pub type DebtorCustomers = StorageDoubleMap< - _, - Blake2_128Concat, - ClusterId, - Blake2_128Concat, - T::AccountId, - u128, - ValueQuery, - >; + pub type DebtorCustomers = + StorageDoubleMap<_, Blake2_128Concat, ClusterId, Blake2_128Concat, T::AccountId, u128>; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] #[scale_info(skip_type_params(T))] pub struct BillingReport { - state: State, - vault: T::AccountId, - total_customer_charge: CustomerCharge, - total_distributed_reward: u128, - total_node_usage: NodeUsage, + pub state: State, + pub vault: T::AccountId, + pub total_customer_charge: CustomerCharge, + pub total_distributed_reward: u128, + pub total_node_usage: NodeUsage, // stage 1 - charging_max_batch_index: BatchIndex, - charging_processed_batches: BoundedBTreeSet, + pub charging_max_batch_index: BatchIndex, + pub charging_processed_batches: BoundedBTreeSet, // stage 2 - rewarding_max_batch_index: BatchIndex, - rewarding_processed_batches: BoundedBTreeSet, + pub rewarding_max_batch_index: BatchIndex, + pub rewarding_processed_batches: BoundedBTreeSet, } impl Default for BillingReport { @@ -235,8 +254,9 @@ pub mod pallet { NotInitialized, Initialized, ChargingCustomers, + CustomersChargedWithFees, CustomersCharged, - DeductingFees, + FeesDeducted, RewardingProviders, ProvidersRewarded, Finalized, @@ -251,7 +271,9 @@ pub mod pallet { ) -> DispatchResult { ensure_root(origin)?; // requires Governance approval - AuthorisedCaller::::put(authorised_caller); + AuthorisedCaller::::put(authorised_caller.clone()); + + Self::deposit_event(Event::::AuthorisedCaller { authorised_caller }); Ok(()) } @@ -294,10 +316,7 @@ pub mod pallet { let caller = ensure_signed(origin)?; ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); - ensure!( - max_batch_index > 0 && max_batch_index < MaxBatchesCount::get(), - Error::::BatchIndexOverflow - ); + ensure!(max_batch_index < MaxBatchesCount::get(), Error::::BatchIndexOverflow); let mut billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; @@ -374,49 +393,52 @@ pub mod pallet { .ok_or(Error::::ArithmeticOverflow)?; let customer_id = payer.0.clone(); - match T::CustomerCharger::charge_content_owner( + let amount_actually_charged = match T::CustomerCharger::charge_content_owner( customer_id.clone(), updated_billing_report.vault.clone(), total_customer_charge, ) { - Ok(_) => { - updated_billing_report.total_customer_charge.storage = - temp_total_customer_storage_charge; - updated_billing_report.total_customer_charge.transfer = - temp_total_customer_transfer_charge; - updated_billing_report.total_customer_charge.puts = - temp_total_customer_puts_charge; - updated_billing_report.total_customer_charge.gets = - temp_total_customer_gets_charge; - - Self::deposit_event(Event::::Charged { - cluster_id, - era, - customer_id, - amount: total_customer_charge, - }); - }, - Err(_e) => { - let mut customer_dept = - DebtorCustomers::::try_get(cluster_id, customer_id.clone()) - .unwrap_or_else(|_| Zero::zero()); - - customer_dept = customer_dept - .checked_add(total_customer_charge) - .ok_or(Error::::ArithmeticOverflow)?; - DebtorCustomers::::insert( - cluster_id, - customer_id.clone(), - customer_dept, - ); - - Self::deposit_event(Event::::ChargeFailed { - cluster_id, - era, - customer_id, - amount: total_customer_charge, - }); - }, + Ok(actually_charged) => actually_charged, + Err(_e) => 0, + }; + + if amount_actually_charged < total_customer_charge { + // debt + let mut customer_debt = + DebtorCustomers::::try_get(cluster_id, customer_id.clone()) + .unwrap_or_else(|_| Zero::zero()); + + customer_debt = (|| -> Option { + customer_debt + .checked_add(total_customer_charge)? + .checked_sub(amount_actually_charged) + })() + .ok_or(Error::::ArithmeticOverflow)?; + + DebtorCustomers::::insert(cluster_id, customer_id.clone(), customer_debt); + + Self::deposit_event(Event::::ChargeFailed { + cluster_id, + era, + customer_id, + amount: total_customer_charge, + }); + } else { + updated_billing_report.total_customer_charge.storage = + temp_total_customer_storage_charge; + updated_billing_report.total_customer_charge.transfer = + temp_total_customer_transfer_charge; + updated_billing_report.total_customer_charge.puts = + temp_total_customer_puts_charge; + updated_billing_report.total_customer_charge.gets = + temp_total_customer_gets_charge; + + Self::deposit_event(Event::::Charged { + cluster_id, + era, + customer_id, + amount: total_customer_charge, + }); } } @@ -448,11 +470,74 @@ pub mod pallet { &billing_report.charging_max_batch_index, )?; - billing_report.state = State::CustomersCharged; - ActiveBillingReports::::insert(cluster_id, era, billing_report); - Self::deposit_event(Event::::ChargingFinished { cluster_id, era }); + // deduct fees + let fees = T::ClusterVisitor::get_fees_params(&cluster_id) + .map_err(|_| Error::::NotExpectedClusterState)?; + + let total_customer_charge = (|| -> Option { + billing_report + .total_customer_charge + .transfer + .checked_add(billing_report.total_customer_charge.storage)? + .checked_add(billing_report.total_customer_charge.puts)? + .checked_add(billing_report.total_customer_charge.gets) + })() + .ok_or(Error::::ArithmeticOverflow)?; + + let treasury_fee = fees.treasury_share * total_customer_charge; + let validators_fee = fees.validators_share * total_customer_charge; + let cluster_reserve_fee = fees.cluster_reserve_share * total_customer_charge; + + charge_treasury_fees::( + treasury_fee, + &billing_report.vault, + &T::TreasuryVisitor::get_account_id(), + )?; + Self::deposit_event(Event::::TreasuryFeesCollected { + cluster_id, + era, + amount: treasury_fee, + }); + + charge_cluster_reserve_fees::( + cluster_reserve_fee, + &billing_report.vault, + &T::ClusterVisitor::get_reserve_account_id(&cluster_id) + .map_err(|_| Error::::NotExpectedClusterState)?, + )?; + Self::deposit_event(Event::::ClusterReserveFeesCollected { + cluster_id, + era, + amount: cluster_reserve_fee, + }); + + charge_validator_fees::(validators_fee, &billing_report.vault)?; + Self::deposit_event(Event::::ValidatorFeesCollected { + cluster_id, + era, + amount: validators_fee, + }); + + // 1 - (X + Y + Z) > 0, 0 < X + Y + Z < 1 + let total_left_from_one = + (fees.treasury_share + fees.validators_share + fees.cluster_reserve_share) + .left_from_one(); + + // X * Z < X, 0 < Z < 1 + billing_report.total_customer_charge.transfer = + total_left_from_one * billing_report.total_customer_charge.transfer; + billing_report.total_customer_charge.storage = + total_left_from_one * billing_report.total_customer_charge.storage; + billing_report.total_customer_charge.puts = + total_left_from_one * billing_report.total_customer_charge.puts; + billing_report.total_customer_charge.gets = + total_left_from_one * billing_report.total_customer_charge.gets; + + billing_report.state = State::CustomersChargedWithFees; + ActiveBillingReports::::insert(cluster_id, era, billing_report); + Ok(()) } @@ -467,15 +552,15 @@ pub mod pallet { let caller = ensure_signed(origin)?; ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); - ensure!( - max_batch_index > 0 && max_batch_index < MaxBatchesCount::get(), - Error::::BatchIndexOverflow - ); + ensure!(max_batch_index < MaxBatchesCount::get(), Error::::BatchIndexOverflow); let mut billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; - ensure!(billing_report.state == State::CustomersCharged, Error::::NotExpectedState); + ensure!( + billing_report.state == State::CustomersChargedWithFees, + Error::::NotExpectedState + ); billing_report.total_node_usage = total_node_usage; billing_report.rewarding_max_batch_index = max_batch_index; @@ -629,6 +714,55 @@ pub mod pallet { } } + fn charge_treasury_fees( + treasury_fee: u128, + vault: &T::AccountId, + treasury_vault: &T::AccountId, + ) -> DispatchResult { + let amount_to_deduct = treasury_fee.saturated_into::>(); + ::Currency::transfer( + vault, + treasury_vault, + amount_to_deduct, + ExistenceRequirement::KeepAlive, + ) + } + + fn charge_cluster_reserve_fees( + cluster_reserve_fee: u128, + vault: &T::AccountId, + reserve_vault: &T::AccountId, + ) -> DispatchResult { + let amount_to_deduct = cluster_reserve_fee.saturated_into::>(); + ::Currency::transfer( + vault, + reserve_vault, + amount_to_deduct, + ExistenceRequirement::KeepAlive, + ) + } + + fn charge_validator_fees( + validators_fee: u128, + vault: &T::AccountId, + ) -> DispatchResult { + let amount_to_deduct = validators_fee + .checked_div(T::ValidatorList::count().try_into().unwrap()) + .ok_or(Error::::ArithmeticOverflow)? + .saturated_into::>(); + + for validator_account_id in T::ValidatorList::iter() { + ::Currency::transfer( + vault, + &validator_account_id, + amount_to_deduct, + ExistenceRequirement::KeepAlive, + )?; + } + + Ok(()) + } + fn get_node_reward( node_usage: &NodeUsage, total_nodes_usage: &NodeUsage, @@ -665,16 +799,14 @@ pub mod pallet { .map_err(|_| Error::::NotExpectedClusterState)?; total.transfer = (|| -> Option { - usage - .transferred_bytes + (usage.transferred_bytes as u128) .checked_mul(pricing.unit_per_mb_streamed)? .checked_div(byte_unit::MEBIBYTE) })() .ok_or(Error::::ArithmeticOverflow)?; total.storage = (|| -> Option { - usage - .stored_bytes + (usage.stored_bytes as u128) .checked_mul(pricing.unit_per_mb_stored)? .checked_div(byte_unit::MEBIBYTE) })() @@ -700,9 +832,9 @@ pub mod pallet { // Check if the Vec contains all integers between 1 and rewarding_max_batch_index ensure!(!batches.is_empty(), Error::::BatchesMissed); - ensure!(*max_batch_index as usize == batches.len() - 1usize, Error::::BatchesMissed); + ensure!((*max_batch_index + 1) as usize == batches.len(), Error::::BatchesMissed); - for index in 0..*max_batch_index { + for index in 0..*max_batch_index + 1 { ensure!(batches.contains(&index), Error::::BatchesMissed); } @@ -710,7 +842,7 @@ pub mod pallet { } impl Pallet { - fn sub_account_id(cluster_id: ClusterId, era: DdcEra) -> T::AccountId { + pub fn sub_account_id(cluster_id: ClusterId, era: DdcEra) -> T::AccountId { let mut bytes = Vec::new(); bytes.extend_from_slice(&cluster_id[..]); bytes.extend_from_slice(&era.encode()); diff --git a/pallets/ddc-payouts/src/mock.rs b/pallets/ddc-payouts/src/mock.rs new file mode 100644 index 000000000..61c7d6e98 --- /dev/null +++ b/pallets/ddc-payouts/src/mock.rs @@ -0,0 +1,307 @@ +//! Test utilities + +#![allow(dead_code)] + +use crate::{self as pallet_ddc_payouts, *}; +use ddc_primitives::{ClusterBondingParams, ClusterFeesParams, ClusterPricingParams, NodeType}; +use ddc_traits::{ + cluster::{ClusterVisitor, ClusterVisitorError}, + customer::{CustomerCharger, CustomerChargerError}, + pallet::PalletVisitor, +}; +use frame_election_provider_support::SortedListProvider; + +use frame_support::{ + construct_runtime, parameter_types, + traits::{ConstU32, ConstU64, Everything}, + weights::constants::RocksDbWeight, + PalletId, +}; +use frame_system::mocking::{MockBlock, MockUncheckedExtrinsic}; +use sp_core::H256; +use sp_io::TestExternalities; +use sp_runtime::{ + testing::Header, + traits::{BlakeTwo256, IdentityLookup}, +}; +use sp_std::prelude::*; + +/// The AccountId alias in this test module. +pub type AccountId = u64; +pub(crate) type AccountIndex = u64; +pub(crate) type BlockNumber = u64; +pub(crate) type Balance = u128; + +type UncheckedExtrinsic = MockUncheckedExtrinsic; +type Block = MockBlock; +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + +construct_runtime!( + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + DdcPayouts: pallet_ddc_payouts::{Pallet, Call, Storage, Event}, + } +); + +parameter_types! { + pub static ExistentialDeposit: Balance = 1; +} + +impl frame_system::Config for Test { + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type DbWeight = RocksDbWeight; + type RuntimeOrigin = RuntimeOrigin; + type Index = AccountIndex; + type BlockNumber = BlockNumber; + type RuntimeCall = RuntimeCall; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = ConstU64<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = ConstU32<16>; +} + +impl pallet_balances::Config for Test { + type MaxLocks = ConstU32<1024>; + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); +} + +parameter_types! { + pub const PayoutsPalletId: PalletId = PalletId(*b"payouts_"); +} + +impl crate::pallet::Config for Test { + type RuntimeEvent = RuntimeEvent; + type PalletId = PayoutsPalletId; + type Currency = Balances; + type CustomerCharger = TestCustomerCharger; + type ClusterVisitor = TestClusterVisitor; + type TreasuryVisitor = TestTreasuryVisitor; + type ValidatorList = TestValidatorVisitor; +} + +pub struct TestCustomerCharger; +impl CustomerCharger for TestCustomerCharger { + fn charge_content_owner( + content_owner: T::AccountId, + billing_vault: T::AccountId, + amount: u128, + ) -> Result { + ensure!(amount > 1_000_000, CustomerChargerError::TransferFailed); // any error will do + + let mut amount_to_charge = amount; + if amount_to_charge < 50_000_000 { + amount_to_charge = PARTIAL_CHARGE; + } + + let charge = amount_to_charge.saturated_into::>(); + + ::Currency::transfer( + &content_owner, + &billing_vault, + charge, + ExistenceRequirement::KeepAlive, + ) + .map_err(|_| CustomerChargerError::TransferFailed)?; + Ok(amount_to_charge) + } +} + +pub const RESERVE_ACCOUNT_ID: AccountId = 999; +pub const TREASURY_ACCOUNT_ID: AccountId = 888; +pub const VALIDATOR1_ACCOUNT_ID: AccountId = 111; +pub const VALIDATOR2_ACCOUNT_ID: AccountId = 222; +pub const VALIDATOR3_ACCOUNT_ID: AccountId = 333; +pub const PARTIAL_CHARGE: u128 = 100; + +pub const PRICING_PARAMS: ClusterPricingParams = ClusterPricingParams { + unit_per_mb_streamed: 2_000_000, + unit_per_mb_stored: 3_000_000, + unit_per_put_request: 4_000_000, + unit_per_get_request: 5_000_000, +}; + +pub const PRICING_FEES: ClusterFeesParams = ClusterFeesParams { + treasury_share: Perbill::from_percent(1), + validators_share: Perbill::from_percent(10), + cluster_reserve_share: Perbill::from_percent(2), +}; + +pub struct TestTreasuryVisitor; +impl PalletVisitor for TestTreasuryVisitor { + fn get_account_id() -> T::AccountId { + let reserve_account = TREASURY_ACCOUNT_ID.to_ne_bytes(); + T::AccountId::decode(&mut &reserve_account[..]).unwrap() + } +} + +fn create_account_id_from_u64(id: u64) -> T::AccountId { + let bytes = id.to_ne_bytes(); + T::AccountId::decode(&mut &bytes[..]).unwrap() +} + +pub struct TestValidatorVisitor(sp_std::marker::PhantomData); +impl SortedListProvider for TestValidatorVisitor { + type Score = u64; + type Error = (); + + /// Returns iterator over voter list, which can have `take` called on it. + fn iter() -> Box> { + Box::new( + vec![ + create_account_id_from_u64::(VALIDATOR1_ACCOUNT_ID), + create_account_id_from_u64::(VALIDATOR2_ACCOUNT_ID), + create_account_id_from_u64::(VALIDATOR3_ACCOUNT_ID), + ] + .into_iter(), + ) + } + fn iter_from( + _start: &T::AccountId, + ) -> Result>, Self::Error> { + unimplemented!() + } + fn count() -> u32 { + 3 + } + fn contains(_id: &T::AccountId) -> bool { + unimplemented!() + } + fn on_insert(_: T::AccountId, _weight: Self::Score) -> Result<(), Self::Error> { + // nothing to do on insert. + Ok(()) + } + fn get_score(_id: &T::AccountId) -> Result { + unimplemented!() + } + fn on_update(_: &T::AccountId, _weight: Self::Score) -> Result<(), Self::Error> { + // nothing to do on update. + Ok(()) + } + fn on_remove(_: &T::AccountId) -> Result<(), Self::Error> { + // nothing to do on remove. + Ok(()) + } + fn unsafe_regenerate( + _: impl IntoIterator, + _: Box Self::Score>, + ) -> u32 { + // nothing to do upon regenerate. + 0 + } + + fn try_state() -> Result<(), &'static str> { + unimplemented!() + } + + fn unsafe_clear() { + unimplemented!() + } + + #[cfg(feature = "runtime-benchmarks")] + fn score_update_worst_case(_who: &T::AccountId, _is_increase: bool) -> Self::Score { + unimplemented!() + } +} + +pub struct TestClusterVisitor; +impl ClusterVisitor for TestClusterVisitor { + fn ensure_cluster(_cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { + Ok(()) + } + fn get_bond_size( + _cluster_id: &ClusterId, + _node_type: NodeType, + ) -> Result { + Ok(10) + } + fn get_chill_delay( + _cluster_id: &ClusterId, + _node_type: NodeType, + ) -> Result { + Ok(T::BlockNumber::from(10u32)) + } + fn get_unbonding_delay( + _cluster_id: &ClusterId, + _node_type: NodeType, + ) -> Result { + Ok(T::BlockNumber::from(10u32)) + } + + fn get_pricing_params( + _cluster_id: &ClusterId, + ) -> Result { + Ok(PRICING_PARAMS) + } + + fn get_fees_params(_cluster_id: &ClusterId) -> Result { + Ok(PRICING_FEES) + } + + fn get_reserve_account_id( + _cluster_id: &ClusterId, + ) -> Result { + let reserve_account = RESERVE_ACCOUNT_ID.to_ne_bytes(); + Ok(T::AccountId::decode(&mut &reserve_account[..]).unwrap()) + } + + fn get_bonding_params( + _cluster_id: &ClusterId, + ) -> Result, ClusterVisitorError> { + Err(ClusterVisitorError::ClusterDoesNotExist) + } +} + +pub(crate) type TestRuntimeCall = ::RuntimeCall; + +pub struct ExtBuilder; + +impl ExtBuilder { + fn build(self) -> TestExternalities { + sp_tracing::try_init_simple(); + let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); + + let _ = pallet_balances::GenesisConfig:: { + balances: vec![ + (1, 1000000000000000000000000), + (2, 10), // < PARTIAL_CHARGE + (3, 1000), // > PARTIAL_CHARGE + (4, 1000000000000000000000000), + ], + } + .assimilate_storage(&mut storage); + + TestExternalities::new(storage) + } + pub fn build_and_execute(self, test: impl FnOnce()) { + sp_tracing::try_init_simple(); + let mut ext = self.build(); + ext.execute_with(test); + } +} diff --git a/pallets/ddc-payouts/src/tests.rs b/pallets/ddc-payouts/src/tests.rs new file mode 100644 index 000000000..d63d799e3 --- /dev/null +++ b/pallets/ddc-payouts/src/tests.rs @@ -0,0 +1,1590 @@ +//! Tests for the module. + +use super::{mock::*, *}; +use ddc_primitives::ClusterId; +use frame_support::{assert_noop, assert_ok, error::BadOrigin}; + +#[test] +fn set_authorised_caller_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let root_account = 1u64; + let dac_account = 2u64; + + assert_noop!( + DdcPayouts::set_authorised_caller(RuntimeOrigin::signed(root_account), dac_account), + BadOrigin + ); + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + System::assert_last_event( + Event::AuthorisedCaller { authorised_caller: dac_account }.into(), + ); + + assert_eq!(DdcPayouts::authorised_caller().unwrap(), dac_account); + }) +} + +#[test] +fn begin_billing_report_fails_for_unauthorised() { + ExtBuilder.build_and_execute(|| { + let root_account = 1u64; + let dac_account = 2u64; + let cluster_id = ClusterId::from([1; 20]); + let era = 100; + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_noop!( + DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account + 1), + cluster_id, + era, + ), + Error::::Unauthorised + ); + + assert_noop!( + DdcPayouts::begin_billing_report(RuntimeOrigin::signed(root_account), cluster_id, era,), + Error::::Unauthorised + ); + }) +} + +#[test] +fn begin_billing_report_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let dac_account = 2u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + System::assert_last_event(Event::BillingReportInitialized { cluster_id, era }.into()); + + let report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_eq!(report.state, State::Initialized); + }) +} + +#[test] +fn begin_charging_customers_fails_uninitialised() { + ExtBuilder.build_and_execute(|| { + let dac_account = 2u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 2; + + assert_noop!( + DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + ), + Error::::Unauthorised + ); + + assert_noop!( + DdcPayouts::begin_charging_customers( + RuntimeOrigin::root(), + cluster_id, + era, + max_batch_index, + ), + BadOrigin + ); + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_noop!( + DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + ), + Error::::BillingReportDoesNotExist + ); + }) +} + +#[test] +fn begin_charging_customers_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let dac_account = 2u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 2; + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + System::assert_last_event(Event::ChargingStarted { cluster_id, era }.into()); + + let report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_eq!(report.state, State::ChargingCustomers); + assert_eq!(report.charging_max_batch_index, max_batch_index); + }) +} + +#[test] +fn send_charging_customers_batch_fails_uninitialised() { + ExtBuilder.build_and_execute(|| { + let root_account = 1u64; + let dac_account = 2u64; + let user1 = 3u64; + let user2 = 4u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 2; + let batch_index = 1; + let payers1 = vec![(user1, CustomerUsage::default())]; + let payers2 = vec![(user2, CustomerUsage::default())]; + + assert_noop!( + DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(root_account), + cluster_id, + era, + batch_index, + payers1.clone(), + ), + Error::::Unauthorised + ); + + assert_noop!( + DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::root(), + cluster_id, + era, + batch_index, + payers1.clone(), + ), + BadOrigin + ); + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_noop!( + DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers1.clone(), + ), + Error::::BillingReportDoesNotExist + ); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_noop!( + DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers1.clone(), + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers1.clone(), + )); + + assert_noop!( + DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers1, + ), + Error::::BatchIndexAlreadyProcessed + ); + + assert_noop!( + DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers2, + ), + Error::::BatchIndexAlreadyProcessed + ); + }) +} + +fn calculate_charge(usage: CustomerUsage) -> u128 { + PRICING_PARAMS.unit_per_mb_streamed * (usage.transferred_bytes as u128) / byte_unit::MEBIBYTE + + (PRICING_PARAMS.unit_per_mb_stored * usage.stored_bytes as u128) / byte_unit::MEBIBYTE + + PRICING_PARAMS.unit_per_put_request * usage.number_of_puts + + PRICING_PARAMS.unit_per_get_request * usage.number_of_gets +} + +#[test] +fn send_charging_customers_batch_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let dac_account = 123u64; + let user1 = 1u64; + let user2_debtor = 2u64; + let user3_debtor = 3u64; + let user4 = 4u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 3; + let batch_index = 0; + let usage1 = CustomerUsage { + // should pass without debt + transferred_bytes: 23452345, + stored_bytes: 3345234523, + number_of_puts: 4456456345234523, + number_of_gets: 523423, + }; + let usage2 = CustomerUsage { + // should fail as not enough balance + transferred_bytes: 1, + stored_bytes: 2, + number_of_puts: 3, + number_of_gets: 4, + }; + let usage3 = CustomerUsage { + // should pass but with debt + transferred_bytes: 1, + stored_bytes: 2, + number_of_puts: 3, + number_of_gets: 4, + }; + let usage4 = CustomerUsage { + // should pass without debt + transferred_bytes: 467457, + stored_bytes: 45674567456, + number_of_puts: 3456345, + number_of_gets: 242334563456423, + }; + let payers1 = vec![(user2_debtor, usage2.clone()), (user4, usage4.clone())]; + let payers2 = vec![(user1, usage1.clone())]; + let payers3 = vec![(user3_debtor, usage3.clone())]; + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + assert_eq!(System::events().len(), 3); + + // batch 1 + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers1, + )); + + let usage4_charge = calculate_charge(usage4); + let mut balance = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); + assert_eq!(balance, usage4_charge); + + let user2_debt = DdcPayouts::debtor_customers(cluster_id, user2_debtor).unwrap(); + let mut debt = calculate_charge(usage2); + assert_eq!(user2_debt, debt); + + System::assert_has_event( + Event::ChargeFailed { cluster_id, era, customer_id: user2_debtor, amount: debt }.into(), + ); + System::assert_last_event( + Event::Charged { cluster_id, era, customer_id: user4, amount: usage4_charge }.into(), + ); + + assert_eq!(System::events().len(), 5 + 3); // 3 for Currency::transfer + + // batch 2 + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index + 1, + payers2, + )); + + System::assert_last_event( + Event::Charged { + cluster_id, + era, + customer_id: user1, + amount: calculate_charge(usage1), + } + .into(), + ); + + let report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_eq!(report.state, State::ChargingCustomers); + let user1_debt = DdcPayouts::debtor_customers(cluster_id, user1); + assert_eq!(user1_debt, None); + + let balance_before = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); + // batch 3 + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index + 2, + payers3, + )); + + let user3_charge = calculate_charge(usage3); + balance = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); + assert_eq!(balance, balance_before + PARTIAL_CHARGE); + + let user3_debt = DdcPayouts::debtor_customers(cluster_id, user3_debtor).unwrap(); + + debt = user3_charge - PARTIAL_CHARGE; + assert_eq!(user3_debt, debt); + + System::assert_last_event( + Event::ChargeFailed { + cluster_id, + era, + customer_id: user3_debtor, + amount: user3_charge, + } + .into(), + ); + }) +} + +#[test] +fn end_charging_customers_fails_uninitialised() { + ExtBuilder.build_and_execute(|| { + let root_account = 100u64; + let dac_account = 123u64; + let user1 = 1u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 2; + let batch_index = 1; + let payers = vec![(user1, CustomerUsage::default())]; + + assert_noop!( + DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(root_account), + cluster_id, + era, + ), + Error::::Unauthorised + ); + + assert_noop!( + DdcPayouts::end_charging_customers(RuntimeOrigin::root(), cluster_id, era,), + BadOrigin + ); + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_noop!( + DdcPayouts::end_charging_customers(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::BillingReportDoesNotExist + ); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_noop!( + DdcPayouts::end_charging_customers(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + assert_noop!( + DdcPayouts::end_charging_customers(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::BatchesMissed + ); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers, + )); + + assert_noop!( + DdcPayouts::end_charging_customers(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::BatchesMissed + ); + }) +} + +#[test] +fn end_charging_customers_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let dac_account = 123u64; + let user1 = 1u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 0; + let batch_index = 0; + let usage1 = CustomerUsage { + transferred_bytes: 23452345, + stored_bytes: 3345234523, + number_of_puts: 4456456345234523, + number_of_gets: 523423, + }; + let payers = vec![(user1, usage1.clone())]; + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers, + )); + + let report_before = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let charge = calculate_charge(usage1); + System::assert_last_event( + Event::Charged { cluster_id, era, customer_id: user1, amount: charge }.into(), + ); + + let mut balance = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); + assert_eq!(balance, charge); + assert_eq!(System::events().len(), 4 + 3); // 3 for Currency::transfer + + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + System::assert_has_event(Event::ChargingFinished { cluster_id, era }.into()); + + let treasury_fee = PRICING_FEES.treasury_share * charge; + let reserve_fee = PRICING_FEES.cluster_reserve_share * charge; + let validator_fee = PRICING_FEES.validators_share * charge; + + System::assert_has_event( + Event::TreasuryFeesCollected { cluster_id, era, amount: treasury_fee }.into(), + ); + + System::assert_has_event( + Event::ClusterReserveFeesCollected { cluster_id, era, amount: reserve_fee }.into(), + ); + + System::assert_has_event( + Event::ValidatorFeesCollected { cluster_id, era, amount: validator_fee }.into(), + ); + + let transfers = 3 + 3 + 3 * 3; // for Currency::transfer + assert_eq!(System::events().len(), 7 + 1 + 3 + transfers); + + let report_after = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_eq!(report_after.state, State::CustomersChargedWithFees); + + let total_left_from_one = (PRICING_FEES.treasury_share + + PRICING_FEES.validators_share + + PRICING_FEES.cluster_reserve_share) + .left_from_one(); + + balance = Balances::free_balance(TREASURY_ACCOUNT_ID); + assert_eq!(balance, PRICING_FEES.treasury_share * charge); + + balance = Balances::free_balance(RESERVE_ACCOUNT_ID); + assert_eq!(balance, PRICING_FEES.cluster_reserve_share * charge); + + balance = Balances::free_balance(VALIDATOR1_ACCOUNT_ID); + assert_eq!(balance, PRICING_FEES.validators_share * charge / 3); + + balance = Balances::free_balance(VALIDATOR2_ACCOUNT_ID); + assert_eq!(balance, PRICING_FEES.validators_share * charge / 3); + + balance = Balances::free_balance(VALIDATOR3_ACCOUNT_ID); + assert_eq!(balance, PRICING_FEES.validators_share * charge / 3); + + assert_eq!( + report_after.total_customer_charge.transfer, + total_left_from_one * report_before.total_customer_charge.transfer + ); + assert_eq!( + report_after.total_customer_charge.storage, + total_left_from_one * report_before.total_customer_charge.storage + ); + assert_eq!( + report_after.total_customer_charge.puts, + total_left_from_one * report_before.total_customer_charge.puts + ); + assert_eq!( + report_after.total_customer_charge.gets, + total_left_from_one * report_before.total_customer_charge.gets + ); + }) +} + +#[test] +fn begin_rewarding_providers_fails_uninitialised() { + ExtBuilder.build_and_execute(|| { + let root_account = 1u64; + let dac_account = 2u64; + let user1 = 3u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 2; + let batch_index = 1; + let payers = vec![(user1, CustomerUsage::default())]; + let node_usage = NodeUsage::default(); + + assert_noop!( + DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(root_account), + cluster_id, + era, + max_batch_index, + node_usage.clone(), + ), + Error::::Unauthorised + ); + + assert_noop!( + DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::root(), + cluster_id, + era, + max_batch_index, + node_usage.clone(), + ), + BadOrigin + ); + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_noop!( + DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + node_usage.clone(), + ), + Error::::BillingReportDoesNotExist + ); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_noop!( + DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + node_usage.clone(), + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + assert_noop!( + DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + node_usage.clone(), + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers.clone(), + )); + + assert_noop!( + DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + node_usage.clone(), + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index + 1, + payers, + )); + + assert_noop!( + DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + node_usage, + ), + Error::::NotExpectedState + ); + }) +} + +#[test] +fn begin_rewarding_providers_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let dac_account = 123u64; + let user1 = 1u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 0; + let batch_index = 0; + let total_node_usage = NodeUsage::default(); + let payers = vec![(user1, CustomerUsage::default())]; + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + let mut report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_eq!(report.state, State::Initialized); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers, + )); + + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_ok!(DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + total_node_usage, + )); + + System::assert_last_event(Event::RewardingStarted { cluster_id, era }.into()); + + report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_eq!(report.state, State::RewardingProviders); + }) +} + +#[test] +fn send_rewarding_providers_batch_fails_uninitialised() { + ExtBuilder.build_and_execute(|| { + let root_account = 1u64; + let dac_account = 2u64; + let user1 = 3u64; + let user2 = 4u64; + let node1 = 33u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 1; + let batch_index = 0; + let payers1 = vec![(user1, CustomerUsage::default())]; + let payers2 = vec![(user2, CustomerUsage::default())]; + let payees = vec![(node1, NodeUsage::default())]; + + assert_noop!( + DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(root_account), + cluster_id, + era, + batch_index, + payees.clone(), + ), + Error::::Unauthorised + ); + + assert_noop!( + DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::root(), + cluster_id, + era, + batch_index, + payees.clone(), + ), + BadOrigin + ); + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_noop!( + DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payees.clone(), + ), + Error::::BillingReportDoesNotExist + ); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_noop!( + DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payees.clone(), + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + assert_noop!( + DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payees.clone(), + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers1, + )); + + assert_noop!( + DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payees.clone(), + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index + 1, + payers2, + )); + + assert_noop!( + DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payees.clone(), + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_noop!( + DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payees, + ), + Error::::NotExpectedState + ); + }) +} + +#[test] +fn send_rewarding_providers_batch_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let dac_account = 123u64; + let user1 = 1u64; + let node1 = 10u64; + let node2 = 11u64; + let node3 = 12u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 0; + let max_node_batch_index = 1; + let batch_index = 0; + let batch_node_index = 0; + let usage1 = CustomerUsage { + transferred_bytes: 23452345, + stored_bytes: 3345234523, + number_of_puts: 4456456345234523, + number_of_gets: 523423, + }; + + let node_usage1 = NodeUsage { + // CDN + transferred_bytes: usage1.transferred_bytes * 2 / 3, + stored_bytes: 0, + number_of_puts: usage1.number_of_puts * 2 / 3, + number_of_gets: usage1.number_of_gets * 2 / 3, + }; + + let node_usage2 = NodeUsage { + // Storage + transferred_bytes: 0, + stored_bytes: usage1.stored_bytes * 2, + number_of_puts: 0, + number_of_gets: 0, + }; + + let node_usage3 = NodeUsage { + // CDN + Storage + transferred_bytes: usage1.transferred_bytes * 2, + stored_bytes: usage1.stored_bytes * 3, + number_of_puts: usage1.number_of_puts * 2, + number_of_gets: usage1.number_of_gets * 2, + }; + + let total_nodes_usage = NodeUsage { + transferred_bytes: node_usage1.transferred_bytes + + node_usage2.transferred_bytes + + node_usage3.transferred_bytes, + stored_bytes: node_usage1.stored_bytes + + node_usage2.stored_bytes + + node_usage3.stored_bytes, + number_of_puts: node_usage1.number_of_puts + + node_usage2.number_of_puts + + node_usage3.number_of_puts, + number_of_gets: node_usage1.number_of_gets + + node_usage2.number_of_gets + + node_usage3.number_of_gets, + }; + + let payers = vec![(user1, usage1)]; + let payees1 = vec![(node1, node_usage1.clone()), (node2, node_usage2.clone())]; + let payees2 = vec![(node3, node_usage3.clone())]; + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers, + )); + + let report_before = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + let report_after = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let total_left_from_one = (PRICING_FEES.treasury_share + + PRICING_FEES.validators_share + + PRICING_FEES.cluster_reserve_share) + .left_from_one(); + + assert_eq!( + report_after.total_customer_charge.transfer, + total_left_from_one * report_before.total_customer_charge.transfer + ); + assert_eq!( + report_after.total_customer_charge.storage, + total_left_from_one * report_before.total_customer_charge.storage + ); + assert_eq!( + report_after.total_customer_charge.puts, + total_left_from_one * report_before.total_customer_charge.puts + ); + assert_eq!( + report_after.total_customer_charge.gets, + total_left_from_one * report_before.total_customer_charge.gets + ); + + assert_ok!(DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_node_batch_index, + total_nodes_usage.clone(), + )); + + assert_ok!(DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_node_index, + payees1, + )); + + let mut ratio = Perbill::from_rational( + node_usage1.transferred_bytes, + total_nodes_usage.transferred_bytes, + ); + let mut transfer_charge = ratio * report_after.total_customer_charge.transfer; + + ratio = Perbill::from_rational(node_usage1.stored_bytes, total_nodes_usage.stored_bytes); + let mut storage_charge = ratio * report_after.total_customer_charge.storage; + + ratio = + Perbill::from_rational(node_usage1.number_of_puts, total_nodes_usage.number_of_puts); + let mut puts_charge = ratio * report_after.total_customer_charge.puts; + + ratio = + Perbill::from_rational(node_usage1.number_of_gets, total_nodes_usage.number_of_gets); + let mut gets_charge = ratio * report_after.total_customer_charge.gets; + + let mut balance = Balances::free_balance(node1); + assert_eq!(balance, transfer_charge + storage_charge + puts_charge + gets_charge); + + ratio = Perbill::from_rational( + node_usage2.transferred_bytes, + total_nodes_usage.transferred_bytes, + ); + transfer_charge = ratio * report_after.total_customer_charge.transfer; + + ratio = Perbill::from_rational(node_usage2.stored_bytes, total_nodes_usage.stored_bytes); + storage_charge = ratio * report_after.total_customer_charge.storage; + + ratio = + Perbill::from_rational(node_usage2.number_of_puts, total_nodes_usage.number_of_puts); + puts_charge = ratio * report_after.total_customer_charge.puts; + + ratio = + Perbill::from_rational(node_usage2.number_of_gets, total_nodes_usage.number_of_gets); + gets_charge = ratio * report_after.total_customer_charge.gets; + + balance = Balances::free_balance(node2); + assert_eq!(balance, transfer_charge + storage_charge + puts_charge + gets_charge); + + assert_ok!(DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_node_index + 1, + payees2, + )); + + ratio = Perbill::from_rational( + node_usage3.transferred_bytes, + total_nodes_usage.transferred_bytes, + ); + transfer_charge = ratio * report_after.total_customer_charge.transfer; + + ratio = Perbill::from_rational(node_usage3.stored_bytes, total_nodes_usage.stored_bytes); + storage_charge = ratio * report_after.total_customer_charge.storage; + + ratio = + Perbill::from_rational(node_usage3.number_of_puts, total_nodes_usage.number_of_puts); + puts_charge = ratio * report_after.total_customer_charge.puts; + + ratio = + Perbill::from_rational(node_usage3.number_of_gets, total_nodes_usage.number_of_gets); + gets_charge = ratio * report_after.total_customer_charge.gets; + + balance = Balances::free_balance(node3); + assert_eq!(balance, transfer_charge + storage_charge + puts_charge + gets_charge); + + assert_ok!(DdcPayouts::end_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + }) +} + +#[test] +fn end_rewarding_providers_fails_uninitialised() { + ExtBuilder.build_and_execute(|| { + let root_account = 1u64; + let dac_account = 2u64; + let user1 = 3u64; + let user2 = 4u64; + let node1 = 33u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 1; + let batch_index = 0; + let payers1 = vec![(user1, CustomerUsage::default())]; + let payers2 = vec![(user2, CustomerUsage::default())]; + let payees = vec![(node1, NodeUsage::default())]; + let total_node_usage = NodeUsage::default(); + + assert_noop!( + DdcPayouts::end_rewarding_providers( + RuntimeOrigin::signed(root_account), + cluster_id, + era, + ), + Error::::Unauthorised + ); + + assert_noop!( + DdcPayouts::end_rewarding_providers(RuntimeOrigin::root(), cluster_id, era,), + BadOrigin + ); + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_noop!( + DdcPayouts::end_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + ), + Error::::BillingReportDoesNotExist + ); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_noop!( + DdcPayouts::end_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + assert_noop!( + DdcPayouts::end_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers1, + )); + + assert_noop!( + DdcPayouts::end_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index + 1, + payers2, + )); + + assert_noop!( + DdcPayouts::end_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_noop!( + DdcPayouts::end_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + ), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + total_node_usage, + )); + + assert_noop!( + DdcPayouts::end_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + ), + Error::::BatchesMissed + ); + + assert_ok!(DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payees, + )); + + assert_noop!( + DdcPayouts::end_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + ), + Error::::BatchesMissed + ); + }) +} + +#[test] +fn end_rewarding_providers_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let dac_account = 2u64; + let user1 = 3u64; + let node1 = 33u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 0; + let batch_index = 0; + let total_node_usage = NodeUsage::default(); + let payers = vec![(user1, CustomerUsage::default())]; + let payees = vec![(node1, NodeUsage::default())]; + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + let mut report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_eq!(report.state, State::Initialized); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers, + )); + + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_ok!(DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + total_node_usage, + )); + + assert_ok!(DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payees, + )); + + assert_ok!(DdcPayouts::end_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + System::assert_last_event(Event::RewardingFinished { cluster_id, era }.into()); + + report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_eq!(report.state, State::ProvidersRewarded); + }) +} + +#[test] +fn end_billing_report_fails_uninitialised() { + ExtBuilder.build_and_execute(|| { + let root_account = 1u64; + let dac_account = 2u64; + let user1 = 3u64; + let user2 = 4u64; + let node1 = 33u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 1; + let batch_index = 0; + let payers1 = vec![(user1, CustomerUsage::default())]; + let payers2 = vec![(user2, CustomerUsage::default())]; + let payees = vec![(node1, NodeUsage::default())]; + let total_node_usage = NodeUsage::default(); + + assert_noop!( + DdcPayouts::end_billing_report(RuntimeOrigin::signed(root_account), cluster_id, era,), + Error::::Unauthorised + ); + + assert_noop!( + DdcPayouts::end_billing_report(RuntimeOrigin::root(), cluster_id, era,), + BadOrigin + ); + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_noop!( + DdcPayouts::end_billing_report(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::BillingReportDoesNotExist + ); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_noop!( + DdcPayouts::end_billing_report(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + assert_noop!( + DdcPayouts::end_billing_report(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers1, + )); + + assert_noop!( + DdcPayouts::end_billing_report(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index + 1, + payers2, + )); + + assert_noop!( + DdcPayouts::end_billing_report(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_noop!( + DdcPayouts::end_billing_report(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + total_node_usage, + )); + + assert_noop!( + DdcPayouts::end_billing_report(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payees.clone(), + )); + + assert_noop!( + DdcPayouts::end_billing_report(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::NotExpectedState + ); + + assert_ok!(DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index + 1, + payees, + )); + + assert_noop!( + DdcPayouts::end_billing_report(RuntimeOrigin::signed(dac_account), cluster_id, era,), + Error::::NotExpectedState + ); + }) +} + +#[test] +fn end_billing_report_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let dac_account = 2u64; + let user1 = 3u64; + let node1 = 33u64; + let cluster_id = ClusterId::from([12; 20]); + let era = 100; + let max_batch_index = 0; + let batch_index = 0; + let total_node_usage = NodeUsage::default(); + let payers = vec![(user1, CustomerUsage::default())]; + let payees = vec![(node1, NodeUsage::default())]; + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + let report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_eq!(report.state, State::Initialized); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers, + )); + + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_ok!(DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + total_node_usage, + )); + + assert_ok!(DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payees, + )); + + assert_ok!(DdcPayouts::end_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_ok!(DdcPayouts::end_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + System::assert_last_event(Event::BillingReportFinalized { cluster_id, era }.into()); + + let report_end = DdcPayouts::active_billing_reports(cluster_id, era); + assert_eq!(report_end, None); + }) +} diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index a2f2d6af2..868271f04 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -4,7 +4,7 @@ use crate::{self as pallet_ddc_staking, *}; use ddc_primitives::{ - CDNNodePubKey, ClusterBondingParams, ClusterPricingParams, StorageNodePubKey, + CDNNodePubKey, ClusterBondingParams, ClusterFeesParams, ClusterPricingParams, StorageNodePubKey, }; use ddc_traits::{ cluster::{ClusterManager, ClusterManagerError, ClusterVisitor, ClusterVisitorError}, @@ -24,6 +24,7 @@ use sp_io::TestExternalities; use sp_runtime::{ testing::Header, traits::{BlakeTwo256, IdentityLookup}, + Perbill, }; use sp_std::collections::btree_map::BTreeMap; use std::cell::RefCell; @@ -146,6 +147,20 @@ impl ClusterVisitor for TestClusterVisitor { }) } + fn get_fees_params(_cluster_id: &ClusterId) -> Result { + Ok(ClusterFeesParams { + treasury_share: Perbill::from_percent(1), + validators_share: Perbill::from_percent(10), + cluster_reserve_share: Perbill::from_percent(2), + }) + } + + fn get_reserve_account_id( + _cluster_id: &ClusterId, + ) -> Result { + Err(ClusterVisitorError::ClusterDoesNotExist) + } + fn get_bonding_params( cluster_id: &ClusterId, ) -> Result, ClusterVisitorError> { diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index b27e7235b..3cdb76416 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -19,7 +19,7 @@ pub struct ClusterParams { pub node_provider_auth_contract: AccountId, } -// ClusterGovParams includes Governance sensetive parameters +// ClusterGovParams includes Governance sensitive parameters #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] #[scale_info(skip_type_params(Balance, BlockNumber, T))] pub struct ClusterGovParams { @@ -47,6 +47,12 @@ pub struct ClusterPricingParams { } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct ClusterFeesParams { + pub treasury_share: Perbill, + pub validators_share: Perbill, + pub cluster_reserve_share: Perbill, +} + pub struct ClusterBondingParams { pub cdn_bond_size: u128, pub cdn_chill_delay: BlockNumber, diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index d38cefcc1..5a2da8127 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -39,6 +39,7 @@ sp-version = { default-features = false, git = "https://github.com/paritytech/su # frame dependencies cere-dev-runtime-constants = { path = "./constants", default-features = false } cere-runtime-common = { path = "../common", default-features = false } +ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-executive = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/runtime/cere-dev/constants/Cargo.toml b/runtime/cere-dev/constants/Cargo.toml index 3c42af3f5..c5c87d7c4 100644 --- a/runtime/cere-dev/constants/Cargo.toml +++ b/runtime/cere-dev/constants/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } [features] default = ["std"] diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 8d5ea40bc..b9359a935 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -23,6 +23,7 @@ #![recursion_limit = "256"] use codec::{Decode, Encode, MaxEncodedLen}; +use ddc_traits::pallet::PalletVisitor; use frame_election_provider_support::{onchain, BalancingConfig, SequentialPhragmen, VoteWeight}; use frame_support::{ construct_runtime, @@ -72,8 +73,8 @@ use sp_runtime::{ curve::PiecewiseLinear, generic, impl_opaque_keys, traits::{ - self, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, NumberFor, OpaqueKeys, - SaturatedConversion, StaticLookup, + self, AccountIdConversion, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, NumberFor, + OpaqueKeys, SaturatedConversion, StaticLookup, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedPointNumber, FixedU128, Perbill, Percent, Permill, Perquintill, @@ -1364,12 +1365,21 @@ parameter_types! { pub const PayoutsPalletId: PalletId = PalletId(*b"payouts_"); } +pub struct TreasureWrapper; +impl PalletVisitor for TreasureWrapper { + fn get_account_id() -> T::AccountId { + TreasuryPalletId::get().into_account_truncating() + } +} + impl pallet_ddc_payouts::Config for Runtime { type RuntimeEvent = RuntimeEvent; type PalletId = PayoutsPalletId; type Currency = Balances; type CustomerCharger = DdcCustomers; type ClusterVisitor = DdcClusters; + type TreasuryVisitor = TreasureWrapper; + type ValidatorList = pallet_staking::UseValidatorsMap; } construct_runtime!( @@ -1910,7 +1920,7 @@ mod tests { #[test] fn perbill_as_onchain_accuracy() { type OnChainAccuracy = - <::Solution as NposSolution>::Accuracy; + <::Solution as NposSolution>::Accuracy; let maximum_chain_accuracy: Vec> = (0..MaxNominations::get()) .map(|_| >::from(OnChainAccuracy::one().deconstruct())) .collect(); diff --git a/traits/Cargo.toml b/traits/Cargo.toml index fe6938291..b2c023f10 100644 --- a/traits/Cargo.toml +++ b/traits/Cargo.toml @@ -8,3 +8,4 @@ ddc-primitives = { version = "0.1.0", default-features = false, path = "../primi frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/traits/src/cluster.rs b/traits/src/cluster.rs index 0cf47a1c8..6752205b0 100644 --- a/traits/src/cluster.rs +++ b/traits/src/cluster.rs @@ -1,6 +1,6 @@ use ddc_primitives::{ - ClusterBondingParams, ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, - NodePubKey, NodeType, + ClusterBondingParams, ClusterFeesParams, ClusterGovParams, ClusterId, ClusterParams, + ClusterPricingParams, NodePubKey, NodeType, }; use frame_support::dispatch::DispatchResult; use frame_system::Config; @@ -17,6 +17,10 @@ pub trait ClusterVisitor { cluster_id: &ClusterId, ) -> Result; + fn get_fees_params(cluster_id: &ClusterId) -> Result; + + fn get_reserve_account_id(cluster_id: &ClusterId) -> Result; + fn get_chill_delay( cluster_id: &ClusterId, node_type: NodeType, diff --git a/traits/src/customer.rs b/traits/src/customer.rs index 73bbf784a..ad944e39b 100644 --- a/traits/src/customer.rs +++ b/traits/src/customer.rs @@ -4,5 +4,12 @@ pub trait CustomerCharger { content_owner: T::AccountId, billing_vault: T::AccountId, amount: u128, - ) -> sp_runtime::DispatchResult; + ) -> Result; +} + +pub enum CustomerChargerError { + NotOwner, + ArithmeticUnderflow, + TransferFailed, + UnlockFailed, } diff --git a/traits/src/lib.rs b/traits/src/lib.rs index dc252fc3b..24ea7a7a1 100644 --- a/traits/src/lib.rs +++ b/traits/src/lib.rs @@ -2,4 +2,6 @@ pub mod cluster; pub mod customer; pub mod node; +pub mod pallet; pub mod staking; +pub mod validator; diff --git a/traits/src/pallet.rs b/traits/src/pallet.rs new file mode 100644 index 000000000..dec6f71b1 --- /dev/null +++ b/traits/src/pallet.rs @@ -0,0 +1,5 @@ +use frame_system::Config; + +pub trait PalletVisitor { + fn get_account_id() -> T::AccountId; +} diff --git a/traits/src/treasury.rs b/traits/src/treasury.rs new file mode 100644 index 000000000..f97529467 --- /dev/null +++ b/traits/src/treasury.rs @@ -0,0 +1,2 @@ +pub trait TreasuryVisitor { + fn cluster_has_node(cluster_id: &ClusterId, node_pub_key: &NodePubKey) -> bool; diff --git a/traits/src/validator.rs b/traits/src/validator.rs new file mode 100644 index 000000000..af7e29dc1 --- /dev/null +++ b/traits/src/validator.rs @@ -0,0 +1,6 @@ +use frame_system::Config; +use sp_std::prelude::*; + +pub trait ValidatorVisitor { + fn get_active_validators() -> Vec; +} From 61f701d67cc0f7e5e234904bad2543ef722cb719 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 27 Nov 2023 14:31:33 +0600 Subject: [PATCH 547/583] Fix node startup panic after clap upgrade to v4 (#161) After the [recent substrate update](https://github.com/Cerebellum-Network/blockchain-node/commit/fb82e2fd02f8736d5adf5c29b2c17053020cf59b) to `polkadot-v0.9.31` which contains `clap` major version upgrade from `3` to `4` the node panics at the startup. There are similar changes as we have here in the diff for `substrate-node`: https://github.com/paritytech/substrate/compare/polkadot-v0.9.30..polkadot-v0.9.31#diff-11f6080619429c3df8cc5afa5767fba0c3ae8ab867a163e782ae7e30df1082e3R23 Co-authored-by: Rakan Al-Huneiti --- cli/src/cli.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 57e4d9f59..4d6229b06 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -1,7 +1,7 @@ #[allow(missing_docs)] #[derive(Debug, clap::Parser)] pub struct Cli { - #[clap(subcommand)] + #[command(subcommand)] pub subcommand: Option, #[clap(flatten)] pub run: RunCmd, @@ -9,21 +9,22 @@ pub struct Cli { #[allow(missing_docs)] #[derive(Debug, clap::Parser)] +#[group(skip)] pub struct RunCmd { #[clap(flatten)] pub base: sc_cli::RunCmd, /// Enable DDC validation (disabled by default). Works only on validator nodes with enabled /// offchain workers. - #[clap(long, requires = "dac-url")] + #[arg(long, requires = "dac_url")] pub enable_ddc_validation: bool, /// DAC DataModel HTTP endpoint to retrieve DDC activity data for validation. - #[clap(long, requires = "enable-ddc-validation", value_parser = url::Url::parse)] + #[arg(long, requires = "enable_ddc_validation", value_parser = url::Url::parse)] pub dac_url: Option, /// Force using Cere Dev runtime. - #[clap(long = "force-cere-dev")] + #[arg(long = "force-cere-dev")] pub force_cere_dev: bool, /// Disable automatic hardware benchmarks. @@ -33,7 +34,7 @@ pub struct RunCmd { /// /// The results are then printed out in the logs, and also sent as part of /// telemetry, if telemetry is enabled. - #[clap(long)] + #[arg(long)] pub no_hardware_benchmarks: bool, } @@ -41,7 +42,7 @@ pub struct RunCmd { #[derive(Debug, clap::Subcommand)] pub enum Subcommand { /// Key management cli utilities - #[clap(subcommand)] + #[command(subcommand)] Key(sc_cli::KeySubcommand), /// Build a chain specification. @@ -66,7 +67,7 @@ pub enum Subcommand { Revert(sc_cli::RevertCmd), /// Sub-commands concerned with benchmarking. - #[clap(subcommand)] + #[command(subcommand)] Benchmark(frame_benchmarking_cli::BenchmarkCmd), /// Try some command against runtime state. From b5ae632253c11cf374bf0c71fd6c5f09fc4d596e Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Mon, 27 Nov 2023 12:33:37 +0400 Subject: [PATCH 548/583] Disable e2e tests (#158) --- .github/workflows/dev.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/dev.yaml b/.github/workflows/dev.yaml index e83f7209f..163c796df 100644 --- a/.github/workflows/dev.yaml +++ b/.github/workflows/dev.yaml @@ -91,6 +91,9 @@ jobs: trigger-e2e-tests: runs-on: ubuntu-latest + # e2e tests are in migration process. Disable the tests as recommended in this slack message: + # https://cere-network.slack.com/archives/C04LRGSLWG0/p1699892758049319 + if: false needs: build steps: - name: Get short SHA From d2895fe570ae64229073752369d324c7ad9cbbaf Mon Sep 17 00:00:00 2001 From: Raid5594 <52794079+Raid5594@users.noreply.github.com> Date: Mon, 27 Nov 2023 09:48:54 +0100 Subject: [PATCH 549/583] provide benchmarking and weights for ddc-staking after changes (#163) - update benchmarking - update weights --------- Co-authored-by: rakanalh --- pallets/ddc-clusters/src/tests.rs | 3 +- pallets/ddc-nodes/src/cdn_node.rs | 12 +- pallets/ddc-nodes/src/lib.rs | 21 +++- pallets/ddc-nodes/src/node.rs | 13 +-- pallets/ddc-nodes/src/storage_node.rs | 13 +-- pallets/ddc-nodes/src/testing_utils.rs | 4 +- pallets/ddc-nodes/src/tests.rs | 3 +- pallets/ddc-staking/src/benchmarking.rs | 21 +++- pallets/ddc-staking/src/lib.rs | 8 +- pallets/ddc-staking/src/mock.rs | 32 ++++- pallets/ddc-staking/src/testing_utils.rs | 90 ++++++++++++-- pallets/ddc-staking/src/weights.rs | 142 +++++++++++++++-------- primitives/src/lib.rs | 25 +++- runtime/cere-dev/src/lib.rs | 2 + traits/src/node.rs | 11 +- 15 files changed, 292 insertions(+), 108 deletions(-) diff --git a/pallets/ddc-clusters/src/tests.rs b/pallets/ddc-clusters/src/tests.rs index ae0b96ae2..97f2a3daf 100644 --- a/pallets/ddc-clusters/src/tests.rs +++ b/pallets/ddc-clusters/src/tests.rs @@ -1,11 +1,10 @@ //! Tests for the module. use super::{mock::*, *}; -use ddc_primitives::{ClusterId, ClusterParams, NodePubKey}; +use ddc_primitives::{CDNNodeParams, ClusterId, ClusterParams, NodeParams, NodePubKey}; use frame_support::{assert_noop, assert_ok, error::BadOrigin}; use frame_system::Config; use hex_literal::hex; -use pallet_ddc_nodes::{CDNNodeParams, NodeParams}; use sp_runtime::{traits::Hash, AccountId32, Perbill}; #[test] diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index eafe6cd27..43c3721f4 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -1,6 +1,6 @@ -use crate::node::{NodeError, NodeParams, NodeProps, NodeTrait}; +use crate::node::{NodeError, NodeProps, NodeTrait}; use codec::{Decode, Encode}; -use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey, NodeType}; +use ddc_primitives::{CDNNodePubKey, ClusterId, NodeParams, NodePubKey, NodeType}; use frame_support::{parameter_types, BoundedVec}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; @@ -28,14 +28,6 @@ pub struct CDNNodeProps { pub p2p_port: u16, } -#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct CDNNodeParams { - pub host: Vec, - pub http_port: u16, - pub grpc_port: u16, - pub p2p_port: u16, -} - impl CDNNode { pub fn new( node_pub_key: NodePubKey, diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 59b40e8ed..5bd307596 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -27,9 +27,9 @@ pub mod benchmarking; #[cfg(any(feature = "runtime-benchmarks", test))] pub mod testing_utils; -use ddc_primitives::{CDNNodePubKey, ClusterId, NodePubKey, StorageNodePubKey}; +use ddc_primitives::{CDNNodePubKey, ClusterId, NodeParams, NodePubKey, StorageNodePubKey}; use ddc_traits::{ - node::{NodeVisitor, NodeVisitorError}, + node::{NodeCreator, NodeVisitor, NodeVisitorError}, staking::StakingVisitor, }; @@ -43,8 +43,8 @@ mod node; mod storage_node; pub use crate::{ - cdn_node::{CDNNode, CDNNodeParams}, - node::{Node, NodeError, NodeParams, NodeTrait}, + cdn_node::CDNNode, + node::{Node, NodeError, NodeTrait}, storage_node::StorageNode, }; @@ -242,4 +242,17 @@ pub mod pallet { Self::get(node_pub_key.clone()).is_ok() } } + + impl NodeCreator for Pallet { + fn create_node( + node_pub_key: NodePubKey, + provider_id: T::AccountId, + node_params: NodeParams, + ) -> DispatchResult { + let node = Node::::new(node_pub_key, provider_id, node_params) + .map_err(Into::>::into)?; + Self::create(node).map_err(Into::>::into)?; + Ok(()) + } + } } diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 042d13be3..ecccdd200 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -1,13 +1,13 @@ #![allow(clippy::needless_lifetimes)] // ToDo use crate::{ - cdn_node::{CDNNode, CDNNodeParams, CDNNodeProps}, + cdn_node::{CDNNode, CDNNodeProps}, pallet::Error, - storage_node::{StorageNode, StorageNodeParams, StorageNodeProps}, + storage_node::{StorageNode, StorageNodeProps}, ClusterId, }; use codec::{Decode, Encode}; -use ddc_primitives::{NodePubKey, NodeType}; +use ddc_primitives::{NodeParams, NodePubKey, NodeType}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; @@ -17,13 +17,6 @@ pub enum Node { CDN(CDNNode), } -// Params fields are always coming from extrinsic input -#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub enum NodeParams { - StorageParams(StorageNodeParams), - CDNParams(CDNNodeParams), -} - // Props fields may include internal protocol properties #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodeProps { diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 902739771..0749c044e 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,10 +1,9 @@ -use crate::node::{NodeError, NodeParams, NodeProps, NodeTrait}; +use crate::node::{NodeError, NodeProps, NodeTrait}; use codec::{Decode, Encode}; -use ddc_primitives::{ClusterId, NodePubKey, NodeType, StorageNodePubKey}; +use ddc_primitives::{ClusterId, NodeParams, NodePubKey, NodeType, StorageNodePubKey}; use frame_support::{parameter_types, BoundedVec}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; -use sp_std::prelude::Vec; parameter_types! { pub MaxStorageNodeParamsLen: u16 = 2048; @@ -28,14 +27,6 @@ pub struct StorageNodeProps { pub p2p_port: u16, } -#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct StorageNodeParams { - pub host: Vec, - pub http_port: u16, - pub grpc_port: u16, - pub p2p_port: u16, -} - impl StorageNode { pub fn new( node_pub_key: NodePubKey, diff --git a/pallets/ddc-nodes/src/testing_utils.rs b/pallets/ddc-nodes/src/testing_utils.rs index 432107e61..8db4dfd35 100644 --- a/pallets/ddc-nodes/src/testing_utils.rs +++ b/pallets/ddc-nodes/src/testing_utils.rs @@ -1,7 +1,7 @@ //! Testing utils for ddc-staking. -use crate::{cdn_node::CDNNodeParams, node::NodeParams, Config, NodePubKey}; -use ddc_primitives::CDNNodePubKey; +use crate::{Config, NodePubKey}; +use ddc_primitives::{CDNNodeParams, CDNNodePubKey, NodeParams}; use frame_benchmarking::account; use sp_std::vec; diff --git a/pallets/ddc-nodes/src/tests.rs b/pallets/ddc-nodes/src/tests.rs index 1c5a80137..ede8e4c64 100644 --- a/pallets/ddc-nodes/src/tests.rs +++ b/pallets/ddc-nodes/src/tests.rs @@ -1,8 +1,7 @@ //! Tests for the module. use super::{mock::*, *}; -use crate::{cdn_node::CDNNodeParams, storage_node::StorageNodeParams}; -use ddc_primitives::NodePubKey; +use ddc_primitives::{CDNNodeParams, NodePubKey, StorageNodeParams}; use frame_support::{assert_noop, assert_ok}; use sp_runtime::AccountId32; diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index 6353e4a5d..a533a6828 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -2,7 +2,7 @@ use super::*; use crate::Pallet as DdcStaking; -use ddc_primitives::{CDNNodePubKey, NodeType}; +use ddc_primitives::{CDNNodeParams, CDNNodePubKey, NodeParams, NodeType, StorageNodePubKey}; use testing_utils::*; use frame_support::traits::Currency; @@ -23,6 +23,16 @@ benchmarks! { let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); let node = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); + let _ = T::NodeCreator::create_node( + node.clone(), + stash.clone(), + NodeParams::CDNParams(CDNNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }) + )?; let amount = T::Currency::minimum_balance() * 10u32.into(); whitelist_account!(stash); }: _(RawOrigin::Signed(stash.clone()), controller_lookup, node.clone(), amount) @@ -65,7 +75,8 @@ benchmarks! { } store { - let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(10u128).saturated_into::>())?; + let node_pub_key = NodePubKey::StoragePubKey(StorageNodePubKey::new([0; 32])); + let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(100u128), node_pub_key)?; whitelist_account!(controller); }: _(RawOrigin::Signed(controller), ClusterId::from([1; 20])) @@ -74,7 +85,8 @@ benchmarks! { } serve { - let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(10u128).saturated_into::>())?; + let node_pub_key = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); + let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(10u128), node_pub_key)?; whitelist_account!(controller); }: _(RawOrigin::Signed(controller), ClusterId::from([1; 20])) @@ -86,7 +98,8 @@ benchmarks! { // clean up any existing state. clear_storages_and_cdns::(); - let (cdn_stash, cdn_controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(10u128).saturated_into::>())?; + let node_pub_key = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); + let (cdn_stash, cdn_controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(10u128), node_pub_key)?; DdcStaking::::serve(RawOrigin::Signed(cdn_controller.clone()).into(), ClusterId::from([1; 20]))?; assert!(CDNs::::contains_key(&cdn_stash)); frame_system::Pallet::::set_block_number(T::BlockNumber::from(1u32)); diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index d32059d0f..cdb3c42de 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -32,8 +32,8 @@ use codec::{Decode, Encode, HasCompact}; use core::fmt::Debug; pub use ddc_primitives::{ClusterId, NodePubKey, NodeType}; use ddc_traits::{ - cluster::{ClusterVisitor, ClusterVisitorError}, - node::NodeVisitor, + cluster::{ClusterCreator, ClusterVisitor, ClusterVisitorError}, + node::{NodeCreator, NodeVisitor}, staking::{StakingVisitor, StakingVisitorError}, }; @@ -171,9 +171,13 @@ pub mod pallet { type ClusterVisitor: ClusterVisitor; + type ClusterCreator: ClusterCreator>; + type ClusterManager: ClusterManager; type NodeVisitor: NodeVisitor; + + type NodeCreator: NodeCreator; } /// Map from all locked "stash" accounts to the controller account. diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 868271f04..37e26b00f 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -4,7 +4,8 @@ use crate::{self as pallet_ddc_staking, *}; use ddc_primitives::{ - CDNNodePubKey, ClusterBondingParams, ClusterFeesParams, ClusterPricingParams, StorageNodePubKey, + CDNNodePubKey, ClusterBondingParams, ClusterFeesParams, ClusterGovParams, ClusterParams, + ClusterPricingParams, NodeParams, NodePubKey, StorageNodePubKey, }; use ddc_traits::{ cluster::{ClusterManager, ClusterManagerError, ClusterVisitor, ClusterVisitorError}, @@ -13,9 +14,11 @@ use ddc_traits::{ use frame_support::{ construct_runtime, + dispatch::DispatchResult, traits::{ConstU32, ConstU64, Everything, GenesisBuild}, weights::constants::RocksDbWeight, }; + use frame_system::mocking::{MockBlock, MockUncheckedExtrinsic}; use lazy_static::lazy_static; use parking_lot::{ReentrantMutex, ReentrantMutexGuard}; @@ -108,11 +111,38 @@ impl crate::pallet::Config for Test { type ClusterVisitor = TestClusterVisitor; type ClusterManager = TestClusterManager; type NodeVisitor = MockNodeVisitor; + type NodeCreator = TestNodeCreator; + type ClusterCreator = TestClusterCreator; } pub(crate) type DdcStakingCall = crate::Call; pub(crate) type TestRuntimeCall = ::RuntimeCall; +pub struct TestNodeCreator; +pub struct TestClusterCreator; pub struct TestClusterVisitor; + +impl NodeCreator for TestNodeCreator { + fn create_node( + _node_pub_key: NodePubKey, + _provider_id: T::AccountId, + _node_params: NodeParams, + ) -> DispatchResult { + Ok(()) + } +} + +impl ClusterCreator for TestClusterCreator { + fn create_new_cluster( + _cluster_id: ClusterId, + _cluster_manager_id: T::AccountId, + _cluster_reserve_id: T::AccountId, + _cluster_params: ClusterParams, + _cluster_gov_params: ClusterGovParams, + ) -> DispatchResult { + Ok(()) + } +} + impl ClusterVisitor for TestClusterVisitor { fn ensure_cluster(_cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { Ok(()) diff --git a/pallets/ddc-staking/src/testing_utils.rs b/pallets/ddc-staking/src/testing_utils.rs index 58e6b656b..277c59334 100644 --- a/pallets/ddc-staking/src/testing_utils.rs +++ b/pallets/ddc-staking/src/testing_utils.rs @@ -1,12 +1,16 @@ //! Testing utils for ddc-staking. use crate::{Pallet as DdcStaking, *}; -use ddc_primitives::CDNNodePubKey; +use ddc_primitives::{ + CDNNodeParams, CDNNodePubKey, ClusterGovParams, ClusterId, ClusterParams, NodeParams, + StorageNodeParams, +}; + use frame_benchmarking::account; use frame_system::RawOrigin; use frame_support::traits::Currency; -use sp_runtime::traits::StaticLookup; +use sp_runtime::{traits::StaticLookup, Perbill}; use sp_std::prelude::*; const SEED: u32 = 0; @@ -36,9 +40,10 @@ pub fn create_funded_user( pub fn create_funded_user_with_balance( string: &'static str, n: u32, - balance: BalanceOf, + balance_factor: u128, ) -> T::AccountId { let user = account(string, n, SEED); + let balance = T::Currency::minimum_balance() * balance_factor.saturated_into::>(); let _ = T::Currency::make_free_balance_be(&user, balance); user } @@ -53,6 +58,17 @@ pub fn create_stash_controller_node( let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); let node = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); + + T::NodeCreator::create_node( + node.clone(), + stash.clone(), + NodeParams::CDNParams(CDNNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }), + )?; let amount = T::Currency::minimum_balance() * (balance_factor / 10).max(1).into(); DdcStaking::::bond( RawOrigin::Signed(stash.clone()).into(), @@ -66,19 +82,73 @@ pub fn create_stash_controller_node( /// Create a stash and controller pair with fixed balance. pub fn create_stash_controller_node_with_balance( n: u32, - balance: crate::BalanceOf, + balance_factor: u128, + node_pub_key: NodePubKey, ) -> Result<(T::AccountId, T::AccountId, NodePubKey), &'static str> { - let stash = create_funded_user_with_balance::("stash", n, balance); - let controller = create_funded_user_with_balance::("controller", n, balance); + let stash = create_funded_user_with_balance::("stash", n, balance_factor); + let controller = create_funded_user_with_balance::("controller", n, balance_factor); let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); - let node = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); + + let node_pub = node_pub_key.clone(); + match node_pub_key { + NodePubKey::CDNPubKey(node_pub_key) => { + T::NodeCreator::create_node( + ddc_primitives::NodePubKey::CDNPubKey(node_pub_key), + stash.clone(), + NodeParams::CDNParams(CDNNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }), + )?; + }, + NodePubKey::StoragePubKey(node_pub_key) => { + T::NodeCreator::create_node( + NodePubKey::StoragePubKey(node_pub_key), + stash.clone(), + NodeParams::StorageParams(StorageNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }), + )?; + }, + } + + let cluster_id = ClusterId::from([1; 20]); + let cluster_params = ClusterParams { node_provider_auth_contract: stash.clone() }; + let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { + treasury_share: Perbill::default(), + validators_share: Perbill::default(), + cluster_reserve_share: Perbill::default(), + cdn_bond_size: 10u32.into(), + cdn_chill_delay: 50u32.into(), + cdn_unbonding_delay: 50u32.into(), + storage_bond_size: 10u32.into(), + storage_chill_delay: 50u32.into(), + storage_unbonding_delay: 50u32.into(), + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + }; + T::ClusterCreator::create_new_cluster( + cluster_id, + stash.clone(), + stash.clone(), + cluster_params, + cluster_gov_params, + )?; DdcStaking::::bond( RawOrigin::Signed(stash.clone()).into(), controller_lookup, - node.clone(), - balance, + node_pub.clone(), + T::Currency::minimum_balance() * balance_factor.saturated_into::>(), )?; - Ok((stash, controller, node)) + + Ok((stash, controller, node_pub)) } diff --git a/pallets/ddc-staking/src/weights.rs b/pallets/ddc-staking/src/weights.rs index efca88632..5437d12a2 100644 --- a/pallets/ddc-staking/src/weights.rs +++ b/pallets/ddc-staking/src/weights.rs @@ -44,72 +44,95 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking Nodes (r:1 w:1) + // Storage: DdcStaking Providers (r:1 w:1) + // Storage: DdcNodes CDNNodes (r:1 w:0) // Storage: Balances Locks (r:1 w:1) fn bond() -> Weight { - Weight::from_ref_time(55_007_000_u64) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + // Minimum execution time: 35_000 nanoseconds. + Weight::from_ref_time(37_000_000_u64) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) - // Storage: DdcStaking CurrentEra (r:1 w:0) + // Storage: DdcStaking Providers (r:1 w:0) + // Storage: DdcNodes CDNNodes (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn unbond() -> Weight { - Weight::from_ref_time(47_727_000_u64) - .saturating_add(T::DbWeight::get().reads(6_u64)) + // Minimum execution time: 37_000 nanoseconds. + Weight::from_ref_time(38_000_000_u64) + .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) - // Storage: DdcStaking CurrentEra (r:1 w:0) + // Storage: DdcStaking Providers (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) + // Storage: DdcStaking LeavingCDNs (r:1 w:0) + // Storage: DdcStaking LeavingStorages (r:1 w:0) fn withdraw_unbonded() -> Weight { - Weight::from_ref_time(69_750_000_u64) - .saturating_add(T::DbWeight::get().reads(4_u64)) + // Minimum execution time: 33_000 nanoseconds. + Weight::from_ref_time(34_000_000_u64) + .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } + // Storage: DdcClusters Clusters (r:1 w:0) // Storage: DdcStaking Ledger (r:1 w:0) - // Storage: DdcStaking Settings (r:1 w:0) + // Storage: DdcClusters ClustersGovParams (r:1 w:0) // Storage: DdcStaking CDNs (r:1 w:0) + // Storage: DdcStaking Providers (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:1) + // Storage: DdcStaking LeavingStorages (r:1 w:0) fn store() -> Weight { - Weight::from_ref_time(26_112_000_u64) - .saturating_add(T::DbWeight::get().reads(4_u64)) + // Minimum execution time: 28_000 nanoseconds. + Weight::from_ref_time(29_000_000_u64) + .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } + // Storage: DdcClusters Clusters (r:1 w:0) // Storage: DdcStaking Ledger (r:1 w:0) - // Storage: DdcStaking Settings (r:1 w:0) + // Storage: DdcClusters ClustersGovParams (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) + // Storage: DdcStaking Providers (r:1 w:0) // Storage: DdcStaking CDNs (r:1 w:1) + // Storage: DdcStaking LeavingCDNs (r:1 w:0) fn serve() -> Weight { - Weight::from_ref_time(19_892_000_u64) - .saturating_add(T::DbWeight::get().reads(4_u64)) + // Minimum execution time: 27_000 nanoseconds. + Weight::from_ref_time(28_000_000_u64) + .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) - // Storage: DdcStaking CurrentEra (r:1 w:0) // Storage: DdcStaking CDNs (r:1 w:1) - // Storage: DdcStaking Settings (r:1 w:0) + // Storage: DdcClusters ClustersGovParams (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) fn chill() -> Weight { - Weight::from_ref_time(77_450_000_u64) - .saturating_add(T::DbWeight::get().reads(5_u64)) + // Minimum execution time: 27_000 nanoseconds. + Weight::from_ref_time(28_000_000_u64) + .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:2 w:2) fn set_controller() -> Weight { - Weight::from_ref_time(38_521_000_u64) + // Minimum execution time: 12_000 nanoseconds. + Weight::from_ref_time(13_000_000_u64) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - // Storage: DdcStaking Nodes (r:1 w:1) + // Storage: DdcStaking Nodes (r:1 w:2) + // Storage: DdcStaking Providers (r:1 w:1) + // Storage: DdcStaking CDNs (r:1 w:0) + // Storage: DdcStaking Storages (r:1 w:0) + // Storage: DdcStaking LeavingCDNs (r:1 w:0) + // Storage: DdcStaking LeavingStorages (r:1 w:0) fn set_node() -> Weight { - Weight::from_ref_time(21_779_000_u64) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) + // Minimum execution time: 13_000 nanoseconds. + Weight::from_ref_time(14_000_000_u64) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } } @@ -118,71 +141,94 @@ impl WeightInfo for () { // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking Nodes (r:1 w:1) + // Storage: DdcStaking Providers (r:1 w:1) + // Storage: DdcNodes CDNNodes (r:1 w:0) // Storage: Balances Locks (r:1 w:1) fn bond() -> Weight { - Weight::from_ref_time(55_007_000_u64) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + // Minimum execution time: 35_000 nanoseconds. + Weight::from_ref_time(37_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) - // Storage: DdcStaking CurrentEra (r:1 w:0) + // Storage: DdcStaking Providers (r:1 w:0) + // Storage: DdcNodes CDNNodes (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn unbond() -> Weight { - Weight::from_ref_time(47_727_000_u64) - .saturating_add(RocksDbWeight::get().reads(6_u64)) + // Minimum execution time: 37_000 nanoseconds. + Weight::from_ref_time(38_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) - // Storage: DdcStaking CurrentEra (r:1 w:0) + // Storage: DdcStaking Providers (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) + // Storage: DdcStaking LeavingCDNs (r:1 w:0) + // Storage: DdcStaking LeavingStorages (r:1 w:0) fn withdraw_unbonded() -> Weight { - Weight::from_ref_time(69_750_000_u64) - .saturating_add(RocksDbWeight::get().reads(4_u64)) + // Minimum execution time: 33_000 nanoseconds. + Weight::from_ref_time(34_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } + // Storage: DdcClusters Clusters (r:1 w:0) // Storage: DdcStaking Ledger (r:1 w:0) - // Storage: DdcStaking Settings (r:1 w:0) + // Storage: DdcClusters ClustersGovParams (r:1 w:0) // Storage: DdcStaking CDNs (r:1 w:0) + // Storage: DdcStaking Providers (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:1) + // Storage: DdcStaking LeavingStorages (r:1 w:0) fn store() -> Weight { - Weight::from_ref_time(26_112_000_u64) - .saturating_add(RocksDbWeight::get().reads(4_u64)) + // Minimum execution time: 28_000 nanoseconds. + Weight::from_ref_time(29_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } + // Storage: DdcClusters Clusters (r:1 w:0) // Storage: DdcStaking Ledger (r:1 w:0) - // Storage: DdcStaking Settings (r:1 w:0) + // Storage: DdcClusters ClustersGovParams (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) + // Storage: DdcStaking Providers (r:1 w:0) // Storage: DdcStaking CDNs (r:1 w:1) + // Storage: DdcStaking LeavingCDNs (r:1 w:0) fn serve() -> Weight { - Weight::from_ref_time(19_892_000_u64) - .saturating_add(RocksDbWeight::get().reads(4_u64)) + // Minimum execution time: 27_000 nanoseconds. + Weight::from_ref_time(28_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) - // Storage: DdcStaking CurrentEra (r:1 w:0) // Storage: DdcStaking CDNs (r:1 w:1) - // Storage: DdcStaking Settings (r:1 w:0) + // Storage: DdcClusters ClustersGovParams (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) fn chill() -> Weight { - Weight::from_ref_time(77_450_000_u64) - .saturating_add(RocksDbWeight::get().reads(5_u64)) + // Minimum execution time: 27_000 nanoseconds. + Weight::from_ref_time(28_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:2 w:2) fn set_controller() -> Weight { - Weight::from_ref_time(38_521_000_u64) + // Minimum execution time: 12_000 nanoseconds. + Weight::from_ref_time(13_000_000_u64) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - // Storage: DdcStaking Nodes (r:1 w:1) + // Storage: DdcStaking Nodes (r:1 w:2) + // Storage: DdcStaking Providers (r:1 w:1) + // Storage: DdcStaking CDNs (r:1 w:0) + // Storage: DdcStaking Storages (r:1 w:0) + // Storage: DdcStaking LeavingCDNs (r:1 w:0) + // Storage: DdcStaking LeavingStorages (r:1 w:0) fn set_node() -> Weight { - Weight::from_ref_time(21_779_000_u64) - .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) + // Minimum execution time: 13_000 nanoseconds. + Weight::from_ref_time(14_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } } diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 3cdb76416..b17d85d4f 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -1,7 +1,7 @@ #![cfg_attr(not(feature = "std"), no_std)] use codec::{Decode, Encode}; -use scale_info::TypeInfo; +use scale_info::{prelude::vec::Vec, TypeInfo}; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; use sp_core::hash::H160; @@ -94,3 +94,26 @@ impl TryFrom for NodeType { } } } + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct CDNNodeParams { + pub host: Vec, + pub http_port: u16, + pub grpc_port: u16, + pub p2p_port: u16, +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub struct StorageNodeParams { + pub host: Vec, + pub http_port: u16, + pub grpc_port: u16, + pub p2p_port: u16, +} + +// Params fields are always coming from extrinsic input +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub enum NodeParams { + StorageParams(StorageNodeParams), + CDNParams(CDNNodeParams), +} diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index b9359a935..5afafa72c 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1329,8 +1329,10 @@ impl pallet_ddc_staking::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; type ClusterVisitor = pallet_ddc_clusters::Pallet; + type ClusterCreator = pallet_ddc_clusters::Pallet; type ClusterManager = pallet_ddc_clusters::Pallet; type NodeVisitor = pallet_ddc_nodes::Pallet; + type NodeCreator = pallet_ddc_nodes::Pallet; } parameter_types! { diff --git a/traits/src/node.rs b/traits/src/node.rs index 0ab55c1d1..ed60e0f1a 100644 --- a/traits/src/node.rs +++ b/traits/src/node.rs @@ -1,4 +1,5 @@ -use ddc_primitives::{ClusterId, NodePubKey}; +use ddc_primitives::{ClusterId, NodeParams, NodePubKey}; +use frame_support::dispatch::DispatchResult; use frame_system::Config; pub trait NodeVisitor { @@ -6,6 +7,14 @@ pub trait NodeVisitor { fn exists(node_pub_key: &NodePubKey) -> bool; } +pub trait NodeCreator { + fn create_node( + node_pub_key: NodePubKey, + provider_id: T::AccountId, + node_params: NodeParams, + ) -> DispatchResult; +} + pub enum NodeVisitorError { NodeDoesNotExist, } From dd1111df794308d0db9adf9ee1b6252fa1b49452 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 27 Nov 2023 16:01:02 +0600 Subject: [PATCH 550/583] Genesis config for `pallet-ddc-clusters` (#153) * `GenesisConfig` implementation for `pallet-ddc-clusters`. * It skips `add_node` with checks and directly writes to the storage because currently cluster authorization smart contract is mandatory, but can't be set in in a genesis state (`pallet-contracts` does not implement `GenesisConfig`). Future implementation may make the extension contract optional and use `add_node` to check if the user set `ddc-staking` and `ddc-nodes` genesis consistently. --------- Co-authored-by: Rakan Al-Huneiti --- Cargo.lock | 1 + node/service/src/chain_spec.rs | 1 + pallets/ddc-clusters/Cargo.toml | 2 ++ pallets/ddc-clusters/src/cluster.rs | 4 +++ pallets/ddc-clusters/src/lib.rs | 55 +++++++++++++++++++++++++++++ primitives/src/lib.rs | 1 + 6 files changed, 64 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 7f5aa29d1..1e6ba75c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4733,6 +4733,7 @@ dependencies = [ "pallet-timestamp", "parity-scale-codec", "scale-info", + "serde", "sp-core", "sp-io", "sp-runtime", diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index 1559b913a..726fa96d8 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -235,6 +235,7 @@ pub fn cere_dev_genesis( transaction_payment: Default::default(), ddc_customers: Default::default(), nomination_pools: Default::default(), + ddc_clusters: Default::default(), } } diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index cd2ef1a2c..6802d4872 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -13,6 +13,7 @@ hex-literal = "^0.3.1" pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +serde = { version = "1.0.136", default-features = false, features = ["derive"], optional = true } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -29,6 +30,7 @@ substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", br default = ["std"] std = [ "codec/std", + "serde", "ddc-primitives/std", "frame-support/std", "frame-system/std", diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index d8f68a497..e79bbd108 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -3,11 +3,14 @@ use codec::{Decode, Encode}; use ddc_primitives::{ClusterId, ClusterParams}; use frame_support::{pallet_prelude::*, parameter_types}; use scale_info::TypeInfo; +#[cfg(feature = "std")] +use serde::{Deserialize, Serialize}; parameter_types! { pub MaxClusterParamsLen: u16 = 2048; } +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct Cluster { pub cluster_id: ClusterId, @@ -16,6 +19,7 @@ pub struct Cluster { pub props: ClusterProps, } +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct ClusterProps { pub node_provider_auth_contract: AccountId, diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 1928dd620..76ba79fdc 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -33,6 +33,7 @@ use ddc_traits::{ staking::{StakingVisitor, StakingVisitorError}, }; use frame_support::{ + assert_ok, pallet_prelude::*, traits::{Currency, LockableCurrency}, }; @@ -118,6 +119,60 @@ pub mod pallet { OptionQuery, >; + #[pallet::genesis_config] + pub struct GenesisConfig { + pub clusters: Vec>, + #[allow(clippy::type_complexity)] + pub clusters_gov_params: Vec<(ClusterId, ClusterGovParams, T::BlockNumber>)>, + pub clusters_nodes: Vec<(ClusterId, Vec)>, + } + + #[cfg(feature = "std")] + impl Default for GenesisConfig { + fn default() -> Self { + GenesisConfig { + clusters: Default::default(), + clusters_gov_params: Default::default(), + clusters_nodes: Default::default(), + } + } + } + + #[pallet::genesis_build] + impl GenesisBuild for GenesisConfig + where + T::AccountId: UncheckedFrom + AsRef<[u8]>, + { + fn build(&self) { + for cluster in &self.clusters { + assert_ok!(Pallet::::create_cluster( + frame_system::Origin::::Root.into(), + cluster.cluster_id, + cluster.manager_id.clone(), + cluster.reserve_id.clone(), + ClusterParams:: { + node_provider_auth_contract: cluster + .props + .node_provider_auth_contract + .clone(), + }, + self.clusters_gov_params + .iter() + .find(|(id, _)| id == &cluster.cluster_id) + .unwrap() + .1 + .clone(), + )); + + for (cluster_id, nodes) in &self.clusters_nodes { + for node_pub_key in nodes { + >::insert(cluster_id, node_pub_key, true); + } + } + } + } + } + #[pallet::call] impl Pallet where diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index b17d85d4f..935596114 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -20,6 +20,7 @@ pub struct ClusterParams { } // ClusterGovParams includes Governance sensitive parameters +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] #[scale_info(skip_type_params(Balance, BlockNumber, T))] pub struct ClusterGovParams { From 10be10c1a916c570f39c0695e7210451865d3417 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 27 Nov 2023 16:01:17 +0600 Subject: [PATCH 551/583] Make optional cluster auth extension contract (#162) Co-authored-by: Rakan Al-Huneiti --- pallets/ddc-clusters/src/cluster.rs | 2 +- pallets/ddc-clusters/src/lib.rs | 27 +++++++++++------------ pallets/ddc-clusters/src/tests.rs | 20 ++++++++--------- pallets/ddc-customers/src/benchmarking.rs | 2 +- primitives/src/lib.rs | 2 +- 5 files changed, 26 insertions(+), 27 deletions(-) diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index e79bbd108..5fc7821c8 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -22,7 +22,7 @@ pub struct Cluster { #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct ClusterProps { - pub node_provider_auth_contract: AccountId, + pub node_provider_auth_contract: Option, } impl Cluster { diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 76ba79fdc..dad079fa2 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -220,24 +220,23 @@ pub mod pallet { .map_err(Into::>::into)?; ensure!(!has_chilling_attempt, Error::::NodeChillingIsProhibited); - // Cluster extension smart contract allows joining. - let auth_contract = NodeProviderAuthContract::::new( - cluster.props.node_provider_auth_contract, - caller_id, - ); - // Node with this node with this public key exists. let node = T::NodeRepository::get(node_pub_key.clone()) .map_err(|_| Error::::AttemptToAddNonExistentNode)?; - let is_authorized = auth_contract - .is_authorized( - node.get_provider_id().to_owned(), - node.get_pub_key(), - node.get_type(), - ) - .map_err(Into::>::into)?; - ensure!(is_authorized, Error::::NodeIsNotAuthorized); + // Cluster extension smart contract allows joining. + if let Some(address) = cluster.props.node_provider_auth_contract { + let auth_contract = NodeProviderAuthContract::::new(address, caller_id); + + let is_authorized = auth_contract + .is_authorized( + node.get_provider_id().to_owned(), + node.get_pub_key(), + node.get_type(), + ) + .map_err(Into::>::into)?; + ensure!(is_authorized, Error::::NodeIsNotAuthorized); + }; // Add node to the cluster. >::add_node(&cluster_id, &node_pub_key) diff --git a/pallets/ddc-clusters/src/tests.rs b/pallets/ddc-clusters/src/tests.rs index 97f2a3daf..2c7aa2330 100644 --- a/pallets/ddc-clusters/src/tests.rs +++ b/pallets/ddc-clusters/src/tests.rs @@ -35,7 +35,7 @@ fn create_cluster_works() { ClusterId::from([1; 20]), AccountId::from([1; 32]), AccountId::from([2; 32]), - ClusterParams { node_provider_auth_contract: AccountId::from([1; 32]) }, + ClusterParams { node_provider_auth_contract: Some(AccountId::from([1; 32])) }, cluster_gov_params.clone() ), BadOrigin @@ -47,7 +47,7 @@ fn create_cluster_works() { ClusterId::from([1; 20]), AccountId::from([1; 32]), AccountId::from([2; 32]), - ClusterParams { node_provider_auth_contract: AccountId::from([1; 32]) }, + ClusterParams { node_provider_auth_contract: Some(AccountId::from([1; 32])) }, cluster_gov_params.clone() )); @@ -58,7 +58,7 @@ fn create_cluster_works() { ClusterId::from([1; 20]), AccountId::from([1; 32]), AccountId::from([2; 32]), - ClusterParams { node_provider_auth_contract: AccountId::from([1; 32]) }, + ClusterParams { node_provider_auth_contract: Some(AccountId::from([1; 32])) }, cluster_gov_params ), Error::::ClusterAlreadyExists @@ -95,7 +95,7 @@ fn add_and_delete_node_works() { ClusterId::from([1; 20]), AccountId::from([1; 32]), AccountId::from([2; 32]), - ClusterParams { node_provider_auth_contract: AccountId::from([1; 32]) }, + ClusterParams { node_provider_auth_contract: Some(AccountId::from([1; 32])) }, ClusterGovParams { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), @@ -165,7 +165,7 @@ fn add_and_delete_node_works() { assert_ok!(DdcClusters::set_cluster_params( RuntimeOrigin::signed(AccountId::from([1; 32])), ClusterId::from([1; 20]), - ClusterParams { node_provider_auth_contract: contract_id }, + ClusterParams { node_provider_auth_contract: Some(contract_id) }, )); // Node doesn't exist @@ -295,7 +295,7 @@ fn set_cluster_params_works() { DdcClusters::set_cluster_params( RuntimeOrigin::signed(AccountId::from([2; 32])), ClusterId::from([2; 20]), - ClusterParams { node_provider_auth_contract: AccountId::from([2; 32]) }, + ClusterParams { node_provider_auth_contract: Some(AccountId::from([2; 32])) }, ), Error::::ClusterDoesNotExist ); @@ -306,7 +306,7 @@ fn set_cluster_params_works() { ClusterId::from([1; 20]), AccountId::from([1; 32]), AccountId::from([2; 32]), - ClusterParams { node_provider_auth_contract: AccountId::from([1; 32]) }, + ClusterParams { node_provider_auth_contract: Some(AccountId::from([1; 32])) }, ClusterGovParams { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), @@ -328,7 +328,7 @@ fn set_cluster_params_works() { DdcClusters::set_cluster_params( RuntimeOrigin::signed(AccountId::from([2; 32])), ClusterId::from([1; 20]), - ClusterParams { node_provider_auth_contract: AccountId::from([2; 32]) }, + ClusterParams { node_provider_auth_contract: Some(AccountId::from([2; 32])) }, ), Error::::OnlyClusterManager ); @@ -336,7 +336,7 @@ fn set_cluster_params_works() { assert_ok!(DdcClusters::set_cluster_params( RuntimeOrigin::signed(AccountId::from([1; 32])), ClusterId::from([1; 20]), - ClusterParams { node_provider_auth_contract: AccountId::from([2; 32]) }, + ClusterParams { node_provider_auth_contract: Some(AccountId::from([2; 32])) }, )); // Checking that event was emitted @@ -383,7 +383,7 @@ fn set_cluster_gov_params_works() { ClusterId::from([1; 20]), AccountId::from([1; 32]), AccountId::from([2; 32]), - ClusterParams { node_provider_auth_contract: AccountId::from([1; 32]) }, + ClusterParams { node_provider_auth_contract: Some(AccountId::from([1; 32])) }, cluster_gov_params.clone() )); diff --git a/pallets/ddc-customers/src/benchmarking.rs b/pallets/ddc-customers/src/benchmarking.rs index efb11b201..39a9b7165 100644 --- a/pallets/ddc-customers/src/benchmarking.rs +++ b/pallets/ddc-customers/src/benchmarking.rs @@ -41,7 +41,7 @@ benchmarks! { ClusterId::from([1; 20]), user.clone(), user.clone(), - ClusterParams { node_provider_auth_contract: user.clone() }, + ClusterParams { node_provider_auth_contract: Some(user.clone()) }, cluster_gov_params ); diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 935596114..a665c1a29 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -16,7 +16,7 @@ pub type CDNNodePubKey = AccountId32; // ClusterParams includes Governance non-sensetive parameters only #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct ClusterParams { - pub node_provider_auth_contract: AccountId, + pub node_provider_auth_contract: Option, } // ClusterGovParams includes Governance sensitive parameters From 828361345b9678642b2bed3a55ede5ef18858ea4 Mon Sep 17 00:00:00 2001 From: Rakan Al-Huneiti Date: Mon, 27 Nov 2023 15:05:43 +0300 Subject: [PATCH 552/583] Rustfmt rules (#151) - [x] Add rustfmt rules - [x] Execute `cargo fmt` to format the files according to the set rules. --- .rustfmt.toml | 30 ++++++++++++++++++ cli/src/command.rs | 4 +-- cli/src/lib.rs | 2 -- node/client/src/lib.rs | 3 +- node/service/src/chain_spec.rs | 6 ++-- node/service/src/lib.rs | 7 ++--- pallets/chainbridge/src/mock.rs | 5 ++- pallets/chainbridge/src/tests.rs | 31 ++++--------------- pallets/ddc-clusters/src/cluster.rs | 3 +- pallets/ddc-clusters/src/lib.rs | 12 ++++--- pallets/ddc-clusters/src/mock.rs | 3 +- .../ddc-clusters/src/node_provider_auth.rs | 3 +- pallets/ddc-clusters/src/tests.rs | 3 +- pallets/ddc-customers/src/benchmarking.rs | 5 +-- pallets/ddc-customers/src/lib.rs | 7 ++--- pallets/ddc-customers/src/mock.rs | 3 +- pallets/ddc-customers/src/tests.rs | 4 +-- .../ddc-metrics-offchain-worker/src/lib.rs | 10 +++--- .../src/tests/mod.rs | 24 ++++++++------ .../src/tests/test_runtime.rs | 5 +-- pallets/ddc-nodes/src/benchmarking.rs | 11 +++---- pallets/ddc-nodes/src/cdn_node.rs | 3 +- pallets/ddc-nodes/src/lib.rs | 4 +-- pallets/ddc-nodes/src/mock.rs | 3 +- pallets/ddc-nodes/src/node.rs | 9 +++--- pallets/ddc-nodes/src/storage_node.rs | 3 +- pallets/ddc-nodes/src/testing_utils.rs | 3 +- pallets/ddc-nodes/src/tests.rs | 3 +- pallets/ddc-payouts/src/lib.rs | 3 +- pallets/ddc-payouts/src/mock.rs | 4 +-- pallets/ddc-payouts/src/tests.rs | 3 +- pallets/ddc-staking/src/benchmarking.rs | 15 +++++---- pallets/ddc-staking/src/lib.rs | 6 ++-- pallets/ddc-staking/src/mock.rs | 8 ++--- pallets/ddc-staking/src/testing_utils.rs | 9 +++--- pallets/ddc-staking/src/tests.rs | 4 +-- pallets/ddc/src/lib.rs | 1 - pallets/ddc/src/mock.rs | 3 +- pallets/ddc/src/tests.rs | 3 +- pallets/erc20/src/lib.rs | 5 ++- pallets/erc721/src/mock.rs | 4 +-- pallets/erc721/src/tests.rs | 5 +-- runtime/cere-dev/src/impls.rs | 12 ++++--- runtime/cere-dev/src/lib.rs | 27 ++++++++-------- runtime/cere/src/impls.rs | 12 ++++--- runtime/cere/src/lib.rs | 27 ++++++++-------- 46 files changed, 190 insertions(+), 170 deletions(-) create mode 100644 .rustfmt.toml diff --git a/.rustfmt.toml b/.rustfmt.toml new file mode 100644 index 000000000..d9f213a06 --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1,30 @@ +edition = "2021" + +# Basic +hard_tabs = true +max_width = 100 +use_small_heuristics = "Max" + +# Imports +imports_granularity = "Crate" +reorder_imports = true +group_imports = "StdExternalCrate" + +# Consistency +newline_style = "Unix" + +# Format comments +comment_width = 100 +wrap_comments = true + +# Misc +chain_width = 80 +spaces_around_ranges = false +binop_separator = "Back" +reorder_impl_items = false +match_arm_leading_pipes = "Preserve" +match_arm_blocks = false +match_block_trailing_comma = true +trailing_comma = "Vertical" +trailing_semicolon = false +use_field_init_shorthand = true diff --git a/cli/src/command.rs b/cli/src/command.rs index 665ba9d31..06de8607f 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -1,10 +1,10 @@ -use crate::cli::{Cli, Subcommand}; - use cere_service::{self, IdentifyVariant}; use frame_benchmarking_cli::{BenchmarkCmd, SUBSTRATE_REFERENCE_HARDWARE}; use sc_cli::{Error, RuntimeVersion, SubstrateCli}; use sc_service::error::Error as ServiceError; +use crate::cli::{Cli, Subcommand}; + impl SubstrateCli for Cli { fn impl_name() -> String { "Cere Node".into() diff --git a/cli/src/lib.rs b/cli/src/lib.rs index e480f49c7..d25b1d6e8 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -9,9 +9,7 @@ mod command; #[cfg(feature = "cli")] pub use cli::*; - #[cfg(feature = "cli")] pub use command::*; - #[cfg(feature = "cli")] pub use sc_cli::{Error, Result}; diff --git a/node/client/src/lib.rs b/node/client/src/lib.rs index 834350915..240894e91 100644 --- a/node/client/src/lib.rs +++ b/node/client/src/lib.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + pub use node_primitives::{AccountId, Balance, Block, BlockNumber, Hash, Header, Index, Signature}; use sc_client_api::{AuxStore, Backend as BackendT, BlockchainEvents, KeyIterator, UsageProvider}; pub use sc_executor::NativeElseWasmExecutor; @@ -10,7 +12,6 @@ use sp_runtime::{ Justifications, }; use sp_storage::{ChildInfo, StorageData, StorageKey}; -use std::sync::Arc; pub type FullBackend = sc_service::TFullBackend; pub type FullClient = diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index 726fa96d8..f17f9343f 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -1,11 +1,9 @@ -#[cfg(feature = "cere-native")] -use cere_runtime as cere; - #[cfg(feature = "cere-dev-native")] use cere_dev_runtime as cere_dev; #[cfg(feature = "cere-dev-native")] use cere_dev_runtime_constants::currency::DOLLARS as TEST_UNITS; - +#[cfg(feature = "cere-native")] +use cere_runtime as cere; pub use node_primitives::{AccountId, Balance, Block, Signature}; use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use sc_chain_spec::ChainSpecExtension; diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index ee62d08d1..774ff1e1d 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -1,13 +1,15 @@ //! Service and ServiceFactory implementation. Specialized wrapper over substrate service. +use std::sync::Arc; + #[cfg(feature = "cere-dev-native")] pub use cere_dev_runtime; #[cfg(feature = "cere-native")] pub use cere_runtime; - use futures::prelude::*; use sc_client_api::{Backend, BlockBackend}; use sc_consensus_babe::{self, SlotProportion}; +pub use sc_executor::NativeExecutionDispatch; use sc_network::Event; use sc_service::{ error::Error as ServiceError, Configuration, KeystoreContainer, RpcHandlers, TaskManager, @@ -15,9 +17,6 @@ use sc_service::{ use sc_telemetry::{Telemetry, TelemetryWorker}; use sp_runtime::traits::{BlakeTwo256, Block as BlockT}; use sp_trie::PrefixedMemoryDB; -use std::sync::Arc; - -pub use sc_executor::NativeExecutionDispatch; pub mod chain_spec; pub use cere_client::{ AbstractClient, CereDevExecutorDispatch, CereExecutorDispatch, Client, ClientHandle, diff --git a/pallets/chainbridge/src/mock.rs b/pallets/chainbridge/src/mock.rs index 2a3fd20b5..33fd9c5c0 100644 --- a/pallets/chainbridge/src/mock.rs +++ b/pallets/chainbridge/src/mock.rs @@ -1,11 +1,10 @@ #![cfg(test)] -use super::*; - use frame_support::{ assert_ok, ord_parameter_types, parameter_types, traits::Everything, weights::Weight, }; use frame_system::{self as system}; +pub use pallet_balances as balances; use sp_core::H256; use sp_runtime::{ testing::Header, @@ -13,8 +12,8 @@ use sp_runtime::{ Perbill, }; +use super::*; use crate::{self as bridge, Config}; -pub use pallet_balances as balances; parameter_types! { pub const BlockHashCount: u64 = 250; diff --git a/pallets/chainbridge/src/tests.rs b/pallets/chainbridge/src/tests.rs index ce0e308c0..673b33cb9 100644 --- a/pallets/chainbridge/src/tests.rs +++ b/pallets/chainbridge/src/tests.rs @@ -1,5 +1,7 @@ #![cfg(test)] +use frame_support::{assert_noop, assert_ok}; + use super::{ mock::{ assert_events, new_test_ext, Balances, Bridge, ProposalLifetime, RuntimeCall, RuntimeEvent, @@ -9,7 +11,6 @@ use super::{ *, }; use crate::mock::new_test_ext_initialized; -use frame_support::{assert_noop, assert_ok}; #[test] fn derive_ids() { @@ -141,12 +142,7 @@ fn asset_transfer_success() { assert_ok!(Bridge::set_threshold(RuntimeOrigin::root(), TEST_THRESHOLD,)); assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), dest_id)); - assert_ok!(Bridge::transfer_fungible( - dest_id, - resource_id, - to.clone(), - amount.into() - )); + assert_ok!(Bridge::transfer_fungible(dest_id, resource_id, to.clone(), amount.into())); assert_events(vec![ RuntimeEvent::Bridge(RawEvent::ChainWhitelisted(dest_id)), RuntimeEvent::Bridge(RawEvent::FungibleTransfer( @@ -174,11 +170,7 @@ fn asset_transfer_success() { metadata.clone(), ))]); - assert_ok!(Bridge::transfer_generic( - dest_id, - resource_id, - metadata.clone() - )); + assert_ok!(Bridge::transfer_generic(dest_id, resource_id, metadata.clone())); assert_events(vec![RuntimeEvent::Bridge(RawEvent::GenericTransfer( dest_id, 3, @@ -200,23 +192,12 @@ fn asset_transfer_invalid_resource_id() { assert_ok!(Bridge::whitelist_chain(RuntimeOrigin::root(), dest_id)); assert_noop!( - Bridge::transfer_fungible( - dest_id, - resource_id, - to, - amount.into() - ), + Bridge::transfer_fungible(dest_id, resource_id, to, amount.into()), Error::::ResourceDoesNotExist ); assert_noop!( - Bridge::transfer_nonfungible( - dest_id, - resource_id, - vec![], - vec![], - vec![] - ), + Bridge::transfer_nonfungible(dest_id, resource_id, vec![], vec![], vec![]), Error::::ResourceDoesNotExist ); diff --git a/pallets/ddc-clusters/src/cluster.rs b/pallets/ddc-clusters/src/cluster.rs index 5fc7821c8..af42ea45e 100644 --- a/pallets/ddc-clusters/src/cluster.rs +++ b/pallets/ddc-clusters/src/cluster.rs @@ -1,4 +1,3 @@ -use crate::pallet::Error; use codec::{Decode, Encode}; use ddc_primitives::{ClusterId, ClusterParams}; use frame_support::{pallet_prelude::*, parameter_types}; @@ -6,6 +5,8 @@ use scale_info::TypeInfo; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; +use crate::pallet::Error; + parameter_types! { pub MaxClusterParamsLen: u16 = 2048; } diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index dad079fa2..b10a4c152 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -20,10 +20,6 @@ pub(crate) mod mock; #[cfg(test)] mod tests; -use crate::{ - cluster::Cluster, - node_provider_auth::{NodeProviderAuthContract, NodeProviderAuthContractError}, -}; use ddc_primitives::{ ClusterBondingParams, ClusterFeesParams, ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, NodePubKey, NodeType, @@ -43,6 +39,11 @@ use pallet_ddc_nodes::{NodeRepository, NodeTrait}; use sp_runtime::SaturatedConversion; use sp_std::prelude::*; +use crate::{ + cluster::Cluster, + node_provider_auth::{NodeProviderAuthContract, NodeProviderAuthContractError}, +}; + pub mod cluster; mod node_provider_auth; @@ -52,10 +53,11 @@ pub type BalanceOf = #[frame_support::pallet] pub mod pallet { - use super::*; use ddc_traits::cluster::{ClusterManager, ClusterManagerError}; use pallet_contracts::chain_extension::UncheckedFrom; + use super::*; + #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] #[pallet::without_storage_info] diff --git a/pallets/ddc-clusters/src/mock.rs b/pallets/ddc-clusters/src/mock.rs index efbea68fb..dd319afc3 100644 --- a/pallets/ddc-clusters/src/mock.rs +++ b/pallets/ddc-clusters/src/mock.rs @@ -2,7 +2,6 @@ #![allow(dead_code)] -use crate::{self as pallet_ddc_clusters, *}; use ddc_primitives::{ClusterId, NodePubKey}; use ddc_traits::staking::{StakingVisitor, StakingVisitorError}; use frame_support::{ @@ -22,6 +21,8 @@ use sp_runtime::{ MultiSignature, }; +use crate::{self as pallet_ddc_clusters, *}; + /// The AccountId alias in this test module. pub type AccountId = <::Signer as IdentifyAccount>::AccountId; pub(crate) type AccountIndex = u64; diff --git a/pallets/ddc-clusters/src/node_provider_auth.rs b/pallets/ddc-clusters/src/node_provider_auth.rs index 48e6e2221..f7f2a99a4 100644 --- a/pallets/ddc-clusters/src/node_provider_auth.rs +++ b/pallets/ddc-clusters/src/node_provider_auth.rs @@ -1,10 +1,11 @@ -use crate::Config; use codec::Encode; use ddc_primitives::{NodePubKey, NodeType}; use frame_support::weights::Weight; use pallet_contracts::chain_extension::UncheckedFrom; use sp_std::prelude::Vec; +use crate::Config; + /// ink! 4.x selector for the "is_authorized" message, equals to the first four bytes of the /// blake2("is_authorized"). See also: https://use.ink/basics/selectors#selector-calculation/, /// https://use.ink/macros-attributes/selector/. diff --git a/pallets/ddc-clusters/src/tests.rs b/pallets/ddc-clusters/src/tests.rs index 2c7aa2330..a81f41b7a 100644 --- a/pallets/ddc-clusters/src/tests.rs +++ b/pallets/ddc-clusters/src/tests.rs @@ -1,12 +1,13 @@ //! Tests for the module. -use super::{mock::*, *}; use ddc_primitives::{CDNNodeParams, ClusterId, ClusterParams, NodeParams, NodePubKey}; use frame_support::{assert_noop, assert_ok, error::BadOrigin}; use frame_system::Config; use hex_literal::hex; use sp_runtime::{traits::Hash, AccountId32, Perbill}; +use super::{mock::*, *}; + #[test] fn create_cluster_works() { ExtBuilder.build_and_execute(|| { diff --git a/pallets/ddc-customers/src/benchmarking.rs b/pallets/ddc-customers/src/benchmarking.rs index 39a9b7165..59bb17b5e 100644 --- a/pallets/ddc-customers/src/benchmarking.rs +++ b/pallets/ddc-customers/src/benchmarking.rs @@ -1,14 +1,15 @@ //! DdcStaking pallet benchmarking. #![cfg(feature = "runtime-benchmarks")] -use super::*; -use crate::Pallet as DdcCustomers; use ddc_primitives::{ClusterGovParams, ClusterId, ClusterParams}; use frame_benchmarking::{account, benchmarks, whitelist_account}; use frame_support::traits::Currency; use sp_runtime::Perbill; use sp_std::prelude::*; +use super::*; +use crate::Pallet as DdcCustomers; + pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 6746efb24..5e6b00d9d 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -15,7 +15,6 @@ mod tests; use core::fmt::Debug; use codec::{Decode, Encode, HasCompact}; - use ddc_primitives::{BucketId, ClusterId}; use ddc_traits::{ cluster::{ClusterCreator, ClusterVisitor}, @@ -26,6 +25,7 @@ use frame_support::{ traits::{Currency, DefensiveSaturating, ExistenceRequirement}, BoundedVec, PalletId, }; +pub use pallet::*; use scale_info::TypeInfo; use sp_runtime::{ traits::{AccountIdConversion, AtLeast32BitUnsigned, CheckedAdd, CheckedSub, Saturating, Zero}, @@ -33,8 +33,6 @@ use sp_runtime::{ }; use sp_std::prelude::*; -pub use pallet::*; - /// The balance type of this pallet. pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; @@ -167,10 +165,11 @@ impl< #[frame_support::pallet] pub mod pallet { - use super::*; use frame_support::{pallet_prelude::*, traits::LockableCurrency}; use frame_system::pallet_prelude::*; + use super::*; + #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] #[pallet::without_storage_info] diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index ae41179ed..035b67550 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -1,6 +1,5 @@ //! Test utilities -use crate::{self as pallet_ddc_customers, *}; use ddc_primitives::{ ClusterBondingParams, ClusterFeesParams, ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, NodePubKey, NodeType, @@ -22,6 +21,8 @@ use sp_runtime::{ DispatchResult, Perbill, }; +use crate::{self as pallet_ddc_customers, *}; + /// The AccountId alias in this test module. pub(crate) type AccountId = u64; pub(crate) type AccountIndex = u64; diff --git a/pallets/ddc-customers/src/tests.rs b/pallets/ddc-customers/src/tests.rs index 9c8230bb0..f09c40ae6 100644 --- a/pallets/ddc-customers/src/tests.rs +++ b/pallets/ddc-customers/src/tests.rs @@ -1,12 +1,12 @@ //! Tests for the module. -use super::{mock::*, *}; use ddc_primitives::ClusterId; - use frame_support::{assert_noop, assert_ok}; use frame_system::Config; use pallet_balances::Error as BalancesError; +use super::{mock::*, *}; + #[test] fn create_bucket_works() { ExtBuilder.build_and_execute(|| { diff --git a/pallets/ddc-metrics-offchain-worker/src/lib.rs b/pallets/ddc-metrics-offchain-worker/src/lib.rs index 548fee745..f49749d72 100644 --- a/pallets/ddc-metrics-offchain-worker/src/lib.rs +++ b/pallets/ddc-metrics-offchain-worker/src/lib.rs @@ -17,9 +17,7 @@ use frame_support::{ use frame_system::offchain::{ AppCrypto, CreateSignedTransaction, SendSignedTransaction, Signer, SigningTypes, }; - use hex_literal::hex; - use sp_core::crypto::{KeyTypeId, UncheckedFrom}; use sp_runtime::{ offchain::{http, storage::StorageValueRef, Duration}, @@ -33,6 +31,7 @@ extern crate alloc; use alloc::string::String; use core::fmt::Debug; + use frame_support::weights::Weight; use scale_info::TypeInfo; @@ -102,13 +101,14 @@ pub const HTTP_TIMEOUT_MS: u64 = 30_000; // in milli-seconds /// We can use from supported crypto kinds (`sr25519`, `ed25519` and `ecdsa`) and augment /// the types with this pallet-specific identifier. pub mod crypto { - use super::KEY_TYPE; use frame_system::offchain::AppCrypto; use sp_core::sr25519::Signature as Sr25519Signature; use sp_runtime::{ app_crypto::{app_crypto, sr25519}, traits::Verify, }; + + use super::KEY_TYPE; app_crypto!(sr25519, KEY_TYPE); use sp_runtime::{MultiSignature, MultiSigner}; @@ -326,7 +326,7 @@ where fn get_start_of_day_ms() -> u64 { let now = sp_io::offchain::timestamp(); - + (now.unix_millis() / MS_PER_DAY) * MS_PER_DAY } @@ -640,8 +640,6 @@ where "HTTP GET error" })?; - - serde_json::from_slice(&body).map_err(|err| { warn!("[OCW] Error while parsing JSON from {}: {:?}", url, err); "HTTP JSON parse error" diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs b/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs index 5e11c5d59..aa7a6a480 100644 --- a/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs +++ b/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs @@ -1,24 +1,28 @@ -use frame_support::traits::{Currency, OffchainWorker}; +use std::sync::Arc; + +use codec::Encode; +use frame_support::{ + traits::{Currency, OffchainWorker}, + weights::Weight, +}; use frame_system::Config as FSC; -use sp_core::offchain::{ - testing, OffchainDbExt, OffchainWorkerExt, Timestamp as OCWTimestamp, TransactionPoolExt, +use hex_literal::hex; +use sp_core::{ + bytes::from_hex, + offchain::{ + testing, OffchainDbExt, OffchainWorkerExt, Timestamp as OCWTimestamp, TransactionPoolExt, + }, }; +use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; use sp_runtime::{traits::Hash, AccountId32, RuntimeAppPublic}; use test_runtime::{ AccountId, Balance, Balances, Contracts, DdcMetricsOffchainWorker, RuntimeOrigin, System, Test, Timestamp, }; -use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; -use std::sync::Arc; - use crate::{ CURRENT_PERIOD_MS, FINALIZE_METRIC_PERIOD, REPORT_DDN_STATUS_SELECTOR, REPORT_METRICS_SELECTOR, }; -use codec::Encode; -use frame_support::weights::Weight; -use hex_literal::hex; -use sp_core::bytes::from_hex; mod test_runtime; diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs b/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs index 29ea224b2..322d564dd 100644 --- a/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs +++ b/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs @@ -2,7 +2,7 @@ // // Inspired from pos-network-node/frame/contracts/src/tests.rs -use crate::{self as pallet_ddc_metrics_offchain_worker, *}; +use std::cell::RefCell; use frame_support::{ parameter_types, @@ -18,7 +18,8 @@ use sp_runtime::{ }, MultiSignature, Perbill, }; -use std::cell::RefCell; + +use crate::{self as pallet_ddc_metrics_offchain_worker, *}; pub type Signature = MultiSignature; pub type AccountId = <::Signer as IdentifyAccount>::AccountId; diff --git a/pallets/ddc-nodes/src/benchmarking.rs b/pallets/ddc-nodes/src/benchmarking.rs index 2a9b2d9e9..90559d4c3 100644 --- a/pallets/ddc-nodes/src/benchmarking.rs +++ b/pallets/ddc-nodes/src/benchmarking.rs @@ -1,16 +1,15 @@ //! DdcStaking pallet benchmarking. -use super::*; -use crate::{cdn_node::CDNNodeProps, Pallet as DdcNodes}; use ddc_primitives::CDNNodePubKey; -use testing_utils::*; - -use sp_std::prelude::*; - pub use frame_benchmarking::{ account, benchmarks, impl_benchmark_test_suite, whitelist_account, whitelisted_caller, }; use frame_system::RawOrigin; +use sp_std::prelude::*; +use testing_utils::*; + +use super::*; +use crate::{cdn_node::CDNNodeProps, Pallet as DdcNodes}; const USER_SEED: u32 = 999666; diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 43c3721f4..edde9de68 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -1,4 +1,3 @@ -use crate::node::{NodeError, NodeProps, NodeTrait}; use codec::{Decode, Encode}; use ddc_primitives::{CDNNodePubKey, ClusterId, NodeParams, NodePubKey, NodeType}; use frame_support::{parameter_types, BoundedVec}; @@ -6,6 +5,8 @@ use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; use sp_std::prelude::*; +use crate::node::{NodeError, NodeProps, NodeTrait}; + parameter_types! { pub MaxCDNNodeParamsLen: u16 = 2048; pub MaxHostLen: u8 = 255; diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 5bd307596..42beeca36 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -32,12 +32,10 @@ use ddc_traits::{ node::{NodeCreator, NodeVisitor, NodeVisitorError}, staking::StakingVisitor, }; - use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; -use sp_std::prelude::*; - pub use pallet::*; +use sp_std::prelude::*; mod cdn_node; mod node; mod storage_node; diff --git a/pallets/ddc-nodes/src/mock.rs b/pallets/ddc-nodes/src/mock.rs index 419fab3d0..0b67ca60d 100644 --- a/pallets/ddc-nodes/src/mock.rs +++ b/pallets/ddc-nodes/src/mock.rs @@ -2,7 +2,6 @@ #![allow(dead_code)] -use crate::{self as pallet_ddc_nodes, *}; use ddc_traits::staking::{StakingVisitor, StakingVisitorError}; use frame_support::{ construct_runtime, parameter_types, @@ -17,6 +16,8 @@ use sp_runtime::{ traits::{BlakeTwo256, IdentityLookup}, }; +use crate::{self as pallet_ddc_nodes, *}; + /// The AccountId alias in this test module. pub(crate) type AccountId = u64; pub(crate) type AccountIndex = u64; diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index ecccdd200..93cdba545 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -1,15 +1,16 @@ #![allow(clippy::needless_lifetimes)] // ToDo +use codec::{Decode, Encode}; +use ddc_primitives::{NodeParams, NodePubKey, NodeType}; +use scale_info::TypeInfo; +use sp_runtime::RuntimeDebug; + use crate::{ cdn_node::{CDNNode, CDNNodeProps}, pallet::Error, storage_node::{StorageNode, StorageNodeProps}, ClusterId, }; -use codec::{Decode, Encode}; -use ddc_primitives::{NodeParams, NodePubKey, NodeType}; -use scale_info::TypeInfo; -use sp_runtime::RuntimeDebug; #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum Node { diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 0749c044e..d299bfe31 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,10 +1,11 @@ -use crate::node::{NodeError, NodeProps, NodeTrait}; use codec::{Decode, Encode}; use ddc_primitives::{ClusterId, NodeParams, NodePubKey, NodeType, StorageNodePubKey}; use frame_support::{parameter_types, BoundedVec}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; +use crate::node::{NodeError, NodeProps, NodeTrait}; + parameter_types! { pub MaxStorageNodeParamsLen: u16 = 2048; pub MaxHostLen: u8 = 255; diff --git a/pallets/ddc-nodes/src/testing_utils.rs b/pallets/ddc-nodes/src/testing_utils.rs index 8db4dfd35..aec9892d2 100644 --- a/pallets/ddc-nodes/src/testing_utils.rs +++ b/pallets/ddc-nodes/src/testing_utils.rs @@ -1,10 +1,11 @@ //! Testing utils for ddc-staking. -use crate::{Config, NodePubKey}; use ddc_primitives::{CDNNodeParams, CDNNodePubKey, NodeParams}; use frame_benchmarking::account; use sp_std::vec; +use crate::{Config, NodePubKey}; + const SEED: u32 = 0; /// Grab a funded user. diff --git a/pallets/ddc-nodes/src/tests.rs b/pallets/ddc-nodes/src/tests.rs index ede8e4c64..e0fc0f599 100644 --- a/pallets/ddc-nodes/src/tests.rs +++ b/pallets/ddc-nodes/src/tests.rs @@ -1,10 +1,11 @@ //! Tests for the module. -use super::{mock::*, *}; use ddc_primitives::{CDNNodeParams, NodePubKey, StorageNodeParams}; use frame_support::{assert_noop, assert_ok}; use sp_runtime::AccountId32; +use super::{mock::*, *}; + #[test] fn create_node_works() { ExtBuilder.build_and_execute(|| { diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index 2786dc21b..4447a99ea 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -93,11 +93,12 @@ parameter_types! { #[frame_support::pallet] pub mod pallet { - use super::*; use frame_support::PalletId; use sp_io::hashing::blake2_128; use sp_runtime::traits::{AccountIdConversion, Zero}; + use super::*; + #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] #[pallet::without_storage_info] diff --git a/pallets/ddc-payouts/src/mock.rs b/pallets/ddc-payouts/src/mock.rs index 61c7d6e98..956b2e9d1 100644 --- a/pallets/ddc-payouts/src/mock.rs +++ b/pallets/ddc-payouts/src/mock.rs @@ -2,7 +2,6 @@ #![allow(dead_code)] -use crate::{self as pallet_ddc_payouts, *}; use ddc_primitives::{ClusterBondingParams, ClusterFeesParams, ClusterPricingParams, NodeType}; use ddc_traits::{ cluster::{ClusterVisitor, ClusterVisitorError}, @@ -10,7 +9,6 @@ use ddc_traits::{ pallet::PalletVisitor, }; use frame_election_provider_support::SortedListProvider; - use frame_support::{ construct_runtime, parameter_types, traits::{ConstU32, ConstU64, Everything}, @@ -26,6 +24,8 @@ use sp_runtime::{ }; use sp_std::prelude::*; +use crate::{self as pallet_ddc_payouts, *}; + /// The AccountId alias in this test module. pub type AccountId = u64; pub(crate) type AccountIndex = u64; diff --git a/pallets/ddc-payouts/src/tests.rs b/pallets/ddc-payouts/src/tests.rs index d63d799e3..3cd324dba 100644 --- a/pallets/ddc-payouts/src/tests.rs +++ b/pallets/ddc-payouts/src/tests.rs @@ -1,9 +1,10 @@ //! Tests for the module. -use super::{mock::*, *}; use ddc_primitives::ClusterId; use frame_support::{assert_noop, assert_ok, error::BadOrigin}; +use super::{mock::*, *}; + #[test] fn set_authorised_caller_works() { ExtBuilder.build_and_execute(|| { diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index a533a6828..91beb955f 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -1,18 +1,17 @@ //! DdcStaking pallet benchmarking. -use super::*; -use crate::Pallet as DdcStaking; use ddc_primitives::{CDNNodeParams, CDNNodePubKey, NodeParams, NodeType, StorageNodePubKey}; -use testing_utils::*; - -use frame_support::traits::Currency; -use sp_runtime::traits::StaticLookup; -use sp_std::prelude::*; - pub use frame_benchmarking::{ account, benchmarks, impl_benchmark_test_suite, whitelist_account, whitelisted_caller, }; +use frame_support::traits::Currency; use frame_system::RawOrigin; +use sp_runtime::traits::StaticLookup; +use sp_std::prelude::*; +use testing_utils::*; + +use super::*; +use crate::Pallet as DdcStaking; const USER_SEED: u32 = 999666; diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index cdb3c42de..40b971a56 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -26,17 +26,15 @@ pub(crate) mod mock; mod tests; pub mod weights; -use crate::weights::WeightInfo; +use core::fmt::Debug; use codec::{Decode, Encode, HasCompact}; -use core::fmt::Debug; pub use ddc_primitives::{ClusterId, NodePubKey, NodeType}; use ddc_traits::{ cluster::{ClusterCreator, ClusterVisitor, ClusterVisitorError}, node::{NodeCreator, NodeVisitor}, staking::{StakingVisitor, StakingVisitorError}, }; - use frame_support::{ assert_ok, pallet_prelude::*, @@ -53,7 +51,7 @@ use sp_runtime::{ }; use sp_std::prelude::*; -pub use pallet::*; +use crate::weights::WeightInfo; const DDC_STAKING_ID: LockIdentifier = *b"ddcstake"; // DDC maintainer's stake diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 37e26b00f..cf0ff819e 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -2,7 +2,8 @@ #![allow(dead_code)] -use crate::{self as pallet_ddc_staking, *}; +use std::cell::RefCell; + use ddc_primitives::{ CDNNodePubKey, ClusterBondingParams, ClusterFeesParams, ClusterGovParams, ClusterParams, ClusterPricingParams, NodeParams, NodePubKey, StorageNodePubKey, @@ -11,14 +12,12 @@ use ddc_traits::{ cluster::{ClusterManager, ClusterManagerError, ClusterVisitor, ClusterVisitorError}, node::{NodeVisitor, NodeVisitorError}, }; - use frame_support::{ construct_runtime, dispatch::DispatchResult, traits::{ConstU32, ConstU64, Everything, GenesisBuild}, weights::constants::RocksDbWeight, }; - use frame_system::mocking::{MockBlock, MockUncheckedExtrinsic}; use lazy_static::lazy_static; use parking_lot::{ReentrantMutex, ReentrantMutexGuard}; @@ -30,7 +29,8 @@ use sp_runtime::{ Perbill, }; use sp_std::collections::btree_map::BTreeMap; -use std::cell::RefCell; + +use crate::{self as pallet_ddc_staking, *}; /// The AccountId alias in this test module. pub(crate) type AccountId = u64; diff --git a/pallets/ddc-staking/src/testing_utils.rs b/pallets/ddc-staking/src/testing_utils.rs index 277c59334..ccc0b8c02 100644 --- a/pallets/ddc-staking/src/testing_utils.rs +++ b/pallets/ddc-staking/src/testing_utils.rs @@ -1,18 +1,17 @@ //! Testing utils for ddc-staking. -use crate::{Pallet as DdcStaking, *}; use ddc_primitives::{ CDNNodeParams, CDNNodePubKey, ClusterGovParams, ClusterId, ClusterParams, NodeParams, StorageNodeParams, }; - use frame_benchmarking::account; -use frame_system::RawOrigin; - use frame_support::traits::Currency; +use frame_system::RawOrigin; use sp_runtime::{traits::StaticLookup, Perbill}; use sp_std::prelude::*; +use crate::{Pallet as DdcStaking, *}; + const SEED: u32 = 0; /// This function removes all storage and CDN nodes from storage. @@ -119,7 +118,7 @@ pub fn create_stash_controller_node_with_balance( } let cluster_id = ClusterId::from([1; 20]); - let cluster_params = ClusterParams { node_provider_auth_contract: stash.clone() }; + let cluster_params = ClusterParams { node_provider_auth_contract: Some(stash.clone()) }; let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { treasury_share: Perbill::default(), validators_share: Perbill::default(), diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index c38b36cda..ab1709814 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -1,11 +1,11 @@ //! Tests for the module. -use super::{mock::*, *}; use ddc_primitives::{CDNNodePubKey, StorageNodePubKey}; - use frame_support::{assert_noop, assert_ok, traits::ReservableCurrency}; use pallet_balances::Error as BalancesError; +use super::{mock::*, *}; + pub const BLOCK_TIME: u64 = 1000; pub const INIT_TIMESTAMP: u64 = 30_000; diff --git a/pallets/ddc/src/lib.rs b/pallets/ddc/src/lib.rs index c7bdc1d73..eaadf59f9 100644 --- a/pallets/ddc/src/lib.rs +++ b/pallets/ddc/src/lib.rs @@ -11,7 +11,6 @@ use frame_support::{ traits::Get, }; use frame_system::ensure_signed; - /// Edit this file to define custom logic or remove it if it is not needed. /// Learn more about FRAME and the core library of Substrate FRAME pallets: /// https://substrate.dev/docs/en/knowledgebase/runtime/frame diff --git a/pallets/ddc/src/mock.rs b/pallets/ddc/src/mock.rs index c514078ba..47674efbd 100644 --- a/pallets/ddc/src/mock.rs +++ b/pallets/ddc/src/mock.rs @@ -1,4 +1,3 @@ -use crate as pallet_cere_ddc; use frame_support::{construct_runtime, parameter_types, traits::Everything}; use frame_system as system; use sp_core::H256; @@ -7,6 +6,8 @@ use sp_runtime::{ traits::{BlakeTwo256, IdentityLookup}, }; +use crate as pallet_cere_ddc; + // Configure a mock runtime to test the pallet. type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; diff --git a/pallets/ddc/src/tests.rs b/pallets/ddc/src/tests.rs index 95f5927ae..0e797721c 100644 --- a/pallets/ddc/src/tests.rs +++ b/pallets/ddc/src/tests.rs @@ -1,6 +1,7 @@ -use crate::{mock::*, Error}; use frame_support::{assert_noop, assert_ok}; +use crate::{mock::*, Error}; + const BOB: u64 = 2; #[test] diff --git a/pallets/erc20/src/lib.rs b/pallets/erc20/src/lib.rs index 8e7967ed6..cdc37a064 100644 --- a/pallets/erc20/src/lib.rs +++ b/pallets/erc20/src/lib.rs @@ -2,9 +2,6 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -use pallet_chainbridge as bridge; -use pallet_erc721 as erc721; - use frame_support::{ decl_error, decl_event, decl_module, decl_storage, dispatch::DispatchResult, @@ -12,6 +9,8 @@ use frame_support::{ traits::{Currency, EnsureOrigin, ExistenceRequirement::AllowDeath, Get}, }; use frame_system::{self as system, ensure_signed}; +use pallet_chainbridge as bridge; +use pallet_erc721 as erc721; use sp_arithmetic::traits::SaturatedConversion; use sp_core::U256; use sp_std::prelude::*; diff --git a/pallets/erc721/src/mock.rs b/pallets/erc721/src/mock.rs index 9406619ae..dc8865d84 100644 --- a/pallets/erc721/src/mock.rs +++ b/pallets/erc721/src/mock.rs @@ -2,6 +2,8 @@ use frame_support::{ord_parameter_types, parameter_types, traits::Everything, weights::Weight}; use frame_system::{self as system}; +pub use pallet_balances as balances; +use pallet_chainbridge as bridge; use sp_core::{hashing::blake2_128, H256}; use sp_runtime::{ testing::Header, @@ -10,8 +12,6 @@ use sp_runtime::{ }; use crate::{self as erc721, Config}; -pub use pallet_balances as balances; -use pallet_chainbridge as bridge; parameter_types! { pub const BlockHashCount: u64 = 250; diff --git a/pallets/erc721/src/tests.rs b/pallets/erc721/src/tests.rs index 9fa6cde1b..2a2add321 100644 --- a/pallets/erc721/src/tests.rs +++ b/pallets/erc721/src/tests.rs @@ -1,11 +1,12 @@ #![cfg(test)] +use frame_support::{assert_noop, assert_ok}; +use sp_core::U256; + use super::{ mock::{new_test_ext, Erc721, RuntimeOrigin, Test, USER_A, USER_B, USER_C}, *, }; -use frame_support::{assert_noop, assert_ok}; -use sp_core::U256; #[test] fn mint_burn_tokens() { diff --git a/runtime/cere-dev/src/impls.rs b/runtime/cere-dev/src/impls.rs index 8c9735b01..3009254a1 100644 --- a/runtime/cere-dev/src/impls.rs +++ b/runtime/cere-dev/src/impls.rs @@ -17,9 +17,10 @@ //! Some configurable implementations as associated type for the substrate runtime. -use crate::{Authorship, Balances, NegativeImbalance}; use frame_support::traits::{Currency, OnUnbalanced}; +use crate::{Authorship, Balances, NegativeImbalance}; + pub struct Author; impl OnUnbalanced for Author { fn on_nonzero_unbalanced(amount: NegativeImbalance) { @@ -31,10 +32,6 @@ impl OnUnbalanced for Author { #[cfg(test)] mod multiplier_tests { - use crate::{ - AdjustmentVariable, MaximumMultiplier, MinimumMultiplier, Runtime, - RuntimeBlockWeights as BlockWeights, System, TargetBlockFullness, TransactionPayment, - }; use cere_dev_runtime_constants::{currency::*, time::*}; use frame_support::{ dispatch::DispatchClass, @@ -47,6 +44,11 @@ mod multiplier_tests { FixedPointNumber, }; + use crate::{ + AdjustmentVariable, MaximumMultiplier, MinimumMultiplier, Runtime, + RuntimeBlockWeights as BlockWeights, System, TargetBlockFullness, TransactionPayment, + }; + fn max_normal() -> Weight { BlockWeights::get() .get(DispatchClass::Normal) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 5afafa72c..ae782f2c7 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -41,12 +41,16 @@ use frame_support::{ }, PalletId, RuntimeDebug, }; +#[cfg(any(feature = "std", test))] +pub use frame_system::Call as SystemCall; use frame_system::{ limits::{BlockLength, BlockWeights}, EnsureRoot, }; pub use node_primitives::{AccountId, Signature}; use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; +#[cfg(any(feature = "std", test))] +pub use pallet_balances::Call as BalancesCall; pub use pallet_cere_ddc; pub use pallet_chainbridge; pub use pallet_ddc_clusters; @@ -61,6 +65,10 @@ use pallet_grandpa::{ }; use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use pallet_session::historical::{self as pallet_session_historical}; +#[cfg(any(feature = "std", test))] +pub use pallet_staking::StakerStatus; +#[cfg(any(feature = "std", test))] +pub use pallet_sudo::Call as SudoCall; pub use pallet_transaction_payment::{CurrencyAdapter, Multiplier, TargetedFeeAdjustment}; use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo}; use sp_api::impl_runtime_apis; @@ -68,6 +76,8 @@ use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; use sp_inherents::{CheckInherentsResult, InherentData}; use sp_io::hashing::blake2_128; +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; use sp_runtime::{ create_runtime_str, curve::PiecewiseLinear, @@ -85,23 +95,11 @@ use sp_version::NativeVersion; use sp_version::RuntimeVersion; use static_assertions::const_assert; -#[cfg(any(feature = "std", test))] -pub use frame_system::Call as SystemCall; -#[cfg(any(feature = "std", test))] -pub use pallet_balances::Call as BalancesCall; -#[cfg(any(feature = "std", test))] -pub use pallet_staking::StakerStatus; -#[cfg(any(feature = "std", test))] -pub use pallet_sudo::Call as SudoCall; -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - /// Implementations of some helper traits passed into runtime modules as associated types. pub mod impls; -use impls::Author; - /// Constant values used within the runtime. use cere_dev_runtime_constants::{currency::*, time::*}; +use impls::Author; use sp_runtime::generic::Era; /// Generated voter bag information. @@ -1903,11 +1901,12 @@ impl_runtime_apis! { #[cfg(test)] mod tests { - use super::*; use frame_election_provider_support::NposSolution; use frame_system::offchain::CreateSignedTransaction; use sp_runtime::UpperOf; + use super::*; + #[test] fn validate_transaction_submitter_bounds() { fn is_submit_signed_transaction() diff --git a/runtime/cere/src/impls.rs b/runtime/cere/src/impls.rs index c1304651c..6a6b77537 100644 --- a/runtime/cere/src/impls.rs +++ b/runtime/cere/src/impls.rs @@ -17,9 +17,10 @@ //! Some configurable implementations as associated type for the substrate runtime. -use crate::{Authorship, Balances, NegativeImbalance}; use frame_support::traits::{Currency, OnUnbalanced}; +use crate::{Authorship, Balances, NegativeImbalance}; + pub struct Author; impl OnUnbalanced for Author { fn on_nonzero_unbalanced(amount: NegativeImbalance) { @@ -31,10 +32,6 @@ impl OnUnbalanced for Author { #[cfg(test)] mod multiplier_tests { - use crate::{ - AdjustmentVariable, MaximumMultiplier, MinimumMultiplier, Runtime, - RuntimeBlockWeights as BlockWeights, System, TargetBlockFullness, TransactionPayment, - }; use cere_runtime_constants::{currency::*, time::*}; use frame_support::{ dispatch::DispatchClass, @@ -47,6 +44,11 @@ mod multiplier_tests { FixedPointNumber, }; + use crate::{ + AdjustmentVariable, MaximumMultiplier, MinimumMultiplier, Runtime, + RuntimeBlockWeights as BlockWeights, System, TargetBlockFullness, TransactionPayment, + }; + fn max_normal() -> Weight { BlockWeights::get() .get(DispatchClass::Normal) diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 127a97846..7fe6ede23 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -40,12 +40,16 @@ use frame_support::{ }, PalletId, RuntimeDebug, }; +#[cfg(any(feature = "std", test))] +pub use frame_system::Call as SystemCall; use frame_system::{ limits::{BlockLength, BlockWeights}, EnsureRoot, }; pub use node_primitives::{AccountId, Signature}; use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; +#[cfg(any(feature = "std", test))] +pub use pallet_balances::Call as BalancesCall; pub use pallet_cere_ddc; pub use pallet_chainbridge; pub use pallet_ddc_metrics_offchain_worker; @@ -55,6 +59,10 @@ use pallet_grandpa::{ }; use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use pallet_session::historical::{self as pallet_session_historical}; +#[cfg(any(feature = "std", test))] +pub use pallet_staking::StakerStatus; +#[cfg(any(feature = "std", test))] +pub use pallet_sudo::Call as SudoCall; pub use pallet_transaction_payment::{CurrencyAdapter, Multiplier, TargetedFeeAdjustment}; use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo}; use sp_api::impl_runtime_apis; @@ -62,6 +70,8 @@ use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; use sp_inherents::{CheckInherentsResult, InherentData}; use sp_io::hashing::blake2_128; +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; use sp_runtime::{ create_runtime_str, curve::PiecewiseLinear, @@ -79,23 +89,11 @@ use sp_version::NativeVersion; use sp_version::RuntimeVersion; use static_assertions::const_assert; -#[cfg(any(feature = "std", test))] -pub use frame_system::Call as SystemCall; -#[cfg(any(feature = "std", test))] -pub use pallet_balances::Call as BalancesCall; -#[cfg(any(feature = "std", test))] -pub use pallet_staking::StakerStatus; -#[cfg(any(feature = "std", test))] -pub use pallet_sudo::Call as SudoCall; -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - /// Implementations of some helper traits passed into runtime modules as associated types. pub mod impls; -use impls::Author; - /// Constant values used within the runtime. use cere_runtime_constants::{currency::*, time::*}; +use impls::Author; use sp_runtime::generic::Era; /// Generated voter bag information. @@ -1816,11 +1814,12 @@ impl_runtime_apis! { #[cfg(test)] mod tests { - use super::*; use frame_election_provider_support::NposSolution; use frame_system::offchain::CreateSignedTransaction; use sp_runtime::UpperOf; + use super::*; + #[test] fn validate_transaction_submitter_bounds() { fn is_submit_signed_transaction() From 093c2de66374ff805f2366c9a25079927b31f75f Mon Sep 17 00:00:00 2001 From: Raid5594 <52794079+Raid5594@users.noreply.github.com> Date: Tue, 28 Nov 2023 09:57:17 +0100 Subject: [PATCH 553/583] Feature/clusters benchmarking (#159) - benchmarks for clusters - weights for clusters - extended node_provider_auth - create staker --------- Co-authored-by: aie0 <149175774+aie0@users.noreply.github.com> --- Cargo.lock | 329 +++++++++--------- pallets/ddc-clusters/Cargo.toml | 9 + pallets/ddc-clusters/src/benchmarking.rs | 113 ++++++ pallets/ddc-clusters/src/lib.rs | 28 +- pallets/ddc-clusters/src/mock.rs | 18 +- .../ddc-clusters/src/node_provider_auth.rs | 74 +++- pallets/ddc-clusters/src/testing_utils.rs | 133 +++++++ pallets/ddc-clusters/src/weights.rs | 155 +++++++++ pallets/ddc-staking/src/lib.rs | 33 +- runtime/cere-dev/Cargo.toml | 1 + runtime/cere-dev/src/lib.rs | 3 + traits/src/staking.rs | 10 + 12 files changed, 732 insertions(+), 174 deletions(-) create mode 100644 pallets/ddc-clusters/src/benchmarking.rs create mode 100644 pallets/ddc-clusters/src/testing_utils.rs create mode 100644 pallets/ddc-clusters/src/weights.rs diff --git a/Cargo.lock b/Cargo.lock index 1e6ba75c8..5032ae212 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2144,7 +2144,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", ] @@ -2167,7 +2167,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -2190,7 +2190,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "array-bytes", @@ -2241,7 +2241,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2252,7 +2252,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2268,7 +2268,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -2297,7 +2297,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2329,7 +2329,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "cfg-expr", @@ -2343,7 +2343,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2355,7 +2355,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -2365,7 +2365,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "log", @@ -2383,7 +2383,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -2398,7 +2398,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -2407,7 +2407,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "parity-scale-codec", @@ -4299,7 +4299,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-system", "parity-scale-codec", @@ -4495,7 +4495,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -4511,7 +4511,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -4526,7 +4526,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4550,7 +4550,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4570,7 +4570,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4585,7 +4585,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4633,7 +4633,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4652,7 +4652,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4669,7 +4669,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4698,7 +4698,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -4710,7 +4710,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -4723,6 +4723,7 @@ version = "4.8.1" dependencies = [ "ddc-primitives", "ddc-traits", + "frame-benchmarking", "frame-support", "frame-system", "hex-literal", @@ -4860,7 +4861,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4878,7 +4879,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4902,7 +4903,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4915,7 +4916,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4967,7 +4968,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4988,7 +4989,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5011,7 +5012,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5027,7 +5028,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5047,7 +5048,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5064,7 +5065,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5081,7 +5082,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5097,7 +5098,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5114,7 +5115,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5134,7 +5135,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -5144,7 +5145,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5161,7 +5162,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5184,7 +5185,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5199,7 +5200,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5213,7 +5214,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5228,7 +5229,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5244,7 +5245,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5265,7 +5266,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5281,7 +5282,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5295,7 +5296,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5318,7 +5319,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5329,7 +5330,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5343,7 +5344,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5361,7 +5362,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5380,7 +5381,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5396,7 +5397,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5411,7 +5412,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5422,7 +5423,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5439,7 +5440,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5455,7 +5456,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -6339,7 +6340,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "env_logger 0.9.3", "log", @@ -6603,7 +6604,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "sp-core", @@ -6614,7 +6615,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6641,7 +6642,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "futures-timer", @@ -6664,7 +6665,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6680,7 +6681,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6697,7 +6698,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6708,7 +6709,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "chrono", @@ -6748,7 +6749,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "fnv", "futures", @@ -6776,7 +6777,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "kvdb", @@ -6801,7 +6802,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6825,7 +6826,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "fork-tree", @@ -6867,7 +6868,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -6889,7 +6890,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6902,7 +6903,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6926,7 +6927,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sc-client-api", "sp-authorship", @@ -6937,7 +6938,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "lazy_static", "lru 0.7.8", @@ -6964,7 +6965,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "environmental", "parity-scale-codec", @@ -6980,7 +6981,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -6995,7 +6996,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "cfg-if", "libc", @@ -7015,7 +7016,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "array-bytes", @@ -7056,7 +7057,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "finality-grandpa", "futures", @@ -7077,7 +7078,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7094,7 +7095,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "async-trait", @@ -7109,7 +7110,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "async-trait", @@ -7156,7 +7157,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "cid", "futures", @@ -7176,7 +7177,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7202,7 +7203,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "futures", @@ -7220,7 +7221,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "futures", @@ -7241,7 +7242,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "fork-tree", @@ -7271,7 +7272,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "futures", @@ -7290,7 +7291,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "bytes", @@ -7320,7 +7321,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "libp2p", @@ -7333,7 +7334,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7342,7 +7343,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "hash-db", @@ -7372,7 +7373,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -7395,7 +7396,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -7408,7 +7409,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "hex", @@ -7427,7 +7428,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "directories", @@ -7498,7 +7499,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -7512,7 +7513,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7531,7 +7532,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "libc", @@ -7550,7 +7551,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "chrono", "futures", @@ -7568,7 +7569,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7599,7 +7600,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7610,7 +7611,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -7637,7 +7638,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -7651,7 +7652,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "futures-timer", @@ -8064,7 +8065,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "log", @@ -8082,7 +8083,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "blake2", "proc-macro-crate", @@ -8094,7 +8095,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8107,7 +8108,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "integer-sqrt", "num-traits", @@ -8122,7 +8123,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8135,7 +8136,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "parity-scale-codec", @@ -8147,7 +8148,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -8159,7 +8160,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "log", @@ -8177,7 +8178,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -8196,7 +8197,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "merlin", @@ -8219,7 +8220,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8233,7 +8234,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8246,7 +8247,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "base58", @@ -8292,7 +8293,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "blake2", "byteorder", @@ -8306,7 +8307,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -8317,7 +8318,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8326,7 +8327,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -8336,7 +8337,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "environmental", "parity-scale-codec", @@ -8347,7 +8348,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "finality-grandpa", "log", @@ -8365,7 +8366,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8379,7 +8380,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bytes", "futures", @@ -8405,7 +8406,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "lazy_static", "sp-core", @@ -8416,7 +8417,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -8433,7 +8434,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "thiserror", "zstd", @@ -8442,7 +8443,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8456,7 +8457,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sp-api", "sp-core", @@ -8466,7 +8467,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "backtrace", "lazy_static", @@ -8476,7 +8477,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "rustc-hash", "serde", @@ -8486,7 +8487,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "either", "hash256-std-hasher", @@ -8509,7 +8510,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8527,7 +8528,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "proc-macro-crate", @@ -8539,7 +8540,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -8553,7 +8554,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8567,7 +8568,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8578,7 +8579,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "log", @@ -8600,12 +8601,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8618,7 +8619,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "sp-core", @@ -8631,7 +8632,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures-timer", @@ -8647,7 +8648,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-std", @@ -8659,7 +8660,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sp-api", "sp-runtime", @@ -8668,7 +8669,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "log", @@ -8684,7 +8685,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "hash-db", @@ -8707,7 +8708,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8724,7 +8725,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8735,7 +8736,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "log", @@ -8748,7 +8749,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8895,7 +8896,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "platforms 2.0.0", ] @@ -8903,7 +8904,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -8924,7 +8925,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures-util", "hyper", @@ -8937,7 +8938,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "jsonrpsee", @@ -8950,7 +8951,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "log", @@ -8971,7 +8972,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "substrate-test-utils-derive", @@ -8981,7 +8982,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8992,7 +8993,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -9438,7 +9439,7 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "clap", "frame-try-runtime", diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index 6802d4872..feda63e13 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } hex-literal = "^0.3.1" @@ -18,6 +19,7 @@ sp-runtime = { default-features = false, git = "https://github.com/paritytech/su sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } [dev-dependencies] +frame-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -41,3 +43,10 @@ std = [ "sp-runtime/std", "sp-std/std", ] +runtime-benchmarks = [ + "ddc-primitives/runtime-benchmarks", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] diff --git a/pallets/ddc-clusters/src/benchmarking.rs b/pallets/ddc-clusters/src/benchmarking.rs new file mode 100644 index 000000000..bf9ec779b --- /dev/null +++ b/pallets/ddc-clusters/src/benchmarking.rs @@ -0,0 +1,113 @@ +//! DdcStaking pallet benchmarking. + +use ddc_primitives::{ClusterGovParams, ClusterId, ClusterParams, NodePubKey}; +pub use frame_benchmarking::{ + account, benchmarks, impl_benchmark_test_suite, whitelist_account, whitelisted_caller, + BenchmarkError, +}; +use frame_system::RawOrigin; +use pallet_contracts::chain_extension::UncheckedFrom; +use sp_runtime::{AccountId32, Perbill}; +use sp_std::prelude::*; +use testing_utils::*; + +use super::*; +use crate::{cluster::ClusterProps, Pallet as DdcClusters}; + +const USER_SEED: u32 = 999666; +const USER_SEED_2: u32 = 999555; + +benchmarks! { + where_clause { where + T::AccountId: UncheckedFrom + AsRef<[u8]> } + + create_cluster { + let cluster_id = ClusterId::from([1; 20]); + let user = account::("user", USER_SEED, 0u32); + let cluster_params = ClusterParams { node_provider_auth_contract: Some(user.clone()) }; + let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { + treasury_share: Perbill::default(), + validators_share: Perbill::default(), + cluster_reserve_share: Perbill::default(), + cdn_bond_size: 100u32.into(), + cdn_chill_delay: 50u32.into(), + cdn_unbonding_delay: 50u32.into(), + storage_bond_size: 100u32.into(), + storage_chill_delay: 50u32.into(), + storage_unbonding_delay: 50u32.into(), + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + }; + }: _(RawOrigin::Root, cluster_id, user.clone(), user, cluster_params, cluster_gov_params) + verify { + assert!(Clusters::::contains_key(cluster_id)); + } + + add_node { + let bytes = [0u8; 32]; + let node_pub_key = NodePubKey::CDNPubKey(AccountId32::from(bytes)); + let cluster_id = ClusterId::from([1; 20]); + let user = account::("user", USER_SEED, 0u32); + let balance = ::Currency::minimum_balance() * 1_000_000u32.into(); + let _ = ::Currency::make_free_balance_be(&user, balance); + let _ = config_cluster_and_node::(user.clone(), node_pub_key.clone(), cluster_id); + }: _(RawOrigin::Signed(user.clone()), cluster_id, node_pub_key.clone()) + verify { + assert!(ClustersNodes::::contains_key(cluster_id, node_pub_key)); + } + + remove_node { + let bytes = [0u8; 32]; + let node_pub_key = NodePubKey::CDNPubKey(AccountId32::from(bytes)); + let cluster_id = ClusterId::from([1; 20]); + let user = account::("user", USER_SEED, 0u32); + let balance = ::Currency::minimum_balance() * 1_000_000u32.into(); + let _ = ::Currency::make_free_balance_be(&user, balance); + let _ = config_cluster_and_node::(user.clone(), node_pub_key.clone(), cluster_id); + let _ = DdcClusters::::add_node( + RawOrigin::Signed(user.clone()).into(), + cluster_id, + node_pub_key.clone() + ); + }: _(RawOrigin::Signed(user.clone()), cluster_id, node_pub_key.clone()) + verify { + assert!(!ClustersNodes::::contains_key(cluster_id, node_pub_key)); + } + + set_cluster_params { + let cluster_id = ClusterId::from([1; 20]); + let user = account::("user", USER_SEED, 0u32); + let user_2 = account::("user", USER_SEED_2, 0u32); + let _ = config_cluster::(user.clone(), cluster_id); + let new_cluster_params = ClusterParams { node_provider_auth_contract: Some(user_2.clone()) }; + }: _(RawOrigin::Signed(user.clone()), cluster_id, new_cluster_params) + verify { + assert_eq!(Clusters::::try_get(cluster_id).unwrap().props, ClusterProps { node_provider_auth_contract: Some(user_2) }); + } + + set_cluster_gov_params { + let cluster_id = ClusterId::from([1; 20]); + let user = account::("user", USER_SEED, 0u32); + let _ = config_cluster::(user, cluster_id); + let new_cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { + treasury_share: Perbill::default(), + validators_share: Perbill::default(), + cluster_reserve_share: Perbill::default(), + cdn_bond_size: 10u32.into(), + cdn_chill_delay: 5u32.into(), + cdn_unbonding_delay: 5u32.into(), + storage_bond_size: 10u32.into(), + storage_chill_delay: 5u32.into(), + storage_unbonding_delay: 5u32.into(), + unit_per_mb_stored: 1, + unit_per_mb_streamed: 1, + unit_per_put_request: 1, + unit_per_get_request: 1, + }; + }: _(RawOrigin::Root, cluster_id, new_cluster_gov_params.clone()) + verify { + assert_eq!(ClustersGovParams::::try_get(cluster_id).unwrap(), new_cluster_gov_params); + } +} diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index b10a4c152..73cf62932 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -15,6 +15,14 @@ #![recursion_limit = "256"] #![feature(is_some_and)] // ToDo: delete at rustc > 1.70 +pub mod weights; +use crate::weights::WeightInfo; + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarking; +#[cfg(any(feature = "runtime-benchmarks", test))] +pub mod testing_utils; + #[cfg(test)] pub(crate) mod mock; #[cfg(test)] @@ -26,7 +34,7 @@ use ddc_primitives::{ }; use ddc_traits::{ cluster::{ClusterCreator, ClusterVisitor, ClusterVisitorError}, - staking::{StakingVisitor, StakingVisitorError}, + staking::{StakerCreator, StakingVisitor, StakingVisitorError}, }; use frame_support::{ assert_ok, @@ -68,7 +76,9 @@ pub mod pallet { type RuntimeEvent: From> + IsType<::RuntimeEvent>; type NodeRepository: NodeRepository; // todo: get rid of tight coupling with nodes-pallet type StakingVisitor: StakingVisitor; + type StakerCreator: StakerCreator>; type Currency: LockableCurrency; + type WeightInfo: WeightInfo; } #[pallet::event] @@ -97,6 +107,8 @@ pub mod pallet { /// Cluster candidate should not plan to chill. NodeChillingIsProhibited, NodeAuthContractCallFailed, + NodeAuthContractDeployFailed, + NodeAuthNodeAuthorizationNotSuccessful, } #[pallet::storage] @@ -180,7 +192,7 @@ pub mod pallet { where T::AccountId: UncheckedFrom + AsRef<[u8]>, { - #[pallet::weight(10_000)] + #[pallet::weight(::WeightInfo::create_cluster())] pub fn create_cluster( origin: OriginFor, cluster_id: ClusterId, @@ -199,7 +211,7 @@ pub mod pallet { ) } - #[pallet::weight(10_000)] + #[pallet::weight(::WeightInfo::add_node())] pub fn add_node( origin: OriginFor, cluster_id: ClusterId, @@ -248,7 +260,7 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] + #[pallet::weight(::WeightInfo::remove_node())] pub fn remove_node( origin: OriginFor, cluster_id: ClusterId, @@ -269,7 +281,7 @@ pub mod pallet { } // Sets Governance non-sensetive parameters only - #[pallet::weight(10_000)] + #[pallet::weight(::WeightInfo::set_cluster_params())] pub fn set_cluster_params( origin: OriginFor, cluster_id: ClusterId, @@ -287,7 +299,7 @@ pub mod pallet { } // Requires Governance approval - #[pallet::weight(10_000)] + #[pallet::weight(::WeightInfo::set_cluster_gov_params())] pub fn set_cluster_gov_params( origin: OriginFor, cluster_id: ClusterId, @@ -501,6 +513,10 @@ pub mod pallet { match error { NodeProviderAuthContractError::ContractCallFailed => Error::::NodeAuthContractCallFailed, + NodeProviderAuthContractError::ContractDeployFailed => + Error::::NodeAuthContractDeployFailed, + NodeProviderAuthContractError::NodeAuthorizationNotSuccessful => + Error::::NodeAuthNodeAuthorizationNotSuccessful, } } } diff --git a/pallets/ddc-clusters/src/mock.rs b/pallets/ddc-clusters/src/mock.rs index dd319afc3..a6baae247 100644 --- a/pallets/ddc-clusters/src/mock.rs +++ b/pallets/ddc-clusters/src/mock.rs @@ -3,7 +3,7 @@ #![allow(dead_code)] use ddc_primitives::{ClusterId, NodePubKey}; -use ddc_traits::staking::{StakingVisitor, StakingVisitorError}; +use ddc_traits::staking::{StakerCreator, StakingVisitor, StakingVisitorError}; use frame_support::{ construct_runtime, parameter_types, traits::{ConstU32, ConstU64, Everything, Nothing}, @@ -190,11 +190,15 @@ impl crate::pallet::Config for Test { type Currency = Balances; type NodeRepository = DdcNodes; type StakingVisitor = TestStakingVisitor; + type StakerCreator = TestStaker; + type WeightInfo = (); } pub(crate) type DdcStakingCall = crate::Call; pub(crate) type TestRuntimeCall = ::RuntimeCall; pub struct TestStakingVisitor; +pub struct TestStaker; + impl StakingVisitor for TestStakingVisitor { fn has_activated_stake( _node_pub_key: &NodePubKey, @@ -210,6 +214,18 @@ impl StakingVisitor for TestStakingVisitor { } } +impl StakerCreator> for TestStaker { + fn bond_stake_and_participate( + _stash: T::AccountId, + _controller: T::AccountId, + _node: NodePubKey, + _value: BalanceOf, + _cluster_id: ClusterId, + ) -> sp_runtime::DispatchResult { + Ok(()) + } +} + pub struct ExtBuilder; impl ExtBuilder { diff --git a/pallets/ddc-clusters/src/node_provider_auth.rs b/pallets/ddc-clusters/src/node_provider_auth.rs index f7f2a99a4..183df979b 100644 --- a/pallets/ddc-clusters/src/node_provider_auth.rs +++ b/pallets/ddc-clusters/src/node_provider_auth.rs @@ -1,8 +1,10 @@ use codec::Encode; use ddc_primitives::{NodePubKey, NodeType}; use frame_support::weights::Weight; +use hex_literal::hex; use pallet_contracts::chain_extension::UncheckedFrom; -use sp_std::prelude::Vec; +use sp_runtime::traits::Hash; +use sp_std::{prelude::Vec, vec}; use crate::Config; @@ -17,7 +19,7 @@ const EXTENSION_CALL_GAS_LIMIT: Weight = Weight::from_ref_time(5_000_000_000_000).set_proof_size(u64::MAX); pub struct NodeProviderAuthContract { - contract_id: T::AccountId, + pub contract_id: T::AccountId, caller_id: T::AccountId, } @@ -61,6 +63,72 @@ where Ok(is_authorized) } + pub fn deploy_contract( + &self, + caller_id: T::AccountId, + ) -> Result { + pub const CTOR_SELECTOR: [u8; 4] = hex!("9bae9d5e"); + + fn encode_constructor() -> Vec { + let mut call_data = CTOR_SELECTOR.to_vec(); + let x = 0_u128; + for _ in 0..9 { + x.encode_to(&mut call_data); + } + call_data + } + + // Load the contract code. + let wasm = &include_bytes!("./test_data/node_provider_auth_white_list.wasm")[..]; + let _wasm_hash = ::Hashing::hash(wasm); + let contract_args = encode_constructor(); + + // Deploy the contract. + let contract_id = pallet_contracts::Pallet::::bare_instantiate( + caller_id.clone(), + Default::default(), + EXTENSION_CALL_GAS_LIMIT, + None, + wasm.into(), + contract_args, + vec![], + false, + ) + .result + .map_err(|_| NodeProviderAuthContractError::ContractDeployFailed)? + .account_id; + + Ok(Self::new(contract_id, caller_id)) + } + + pub fn authorize_node( + &self, + node_pub_key: NodePubKey, + ) -> Result { + pub const ADD_DDC_NODE_SELECTOR: [u8; 4] = hex!("7a04093d"); + + let call_data = { + // is_authorized(node_provider: AccountId, node: Vec, node_variant: u8) -> bool + let args: ([u8; 4], Vec) = + (ADD_DDC_NODE_SELECTOR, node_pub_key.encode()[1..].to_vec()); + args.encode() + }; + + let _ = pallet_contracts::Pallet::::bare_call( + self.caller_id.clone(), + self.contract_id.clone(), + Default::default(), + EXTENSION_CALL_GAS_LIMIT, + None, + call_data, + false, + ) + .result + .map_err(|_| NodeProviderAuthContractError::NodeAuthorizationNotSuccessful)?; + + Ok(true) + } + pub fn new(contract_id: T::AccountId, caller_id: T::AccountId) -> Self { Self { contract_id, caller_id } } @@ -68,4 +136,6 @@ where pub enum NodeProviderAuthContractError { ContractCallFailed, + ContractDeployFailed, + NodeAuthorizationNotSuccessful, } diff --git a/pallets/ddc-clusters/src/testing_utils.rs b/pallets/ddc-clusters/src/testing_utils.rs new file mode 100644 index 000000000..9e97b0904 --- /dev/null +++ b/pallets/ddc-clusters/src/testing_utils.rs @@ -0,0 +1,133 @@ +//! DdcStaking pallet benchmarking. + +use ddc_primitives::{ + CDNNodeParams, ClusterGovParams, ClusterId, ClusterParams, NodeParams, NodePubKey, +}; +pub use frame_benchmarking::{ + account, benchmarks, impl_benchmark_test_suite, whitelist_account, whitelisted_caller, + BenchmarkError, +}; +use frame_system::RawOrigin; +use pallet_contracts::chain_extension::UncheckedFrom; +use pallet_ddc_nodes::Node; +use sp_runtime::Perbill; +use sp_std::prelude::*; + +use crate::{Pallet as DdcClusters, *}; + +pub fn config_cluster(user: T::AccountId, cluster_id: ClusterId) +where + T::AccountId: UncheckedFrom + AsRef<[u8]>, +{ + let cluster_params = ClusterParams { node_provider_auth_contract: Some(user.clone()) }; + let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { + treasury_share: Perbill::default(), + validators_share: Perbill::default(), + cluster_reserve_share: Perbill::default(), + cdn_bond_size: 100u32.into(), + cdn_chill_delay: 50u32.into(), + cdn_unbonding_delay: 50u32.into(), + storage_bond_size: 100u32.into(), + storage_chill_delay: 50u32.into(), + storage_unbonding_delay: 50u32.into(), + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + }; + + let _ = DdcClusters::::create_cluster( + RawOrigin::Root.into(), + cluster_id, + user.clone(), + user, + cluster_params, + cluster_gov_params, + ); +} + +pub fn config_cluster_and_node( + user: T::AccountId, + node_pub_key: NodePubKey, + cluster_id: ClusterId, +) -> Result<(), Box> +where + T::AccountId: UncheckedFrom + AsRef<[u8]>, +{ + let cluster_params = ClusterParams { node_provider_auth_contract: Some(user.clone()) }; + let cdn_node_params = CDNNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + + let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { + treasury_share: Perbill::default(), + validators_share: Perbill::default(), + cluster_reserve_share: Perbill::default(), + cdn_bond_size: 100u32.into(), + cdn_chill_delay: 50u32.into(), + cdn_unbonding_delay: 50u32.into(), + storage_bond_size: 100u32.into(), + storage_chill_delay: 50u32.into(), + storage_unbonding_delay: 50u32.into(), + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + }; + + let _ = DdcClusters::::create_cluster( + RawOrigin::Root.into(), + cluster_id, + user.clone(), + user.clone(), + cluster_params, + cluster_gov_params, + ); + + if let Ok(new_node) = + Node::::new(node_pub_key.clone(), user.clone(), NodeParams::CDNParams(cdn_node_params)) + { + let _ = T::NodeRepository::create(new_node); + } + + T::StakerCreator::bond_stake_and_participate( + user.clone(), + user.clone(), + node_pub_key.clone(), + 10_000u32.into(), + cluster_id, + ) + .unwrap(); + + let mut auth_contract = NodeProviderAuthContract::::new(user.clone(), user.clone()); + auth_contract = auth_contract.deploy_contract(user.clone())?; + auth_contract.authorize_node(node_pub_key)?; + + let updated_cluster_params = + ClusterParams { node_provider_auth_contract: Some(auth_contract.contract_id) }; + + // Register auth contract + let _ = DdcClusters::::set_cluster_params( + RawOrigin::Signed(user).into(), + cluster_id, + updated_cluster_params, + ); + + Ok(()) +} + +impl From for Box { + fn from(error: NodeProviderAuthContractError) -> Self { + match error { + NodeProviderAuthContractError::ContractCallFailed => + Box::new(BenchmarkError::Stop("NodeAuthContractCallFailed")), + NodeProviderAuthContractError::ContractDeployFailed => + Box::new(BenchmarkError::Stop("NodeAuthContractDeployFailed")), + NodeProviderAuthContractError::NodeAuthorizationNotSuccessful => + Box::new(BenchmarkError::Stop("NodeAuthNodeAuthorizationNotSuccessful")), + } + } +} diff --git a/pallets/ddc-clusters/src/weights.rs b/pallets/ddc-clusters/src/weights.rs new file mode 100644 index 000000000..96e4b735f --- /dev/null +++ b/pallets/ddc-clusters/src/weights.rs @@ -0,0 +1,155 @@ + +//! Autogenerated weights for `pallet_ddc_clusters` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-11-16, STEPS: `200`, REPEAT: 1000, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `Raids-MacBook-Pro-2.local`, CPU: `` +//! EXECUTION: None, WASM-EXECUTION: Interpreted, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// ./target/release/cere +// benchmark +// pallet +// --chain +// dev +// --pallet +// pallet_ddc_clusters +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 50 +// --output +// pallets/ddc-clusters/src/weights.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_ddc_clusters. +pub trait WeightInfo { + fn create_cluster() -> Weight; + fn add_node() -> Weight; + fn remove_node() -> Weight; + fn set_cluster_params() -> Weight; + fn set_cluster_gov_params() -> Weight; +} + +/// Weight functions for `pallet_ddc_clusters`. +pub struct SubstrateWeight(PhantomData); +impl WeightInfo for SubstrateWeight { + // Storage: DdcClusters Clusters (r:1 w:1) + // Storage: DdcClusters ClustersGovParams (r:0 w:1) + fn create_cluster() -> Weight { + // Minimum execution time: 14_000 nanoseconds. + Weight::from_ref_time(15_000_000u64) + .saturating_add(T::DbWeight::get().reads(1u64)) + .saturating_add(T::DbWeight::get().writes(2u64)) + } + // Storage: DdcClusters Clusters (r:1 w:0) + // Storage: DdcNodes CDNNodes (r:1 w:1) + // Storage: DdcStaking Nodes (r:1 w:0) + // Storage: DdcStaking CDNs (r:1 w:0) + // Storage: DdcStaking Storages (r:1 w:0) + // Storage: DdcStaking Bonded (r:1 w:0) + // Storage: DdcStaking Ledger (r:1 w:0) + // Storage: System Account (r:1 w:0) + // Storage: Contracts ContractInfoOf (r:1 w:1) + // Storage: Contracts CodeStorage (r:1 w:0) + // Storage: Timestamp Now (r:1 w:0) + // Storage: System EventTopics (r:2 w:2) + // Storage: DdcClusters ClustersNodes (r:0 w:1) + // Storage: unknown [0x89eb0d6a8a691dae2cd15ed0369931ce0a949ecafa5c3f93f8121833646e15c3] (r:1 w:0) + // Storage: unknown [0xc3ad1d87683b6ac25f2e809346840d7a7ed0c05653ee606dba68aba3bdb5d957] (r:1 w:0) + fn add_node() -> Weight { + // Minimum execution time: 307_000 nanoseconds. + Weight::from_ref_time(354_000_000u64) + .saturating_add(T::DbWeight::get().reads(15u64)) + .saturating_add(T::DbWeight::get().writes(5u64)) + } + // Storage: DdcClusters Clusters (r:1 w:0) + // Storage: DdcNodes CDNNodes (r:1 w:1) + // Storage: DdcClusters ClustersNodes (r:0 w:1) + fn remove_node() -> Weight { + // Minimum execution time: 23_000 nanoseconds. + Weight::from_ref_time(24_000_000u64) + .saturating_add(T::DbWeight::get().reads(2u64)) + .saturating_add(T::DbWeight::get().writes(2u64)) + } + // Storage: DdcClusters Clusters (r:1 w:1) + fn set_cluster_params() -> Weight { + // Minimum execution time: 15_000 nanoseconds. + Weight::from_ref_time(16_000_000u64) + .saturating_add(T::DbWeight::get().reads(1u64)) + .saturating_add(T::DbWeight::get().writes(1u64)) + } + // Storage: DdcClusters Clusters (r:1 w:0) + // Storage: DdcClusters ClustersGovParams (r:0 w:1) + fn set_cluster_gov_params() -> Weight { + // Minimum execution time: 15_000 nanoseconds. + Weight::from_ref_time(16_000_000u64) + .saturating_add(T::DbWeight::get().reads(1u64)) + .saturating_add(T::DbWeight::get().writes(1u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + // Storage: DdcClusters Clusters (r:1 w:1) + // Storage: DdcClusters ClustersGovParams (r:0 w:1) + fn create_cluster() -> Weight { + // Minimum execution time: 14_000 nanoseconds. + Weight::from_ref_time(15_000_000u64) + .saturating_add(RocksDbWeight::get().reads(1u64)) + .saturating_add(RocksDbWeight::get().writes(2u64)) + } + // Storage: DdcClusters Clusters (r:1 w:0) + // Storage: DdcNodes CDNNodes (r:1 w:1) + // Storage: DdcStaking Nodes (r:1 w:0) + // Storage: DdcStaking CDNs (r:1 w:0) + // Storage: DdcStaking Storages (r:1 w:0) + // Storage: DdcStaking Bonded (r:1 w:0) + // Storage: DdcStaking Ledger (r:1 w:0) + // Storage: System Account (r:1 w:0) + // Storage: Contracts ContractInfoOf (r:1 w:1) + // Storage: Contracts CodeStorage (r:1 w:0) + // Storage: Timestamp Now (r:1 w:0) + // Storage: System EventTopics (r:2 w:2) + // Storage: DdcClusters ClustersNodes (r:0 w:1) + // Storage: unknown [0x89eb0d6a8a691dae2cd15ed0369931ce0a949ecafa5c3f93f8121833646e15c3] (r:1 w:0) + // Storage: unknown [0xc3ad1d87683b6ac25f2e809346840d7a7ed0c05653ee606dba68aba3bdb5d957] (r:1 w:0) + fn add_node() -> Weight { + // Minimum execution time: 307_000 nanoseconds. + Weight::from_ref_time(354_000_000u64) + .saturating_add(RocksDbWeight::get().reads(15u64)) + .saturating_add(RocksDbWeight::get().writes(5u64)) + } + // Storage: DdcClusters Clusters (r:1 w:0) + // Storage: DdcNodes CDNNodes (r:1 w:1) + // Storage: DdcClusters ClustersNodes (r:0 w:1) + fn remove_node() -> Weight { + // Minimum execution time: 23_000 nanoseconds. + Weight::from_ref_time(24_000_000u64) + .saturating_add(RocksDbWeight::get().reads(2u64)) + .saturating_add(RocksDbWeight::get().writes(2u64)) + } + // Storage: DdcClusters Clusters (r:1 w:1) + fn set_cluster_params() -> Weight { + // Minimum execution time: 15_000 nanoseconds. + Weight::from_ref_time(16_000_000u64) + .saturating_add(RocksDbWeight::get().reads(1u64)) + .saturating_add(RocksDbWeight::get().writes(1u64)) + } + // Storage: DdcClusters Clusters (r:1 w:0) + // Storage: DdcClusters ClustersGovParams (r:0 w:1) + fn set_cluster_gov_params() -> Weight { + // Minimum execution time: 15_000 nanoseconds. + Weight::from_ref_time(16_000_000u64) + .saturating_add(RocksDbWeight::get().reads(1u64)) + .saturating_add(RocksDbWeight::get().writes(1u64)) + } +} \ No newline at end of file diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 40b971a56..f012c35dc 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -33,7 +33,7 @@ pub use ddc_primitives::{ClusterId, NodePubKey, NodeType}; use ddc_traits::{ cluster::{ClusterCreator, ClusterVisitor, ClusterVisitorError}, node::{NodeCreator, NodeVisitor}, - staking::{StakingVisitor, StakingVisitorError}, + staking::{StakerCreator, StakingVisitor, StakingVisitorError}, }; use frame_support::{ assert_ok, @@ -967,6 +967,37 @@ pub mod pallet { } } + impl StakerCreator> for Pallet { + fn bond_stake_and_participate( + stash: T::AccountId, + controller: T::AccountId, + node: NodePubKey, + value: BalanceOf, + cluster_id: ClusterId, + ) -> DispatchResult { + Nodes::::insert(&node, &stash); + Providers::::insert(&stash, &node); + >::insert(&stash, &controller); + let stash_balance = T::Currency::free_balance(&stash); + let value = value.min(stash_balance); + Self::deposit_event(Event::::Bonded(stash.clone(), value)); + let item = StakingLedger { + stash: stash.clone(), + total: value, + active: value, + chilling: Default::default(), + unlocking: Default::default(), + }; + Self::update_ledger(&controller, &item); + match node { + NodePubKey::StoragePubKey(_node) => Self::do_add_storage(&stash, cluster_id), + NodePubKey::CDNPubKey(_node) => Self::do_add_cdn(&stash, cluster_id), + } + + Ok(()) + } + } + impl StakingVisitor for Pallet { fn has_activated_stake( node_pub_key: &NodePubKey, diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 5a2da8127..579a1cc17 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -217,6 +217,7 @@ runtime-benchmarks = [ "pallet-society/runtime-benchmarks", "pallet-staking/runtime-benchmarks", "pallet-ddc-customers/runtime-benchmarks", + "pallet-ddc-clusters/runtime-benchmarks", "pallet-ddc-nodes/runtime-benchmarks", "pallet-ddc-staking/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index ae782f2c7..65e80656e 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1358,7 +1358,9 @@ impl pallet_ddc_clusters::Config for Runtime { type RuntimeEvent = RuntimeEvent; type NodeRepository = pallet_ddc_nodes::Pallet; type StakingVisitor = pallet_ddc_staking::Pallet; + type StakerCreator = pallet_ddc_staking::Pallet; type Currency = Balances; + type WeightInfo = pallet_ddc_clusters::weights::SubstrateWeight; } parameter_types! { @@ -1542,6 +1544,7 @@ mod benches { [pallet_session, SessionBench::] [pallet_staking, Staking] [pallet_ddc_customers, DdcCustomers] + [pallet_ddc_clusters, DdcClusters] [pallet_ddc_staking, DdcStaking] [pallet_ddc_nodes, DdcNodes] [frame_system, SystemBench::] diff --git a/traits/src/staking.rs b/traits/src/staking.rs index af1a185e2..06697856f 100644 --- a/traits/src/staking.rs +++ b/traits/src/staking.rs @@ -12,6 +12,16 @@ pub trait StakingVisitor { fn has_chilling_attempt(node_pub_key: &NodePubKey) -> Result; } +pub trait StakerCreator { + fn bond_stake_and_participate( + stash: T::AccountId, + controller: T::AccountId, + node: NodePubKey, + value: Balance, + cluster_id: ClusterId, + ) -> sp_runtime::DispatchResult; +} + pub enum StakingVisitorError { NodeStakeDoesNotExist, NodeStakeIsInBadState, From 5adee060311f6fe4e4cf98dd436b843622878666 Mon Sep 17 00:00:00 2001 From: Rakan Al-Huneiti Date: Wed, 29 Nov 2023 16:04:46 +0300 Subject: [PATCH 554/583] Release/4.8.2 (#173) This is a PR that should precede #146 to be able to tag this 4.8.2 release prior to merging the 0.9.33 PR. - [x] Change version to 4.8.2 - [x] Update spec and transaction versions - [x] Update cere-dev - [x] Update cere --- CHANGELOG.md | 10 +++--- Cargo.lock | 36 +++++++++---------- cli/Cargo.toml | 2 +- node/client/Cargo.toml | 2 +- node/service/Cargo.toml | 2 +- pallets/chainbridge/Cargo.toml | 2 +- pallets/ddc-clusters/Cargo.toml | 2 +- .../ddc-metrics-offchain-worker/Cargo.toml | 2 +- pallets/ddc-nodes/Cargo.toml | 2 +- pallets/ddc-payouts/Cargo.toml | 2 +- pallets/ddc-staking/Cargo.toml | 2 +- pallets/ddc/Cargo.toml | 2 +- pallets/erc20/Cargo.toml | 2 +- pallets/erc721/Cargo.toml | 2 +- rpc/Cargo.toml | 2 +- runtime/cere-dev/Cargo.toml | 20 +++++------ runtime/cere-dev/constants/Cargo.toml | 2 +- runtime/cere-dev/src/lib.rs | 4 +-- runtime/cere/Cargo.toml | 12 +++---- runtime/cere/constants/Cargo.toml | 2 +- runtime/cere/src/lib.rs | 4 +-- runtime/common/Cargo.toml | 2 +- 22 files changed, 58 insertions(+), 60 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e47be2757..26416a2fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,13 +9,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [C] Changes is `Cere` Runtime - [D] Changes is `Cere Dev` Runtime -## [vNext + 1] - -### Changed +## [vNext] -- [C,D] Updated Substrate to polkadot-v0.9.31 +- ... -## [vNext] +## [4.8.2] ### Added @@ -28,7 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- ... +- [C,D] Updated Substrate to polkadot-v0.9.31 ## [4.8.1] diff --git a/Cargo.lock b/Cargo.lock index 5032ae212..8691a9de8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -790,7 +790,7 @@ dependencies = [ [[package]] name = "cere-cli" -version = "4.8.1" +version = "4.8.2" dependencies = [ "cere-client", "cere-service", @@ -805,7 +805,7 @@ dependencies = [ [[package]] name = "cere-client" -version = "4.8.1" +version = "4.8.2" dependencies = [ "cere-dev-runtime", "cere-runtime", @@ -836,7 +836,7 @@ dependencies = [ [[package]] name = "cere-dev-runtime" -version = "4.8.1" +version = "4.8.2" dependencies = [ "cere-dev-runtime-constants", "cere-runtime-common", @@ -927,7 +927,7 @@ dependencies = [ [[package]] name = "cere-dev-runtime-constants" -version = "4.8.1" +version = "4.8.2" dependencies = [ "node-primitives", "sp-runtime", @@ -935,7 +935,7 @@ dependencies = [ [[package]] name = "cere-rpc" -version = "4.8.1" +version = "4.8.2" dependencies = [ "jsonrpsee", "node-primitives", @@ -964,7 +964,7 @@ dependencies = [ [[package]] name = "cere-runtime" -version = "4.8.1" +version = "4.8.2" dependencies = [ "cere-runtime-common", "cere-runtime-constants", @@ -1049,7 +1049,7 @@ dependencies = [ [[package]] name = "cere-runtime-common" -version = "4.8.1" +version = "4.8.2" dependencies = [ "frame-support", "node-primitives", @@ -1059,14 +1059,14 @@ dependencies = [ [[package]] name = "cere-runtime-constants" -version = "4.8.1" +version = "4.8.2" dependencies = [ "node-primitives", ] [[package]] name = "cere-service" -version = "4.8.1" +version = "4.8.2" dependencies = [ "cere-client", "cere-dev-runtime", @@ -4602,7 +4602,7 @@ dependencies = [ [[package]] name = "pallet-cere-ddc" -version = "4.8.1" +version = "4.8.2" dependencies = [ "frame-support", "frame-system", @@ -4617,7 +4617,7 @@ dependencies = [ [[package]] name = "pallet-chainbridge" -version = "4.8.1" +version = "4.8.2" dependencies = [ "frame-support", "frame-system", @@ -4719,7 +4719,7 @@ dependencies = [ [[package]] name = "pallet-ddc-clusters" -version = "4.8.1" +version = "4.8.2" dependencies = [ "ddc-primitives", "ddc-traits", @@ -4768,7 +4768,7 @@ dependencies = [ [[package]] name = "pallet-ddc-metrics-offchain-worker" -version = "4.8.1" +version = "4.8.2" dependencies = [ "alt_serde", "frame-support", @@ -4792,7 +4792,7 @@ dependencies = [ [[package]] name = "pallet-ddc-nodes" -version = "4.8.1" +version = "4.8.2" dependencies = [ "ddc-primitives", "ddc-traits", @@ -4813,7 +4813,7 @@ dependencies = [ [[package]] name = "pallet-ddc-payouts" -version = "4.8.1" +version = "4.8.2" dependencies = [ "byte-unit", "ddc-primitives", @@ -4837,7 +4837,7 @@ dependencies = [ [[package]] name = "pallet-ddc-staking" -version = "4.8.1" +version = "4.8.2" dependencies = [ "ddc-primitives", "ddc-traits", @@ -4933,7 +4933,7 @@ dependencies = [ [[package]] name = "pallet-erc20" -version = "4.8.1" +version = "4.8.2" dependencies = [ "frame-support", "frame-system", @@ -4951,7 +4951,7 @@ dependencies = [ [[package]] name = "pallet-erc721" -version = "4.8.1" +version = "4.8.2" dependencies = [ "frame-support", "frame-system", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 1d9531de1..ef0f24d90 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-cli" -version = "4.8.1" +version = "4.8.2" edition = "2021" [package.metadata.wasm-pack.profile.release] diff --git a/node/client/Cargo.toml b/node/client/Cargo.toml index baf0949bf..94eeea9ab 100644 --- a/node/client/Cargo.toml +++ b/node/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-client" -version = "4.8.1" +version = "4.8.2" edition = "2021" [dependencies] diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index e3ac7f21d..c28d6fc1b 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-service" -version = "4.8.1" +version = "4.8.2" edition = "2021" [dependencies] diff --git a/pallets/chainbridge/Cargo.toml b/pallets/chainbridge/Cargo.toml index 4e14c525e..0f99454b1 100644 --- a/pallets/chainbridge/Cargo.toml +++ b/pallets/chainbridge/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-chainbridge" -version = "4.8.1" +version = "4.8.2" authors = ["Parity Technologies "] edition = "2021" homepage = "https://substrate.io" diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index feda63e13..5630b420b 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-ddc-clusters" -version = "4.8.1" +version = "4.8.2" edition = "2021" [dependencies] diff --git a/pallets/ddc-metrics-offchain-worker/Cargo.toml b/pallets/ddc-metrics-offchain-worker/Cargo.toml index f85e2c42f..dbf72f5de 100644 --- a/pallets/ddc-metrics-offchain-worker/Cargo.toml +++ b/pallets/ddc-metrics-offchain-worker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-ddc-metrics-offchain-worker" -version = "4.8.1" +version = "4.8.2" authors = ["Parity Technologies "] edition = "2021" homepage = "https://substrate.dev" diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index 25afc226f..395c613c6 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-ddc-nodes" -version = "4.8.1" +version = "4.8.2" edition = "2021" [dependencies] diff --git a/pallets/ddc-payouts/Cargo.toml b/pallets/ddc-payouts/Cargo.toml index 406612a0c..248e81165 100644 --- a/pallets/ddc-payouts/Cargo.toml +++ b/pallets/ddc-payouts/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-ddc-payouts" -version = "4.8.1" +version = "4.8.2" edition = "2021" [dependencies] diff --git a/pallets/ddc-staking/Cargo.toml b/pallets/ddc-staking/Cargo.toml index 0b4a64f1f..9dcad54c5 100644 --- a/pallets/ddc-staking/Cargo.toml +++ b/pallets/ddc-staking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-ddc-staking" -version = "4.8.1" +version = "4.8.2" edition = "2021" [dependencies] diff --git a/pallets/ddc/Cargo.toml b/pallets/ddc/Cargo.toml index 1321a638e..7778b0c71 100644 --- a/pallets/ddc/Cargo.toml +++ b/pallets/ddc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = 'pallet-cere-ddc' -version = '4.8.1' +version = '4.8.2' authors = ['Substrate DevHub '] edition = '2021' homepage = 'https://www.cere.network/' diff --git a/pallets/erc20/Cargo.toml b/pallets/erc20/Cargo.toml index 72394b0ae..e9516a297 100644 --- a/pallets/erc20/Cargo.toml +++ b/pallets/erc20/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-erc20" -version = "4.8.1" +version = "4.8.2" authors = ["Parity Technologies "] edition = "2021" homepage = "https://substrate.dev" diff --git a/pallets/erc721/Cargo.toml b/pallets/erc721/Cargo.toml index 9ade33e51..775e59b14 100644 --- a/pallets/erc721/Cargo.toml +++ b/pallets/erc721/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-erc721" -version = "4.8.1" +version = "4.8.2" authors = ["Parity Technologies "] edition = "2021" homepage = "https://substrate.dev" diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 6edd37b22..ed320a242 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-rpc" -version = "4.8.1" +version = "4.8.2" edition = "2021" [dependencies] diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 579a1cc17..232284a86 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-dev-runtime" -version = "4.8.1" +version = "4.8.2" authors = ["Parity Technologies "] build = "build.rs" edition = "2021" @@ -54,24 +54,24 @@ pallet-babe = { default-features = false, git = "https://github.com/paritytech/s pallet-bags-list = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } -pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } +pallet-cere-ddc = { version = "4.8.2", default-features = false, path = "../../pallets/ddc" } +pallet-chainbridge = { version = "4.8.2", default-features = false, path = "../../pallets/chainbridge" } pallet-child-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-collective = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-contracts-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-ddc-clusters = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-clusters" } +pallet-ddc-clusters = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-clusters" } pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } -pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } -pallet-ddc-nodes = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-nodes" } -pallet-ddc-payouts = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-payouts" } -pallet-ddc-staking = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-staking" } +pallet-ddc-metrics-offchain-worker = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } +pallet-ddc-nodes = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-nodes" } +pallet-ddc-payouts = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-payouts" } +pallet-ddc-staking = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-staking" } pallet-democracy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-multi-phase = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-support-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } pallet-elections-phragmen = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } -pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } +pallet-erc20 = { version = "4.8.2", default-features = false, path = "../../pallets/erc20" } +pallet-erc721 = { version = "4.8.2", default-features = false, path = "../../pallets/erc721" } pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } pallet-grandpa = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-identity = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/runtime/cere-dev/constants/Cargo.toml b/runtime/cere-dev/constants/Cargo.toml index c5c87d7c4..8c8b0f96a 100644 --- a/runtime/cere-dev/constants/Cargo.toml +++ b/runtime/cere-dev/constants/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-dev-runtime-constants" -version = "4.8.1" +version = "4.8.2" authors = ["Parity Technologies "] edition = "2021" diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 65e80656e..0ef21b0fa 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -129,10 +129,10 @@ 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: 48015, + spec_version: 48016, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 6, + transaction_version: 7, state_version: 0, }; diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index 901d75238..c320c3dda 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-runtime" -version = "4.8.1" +version = "4.8.2" authors = ["Parity Technologies "] build = "build.rs" edition = "2021" @@ -53,19 +53,19 @@ pallet-babe = { default-features = false, git = "https://github.com/paritytech/s pallet-bags-list = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-cere-ddc = { version = "4.8.1", default-features = false, path = "../../pallets/ddc" } -pallet-chainbridge = { version = "4.8.1", default-features = false, path = "../../pallets/chainbridge" } +pallet-cere-ddc = { version = "4.8.2", default-features = false, path = "../../pallets/ddc" } +pallet-chainbridge = { version = "4.8.2", default-features = false, path = "../../pallets/chainbridge" } pallet-child-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-collective = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-contracts-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-ddc-metrics-offchain-worker = { version = "4.8.1", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } +pallet-ddc-metrics-offchain-worker = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } pallet-democracy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-multi-phase = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-support-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } pallet-elections-phragmen = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-erc20 = { version = "4.8.1", default-features = false, path = "../../pallets/erc20" } -pallet-erc721 = { version = "4.8.1", default-features = false, path = "../../pallets/erc721" } +pallet-erc20 = { version = "4.8.2", default-features = false, path = "../../pallets/erc20" } +pallet-erc721 = { version = "4.8.2", default-features = false, path = "../../pallets/erc721" } pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } pallet-grandpa = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-identity = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/runtime/cere/constants/Cargo.toml b/runtime/cere/constants/Cargo.toml index e53040e30..492524a30 100644 --- a/runtime/cere/constants/Cargo.toml +++ b/runtime/cere/constants/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-runtime-constants" -version = "4.8.1" +version = "4.8.2" authors = ["Parity Technologies "] edition = "2021" diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 7fe6ede23..16b3fbb53 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -123,10 +123,10 @@ 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: 48009, + spec_version: 48010, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 6, + transaction_version: 7, state_version: 0, }; diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 86f70eb4f..e8c7950d8 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-runtime-common" -version = "4.8.1" +version = "4.8.2" authors = ["Parity Technologies "] edition = "2021" From 31f45a84f59f97c037ca585d325df352bcccb8ee Mon Sep 17 00:00:00 2001 From: Raid5594 <52794079+Raid5594@users.noreply.github.com> Date: Thu, 30 Nov 2023 13:19:23 +0100 Subject: [PATCH 555/583] improve coverage for ddc-staking (#177) - increase coverage to 90% + --- pallets/ddc-staking/src/benchmarking.rs | 6 + pallets/ddc-staking/src/mock.rs | 2 +- pallets/ddc-staking/src/tests.rs | 194 ++++++++++++++++++++++++ 3 files changed, 201 insertions(+), 1 deletion(-) diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index 91beb955f..67afcea68 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -129,4 +129,10 @@ benchmarks! { verify { assert!(Nodes::::contains_key(&new_node)); } + + impl_benchmark_test_suite!( + DdcStaking, + crate::mock::ExtBuilder::default().build(), + crate::mock::Test, + ); } diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index cf0ff819e..ef35f6515 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -353,7 +353,7 @@ impl ExtBuilder { self.storages.push((stash, controller, stake, cluster)); self } - fn build(self) -> TestExternalities { + pub fn build(self) -> TestExternalities { sp_tracing::try_init_simple(); let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index ab1709814..ad1ff7914 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -9,6 +9,21 @@ use super::{mock::*, *}; pub const BLOCK_TIME: u64 = 1000; pub const INIT_TIMESTAMP: u64 = 30_000; +#[test] +fn test_default_staking_ledger() { + // Verifies initial conditions of mock + ExtBuilder::default().build_and_execute(|| { + let default_staking_ledger = StakingLedger::< + ::AccountId, + BalanceOf, + Test, + >::default_from(1); + // Account 11 is stashed and locked, and account 10 is the controller + assert_eq!(default_staking_ledger.stash, 1); + assert_eq!(default_staking_ledger.total, Zero::zero()); + }); +} + #[test] fn basic_setup_works() { // Verifies initial conditions of mock @@ -58,6 +73,10 @@ fn change_controller_works() { // Change controller. assert_ok!(DdcStaking::set_controller(RuntimeOrigin::signed(11), 3)); + assert_noop!( + DdcStaking::set_controller(RuntimeOrigin::signed(11), 3), + Error::::AlreadyPaired + ); assert_eq!(DdcStaking::bonded(&11), Some(3)); // 10 is no longer in control. @@ -89,6 +108,20 @@ fn not_enough_inital_bond_flow() { Error::::InsufficientBond ); + // Add new Storage participant, account 1 controlled by 2 with node 3. + assert_ok!(DdcStaking::bond( + RuntimeOrigin::signed(1), + 2, + NodePubKey::StoragePubKey(StorageNodePubKey::new([3; 32])), + 100 + )); + + // Not enough tokens bonded to store + assert_noop!( + DdcStaking::store(RuntimeOrigin::signed(4), ClusterId::from([1; 20])), + Error::::InsufficientBond + ); + // Can not bond extra assert_noop!( DdcStaking::bond( @@ -121,6 +154,67 @@ fn not_enough_inital_bond_flow() { }) } +#[test] +fn unbonding_edge_cases_work() { + ExtBuilder::default().build_and_execute(|| { + System::set_block_number(1); + + // Add new CDN participant, account 3 controlled by 4 with node 5. + assert_ok!(DdcStaking::bond( + RuntimeOrigin::signed(3), + 4, + NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + 100 + )); + + assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), ClusterId::from([1; 20]))); + + assert_ok!(DdcStaking::unbond(RuntimeOrigin::signed(4), 1)); + while System::block_number() < 33 { + assert_ok!(DdcStaking::unbond(RuntimeOrigin::signed(4), 1)); + System::assert_last_event(Event::Unbonded(3, 1).into()); + System::set_block_number(System::block_number() + 1); + } + + assert_noop!(DdcStaking::unbond(RuntimeOrigin::signed(4), 1), Error::::NoMoreChunks); + }) +} + +#[test] +fn serve_or_store_should_be_prohibited() { + ExtBuilder::default().build_and_execute(|| { + System::set_block_number(1); + + // Add new CDN participant, account 3 controlled by 4 with node 5. + assert_ok!(DdcStaking::bond( + RuntimeOrigin::signed(3), + 4, + NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + 100 + )); + + // Add new Storage participant, account 1 controlled by 2 with node 3. + assert_ok!(DdcStaking::bond( + RuntimeOrigin::signed(1), + 2, + NodePubKey::StoragePubKey(StorageNodePubKey::new([3; 32])), + 100 + )); + + // Not enough tokens bonded to serve + assert_noop!( + DdcStaking::serve(RuntimeOrigin::signed(2), ClusterId::from([1; 20])), + Error::::ServingProhibited + ); + + // Not enough tokens bonded to store + assert_noop!( + DdcStaking::store(RuntimeOrigin::signed(4), ClusterId::from([1; 20])), + Error::::StoringProhibited + ); + }) +} + #[test] fn set_node_works() { ExtBuilder::default().build_and_execute(|| { @@ -160,6 +254,45 @@ fn set_node_works() { }) } +#[test] +fn cancel_previous_chill_works() { + ExtBuilder::default().build_and_execute(|| { + System::set_block_number(1); + + let cluster_id = ClusterId::from([1; 20]); + // Add new CDN participant, account 3 controlled by 4 with node 5. + assert_ok!(DdcStaking::bond( + RuntimeOrigin::signed(3), + 4, + NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + 100 + )); + + // Add new Storage participant, account 1 controlled by 2 with node 3. + assert_ok!(DdcStaking::bond( + RuntimeOrigin::signed(1), + 2, + NodePubKey::StoragePubKey(StorageNodePubKey::new([3; 32])), + 100 + )); + + // Not enough tokens bonded to serve + assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), cluster_id)); + + assert_ok!(DdcStaking::store(RuntimeOrigin::signed(2), ClusterId::from([1; 20]))); + + // Schedule CDN participant removal. + assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); + // Not enough tokens bonded to serve + assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), cluster_id)); + + // Schedule CDN participant removal. + assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(2))); + // Not enough tokens bonded to serve + assert_ok!(DdcStaking::store(RuntimeOrigin::signed(2), cluster_id)); + }) +} + #[test] fn staking_should_work() { ExtBuilder::default().build_and_execute(|| { @@ -453,3 +586,64 @@ fn storage_full_unbonding_works() { MockNodeVisitor::reset_and_release_lock(lock); }); } + +#[test] +fn staking_creator_works() { + // Verifies initial conditions of mock + ExtBuilder::default().build_and_execute(|| { + let stash: u64 = 1; + let controller: u64 = 2; + let cluster_id = ClusterId::from([1; 20]); + let value = 5; + let cdn_node_pub_key = NodePubKey::StoragePubKey(StorageNodePubKey::new([2; 32])); + let storage_node_pub_key = NodePubKey::CDNPubKey(CDNNodePubKey::new([2; 32])); + + assert_ok!( + >>::bond_stake_and_participate( + stash, + controller, + cdn_node_pub_key, + value, + cluster_id, + ) + ); + + assert_ok!( + >>::bond_stake_and_participate( + stash, + controller, + storage_node_pub_key, + value, + cluster_id, + ) + ); + }); +} + +#[test] +fn staking_visitor_works() { + // Verifies initial conditions of mock + ExtBuilder::default().build_and_execute(|| { + let cluster_id = ClusterId::from([1; 20]); + let node_pub_key = NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])); + + // Add new CDN participant, account 3 controlled by 4 with node 5. + assert_ok!(DdcStaking::bond(RuntimeOrigin::signed(3), 4, node_pub_key.clone(), 100)); + + assert!(>::has_stake(&node_pub_key,)); + + if let Ok(result) = + >::has_chilling_attempt(&node_pub_key) + { + assert!(!result); + } + + assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), ClusterId::from([1; 20]))); + + if let Ok(result) = + >::has_activated_stake(&node_pub_key, &cluster_id) + { + assert!(result); + } + }); +} From f2235c6d0c9ff20354225877487a643290ecc981 Mon Sep 17 00:00:00 2001 From: aie0 <149175774+aie0@users.noreply.github.com> Date: Thu, 30 Nov 2023 17:34:37 +0200 Subject: [PATCH 556/583] Dac squash 0.9.30 (#179) Co-authored-by: rakanalh --- .github/workflows/dev.yaml | 3 +- Cargo.lock | 330 +++++++++++++++-------------- pallets/ddc-customers/src/lib.rs | 65 +++--- pallets/ddc-customers/src/mock.rs | 6 +- pallets/ddc-customers/src/tests.rs | 112 +++++++++- pallets/ddc-payouts/src/lib.rs | 237 ++++++++++++--------- pallets/ddc-payouts/src/mock.rs | 39 +++- pallets/ddc-payouts/src/tests.rs | 251 ++++++++++++++++++++-- primitives/src/lib.rs | 1 - traits/Cargo.toml | 2 + traits/src/cluster.rs | 4 + traits/src/customer.rs | 11 +- 12 files changed, 703 insertions(+), 358 deletions(-) diff --git a/.github/workflows/dev.yaml b/.github/workflows/dev.yaml index 163c796df..045091f41 100644 --- a/.github/workflows/dev.yaml +++ b/.github/workflows/dev.yaml @@ -3,6 +3,7 @@ on: push: branches: - 'dev' + - 'deployment-0.9.30' workflow_dispatch: env: @@ -68,7 +69,7 @@ jobs: tags: | ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} - ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:deployment-0.9.30-latest - name: Copy wasm artifacts from the image run: | diff --git a/Cargo.lock b/Cargo.lock index 8691a9de8..e40e763df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1636,6 +1636,8 @@ dependencies = [ "ddc-primitives", "frame-support", "frame-system", + "parity-scale-codec", + "scale-info", "sp-runtime", "sp-std", ] @@ -2144,7 +2146,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", ] @@ -2167,7 +2169,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -2190,7 +2192,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "array-bytes", @@ -2241,7 +2243,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2252,7 +2254,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2268,7 +2270,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -2297,7 +2299,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2329,7 +2331,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "cfg-expr", @@ -2343,7 +2345,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2355,7 +2357,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -2365,7 +2367,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "log", @@ -2383,7 +2385,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -2398,7 +2400,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -2407,7 +2409,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "parity-scale-codec", @@ -4299,7 +4301,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-system", "parity-scale-codec", @@ -4495,7 +4497,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -4511,7 +4513,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -4526,7 +4528,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4550,7 +4552,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4570,7 +4572,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4585,7 +4587,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4633,7 +4635,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4652,7 +4654,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4669,7 +4671,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4698,7 +4700,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -4710,7 +4712,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -4861,7 +4863,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4879,7 +4881,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4903,7 +4905,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4916,7 +4918,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4968,7 +4970,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4989,7 +4991,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5012,7 +5014,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5028,7 +5030,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5048,7 +5050,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5065,7 +5067,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5082,7 +5084,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5098,7 +5100,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5115,7 +5117,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5135,7 +5137,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -5145,7 +5147,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5162,7 +5164,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5185,7 +5187,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5200,7 +5202,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5214,7 +5216,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5229,7 +5231,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5245,7 +5247,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5266,7 +5268,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5282,7 +5284,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5296,7 +5298,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5319,7 +5321,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5330,7 +5332,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5344,7 +5346,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5362,7 +5364,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5381,7 +5383,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5397,7 +5399,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5412,7 +5414,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5423,7 +5425,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5440,7 +5442,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5456,7 +5458,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -6340,7 +6342,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "env_logger 0.9.3", "log", @@ -6604,7 +6606,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "sp-core", @@ -6615,7 +6617,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6642,7 +6644,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "futures-timer", @@ -6665,7 +6667,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6681,7 +6683,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6698,7 +6700,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6709,7 +6711,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "chrono", @@ -6749,7 +6751,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "fnv", "futures", @@ -6777,7 +6779,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "kvdb", @@ -6802,7 +6804,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6826,7 +6828,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "fork-tree", @@ -6868,7 +6870,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -6890,7 +6892,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6903,7 +6905,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6927,7 +6929,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sc-client-api", "sp-authorship", @@ -6938,7 +6940,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "lazy_static", "lru 0.7.8", @@ -6965,7 +6967,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "environmental", "parity-scale-codec", @@ -6981,7 +6983,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -6996,7 +6998,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "cfg-if", "libc", @@ -7016,7 +7018,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "array-bytes", @@ -7057,7 +7059,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "finality-grandpa", "futures", @@ -7078,7 +7080,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7095,7 +7097,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "async-trait", @@ -7110,7 +7112,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "async-trait", @@ -7157,7 +7159,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "cid", "futures", @@ -7177,7 +7179,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7203,7 +7205,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "futures", @@ -7221,7 +7223,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "futures", @@ -7242,7 +7244,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "fork-tree", @@ -7272,7 +7274,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "futures", @@ -7291,7 +7293,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "bytes", @@ -7321,7 +7323,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "libp2p", @@ -7334,7 +7336,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7343,7 +7345,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "hash-db", @@ -7373,7 +7375,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -7396,7 +7398,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -7409,7 +7411,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "hex", @@ -7428,7 +7430,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "directories", @@ -7499,7 +7501,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -7513,7 +7515,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7532,7 +7534,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "libc", @@ -7551,7 +7553,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "chrono", "futures", @@ -7569,7 +7571,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7600,7 +7602,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7611,7 +7613,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -7638,7 +7640,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -7652,7 +7654,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "futures-timer", @@ -8065,7 +8067,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "log", @@ -8083,7 +8085,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "blake2", "proc-macro-crate", @@ -8095,7 +8097,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8108,7 +8110,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "integer-sqrt", "num-traits", @@ -8123,7 +8125,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8136,7 +8138,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "parity-scale-codec", @@ -8148,7 +8150,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -8160,7 +8162,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "log", @@ -8178,7 +8180,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -8197,7 +8199,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "merlin", @@ -8220,7 +8222,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8234,7 +8236,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8247,7 +8249,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "base58", @@ -8293,7 +8295,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "blake2", "byteorder", @@ -8307,7 +8309,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -8318,7 +8320,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8327,7 +8329,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -8337,7 +8339,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "environmental", "parity-scale-codec", @@ -8348,7 +8350,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "finality-grandpa", "log", @@ -8366,7 +8368,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8380,7 +8382,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bytes", "futures", @@ -8406,7 +8408,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "lazy_static", "sp-core", @@ -8417,7 +8419,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -8434,7 +8436,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "thiserror", "zstd", @@ -8443,7 +8445,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8457,7 +8459,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sp-api", "sp-core", @@ -8467,7 +8469,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "backtrace", "lazy_static", @@ -8477,7 +8479,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "rustc-hash", "serde", @@ -8487,7 +8489,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "either", "hash256-std-hasher", @@ -8510,7 +8512,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8528,7 +8530,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "proc-macro-crate", @@ -8540,7 +8542,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -8554,7 +8556,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8568,7 +8570,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8579,7 +8581,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "log", @@ -8601,12 +8603,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8619,7 +8621,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "sp-core", @@ -8632,7 +8634,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures-timer", @@ -8648,7 +8650,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-std", @@ -8660,7 +8662,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sp-api", "sp-runtime", @@ -8669,7 +8671,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "log", @@ -8685,7 +8687,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "hash-db", @@ -8708,7 +8710,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8725,7 +8727,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8736,7 +8738,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "log", @@ -8749,7 +8751,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8896,7 +8898,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "platforms 2.0.0", ] @@ -8904,7 +8906,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -8925,7 +8927,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures-util", "hyper", @@ -8938,7 +8940,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "jsonrpsee", @@ -8951,7 +8953,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "log", @@ -8972,7 +8974,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "substrate-test-utils-derive", @@ -8982,7 +8984,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8993,7 +8995,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -9439,7 +9441,7 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "clap", "frame-try-runtime", diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 5e6b00d9d..a08f27eef 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -18,7 +18,7 @@ use codec::{Decode, Encode, HasCompact}; use ddc_primitives::{BucketId, ClusterId}; use ddc_traits::{ cluster::{ClusterCreator, ClusterVisitor}, - customer::{CustomerCharger, CustomerChargerError}, + customer::CustomerCharger, }; use frame_support::{ parameter_types, @@ -139,8 +139,6 @@ impl< .ok_or(Error::::ArithmeticOverflow)?; if temp <= value { unlocking_balance = temp; - self.active = - self.active.checked_sub(&last.value).ok_or(Error::::ArithmeticUnderflow)?; self.unlocking.pop(); } else { let diff = @@ -148,8 +146,6 @@ impl< unlocking_balance = unlocking_balance.checked_add(&diff).ok_or(Error::::ArithmeticOverflow)?; - self.active = - self.active.checked_sub(&diff).ok_or(Error::::ArithmeticUnderflow)?; last.value = last.value.checked_sub(&diff).ok_or(Error::::ArithmeticUnderflow)?; } @@ -442,7 +438,7 @@ pub mod pallet { .map_err(|_| Error::::NoMoreChunks)?; }; - Self::update_ledger(&owner, &ledger); + >::insert(&owner, &ledger); Self::deposit_event(Event::::InitialDepositUnlock(ledger.owner, value)); } @@ -481,7 +477,8 @@ pub mod pallet { log::debug!("Updating ledger"); // This was the consequence of a partial deposit unlock. just update the ledger and // move on. - Self::update_ledger(&owner, &ledger); + >::insert(&owner, &ledger); + // This is only an update, so we use less overall weight. Some(::WeightInfo::withdraw_unlocked_deposit_update()) }; @@ -523,11 +520,9 @@ pub mod pallet { owner: &T::AccountId, ledger: &AccountsLedger, T>, ) -> DispatchResult { - let account_id = Self::account_id(); - ::Currency::transfer( owner, - &account_id, + &Self::account_id(), ledger.total, ExistenceRequirement::KeepAlive, )?; @@ -536,14 +531,6 @@ pub mod pallet { Ok(()) } - /// Update the ledger for a owner. - fn update_ledger( - owner: &T::AccountId, - ledger: &AccountsLedger, T>, - ) { - >::insert(owner, ledger); - } - /// Remove all associated data of a owner account from the accounts system. /// /// Assumes storage is upgraded before calling. @@ -564,47 +551,49 @@ pub mod pallet { content_owner: T::AccountId, billing_vault: T::AccountId, amount: u128, - ) -> Result { + ) -> Result { let actually_charged: BalanceOf; - let mut ledger = Self::ledger(&content_owner).ok_or(CustomerChargerError::NotOwner)?; - let mut amount_to_deduct = amount.saturated_into::>(); + let mut ledger = Self::ledger(&content_owner).ok_or(Error::::NotOwner)?; + let amount_to_deduct = amount.saturated_into::>(); - ensure!(ledger.total >= ledger.active, CustomerChargerError::ArithmeticUnderflow); if ledger.active >= amount_to_deduct { actually_charged = amount_to_deduct; ledger.active = ledger .active .checked_sub(&amount_to_deduct) - .ok_or(CustomerChargerError::ArithmeticUnderflow)?; + .ok_or(Error::::ArithmeticUnderflow)?; ledger.total = ledger .total .checked_sub(&amount_to_deduct) - .ok_or(CustomerChargerError::ArithmeticUnderflow)?; - Self::update_ledger(&content_owner, &ledger); + .ok_or(Error::::ArithmeticUnderflow)?; + + >::insert(&content_owner, &ledger); } else { let diff = amount_to_deduct .checked_sub(&ledger.active) - .ok_or(CustomerChargerError::ArithmeticUnderflow)?; - actually_charged = diff; + .ok_or(Error::::ArithmeticUnderflow)?; + + actually_charged = ledger.active; ledger.total = ledger .total .checked_sub(&ledger.active) - .ok_or(CustomerChargerError::ArithmeticUnderflow)?; - amount_to_deduct = ledger.active; + .ok_or(Error::::ArithmeticUnderflow)?; ledger.active = BalanceOf::::zero(); - let (ledger, _charged) = ledger - .charge_unlocking(diff) - .map_err(|_| CustomerChargerError::UnlockFailed)?; - Self::update_ledger(&content_owner, &ledger); - }; + + let (ledger, charged) = ledger.charge_unlocking(diff)?; + + actually_charged.checked_add(&charged).ok_or(Error::::ArithmeticUnderflow)?; + + >::insert(&content_owner, &ledger); + } ::Currency::transfer( &Self::account_id(), &billing_vault, - amount_to_deduct, - ExistenceRequirement::KeepAlive, - ) - .map_err(|_| CustomerChargerError::TransferFailed)?; + actually_charged, + ExistenceRequirement::AllowDeath, + )?; + Self::deposit_event(Event::::Charged(content_owner, amount_to_deduct)); Ok(actually_charged.saturated_into::()) diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index 035b67550..3b62bc757 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -238,8 +238,10 @@ impl ExtBuilder { sp_tracing::try_init_simple(); let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); - let _ = pallet_balances::GenesisConfig:: { balances: vec![(1, 100), (2, 100)] } - .assimilate_storage(&mut storage); + let _ = pallet_balances::GenesisConfig:: { + balances: vec![(1, 100), (2, 100), (3, 1000)], + } + .assimilate_storage(&mut storage); TestExternalities::new(storage) } diff --git a/pallets/ddc-customers/src/tests.rs b/pallets/ddc-customers/src/tests.rs index f09c40ae6..081335ff2 100644 --- a/pallets/ddc-customers/src/tests.rs +++ b/pallets/ddc-customers/src/tests.rs @@ -80,26 +80,27 @@ fn deposit_and_deposit_extra_works() { BalancesError::::KeepAlive ); + let amount1 = 10_u128; // Deposited - assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(account_1), 10_u128)); + assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(account_1), amount1)); // Check storage assert_eq!( DdcCustomers::ledger(&account_1), Some(AccountsLedger { - owner: 1, - total: 10_u128, - active: 10_u128, + owner: account_1, + total: amount1, + active: amount1, unlocking: Default::default(), }) ); // Checking that event was emitted - System::assert_last_event(Event::Deposited(account_1, 10).into()); + System::assert_last_event(Event::Deposited(account_1, amount1).into()); // Deposit should fail when called the second time assert_noop!( - DdcCustomers::deposit(RuntimeOrigin::signed(account_1), 10_u128), + DdcCustomers::deposit(RuntimeOrigin::signed(account_1), amount1), Error::::AlreadyPaired ); @@ -110,21 +111,110 @@ fn deposit_and_deposit_extra_works() { ); // Deposited extra - assert_ok!(DdcCustomers::deposit_extra(RuntimeOrigin::signed(account_1), 20_u128)); + let amount2 = 20_u128; + assert_ok!(DdcCustomers::deposit_extra(RuntimeOrigin::signed(account_1), amount2)); // Check storage assert_eq!( DdcCustomers::ledger(&account_1), Some(AccountsLedger { - owner: 1, - total: 30_u128, - active: 30_u128, + owner: account_1, + total: amount1 + amount2, + active: amount1 + amount2, unlocking: Default::default(), }) ); // Checking that event was emitted - System::assert_last_event(Event::Deposited(account_1, 20).into()); + System::assert_last_event(Event::Deposited(account_1, amount2).into()); + }) +} + +#[test] +fn charge_content_owner_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let account_3 = 3; + let vault = 4; + let deposit = 100_u128; + + let balance_before_deposit = Balances::free_balance(account_3); + // Deposited + assert_ok!(DdcCustomers::deposit(RuntimeOrigin::signed(account_3), deposit)); + let balance_after_deposit = Balances::free_balance(account_3); + assert_eq!(balance_before_deposit - deposit, balance_after_deposit); + + let pallet_balance = Balances::free_balance(DdcCustomers::account_id()); + assert_eq!(deposit, pallet_balance); + + // Check storage + assert_eq!( + DdcCustomers::ledger(&account_3), + Some(AccountsLedger { + owner: account_3, + total: deposit, + active: deposit, + unlocking: Default::default(), + }) + ); + + // Checking that event was emitted + System::assert_last_event(Event::Deposited(account_3, deposit).into()); + + // successful transfer + let charge1 = 10; + let charged = DdcCustomers::charge_content_owner(account_3, vault, charge1).unwrap(); + assert_eq!(charge1, charged); + + let vault_balance = Balances::free_balance(vault); + assert_eq!(charged, vault_balance); + + let account_balance = Balances::free_balance(account_3); + assert_eq!(balance_after_deposit, account_balance); + + let pallet_balance_after_charge = Balances::free_balance(DdcCustomers::account_id()); + assert_eq!(pallet_balance - charged, pallet_balance_after_charge); + + // Check storage + assert_eq!( + DdcCustomers::ledger(&account_3), + Some(AccountsLedger { + owner: account_3, + total: deposit - charge1, + active: deposit - charge1, + unlocking: Default::default(), + }) + ); + + // failed transfer + let charge2 = 100u128; + let charge_result = DdcCustomers::charge_content_owner(account_3, vault, charge2).unwrap(); + assert_eq!( + DdcCustomers::ledger(&account_3), + Some(AccountsLedger { + owner: account_3, + total: 0, + active: 0, + unlocking: Default::default(), + }) + ); + + assert_eq!(0, Balances::free_balance(DdcCustomers::account_id())); + assert_eq!(charge_result, deposit - charge1); + + assert_ok!(DdcCustomers::deposit_extra(RuntimeOrigin::signed(account_3), deposit)); + assert_eq!( + DdcCustomers::ledger(&account_3), + Some(AccountsLedger { + owner: account_3, + total: deposit, + active: deposit, + unlocking: Default::default(), + }) + ); + + assert_eq!(deposit, Balances::free_balance(DdcCustomers::account_id())); }) } diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index 4447a99ea..ccdf466e3 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -60,10 +60,10 @@ pub struct NodeUsage { /// Stores reward in tokens(units) of node provider as per NodeUsage #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] pub struct NodeReward { - pub transfer: u128, // tokens for transferred_bytes - pub storage: u128, // tokens for stored_bytes - pub puts: u128, // tokens for number_of_puts - pub gets: u128, // tokens for number_of_gets + pub transfer: u128, // reward in tokens for NodeUsage::transferred_bytes + pub storage: u128, // reward in tokens for NodeUsage::stored_bytes + pub puts: u128, // reward in tokens for NodeUsage::number_of_puts + pub gets: u128, // reward in tokens for NodeUsage::number_of_gets } #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] @@ -77,10 +77,10 @@ pub struct BillingReportDebt { /// Stores charge in tokens(units) of customer as per CustomerUsage #[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo, Default, Clone)] pub struct CustomerCharge { - pub transfer: u128, // tokens for transferred_bytes - pub storage: u128, // tokens for stored_bytes - pub puts: u128, // tokens for number_of_puts - pub gets: u128, // tokens for number_of_gets + pub transfer: u128, // charge in tokens for CustomerUsage::transferred_bytes + pub storage: u128, // charge in tokens for CustomerUsage::stored_bytes + pub puts: u128, // charge in tokens for CustomerUsage::number_of_puts + pub gets: u128, // charge in tokens for CustomerUsage::number_of_gets } /// The balance type of this pallet. @@ -130,12 +130,21 @@ pub mod pallet { Charged { cluster_id: ClusterId, era: DdcEra, + batch_index: BatchIndex, customer_id: T::AccountId, amount: u128, }, ChargeFailed { cluster_id: ClusterId, era: DdcEra, + batch_index: BatchIndex, + customer_id: T::AccountId, + amount: u128, + }, + Indebted { + cluster_id: ClusterId, + era: DdcEra, + batch_index: BatchIndex, customer_id: T::AccountId, amount: u128, }, @@ -250,17 +259,17 @@ pub mod pallet { } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq, Default)] + // don't remove or change numbers, if needed add a new state to the end with new number + // DAC uses the state value for integration! pub enum State { #[default] - NotInitialized, - Initialized, - ChargingCustomers, - CustomersChargedWithFees, - CustomersCharged, - FeesDeducted, - RewardingProviders, - ProvidersRewarded, - Finalized, + NotInitialized = 1, + Initialized = 2, + ChargingCustomers = 3, + CustomersChargedWithFees = 4, + RewardingProviders = 5, + ProvidersRewarded = 6, + Finalized = 7, } #[pallet::call] @@ -359,7 +368,7 @@ pub mod pallet { let mut updated_billing_report = billing_report; for payer in payers { - let customer_charge = get_customer_charge::(cluster_id, &payer.1)?; + let mut customer_charge = get_customer_charge::(cluster_id, &payer.1)?; let total_customer_charge = (|| -> Option { customer_charge .transfer @@ -369,30 +378,6 @@ pub mod pallet { })() .ok_or(Error::::ArithmeticOverflow)?; - let temp_total_customer_storage_charge = updated_billing_report - .total_customer_charge - .storage - .checked_add(customer_charge.storage) - .ok_or(Error::::ArithmeticOverflow)?; - - let temp_total_customer_transfer_charge = updated_billing_report - .total_customer_charge - .transfer - .checked_add(customer_charge.transfer) - .ok_or(Error::::ArithmeticOverflow)?; - - let temp_total_customer_puts_charge = updated_billing_report - .total_customer_charge - .puts - .checked_add(customer_charge.puts) - .ok_or(Error::::ArithmeticOverflow)?; - - let temp_total_customer_gets_charge = updated_billing_report - .total_customer_charge - .gets - .checked_add(customer_charge.gets) - .ok_or(Error::::ArithmeticOverflow)?; - let customer_id = payer.0.clone(); let amount_actually_charged = match T::CustomerCharger::charge_content_owner( customer_id.clone(), @@ -409,38 +394,75 @@ pub mod pallet { DebtorCustomers::::try_get(cluster_id, customer_id.clone()) .unwrap_or_else(|_| Zero::zero()); - customer_debt = (|| -> Option { - customer_debt - .checked_add(total_customer_charge)? - .checked_sub(amount_actually_charged) - })() - .ok_or(Error::::ArithmeticOverflow)?; + let debt = total_customer_charge + .checked_sub(amount_actually_charged) + .ok_or(Error::::ArithmeticOverflow)?; + + customer_debt = + customer_debt.checked_add(debt).ok_or(Error::::ArithmeticOverflow)?; DebtorCustomers::::insert(cluster_id, customer_id.clone(), customer_debt); + Self::deposit_event(Event::::Indebted { + cluster_id, + era, + batch_index, + customer_id: customer_id.clone(), + amount: debt, + }); + Self::deposit_event(Event::::ChargeFailed { cluster_id, era, + batch_index, customer_id, amount: total_customer_charge, }); - } else { - updated_billing_report.total_customer_charge.storage = - temp_total_customer_storage_charge; - updated_billing_report.total_customer_charge.transfer = - temp_total_customer_transfer_charge; - updated_billing_report.total_customer_charge.puts = - temp_total_customer_puts_charge; - updated_billing_report.total_customer_charge.gets = - temp_total_customer_gets_charge; + if amount_actually_charged > 0 { + // something was charged and should be added + // calculate ratio + let ratio = + Perbill::from_rational(amount_actually_charged, total_customer_charge); + + customer_charge.storage = ratio * customer_charge.storage; + customer_charge.transfer = ratio * customer_charge.transfer; + customer_charge.gets = ratio * customer_charge.gets; + customer_charge.puts = ratio * customer_charge.puts; + } + } else { Self::deposit_event(Event::::Charged { cluster_id, era, + batch_index, customer_id, amount: total_customer_charge, }); } + + updated_billing_report.total_customer_charge.storage = updated_billing_report + .total_customer_charge + .storage + .checked_add(customer_charge.storage) + .ok_or(Error::::ArithmeticOverflow)?; + + updated_billing_report.total_customer_charge.transfer = updated_billing_report + .total_customer_charge + .transfer + .checked_add(customer_charge.transfer) + .ok_or(Error::::ArithmeticOverflow)?; + + updated_billing_report.total_customer_charge.puts = updated_billing_report + .total_customer_charge + .puts + .checked_add(customer_charge.puts) + .ok_or(Error::::ArithmeticOverflow)?; + + updated_billing_report.total_customer_charge.gets = updated_billing_report + .total_customer_charge + .gets + .checked_add(customer_charge.gets) + .ok_or(Error::::ArithmeticOverflow)?; } updated_billing_report @@ -491,50 +513,59 @@ pub mod pallet { let validators_fee = fees.validators_share * total_customer_charge; let cluster_reserve_fee = fees.cluster_reserve_share * total_customer_charge; - charge_treasury_fees::( - treasury_fee, - &billing_report.vault, - &T::TreasuryVisitor::get_account_id(), - )?; - Self::deposit_event(Event::::TreasuryFeesCollected { - cluster_id, - era, - amount: treasury_fee, - }); - - charge_cluster_reserve_fees::( - cluster_reserve_fee, - &billing_report.vault, - &T::ClusterVisitor::get_reserve_account_id(&cluster_id) - .map_err(|_| Error::::NotExpectedClusterState)?, - )?; - Self::deposit_event(Event::::ClusterReserveFeesCollected { - cluster_id, - era, - amount: cluster_reserve_fee, - }); - - charge_validator_fees::(validators_fee, &billing_report.vault)?; - Self::deposit_event(Event::::ValidatorFeesCollected { - cluster_id, - era, - amount: validators_fee, - }); + if treasury_fee > 0 { + charge_treasury_fees::( + treasury_fee, + &billing_report.vault, + &T::TreasuryVisitor::get_account_id(), + )?; + + Self::deposit_event(Event::::TreasuryFeesCollected { + cluster_id, + era, + amount: treasury_fee, + }); + } + + if cluster_reserve_fee > 0 { + charge_cluster_reserve_fees::( + cluster_reserve_fee, + &billing_report.vault, + &T::ClusterVisitor::get_reserve_account_id(&cluster_id) + .map_err(|_| Error::::NotExpectedClusterState)?, + )?; + Self::deposit_event(Event::::ClusterReserveFeesCollected { + cluster_id, + era, + amount: cluster_reserve_fee, + }); + } + + if validators_fee > 0 { + charge_validator_fees::(validators_fee, &billing_report.vault)?; + Self::deposit_event(Event::::ValidatorFeesCollected { + cluster_id, + era, + amount: validators_fee, + }); + } // 1 - (X + Y + Z) > 0, 0 < X + Y + Z < 1 let total_left_from_one = (fees.treasury_share + fees.validators_share + fees.cluster_reserve_share) .left_from_one(); - // X * Z < X, 0 < Z < 1 - billing_report.total_customer_charge.transfer = - total_left_from_one * billing_report.total_customer_charge.transfer; - billing_report.total_customer_charge.storage = - total_left_from_one * billing_report.total_customer_charge.storage; - billing_report.total_customer_charge.puts = - total_left_from_one * billing_report.total_customer_charge.puts; - billing_report.total_customer_charge.gets = - total_left_from_one * billing_report.total_customer_charge.gets; + if !total_left_from_one.is_zero() { + // X * Z < X, 0 < Z < 1 + billing_report.total_customer_charge.transfer = + total_left_from_one * billing_report.total_customer_charge.transfer; + billing_report.total_customer_charge.storage = + total_left_from_one * billing_report.total_customer_charge.storage; + billing_report.total_customer_charge.puts = + total_left_from_one * billing_report.total_customer_charge.puts; + billing_report.total_customer_charge.gets = + total_left_from_one * billing_report.total_customer_charge.gets; + } billing_report.state = State::CustomersChargedWithFees; ActiveBillingReports::::insert(cluster_id, era, billing_report); @@ -624,7 +655,7 @@ pub mod pallet { &updated_billing_report.vault, &node_provider_id, reward, - ExistenceRequirement::KeepAlive, + ExistenceRequirement::AllowDeath, )?; updated_billing_report @@ -689,7 +720,7 @@ pub mod pallet { let caller = ensure_signed(origin)?; ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); - let billing_report = ActiveBillingReports::::try_get(cluster_id, era) + let mut billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; ensure!(billing_report.state == State::ProvidersRewarded, Error::::NotExpectedState); @@ -708,7 +739,11 @@ pub mod pallet { Error::::NotDistributedBalance ); - ActiveBillingReports::::remove(cluster_id, era); + billing_report.charging_processed_batches.clear(); + billing_report.rewarding_processed_batches.clear(); + billing_report.state = State::Finalized; + + ActiveBillingReports::::insert(cluster_id, era, billing_report); Self::deposit_event(Event::::BillingReportFinalized { cluster_id, era }); Ok(()) @@ -725,7 +760,7 @@ pub mod pallet { vault, treasury_vault, amount_to_deduct, - ExistenceRequirement::KeepAlive, + ExistenceRequirement::AllowDeath, ) } @@ -739,7 +774,7 @@ pub mod pallet { vault, reserve_vault, amount_to_deduct, - ExistenceRequirement::KeepAlive, + ExistenceRequirement::AllowDeath, ) } @@ -757,7 +792,7 @@ pub mod pallet { vault, &validator_account_id, amount_to_deduct, - ExistenceRequirement::KeepAlive, + ExistenceRequirement::AllowDeath, )?; } diff --git a/pallets/ddc-payouts/src/mock.rs b/pallets/ddc-payouts/src/mock.rs index 956b2e9d1..dc519a4a3 100644 --- a/pallets/ddc-payouts/src/mock.rs +++ b/pallets/ddc-payouts/src/mock.rs @@ -5,7 +5,7 @@ use ddc_primitives::{ClusterBondingParams, ClusterFeesParams, ClusterPricingParams, NodeType}; use ddc_traits::{ cluster::{ClusterVisitor, ClusterVisitorError}, - customer::{CustomerCharger, CustomerChargerError}, + customer::CustomerCharger, pallet::PalletVisitor, }; use frame_election_provider_support::SortedListProvider; @@ -21,6 +21,7 @@ use sp_io::TestExternalities; use sp_runtime::{ testing::Header, traits::{BlakeTwo256, IdentityLookup}, + DispatchError, }; use sp_std::prelude::*; @@ -112,12 +113,12 @@ impl CustomerCharger for TestCustomerCharger { content_owner: T::AccountId, billing_vault: T::AccountId, amount: u128, - ) -> Result { - ensure!(amount > 1_000_000, CustomerChargerError::TransferFailed); // any error will do + ) -> Result { + ensure!(amount > 1_000_000, DispatchError::BadOrigin); // any error will do let mut amount_to_charge = amount; if amount_to_charge < 50_000_000 { - amount_to_charge = PARTIAL_CHARGE; + amount_to_charge = PARTIAL_CHARGE; // for user 3 } let charge = amount_to_charge.saturated_into::>(); @@ -127,8 +128,7 @@ impl CustomerCharger for TestCustomerCharger { &billing_vault, charge, ExistenceRequirement::KeepAlive, - ) - .map_err(|_| CustomerChargerError::TransferFailed)?; + )?; Ok(amount_to_charge) } } @@ -139,6 +139,9 @@ pub const VALIDATOR1_ACCOUNT_ID: AccountId = 111; pub const VALIDATOR2_ACCOUNT_ID: AccountId = 222; pub const VALIDATOR3_ACCOUNT_ID: AccountId = 333; pub const PARTIAL_CHARGE: u128 = 100; +pub const USER3_BALANCE: u128 = 1000; + +pub const FREE_CLUSTER_ID: ClusterId = ClusterId::zero(); pub const PRICING_PARAMS: ClusterPricingParams = ClusterPricingParams { unit_per_mb_streamed: 2_000_000, @@ -153,6 +156,12 @@ pub const PRICING_FEES: ClusterFeesParams = ClusterFeesParams { cluster_reserve_share: Perbill::from_percent(2), }; +pub const PRICING_FEES_ZERO: ClusterFeesParams = ClusterFeesParams { + treasury_share: Perbill::from_percent(0), + validators_share: Perbill::from_percent(0), + cluster_reserve_share: Perbill::from_percent(0), +}; + pub struct TestTreasuryVisitor; impl PalletVisitor for TestTreasuryVisitor { fn get_account_id() -> T::AccountId { @@ -230,6 +239,14 @@ impl SortedListProvider for TestValidator } } +pub fn get_fees(cluster_id: &ClusterId) -> Result { + if *cluster_id == FREE_CLUSTER_ID { + Ok(PRICING_FEES_ZERO) + } else { + Ok(PRICING_FEES) + } +} + pub struct TestClusterVisitor; impl ClusterVisitor for TestClusterVisitor { fn ensure_cluster(_cluster_id: &ClusterId) -> Result<(), ClusterVisitorError> { @@ -260,8 +277,8 @@ impl ClusterVisitor for TestClusterVisitor { Ok(PRICING_PARAMS) } - fn get_fees_params(_cluster_id: &ClusterId) -> Result { - Ok(PRICING_FEES) + fn get_fees_params(cluster_id: &ClusterId) -> Result { + get_fees(cluster_id) } fn get_reserve_account_id( @@ -274,7 +291,7 @@ impl ClusterVisitor for TestClusterVisitor { fn get_bonding_params( _cluster_id: &ClusterId, ) -> Result, ClusterVisitorError> { - Err(ClusterVisitorError::ClusterDoesNotExist) + unimplemented!() } } @@ -290,8 +307,8 @@ impl ExtBuilder { let _ = pallet_balances::GenesisConfig:: { balances: vec![ (1, 1000000000000000000000000), - (2, 10), // < PARTIAL_CHARGE - (3, 1000), // > PARTIAL_CHARGE + (2, 10), // < PARTIAL_CHARGE + (3, USER3_BALANCE), // > PARTIAL_CHARGE (4, 1000000000000000000000000), ], } diff --git a/pallets/ddc-payouts/src/tests.rs b/pallets/ddc-payouts/src/tests.rs index 3cd324dba..2197f6654 100644 --- a/pallets/ddc-payouts/src/tests.rs +++ b/pallets/ddc-payouts/src/tests.rs @@ -258,11 +258,20 @@ fn send_charging_customers_batch_fails_uninitialised() { }) } +fn calculate_charge_parts(usage: CustomerUsage) -> CustomerCharge { + CustomerCharge { + transfer: PRICING_PARAMS.unit_per_mb_streamed * (usage.transferred_bytes as u128) / + byte_unit::MEBIBYTE, + storage: (PRICING_PARAMS.unit_per_mb_stored * usage.stored_bytes as u128) / + byte_unit::MEBIBYTE, + puts: PRICING_PARAMS.unit_per_put_request * usage.number_of_puts, + gets: PRICING_PARAMS.unit_per_get_request * usage.number_of_gets, + } +} + fn calculate_charge(usage: CustomerUsage) -> u128 { - PRICING_PARAMS.unit_per_mb_streamed * (usage.transferred_bytes as u128) / byte_unit::MEBIBYTE + - (PRICING_PARAMS.unit_per_mb_stored * usage.stored_bytes as u128) / byte_unit::MEBIBYTE + - PRICING_PARAMS.unit_per_put_request * usage.number_of_puts + - PRICING_PARAMS.unit_per_get_request * usage.number_of_gets + let charge = calculate_charge_parts(usage); + charge.transfer + charge.storage + charge.puts + charge.gets } #[test] @@ -278,7 +287,7 @@ fn send_charging_customers_batch_works() { let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 3; - let batch_index = 0; + let mut batch_index = 0; let usage1 = CustomerUsage { // should pass without debt transferred_bytes: 23452345, @@ -294,7 +303,7 @@ fn send_charging_customers_batch_works() { number_of_gets: 4, }; let usage3 = CustomerUsage { - // should pass but with debt + // should pass but with debt (partial charge) transferred_bytes: 1, stored_bytes: 2, number_of_puts: 3, @@ -335,29 +344,64 @@ fn send_charging_customers_batch_works() { payers1, )); - let usage4_charge = calculate_charge(usage4); + let usage4_charge = calculate_charge(usage4.clone()); let mut balance = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); assert_eq!(balance, usage4_charge); let user2_debt = DdcPayouts::debtor_customers(cluster_id, user2_debtor).unwrap(); - let mut debt = calculate_charge(usage2); + let mut debt = calculate_charge(usage2.clone()); assert_eq!(user2_debt, debt); + let mut report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let charge2 = calculate_charge_parts(usage2); + let charge4 = calculate_charge_parts(usage4); + assert_eq!(charge2.puts + charge4.puts, report.total_customer_charge.puts); + assert_eq!(charge2.gets + charge4.gets, report.total_customer_charge.gets); + assert_eq!(charge2.storage + charge4.storage, report.total_customer_charge.storage); + assert_eq!(charge2.transfer + charge4.transfer, report.total_customer_charge.transfer); + + System::assert_has_event( + Event::ChargeFailed { + cluster_id, + era, + customer_id: user2_debtor, + batch_index, + amount: debt, + } + .into(), + ); + System::assert_has_event( - Event::ChargeFailed { cluster_id, era, customer_id: user2_debtor, amount: debt }.into(), + Event::Indebted { + cluster_id, + era, + customer_id: user2_debtor, + batch_index, + amount: debt, + } + .into(), ); System::assert_last_event( - Event::Charged { cluster_id, era, customer_id: user4, amount: usage4_charge }.into(), + Event::Charged { + cluster_id, + era, + customer_id: user4, + batch_index, + amount: usage4_charge, + } + .into(), ); - assert_eq!(System::events().len(), 5 + 3); // 3 for Currency::transfer + assert_eq!(System::events().len(), 5 + 3 + 1); // 3 for Currency::transfer // batch 2 + let mut before_total_customer_charge = report.total_customer_charge.clone(); + batch_index += 1; assert_ok!(DdcPayouts::send_charging_customers_batch( RuntimeOrigin::signed(dac_account), cluster_id, era, - batch_index + 1, + batch_index, payers2, )); @@ -365,40 +409,93 @@ fn send_charging_customers_batch_works() { Event::Charged { cluster_id, era, + batch_index, customer_id: user1, - amount: calculate_charge(usage1), + amount: calculate_charge(usage1.clone()), } .into(), ); - let report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let charge1 = calculate_charge_parts(usage1); + assert_eq!( + charge1.puts + before_total_customer_charge.puts, + report.total_customer_charge.puts + ); + assert_eq!( + charge1.gets + before_total_customer_charge.gets, + report.total_customer_charge.gets + ); + assert_eq!( + charge1.storage + before_total_customer_charge.storage, + report.total_customer_charge.storage + ); + assert_eq!( + charge1.transfer + before_total_customer_charge.transfer, + report.total_customer_charge.transfer + ); + assert_eq!(report.state, State::ChargingCustomers); let user1_debt = DdcPayouts::debtor_customers(cluster_id, user1); assert_eq!(user1_debt, None); let balance_before = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); + // batch 3 + batch_index += 2; + before_total_customer_charge = report.total_customer_charge.clone(); assert_ok!(DdcPayouts::send_charging_customers_batch( RuntimeOrigin::signed(dac_account), cluster_id, era, - batch_index + 2, + batch_index, payers3, )); - let user3_charge = calculate_charge(usage3); + let user3_charge = calculate_charge(usage3.clone()); + let charge3 = calculate_charge_parts(usage3); + let ratio = Perbill::from_rational(PARTIAL_CHARGE, user3_charge); + report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_eq!( + ratio * charge3.puts + before_total_customer_charge.puts, + report.total_customer_charge.puts + ); + assert_eq!( + ratio * charge3.gets + before_total_customer_charge.gets, + report.total_customer_charge.gets + ); + assert_eq!( + ratio * charge3.storage + before_total_customer_charge.storage, + report.total_customer_charge.storage + ); + assert_eq!( + ratio * charge3.transfer + before_total_customer_charge.transfer, + report.total_customer_charge.transfer + ); + balance = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); assert_eq!(balance, balance_before + PARTIAL_CHARGE); let user3_debt = DdcPayouts::debtor_customers(cluster_id, user3_debtor).unwrap(); - debt = user3_charge - PARTIAL_CHARGE; assert_eq!(user3_debt, debt); + System::assert_has_event( + Event::Indebted { + cluster_id, + era, + customer_id: user3_debtor, + batch_index, + amount: user3_debt, + } + .into(), + ); + System::assert_last_event( Event::ChargeFailed { cluster_id, era, + batch_index, customer_id: user3_debtor, amount: user3_charge, } @@ -523,7 +620,8 @@ fn end_charging_customers_works() { let report_before = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); let charge = calculate_charge(usage1); System::assert_last_event( - Event::Charged { cluster_id, era, customer_id: user1, amount: charge }.into(), + Event::Charged { cluster_id, era, batch_index, customer_id: user1, amount: charge } + .into(), ); let mut balance = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); @@ -599,6 +697,117 @@ fn end_charging_customers_works() { }) } +#[test] +fn end_charging_customers_works_zero_fees() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let dac_account = 123u64; + let user1 = 1u64; + let cluster_id = ClusterId::zero(); + let era = 100; + let max_batch_index = 0; + let batch_index = 0; + let usage1 = CustomerUsage { + transferred_bytes: 23452345, + stored_bytes: 3345234523, + number_of_puts: 4456456345234523, + number_of_gets: 523423, + }; + let payers = vec![(user1, usage1.clone())]; + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers, + )); + + let report_before = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let charge = calculate_charge(usage1); + System::assert_last_event( + Event::Charged { cluster_id, era, customer_id: user1, batch_index, amount: charge } + .into(), + ); + + let mut balance = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); + assert_eq!(balance, charge); + assert_eq!(System::events().len(), 4 + 3); // 3 for Currency::transfer + + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + System::assert_has_event(Event::ChargingFinished { cluster_id, era }.into()); + assert_eq!(System::events().len(), 7 + 1); + + let report_after = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_eq!(report_after.state, State::CustomersChargedWithFees); + + let fees = get_fees(&cluster_id).unwrap(); + + let total_left_from_one = + (fees.treasury_share + fees.validators_share + fees.cluster_reserve_share) + .left_from_one(); + + assert_eq!(total_left_from_one, Perbill::one()); + + assert_eq!(fees.treasury_share, Perbill::zero()); + assert_eq!(fees.validators_share, Perbill::zero()); + assert_eq!(fees.cluster_reserve_share, Perbill::zero()); + + balance = Balances::free_balance(TREASURY_ACCOUNT_ID); + assert_eq!(balance, 0); + + balance = Balances::free_balance(RESERVE_ACCOUNT_ID); + assert_eq!(balance, 0); + + balance = Balances::free_balance(VALIDATOR1_ACCOUNT_ID); + assert_eq!(balance, 0); + + balance = Balances::free_balance(VALIDATOR2_ACCOUNT_ID); + assert_eq!(balance, 0); + + balance = Balances::free_balance(VALIDATOR3_ACCOUNT_ID); + assert_eq!(balance, 0); + + assert_eq!( + report_after.total_customer_charge.transfer, + total_left_from_one * report_before.total_customer_charge.transfer + ); + assert_eq!( + report_after.total_customer_charge.storage, + total_left_from_one * report_before.total_customer_charge.storage + ); + assert_eq!( + report_after.total_customer_charge.puts, + total_left_from_one * report_before.total_customer_charge.puts + ); + assert_eq!( + report_after.total_customer_charge.gets, + total_left_from_one * report_before.total_customer_charge.gets + ); + }) +} + #[test] fn begin_rewarding_providers_fails_uninitialised() { ExtBuilder.build_and_execute(|| { @@ -1585,7 +1794,9 @@ fn end_billing_report_works() { System::assert_last_event(Event::BillingReportFinalized { cluster_id, era }.into()); - let report_end = DdcPayouts::active_billing_reports(cluster_id, era); - assert_eq!(report_end, None); + let report_end = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert!(report_end.rewarding_processed_batches.is_empty()); + assert!(report_end.charging_processed_batches.is_empty()); + assert_eq!(report_end.state, State::Finalized); }) } diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index a665c1a29..56df30ee5 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -6,7 +6,6 @@ use scale_info::{prelude::vec::Vec, TypeInfo}; use serde::{Deserialize, Serialize}; use sp_core::hash::H160; use sp_runtime::{AccountId32, Perbill, RuntimeDebug}; - pub type ClusterId = H160; pub type DdcEra = u32; pub type BucketId = u64; diff --git a/traits/Cargo.toml b/traits/Cargo.toml index b2c023f10..e37e4d659 100644 --- a/traits/Cargo.toml +++ b/traits/Cargo.toml @@ -4,8 +4,10 @@ version = "0.1.0" edition = "2021" [dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } ddc-primitives = { version = "0.1.0", default-features = false, path = "../primitives" } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/traits/src/cluster.rs b/traits/src/cluster.rs index 6752205b0..d980c1ae4 100644 --- a/traits/src/cluster.rs +++ b/traits/src/cluster.rs @@ -1,9 +1,12 @@ +use codec::{Decode, Encode}; use ddc_primitives::{ ClusterBondingParams, ClusterFeesParams, ClusterGovParams, ClusterId, ClusterParams, ClusterPricingParams, NodePubKey, NodeType, }; use frame_support::dispatch::DispatchResult; use frame_system::Config; +use scale_info::TypeInfo; +use sp_runtime::RuntimeDebug; pub trait ClusterVisitor { fn ensure_cluster(cluster_id: &ClusterId) -> Result<(), ClusterVisitorError>; @@ -46,6 +49,7 @@ pub trait ClusterCreator { ) -> DispatchResult; } +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum ClusterVisitorError { ClusterDoesNotExist, ClusterGovParamsNotSet, diff --git a/traits/src/customer.rs b/traits/src/customer.rs index ad944e39b..80af26050 100644 --- a/traits/src/customer.rs +++ b/traits/src/customer.rs @@ -1,15 +1,8 @@ +use sp_runtime::DispatchError; pub trait CustomerCharger { - // todo: WIP for decoupling payout and customers fn charge_content_owner( content_owner: T::AccountId, billing_vault: T::AccountId, amount: u128, - ) -> Result; -} - -pub enum CustomerChargerError { - NotOwner, - ArithmeticUnderflow, - TransferFailed, - UnlockFailed, + ) -> Result; } From 5f1b06942078ab78c5bf295b3788865471e62a42 Mon Sep 17 00:00:00 2001 From: Raid5594 <52794079+Raid5594@users.noreply.github.com> Date: Fri, 1 Dec 2023 10:22:13 +0100 Subject: [PATCH 557/583] increase coverage of ddc-nodes to 90% (#175) Co-authored-by: aie0 <149175774+aie0@users.noreply.github.com> --- pallets/ddc-nodes/src/benchmarking.rs | 6 + pallets/ddc-nodes/src/lib.rs | 1 + pallets/ddc-nodes/src/mock.rs | 2 +- pallets/ddc-nodes/src/node.rs | 1 + pallets/ddc-nodes/src/tests.rs | 397 +++++++++++++++++++++++++- 5 files changed, 402 insertions(+), 5 deletions(-) diff --git a/pallets/ddc-nodes/src/benchmarking.rs b/pallets/ddc-nodes/src/benchmarking.rs index 90559d4c3..b1ae3e629 100644 --- a/pallets/ddc-nodes/src/benchmarking.rs +++ b/pallets/ddc-nodes/src/benchmarking.rs @@ -51,4 +51,10 @@ benchmarks! { p2p_port: 65000u16, }); } + + impl_benchmark_test_suite!( + DdcNodes, + crate::mock::ExtBuilder.build(), + crate::mock::Test, + ); } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 42beeca36..a6ce51fb7 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -144,6 +144,7 @@ pub mod pallet { fn delete(node_pub_key: NodePubKey) -> Result<(), NodeRepositoryError>; } + #[derive(Debug, PartialEq)] pub enum NodeRepositoryError { StorageNodeAlreadyExists, CDNNodeAlreadyExists, diff --git a/pallets/ddc-nodes/src/mock.rs b/pallets/ddc-nodes/src/mock.rs index 0b67ca60d..8a4be3286 100644 --- a/pallets/ddc-nodes/src/mock.rs +++ b/pallets/ddc-nodes/src/mock.rs @@ -117,7 +117,7 @@ pub(crate) type TestRuntimeCall = ::RuntimeCall; pub struct ExtBuilder; impl ExtBuilder { - fn build(self) -> TestExternalities { + pub fn build(self) -> TestExternalities { sp_tracing::try_init_simple(); let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 93cdba545..99fbdea81 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -102,6 +102,7 @@ impl NodeTrait for Node { } } +#[derive(Debug, PartialEq)] pub enum NodeError { InvalidStorageNodePubKey, InvalidCDNNodePubKey, diff --git a/pallets/ddc-nodes/src/tests.rs b/pallets/ddc-nodes/src/tests.rs index e0fc0f599..c678de436 100644 --- a/pallets/ddc-nodes/src/tests.rs +++ b/pallets/ddc-nodes/src/tests.rs @@ -7,7 +7,7 @@ use sp_runtime::AccountId32; use super::{mock::*, *}; #[test] -fn create_node_works() { +fn create_cdn_node_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); let bytes = [0u8; 32]; @@ -34,6 +34,31 @@ fn create_node_works() { Error::::InvalidNodeParams ); + // Pub key invalid + assert_noop!( + CDNNode::::new( + NodePubKey::StoragePubKey(node_pub_key.clone()), + 1u64, + NodeParams::CDNParams(cdn_node_params.clone()) + ), + NodeError::InvalidCDNNodePubKey + ); + + // Host length exceeds limit + assert_noop!( + DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::CDNParams(CDNNodeParams { + host: vec![1u8; 256], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }) + ), + Error::::HostLenExceedsLimit + ); + // Node created assert_ok!(DdcNodes::create_node( RuntimeOrigin::signed(1), @@ -41,6 +66,17 @@ fn create_node_works() { NodeParams::CDNParams(cdn_node_params.clone()) )); + // Check storage + assert!(CDNNodes::::contains_key(node_pub_key.clone())); + assert!(DdcNodes::exists(&NodePubKey::CDNPubKey(node_pub_key.clone()))); + if let Ok(cluster_id) = + DdcNodes::get_cluster_id(&NodePubKey::CDNPubKey(node_pub_key.clone())) + { + assert_eq!(cluster_id, None); + } + let cdn_node = DdcNodes::cdn_nodes(&node_pub_key).unwrap(); + assert_eq!(cdn_node.pub_key, node_pub_key); + // Node already exists assert_noop!( DdcNodes::create_node( @@ -60,7 +96,162 @@ fn create_node_works() { } #[test] -fn set_node_params_works() { +fn create_cdn_node_with_node_creator() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + let bytes = [0u8; 32]; + let node_pub_key = AccountId32::from(bytes); + let cdn_node_params = CDNNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + + // Node created + assert_ok!(>::create_node( + NodePubKey::CDNPubKey(node_pub_key.clone()), + 1u64, + NodeParams::CDNParams(cdn_node_params) + )); + + // Check storage + assert!(CDNNodes::::contains_key(node_pub_key.clone())); + assert!(DdcNodes::exists(&NodePubKey::CDNPubKey(node_pub_key.clone()))); + if let Ok(cluster_id) = + DdcNodes::get_cluster_id(&NodePubKey::CDNPubKey(node_pub_key.clone())) + { + assert_eq!(cluster_id, None); + } + let cdn_node = DdcNodes::cdn_nodes(&node_pub_key).unwrap(); + assert_eq!(cdn_node.pub_key, node_pub_key); + }) +} + +#[test] +fn create_storage_node_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + let bytes = [0u8; 32]; + let node_pub_key = AccountId32::from(bytes); + let storage_node_params = StorageNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + + // Node params are not valid + assert_noop!( + DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::CDNParams(CDNNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }) + ), + Error::::InvalidNodeParams + ); + + // Pub key invalid + assert_noop!( + StorageNode::::new( + NodePubKey::CDNPubKey(node_pub_key.clone()), + 1u64, + NodeParams::StorageParams(storage_node_params.clone()) + ), + NodeError::InvalidStorageNodePubKey + ); + + // Host length exceeds limit + assert_noop!( + DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::StorageParams(StorageNodeParams { + host: vec![1u8; 256], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }) + ), + Error::::HostLenExceedsLimit + ); + + // Node created + assert_ok!(DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::StorageParams(storage_node_params.clone()) + )); + + // Check storage + assert!(StorageNodes::::contains_key(node_pub_key.clone())); + assert!(DdcNodes::exists(&NodePubKey::StoragePubKey(node_pub_key.clone()))); + if let Ok(cluster_id) = + DdcNodes::get_cluster_id(&NodePubKey::StoragePubKey(node_pub_key.clone())) + { + assert_eq!(cluster_id, None); + } + let storage_node = DdcNodes::storage_nodes(&node_pub_key).unwrap(); + assert_eq!(storage_node.pub_key, node_pub_key); + + // Node already exists + assert_noop!( + DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::StorageParams(storage_node_params) + ), + Error::::NodeAlreadyExists + ); + + // Checking that event was emitted + assert_eq!(System::events().len(), 1); + System::assert_last_event( + Event::NodeCreated { node_pub_key: NodePubKey::StoragePubKey(node_pub_key) }.into(), + ) + }) +} + +#[test] +fn create_storage_node_with_node_creator() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + let bytes = [0u8; 32]; + let node_pub_key = AccountId32::from(bytes); + let storage_node_params = StorageNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + + // Node created + assert_ok!(>::create_node( + NodePubKey::StoragePubKey(node_pub_key.clone()), + 1u64, + NodeParams::StorageParams(storage_node_params) + )); + + // Check storage + assert!(StorageNodes::::contains_key(node_pub_key.clone())); + assert!(DdcNodes::exists(&NodePubKey::StoragePubKey(node_pub_key.clone()))); + if let Ok(cluster_id) = + DdcNodes::get_cluster_id(&NodePubKey::StoragePubKey(node_pub_key.clone())) + { + assert_eq!(cluster_id, None); + } + let cdn_node = DdcNodes::storage_nodes(&node_pub_key).unwrap(); + assert_eq!(cdn_node.pub_key, node_pub_key); + }) +} + +#[test] +fn set_cdn_node_params_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); let bytes = [0u8; 32]; @@ -117,11 +308,55 @@ fn set_node_params_works() { DdcNodes::set_node_params( RuntimeOrigin::signed(2), NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params) + NodeParams::CDNParams(cdn_node_params.clone()) ), Error::::OnlyNodeProvider ); + // CDN host length exceeds limit + assert_noop!( + DdcNodes::set_node_params( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::CDNParams(CDNNodeParams { + host: vec![1u8; 256], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }) + ), + Error::::HostLenExceedsLimit + ); + + let bytes_2 = [1u8; 32]; + let node_pub_key_2 = AccountId32::from(bytes_2); + let node = Node::::new( + NodePubKey::CDNPubKey(node_pub_key_2), + 2u64, + NodeParams::CDNParams(cdn_node_params), + ) + .unwrap(); + + // Update should fail if node doesn't exist + assert_noop!( + >::update(node), + NodeRepositoryError::CDNNodeDoesNotExist + ); + + assert_noop!( + DdcNodes::set_node_params( + RuntimeOrigin::signed(1), + NodePubKey::CDNPubKey(node_pub_key.clone()), + NodeParams::CDNParams(CDNNodeParams { + host: vec![1u8; 256], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }) + ), + Error::::HostLenExceedsLimit + ); + // Checking that event was emitted assert_eq!(System::events().len(), 2); System::assert_last_event( @@ -131,7 +366,109 @@ fn set_node_params_works() { } #[test] -fn set_delete_node_works() { +fn set_storage_node_params_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + let bytes = [0u8; 32]; + let node_pub_key = AccountId32::from(bytes); + let storage_node_params = StorageNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + let cdn_node_params = CDNNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + + // Node doesn't exist + assert_noop!( + DdcNodes::set_node_params( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::StorageParams(storage_node_params.clone()) + ), + Error::::NodeDoesNotExist + ); + + // Node created + assert_ok!(DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::StorageParams(storage_node_params.clone()) + )); + + // Set node params + assert_ok!(DdcNodes::set_node_params( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::StorageParams(storage_node_params.clone()) + )); + + // Node params are not valid + assert_noop!( + DdcNodes::set_node_params( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::CDNParams(cdn_node_params) + ), + Error::::InvalidNodeParams + ); + + // Only node provider can set params + assert_noop!( + DdcNodes::set_node_params( + RuntimeOrigin::signed(2), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::StorageParams(storage_node_params.clone()) + ), + Error::::OnlyNodeProvider + ); + + let bytes_2 = [1u8; 32]; + let node_pub_key_2 = AccountId32::from(bytes_2); + let node = Node::::new( + NodePubKey::StoragePubKey(node_pub_key_2), + 2u64, + NodeParams::StorageParams(storage_node_params), + ) + .unwrap(); + + // Update should fail if node doesn't exist + assert_noop!( + >::update(node), + NodeRepositoryError::StorageNodeDoesNotExist + ); + + // Storage host length exceeds limit + assert_noop!( + DdcNodes::set_node_params( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::StorageParams(StorageNodeParams { + host: vec![1u8; 256], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }) + ), + Error::::HostLenExceedsLimit + ); + + // Checking that event was emitted + assert_eq!(System::events().len(), 2); + System::assert_last_event( + Event::NodeParamsChanged { node_pub_key: NodePubKey::StoragePubKey(node_pub_key) } + .into(), + ) + }) +} + +#[test] +fn delete_cdn_node_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); let bytes = [0u8; 32]; @@ -181,3 +518,55 @@ fn set_delete_node_works() { ) }) } + +#[test] +fn delete_storage_node_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + let bytes = [0u8; 32]; + let node_pub_key = AccountId32::from(bytes); + let storage_node_params = StorageNodeParams { + host: vec![1u8, 255], + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + + // Node doesn't exist + assert_noop!( + DdcNodes::delete_node( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()) + ), + Error::::NodeDoesNotExist + ); + + // Create node + assert_ok!(DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::StorageParams(storage_node_params) + )); + + // Only node provider can delete + assert_noop!( + DdcNodes::delete_node( + RuntimeOrigin::signed(2), + NodePubKey::StoragePubKey(node_pub_key.clone()) + ), + Error::::OnlyNodeProvider + ); + + // Delete node + assert_ok!(DdcNodes::delete_node( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + )); + + // Checking that event was emitted + assert_eq!(System::events().len(), 2); + System::assert_last_event( + Event::NodeDeleted { node_pub_key: NodePubKey::StoragePubKey(node_pub_key) }.into(), + ) + }) +} From c049c33209688bd2e66ce45629cdeec62d4f0fcb Mon Sep 17 00:00:00 2001 From: Yahor Tsaryk Date: Mon, 4 Dec 2023 17:43:13 +0100 Subject: [PATCH 558/583] DdcPayouts: Benchmarking (#169) Co-authored-by: aie0 <149175774+aie0@users.noreply.github.com> --- .maintain/frame-weight-template.hbs | 24 +- Cargo.lock | 328 ++++++++-------- pallets/ddc-customers/src/lib.rs | 104 +++-- pallets/ddc-customers/src/tests.rs | 3 +- pallets/ddc-payouts/Cargo.toml | 9 +- pallets/ddc-payouts/src/benchmarking.rs | 499 ++++++++++++++++++++++++ pallets/ddc-payouts/src/lib.rs | 46 ++- pallets/ddc-payouts/src/mock.rs | 40 +- pallets/ddc-payouts/src/weights.rs | 210 ++++++++++ primitives/src/lib.rs | 2 +- runtime/cere-dev/Cargo.toml | 1 + runtime/cere-dev/src/lib.rs | 4 + traits/src/customer.rs | 8 + 13 files changed, 1039 insertions(+), 239 deletions(-) create mode 100644 pallets/ddc-payouts/src/benchmarking.rs create mode 100644 pallets/ddc-payouts/src/weights.rs diff --git a/.maintain/frame-weight-template.hbs b/.maintain/frame-weight-template.hbs index e2248b4e2..ad0077736 100644 --- a/.maintain/frame-weight-template.hbs +++ b/.maintain/frame-weight-template.hbs @@ -47,22 +47,22 @@ impl WeightInfo for SubstrateWeight { {{~#each benchmark.components as |c| ~}} {{~#if (not c.is_used)}}_{{/if}}{{c.name}}: u32, {{/each~}} ) -> Weight { - Weight::from_ref_time({{underscore benchmark.base_weight}} as u64) + Weight::from_ref_time({{underscore benchmark.base_weight}}_u64) {{#each benchmark.component_weight as |cw|}} // Standard Error: {{underscore cw.error}} - .saturating_add(Weight::from_ref_time({{underscore cw.slope}} as u64).saturating_mul({{cw.name}} as u64)) + .saturating_add(Weight::from_ref_time({{underscore cw.slope}}_u64).saturating_mul({{cw.name}} as u64)) {{/each}} {{#if (ne benchmark.base_reads "0")}} - .saturating_add(T::DbWeight::get().reads({{benchmark.base_reads}} as u64)) + .saturating_add(T::DbWeight::get().reads({{benchmark.base_reads}}_u64)) {{/if}} {{#each benchmark.component_reads as |cr|}} - .saturating_add(T::DbWeight::get().reads(({{cr.slope}} as u64).saturating_mul({{cr.name}} as u64))) + .saturating_add(T::DbWeight::get().reads(({{cr.slope}}_u64).saturating_mul({{cr.name}} as u64))) {{/each}} {{#if (ne benchmark.base_writes "0")}} - .saturating_add(T::DbWeight::get().writes({{benchmark.base_writes}} as u64)) + .saturating_add(T::DbWeight::get().writes({{benchmark.base_writes}}_u64)) {{/if}} {{#each benchmark.component_writes as |cw|}} - .saturating_add(T::DbWeight::get().writes(({{cw.slope}} as u64).saturating_mul({{cw.name}} as u64))) + .saturating_add(T::DbWeight::get().writes(({{cw.slope}}_u64).saturating_mul({{cw.name}} as u64))) {{/each}} } {{/each}} @@ -82,22 +82,22 @@ impl WeightInfo for () { {{~#each benchmark.components as |c| ~}} {{~#if (not c.is_used)}}_{{/if}}{{c.name}}: u32, {{/each~}} ) -> Weight { - Weight::from_ref_time({{underscore benchmark.base_weight}} as u64) + Weight::from_ref_time({{underscore benchmark.base_weight}}_u64) {{#each benchmark.component_weight as |cw|}} // Standard Error: {{underscore cw.error}} - .saturating_add(Weight::from_ref_time({{underscore cw.slope}} as u64).saturating_mul({{cw.name}} as u64)) + .saturating_add(Weight::from_ref_time({{underscore cw.slope}}_u64).saturating_mul({{cw.name}} as u64)) {{/each}} {{#if (ne benchmark.base_reads "0")}} - .saturating_add(RocksDbWeight::get().reads({{benchmark.base_reads}} as u64)) + .saturating_add(RocksDbWeight::get().reads({{benchmark.base_reads}}_u64)) {{/if}} {{#each benchmark.component_reads as |cr|}} - .saturating_add(RocksDbWeight::get().reads(({{cr.slope}} as u64).saturating_mul({{cr.name}} as u64))) + .saturating_add(RocksDbWeight::get().reads(({{cr.slope}}_u64).saturating_mul({{cr.name}} as u64))) {{/each}} {{#if (ne benchmark.base_writes "0")}} - .saturating_add(RocksDbWeight::get().writes({{benchmark.base_writes}} as u64)) + .saturating_add(RocksDbWeight::get().writes({{benchmark.base_writes}}_u64)) {{/if}} {{#each benchmark.component_writes as |cw|}} - .saturating_add(RocksDbWeight::get().writes(({{cw.slope}} as u64).saturating_mul({{cw.name}} as u64))) + .saturating_add(RocksDbWeight::get().writes(({{cw.slope}}_u64).saturating_mul({{cw.name}} as u64))) {{/each}} } {{/each}} diff --git a/Cargo.lock b/Cargo.lock index e40e763df..fe193760e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2146,7 +2146,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", ] @@ -2169,7 +2169,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -2192,7 +2192,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "array-bytes", @@ -2243,7 +2243,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2254,7 +2254,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2270,7 +2270,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -2299,7 +2299,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2331,7 +2331,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "cfg-expr", @@ -2345,7 +2345,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2357,7 +2357,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -2367,7 +2367,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "log", @@ -2385,7 +2385,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -2400,7 +2400,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -2409,7 +2409,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "parity-scale-codec", @@ -4301,7 +4301,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-system", "parity-scale-codec", @@ -4497,7 +4497,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -4513,7 +4513,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4552,7 +4552,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4572,7 +4572,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4587,7 +4587,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4635,7 +4635,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4654,7 +4654,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4671,7 +4671,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4700,7 +4700,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -4712,7 +4712,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -4863,7 +4863,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4881,7 +4881,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4905,7 +4905,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4918,7 +4918,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4970,7 +4970,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4991,7 +4991,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5014,7 +5014,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5030,7 +5030,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5050,7 +5050,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5067,7 +5067,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5084,7 +5084,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5100,7 +5100,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5117,7 +5117,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5137,7 +5137,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -5147,7 +5147,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5164,7 +5164,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5187,7 +5187,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5202,7 +5202,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5216,7 +5216,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5231,7 +5231,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5247,7 +5247,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5268,7 +5268,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5284,7 +5284,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5298,7 +5298,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5321,7 +5321,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5332,7 +5332,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5346,7 +5346,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5364,7 +5364,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5383,7 +5383,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-support", "frame-system", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5414,7 +5414,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5425,7 +5425,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5442,7 +5442,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-benchmarking", "frame-support", @@ -6342,7 +6342,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "env_logger 0.9.3", "log", @@ -6606,7 +6606,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "sp-core", @@ -6617,7 +6617,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6644,7 +6644,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "futures-timer", @@ -6667,7 +6667,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6683,7 +6683,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6700,7 +6700,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6711,7 +6711,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "chrono", @@ -6751,7 +6751,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "fnv", "futures", @@ -6779,7 +6779,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "kvdb", @@ -6804,7 +6804,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6828,7 +6828,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "fork-tree", @@ -6870,7 +6870,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -6892,7 +6892,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6905,7 +6905,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -6929,7 +6929,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sc-client-api", "sp-authorship", @@ -6940,7 +6940,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "lazy_static", "lru 0.7.8", @@ -6967,7 +6967,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "environmental", "parity-scale-codec", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -6998,7 +6998,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "cfg-if", "libc", @@ -7018,7 +7018,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "array-bytes", @@ -7059,7 +7059,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "finality-grandpa", "futures", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "futures", @@ -7097,7 +7097,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "async-trait", @@ -7112,7 +7112,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "async-trait", @@ -7159,7 +7159,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "cid", "futures", @@ -7179,7 +7179,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7205,7 +7205,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "futures", @@ -7223,7 +7223,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "futures", @@ -7244,7 +7244,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "fork-tree", @@ -7274,7 +7274,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "futures", @@ -7293,7 +7293,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "bytes", @@ -7323,7 +7323,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "libp2p", @@ -7336,7 +7336,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7345,7 +7345,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "hash-db", @@ -7375,7 +7375,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -7398,7 +7398,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "jsonrpsee", @@ -7411,7 +7411,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "hex", @@ -7430,7 +7430,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "directories", @@ -7501,7 +7501,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -7515,7 +7515,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7534,7 +7534,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "libc", @@ -7553,7 +7553,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "chrono", "futures", @@ -7571,7 +7571,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "atty", @@ -7602,7 +7602,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7613,7 +7613,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -7640,7 +7640,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -7654,7 +7654,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "futures-timer", @@ -8067,7 +8067,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "log", @@ -8085,7 +8085,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "blake2", "proc-macro-crate", @@ -8097,7 +8097,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8110,7 +8110,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "integer-sqrt", "num-traits", @@ -8125,7 +8125,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8138,7 +8138,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "parity-scale-codec", @@ -8150,7 +8150,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-api", @@ -8162,7 +8162,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "log", @@ -8180,7 +8180,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -8199,7 +8199,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "merlin", @@ -8222,7 +8222,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8236,7 +8236,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8249,7 +8249,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "array-bytes", "base58", @@ -8295,7 +8295,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "blake2", "byteorder", @@ -8309,7 +8309,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -8320,7 +8320,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8329,7 +8329,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro2", "quote", @@ -8339,7 +8339,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "environmental", "parity-scale-codec", @@ -8350,7 +8350,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "finality-grandpa", "log", @@ -8368,7 +8368,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8382,7 +8382,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bytes", "futures", @@ -8408,7 +8408,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "lazy_static", "sp-core", @@ -8419,7 +8419,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures", @@ -8436,7 +8436,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "thiserror", "zstd", @@ -8445,7 +8445,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8459,7 +8459,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sp-api", "sp-core", @@ -8469,7 +8469,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "backtrace", "lazy_static", @@ -8479,7 +8479,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "rustc-hash", "serde", @@ -8489,7 +8489,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "either", "hash256-std-hasher", @@ -8512,7 +8512,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8530,7 +8530,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "Inflector", "proc-macro-crate", @@ -8542,7 +8542,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "parity-scale-codec", @@ -8556,7 +8556,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8570,7 +8570,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "scale-info", @@ -8581,7 +8581,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "hash-db", "log", @@ -8603,12 +8603,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8621,7 +8621,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "log", "sp-core", @@ -8634,7 +8634,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "futures-timer", @@ -8650,7 +8650,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "sp-std", @@ -8662,7 +8662,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "sp-api", "sp-runtime", @@ -8671,7 +8671,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "log", @@ -8687,7 +8687,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ahash", "hash-db", @@ -8710,7 +8710,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8727,7 +8727,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8738,7 +8738,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "log", @@ -8751,7 +8751,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8898,7 +8898,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "platforms 2.0.0", ] @@ -8906,7 +8906,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -8927,7 +8927,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures-util", "hyper", @@ -8940,7 +8940,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "async-trait", "jsonrpsee", @@ -8953,7 +8953,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "jsonrpsee", "log", @@ -8974,7 +8974,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "futures", "substrate-test-utils-derive", @@ -8984,7 +8984,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8995,7 +8995,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -9441,7 +9441,7 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ "clap", "frame-try-runtime", diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index a08f27eef..fcefa7036 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -18,7 +18,7 @@ use codec::{Decode, Encode, HasCompact}; use ddc_primitives::{BucketId, ClusterId}; use ddc_traits::{ cluster::{ClusterCreator, ClusterVisitor}, - customer::CustomerCharger, + customer::{CustomerCharger, CustomerDepositor}, }; use frame_support::{ parameter_types, @@ -257,6 +257,8 @@ pub mod pallet { ArithmeticOverflow, // Arithmetic underflow ArithmeticUnderflow, + // Transferring balance to pallet's vault has failed + TransferFailed, } #[pallet::genesis_config] @@ -318,28 +320,7 @@ pub mod pallet { #[pallet::compact] value: BalanceOf, ) -> DispatchResult { let owner = ensure_signed(origin)?; - - if >::contains_key(&owner) { - Err(Error::::AlreadyPaired)? - } - - // Reject a deposit which is considered to be _dust_. - if value < ::Currency::minimum_balance() { - Err(Error::::InsufficientDeposit)? - } - - frame_system::Pallet::::inc_consumers(&owner).map_err(|_| Error::::BadState)?; - - let owner_balance = ::Currency::free_balance(&owner); - let value = value.min(owner_balance); - let item = AccountsLedger { - owner: owner.clone(), - total: value, - active: value, - unlocking: Default::default(), - }; - Self::update_ledger_and_deposit(&owner, &item)?; - Self::deposit_event(Event::::Deposited(owner, value)); + >::deposit(owner, value.saturated_into())?; Ok(()) } @@ -355,26 +336,7 @@ pub mod pallet { #[pallet::compact] max_additional: BalanceOf, ) -> DispatchResult { let owner = ensure_signed(origin)?; - - let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; - - let owner_balance = ::Currency::free_balance(&owner); - let extra = owner_balance.min(max_additional); - ledger.total = - ledger.total.checked_add(&extra).ok_or(Error::::ArithmeticOverflow)?; - ledger.active = - ledger.active.checked_add(&extra).ok_or(Error::::ArithmeticOverflow)?; - - // Last check: the new active amount of ledger must be more than ED. - ensure!( - ledger.active >= ::Currency::minimum_balance(), - Error::::InsufficientDeposit - ); - - Self::update_ledger_and_deposit(&owner, &ledger)?; - - Self::deposit_event(Event::::Deposited(owner, extra)); - + >::deposit_extra(owner, max_additional.saturated_into())?; Ok(()) } @@ -599,4 +561,60 @@ pub mod pallet { Ok(actually_charged.saturated_into::()) } } + + impl CustomerDepositor for Pallet { + fn deposit(owner: T::AccountId, amount: u128) -> Result<(), DispatchError> { + let value = amount.saturated_into::>(); + + if >::contains_key(&owner) { + Err(Error::::AlreadyPaired)? + } + + // Reject a deposit which is considered to be _dust_. + if value < ::Currency::minimum_balance() { + Err(Error::::InsufficientDeposit)? + } + + frame_system::Pallet::::inc_consumers(&owner).map_err(|_| Error::::BadState)?; + + let owner_balance = ::Currency::free_balance(&owner); + let value = value.min(owner_balance); + let item = AccountsLedger { + owner: owner.clone(), + total: value, + active: value, + unlocking: Default::default(), + }; + + Self::update_ledger_and_deposit(&owner, &item) + .map_err(|_| Error::::TransferFailed)?; + Self::deposit_event(Event::::Deposited(owner, value)); + + Ok(()) + } + + fn deposit_extra(owner: T::AccountId, amount: u128) -> Result<(), DispatchError> { + let max_additional = amount.saturated_into::>(); + let mut ledger = Self::ledger(&owner).ok_or(Error::::NotOwner)?; + + let owner_balance = ::Currency::free_balance(&owner); + let extra = owner_balance.min(max_additional); + ledger.total = + ledger.total.checked_add(&extra).ok_or(Error::::ArithmeticOverflow)?; + ledger.active = + ledger.active.checked_add(&extra).ok_or(Error::::ArithmeticOverflow)?; + + // Last check: the new active amount of ledger must be more than ED. + ensure!( + ledger.active >= ::Currency::minimum_balance(), + Error::::InsufficientDeposit + ); + + Self::update_ledger_and_deposit(&owner, &ledger) + .map_err(|_| Error::::TransferFailed)?; + Self::deposit_event(Event::::Deposited(owner, extra)); + + Ok(()) + } + } } diff --git a/pallets/ddc-customers/src/tests.rs b/pallets/ddc-customers/src/tests.rs index 081335ff2..aa83b1c54 100644 --- a/pallets/ddc-customers/src/tests.rs +++ b/pallets/ddc-customers/src/tests.rs @@ -3,7 +3,6 @@ use ddc_primitives::ClusterId; use frame_support::{assert_noop, assert_ok}; use frame_system::Config; -use pallet_balances::Error as BalancesError; use super::{mock::*, *}; @@ -77,7 +76,7 @@ fn deposit_and_deposit_extra_works() { // Deposit all tokens fails (should not kill account) assert_noop!( DdcCustomers::deposit(RuntimeOrigin::signed(account_1), 100_u128), - BalancesError::::KeepAlive + Error::::TransferFailed ); let amount1 = 10_u128; diff --git a/pallets/ddc-payouts/Cargo.toml b/pallets/ddc-payouts/Cargo.toml index 248e81165..f7f7e28be 100644 --- a/pallets/ddc-payouts/Cargo.toml +++ b/pallets/ddc-payouts/Cargo.toml @@ -42,4 +42,11 @@ std = [ "sp-core/std", "frame-election-provider-support/std", ] -runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] + +runtime-benchmarks = [ + "ddc-primitives/runtime-benchmarks", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] diff --git a/pallets/ddc-payouts/src/benchmarking.rs b/pallets/ddc-payouts/src/benchmarking.rs new file mode 100644 index 000000000..4690b29ac --- /dev/null +++ b/pallets/ddc-payouts/src/benchmarking.rs @@ -0,0 +1,499 @@ +//! DdcPayouts pallet benchmarking. + +use ddc_primitives::{ClusterGovParams, ClusterId, ClusterParams}; +pub use frame_benchmarking::{account, benchmarks, whitelist_account}; +use frame_system::RawOrigin; +use sp_std::prelude::*; + +use super::*; +use crate::Pallet as DdcPayouts; + +const CERE: u128 = 10000000000; + +fn create_dac_account() -> T::AccountId { + let dac_account = create_account::("dac_account", 0, 0); + authorize_account::(dac_account.clone()); + dac_account +} + +fn create_account(name: &'static str, idx: u32, seed: u32) -> T::AccountId { + account::(name, idx, seed) +} + +fn authorize_account(account: T::AccountId) { + AuthorisedCaller::::put(account); +} + +fn endow_account(account: &T::AccountId, amount: u128) { + let balance = amount.saturated_into::>(); + let _ = T::Currency::make_free_balance_be(account, balance); +} + +fn endow_customer(customer: &T::AccountId, amount: u128) { + endow_account::(customer, amount); + T::CustomerDepositor::deposit( + customer.clone(), + // we need to keep min existensial deposit + amount - T::Currency::minimum_balance().saturated_into::(), + ) + .expect("Customer deposit failed"); +} + +fn create_cluster( + cluster_id: ClusterId, + cluster_manager_id: T::AccountId, + cluster_reserve_id: T::AccountId, + cluster_params: ClusterParams, + cluster_gov_params: ClusterGovParams, T::BlockNumber>, +) { + T::ClusterCreator::create_new_cluster( + cluster_id, + cluster_manager_id, + cluster_reserve_id, + cluster_params, + cluster_gov_params, + ) + .expect("Cluster is not created"); +} + +fn create_default_cluster(cluster_id: ClusterId) { + let cluster_manager = create_account::("cm", 0, 0); + let cluster_reserve = create_account::("cr", 0, 0); + let cluster_params = ClusterParams { node_provider_auth_contract: Default::default() }; + let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { + treasury_share: Perbill::from_percent(5), + validators_share: Perbill::from_percent(10), + cluster_reserve_share: Perbill::from_percent(15), + unit_per_mb_stored: CERE, + unit_per_mb_streamed: CERE, + unit_per_put_request: CERE, + unit_per_get_request: CERE, + ..Default::default() + }; + + create_cluster::( + cluster_id, + cluster_manager, + cluster_reserve, + cluster_params, + cluster_gov_params, + ); +} + +struct BillingReportParams { + cluster_id: ClusterId, + era: DdcEra, + state: State, + total_customer_charge: CustomerCharge, + total_distributed_reward: u128, + total_node_usage: NodeUsage, + charging_max_batch_index: BatchIndex, + charging_processed_batches: BoundedBTreeSet, + rewarding_max_batch_index: BatchIndex, + rewarding_processed_batches: BoundedBTreeSet, +} + +fn create_billing_report(params: BillingReportParams) { + let vault = DdcPayouts::::sub_account_id(params.cluster_id, params.era); + let billing_report = BillingReport:: { + vault, + state: params.state, + total_customer_charge: params.total_customer_charge, + total_distributed_reward: params.total_distributed_reward, + total_node_usage: params.total_node_usage, + charging_max_batch_index: params.charging_max_batch_index, + charging_processed_batches: params.charging_processed_batches, + rewarding_max_batch_index: params.rewarding_max_batch_index, + rewarding_processed_batches: params.rewarding_processed_batches, + }; + + ActiveBillingReports::::insert(params.cluster_id, params.era, billing_report); +} + +benchmarks! { + + set_authorised_caller { + let dac_account = create_account::("dac_account", 0, 0); + + }: _(RawOrigin::Root, dac_account.clone()) + verify { + assert_eq!(AuthorisedCaller::::get(), Some(dac_account)); + } + + begin_billing_report { + + let cluster_id = ClusterId::from([1; 20]); + let era : DdcEra = 1; + + create_default_cluster::(cluster_id); + + let dac_account = create_dac_account::(); + whitelist_account!(dac_account); + + }: _(RawOrigin::Signed(dac_account.clone()), cluster_id, era) + verify { + assert!(ActiveBillingReports::::contains_key(cluster_id, era)); + let billing_report = ActiveBillingReports::::get(cluster_id, era).unwrap(); + assert_eq!(billing_report.state, State::Initialized); + } + + begin_charging_customers { + let cluster_id = ClusterId::from([1; 20]); + let era : DdcEra = 1; + let state = State::Initialized; + let total_customer_charge = CustomerCharge::default(); + let total_distributed_reward : u128= 0; + let total_node_usage = NodeUsage::default(); + let charging_max_batch_index = BatchIndex::default(); + let charging_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + let rewarding_max_batch_index = BatchIndex::default(); + let rewarding_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + + create_default_cluster::(cluster_id); + create_billing_report::(BillingReportParams { + cluster_id, + era, + state, + total_customer_charge, + total_distributed_reward, + total_node_usage, + charging_max_batch_index, + charging_processed_batches, + rewarding_max_batch_index, + rewarding_processed_batches, + }); + + let dac_account = create_dac_account::(); + whitelist_account!(dac_account); + + let max_batch_index: BatchIndex = 10; + + }: _(RawOrigin::Signed(dac_account.clone()), cluster_id, era, max_batch_index) + verify { + assert!(ActiveBillingReports::::contains_key(cluster_id, era)); + let billing_report = ActiveBillingReports::::get(cluster_id, era).unwrap(); + assert_eq!(billing_report.state, State::ChargingCustomers); + assert_eq!(billing_report.charging_max_batch_index, max_batch_index); + } + + send_charging_customers_batch { + let b in 1 .. MaxBatchSize::get() as u32; + + let cluster_id = ClusterId::from([1; 20]); + let era : DdcEra = 1; + let state = State::ChargingCustomers; + let total_customer_charge = CustomerCharge::default(); + let total_distributed_reward : u128 = 0; + let total_node_usage = NodeUsage::default(); + let charging_max_batch_index = 0; + let charging_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + let rewarding_max_batch_index = BatchIndex::default(); + let rewarding_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + + let dac_account = create_dac_account::(); + whitelist_account!(dac_account); + + create_default_cluster::(cluster_id); + create_billing_report::(BillingReportParams { + cluster_id, + era, + state, + total_customer_charge, + total_distributed_reward, + total_node_usage, + charging_max_batch_index, + charging_processed_batches, + rewarding_max_batch_index, + rewarding_processed_batches, + }); + + let batch_index: BatchIndex = 0; + let payers: Vec<(T::AccountId, CustomerUsage)> = (0..b).map(|i| { + let customer = create_account::("customer", i, i); + + if b % 2 == 0 { + // no customer debt path + endow_customer::(&customer, 1_000_000 * CERE); + } else { + // customer debt path + endow_customer::(&customer, 10 * CERE); + } + + let customer_usage = CustomerUsage { + transferred_bytes: 200000000, // 200 mb + stored_bytes: 100000000, // 100 mb + number_of_gets: 10, // 10 gets + number_of_puts: 5, // 5 puts + }; + + (customer, customer_usage) + }).collect(); + + }: _(RawOrigin::Signed(dac_account.clone()), cluster_id, era, batch_index, payers) + verify { + assert!(ActiveBillingReports::::contains_key(cluster_id, era)); + let billing_report = ActiveBillingReports::::get(cluster_id, era).unwrap(); + assert_eq!(billing_report.state, State::ChargingCustomers); + assert!(billing_report.charging_processed_batches.contains(&batch_index)); + } + + end_charging_customers { + let cluster_id = ClusterId::from([1; 20]); + let era : DdcEra = 1; + let state = State::ChargingCustomers; + let total_customer_charge = CustomerCharge { + transfer: 200 * CERE, // price for 200 mb + storage: 100 * CERE, // price for 100 mb + gets: 10 * CERE, // price for 10 gets + puts: 5 * CERE, // price for 5 puts + }; + let total_distributed_reward : u128 = 0; + let total_node_usage = NodeUsage::default(); + let charging_max_batch_index = 0; + let mut charging_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + charging_processed_batches.try_insert(0).unwrap(); + let rewarding_max_batch_index = BatchIndex::default(); + let rewarding_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + + create_default_cluster::(cluster_id); + create_billing_report::(BillingReportParams { + cluster_id, + era, + state, + total_customer_charge: total_customer_charge.clone(), + total_distributed_reward, + total_node_usage, + charging_max_batch_index, + charging_processed_batches, + rewarding_max_batch_index, + rewarding_processed_batches, + }); + + let vault = DdcPayouts::::sub_account_id(cluster_id, era); + let total_customer_charge_amount = total_customer_charge.transfer + total_customer_charge.storage + total_customer_charge.gets + total_customer_charge.puts; + endow_account::(&vault, total_customer_charge_amount); + + let dac_account = create_dac_account::(); + whitelist_account!(dac_account); + + }: _(RawOrigin::Signed(dac_account.clone()), cluster_id, era) + verify { + let billing_report = ActiveBillingReports::::get(cluster_id, era).unwrap(); + assert_eq!(billing_report.state, State::CustomersChargedWithFees); + assert!(billing_report.charging_processed_batches.contains(&charging_max_batch_index)); + } + + begin_rewarding_providers { + let cluster_id = ClusterId::from([1; 20]); + let era : DdcEra = 1; + let state = State::CustomersChargedWithFees; + let total_customer_charge = CustomerCharge { + transfer: 200 * CERE, // price for 200 mb + storage: 100 * CERE, // price for 100 mb + gets: 10 * CERE, // price for 10 gets + puts: 5 * CERE, // price for 5 puts + }; + let total_distributed_reward : u128 = 0; + let total_node_usage = NodeUsage::default(); + let charging_max_batch_index = 0; + let mut charging_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + charging_processed_batches.try_insert(0).unwrap(); + let rewarding_max_batch_index = BatchIndex::default(); + let rewarding_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + + create_default_cluster::(cluster_id); + create_billing_report::(BillingReportParams { + cluster_id, + era, + state, + total_customer_charge, + total_distributed_reward, + total_node_usage, + charging_max_batch_index, + charging_processed_batches, + rewarding_max_batch_index, + rewarding_processed_batches, + }); + + let max_batch_index: BatchIndex = 10; + let total_node_usage = NodeUsage { + transferred_bytes: 200000000, // 200 mb + stored_bytes: 100000000, // 100 mb + number_of_gets: 10, // 10 gets + number_of_puts: 5, // 5 puts + }; + + let dac_account = create_dac_account::(); + whitelist_account!(dac_account); + + }: _(RawOrigin::Signed(dac_account.clone()), cluster_id, era, max_batch_index, total_node_usage) + verify { + let billing_report = ActiveBillingReports::::get(cluster_id, era).unwrap(); + assert_eq!(billing_report.state, State::RewardingProviders); + assert_eq!(billing_report.rewarding_max_batch_index, max_batch_index); + } + + send_rewarding_providers_batch { + let b in 1 .. MaxBatchSize::get() as u32; + + let cluster_id = ClusterId::from([1; 20]); + let era : DdcEra = 1; + let state = State::RewardingProviders; + let total_customer_charge = CustomerCharge { + transfer: (200 * CERE).saturating_mul(b.into()), // price for 200 mb per customer + storage: (100 * CERE).saturating_mul(b.into()), // price for 100 mb per customer + gets: (10 * CERE).saturating_mul(b.into()), // price for 10 gets per customer + puts: (5 * CERE).saturating_mul(b.into()), // price for 5 puts per customer + }; + let total_distributed_reward : u128 = 0; + let total_node_usage = NodeUsage { + transferred_bytes: 200000000u64.saturating_mul(b.into()), // 200 mb per provider + stored_bytes: 100000000u64.saturating_mul(b.into()), // 100 mb per provider + number_of_gets: 10u128.saturating_mul(b.into()), // 10 gets per provider + number_of_puts: 5u128.saturating_mul(b.into()), // 5 puts per provider + }; + let charging_max_batch_index = 0; + let mut charging_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + charging_processed_batches.try_insert(0).unwrap(); + let rewarding_max_batch_index = 0; + let rewarding_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + + create_default_cluster::(cluster_id); + create_billing_report::(BillingReportParams { + cluster_id, + era, + state, + total_customer_charge: total_customer_charge.clone(), + total_distributed_reward, + total_node_usage, + charging_max_batch_index, + charging_processed_batches, + rewarding_max_batch_index, + rewarding_processed_batches, + }); + + let vault = DdcPayouts::::sub_account_id(cluster_id, era); + let total_customer_charge_amount = total_customer_charge.transfer + total_customer_charge.storage + total_customer_charge.gets + total_customer_charge.puts; + endow_account::(&vault, total_customer_charge_amount + T::Currency::minimum_balance().saturated_into::()); + + let dac_account = create_dac_account::(); + whitelist_account!(dac_account); + + let batch_index: BatchIndex = 0; + let payees: Vec<(T::AccountId, NodeUsage)> = (0..b).map(|i| { + let provider = create_account::("provider", i, i); + endow_account::(&provider, T::Currency::minimum_balance().saturated_into()); + let node_usage = NodeUsage { + transferred_bytes: 200000000, // 200 mb + stored_bytes: 100000000, // 100 mb + number_of_gets: 10, // 10 gets + number_of_puts: 5, // 5 puts + }; + (provider, node_usage) + }).collect(); + + }: _(RawOrigin::Signed(dac_account.clone()), cluster_id, era, batch_index, payees) + verify { + assert!(ActiveBillingReports::::contains_key(cluster_id, era)); + let billing_report = ActiveBillingReports::::get(cluster_id, era).unwrap(); + assert_eq!(billing_report.state, State::RewardingProviders); + assert!(billing_report.rewarding_processed_batches.contains(&batch_index)); + } + + end_rewarding_providers { + let cluster_id = ClusterId::from([1; 20]); + let era : DdcEra = 1; + let state = State::RewardingProviders; + let total_customer_charge = CustomerCharge { + transfer: 200 * CERE, // price for 200 mb + storage: 100 * CERE, // price for 100 mb + gets: 10 * CERE, // price for 10 gets + puts: 5 * CERE, // price for 5 puts + }; + let total_distributed_reward : u128 = total_customer_charge.transfer + total_customer_charge.storage + total_customer_charge.gets + total_customer_charge.puts; + let total_node_usage = NodeUsage { + transferred_bytes: 200000000, // 200 mb + stored_bytes: 100000000, // 100 mb + number_of_gets: 10, // 10 gets + number_of_puts: 5, // 5 puts + }; + let charging_max_batch_index = 0; + let mut charging_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + charging_processed_batches.try_insert(0).unwrap(); + let rewarding_max_batch_index = 0; + let mut rewarding_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + rewarding_processed_batches.try_insert(0).unwrap(); + + create_default_cluster::(cluster_id); + create_billing_report::(BillingReportParams { + cluster_id, + era, + state, + total_customer_charge, + total_distributed_reward, + total_node_usage, + charging_max_batch_index, + charging_processed_batches, + rewarding_max_batch_index, + rewarding_processed_batches, + }); + + let dac_account = create_dac_account::(); + whitelist_account!(dac_account); + + }: _(RawOrigin::Signed(dac_account.clone()), cluster_id, era) + verify { + assert!(ActiveBillingReports::::contains_key(cluster_id, era)); + let billing_report = ActiveBillingReports::::get(cluster_id, era).unwrap(); + assert_eq!(billing_report.state, State::ProvidersRewarded); + } + + end_billing_report { + let cluster_id = ClusterId::from([1; 20]); + let era : DdcEra = 1; + let state = State::ProvidersRewarded; + let total_customer_charge = CustomerCharge { + transfer: 200 * CERE, // price for 200 mb + storage: 100 * CERE, // price for 100 mb + gets: 10 * CERE, // price for 10 gets + puts: 5 * CERE, // price for 5 puts + }; + let total_distributed_reward : u128 = total_customer_charge.transfer + total_customer_charge.storage + total_customer_charge.gets + total_customer_charge.puts; + let total_node_usage = NodeUsage { + transferred_bytes: 200000000, // 200 mb + stored_bytes: 100000000, // 100 mb + number_of_gets: 10, // 10 gets + number_of_puts: 5, // 5 puts + }; + let charging_max_batch_index = 0; + let mut charging_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + charging_processed_batches.try_insert(0).unwrap(); + let rewarding_max_batch_index = 0; + let mut rewarding_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); + rewarding_processed_batches.try_insert(0).unwrap(); + + create_default_cluster::(cluster_id); + create_billing_report::(BillingReportParams { + cluster_id, + era, + state, + total_customer_charge, + total_distributed_reward, + total_node_usage, + charging_max_batch_index, + charging_processed_batches, + rewarding_max_batch_index, + rewarding_processed_batches, + }); + + let dac_account = create_dac_account::(); + whitelist_account!(dac_account); + + }: _(RawOrigin::Signed(dac_account.clone()), cluster_id, era) + verify { + assert!(ActiveBillingReports::::contains_key(cluster_id, era)); + let billing_report = ActiveBillingReports::::get(cluster_id, era).unwrap(); + assert_eq!(billing_report.state, State::Finalized); + } + +} diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index ccdf466e3..9d7b12003 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -14,6 +14,12 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] +pub mod weights; +use crate::weights::WeightInfo; + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarking; + #[cfg(test)] pub(crate) mod mock; #[cfg(test)] @@ -21,8 +27,11 @@ mod tests; use ddc_primitives::{ClusterId, DdcEra}; use ddc_traits::{ - cluster::ClusterVisitor as ClusterVisitorType, - customer::CustomerCharger as CustomerChargerType, pallet::PalletVisitor as PalletVisitorType, + cluster::{ClusterCreator as ClusterCreatorType, ClusterVisitor as ClusterVisitorType}, + customer::{ + CustomerCharger as CustomerChargerType, CustomerDepositor as CustomerDepositorType, + }, + pallet::PalletVisitor as PalletVisitorType, }; use frame_election_provider_support::SortedListProvider; use frame_support::{ @@ -89,6 +98,7 @@ pub type BalanceOf = parameter_types! { pub MaxBatchesCount: u16 = 1000; + pub MaxBatchSize: u16 = 1000; } #[frame_support::pallet] @@ -111,9 +121,12 @@ pub mod pallet { type PalletId: Get; type Currency: LockableCurrency; type CustomerCharger: CustomerChargerType; + type CustomerDepositor: CustomerDepositorType; type TreasuryVisitor: PalletVisitorType; type ClusterVisitor: ClusterVisitorType; type ValidatorList: SortedListProvider; + type ClusterCreator: ClusterCreatorType>; + type WeightInfo: WeightInfo; } #[pallet::event] @@ -204,6 +217,7 @@ pub mod pallet { BoundedVecOverflow, ArithmeticOverflow, NotExpectedClusterState, + BatchSizeIsOutOfBounds, } #[pallet::storage] @@ -274,7 +288,7 @@ pub mod pallet { #[pallet::call] impl Pallet { - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::set_authorised_caller())] pub fn set_authorised_caller( origin: OriginFor, authorised_caller: T::AccountId, @@ -288,7 +302,7 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::begin_billing_report())] pub fn begin_billing_report( origin: OriginFor, cluster_id: ClusterId, @@ -316,7 +330,7 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::begin_charging_customers())] pub fn begin_charging_customers( origin: OriginFor, cluster_id: ClusterId, @@ -342,7 +356,7 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::send_charging_customers_batch(payers.len().saturated_into()))] pub fn send_charging_customers_batch( origin: OriginFor, cluster_id: ClusterId, @@ -353,6 +367,11 @@ pub mod pallet { let caller = ensure_signed(origin)?; ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); + ensure!( + !payers.is_empty() && payers.len() <= MaxBatchSize::get() as usize, + Error::::BatchSizeIsOutOfBounds + ); + let billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; @@ -475,7 +494,7 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::end_charging_customers())] pub fn end_charging_customers( origin: OriginFor, cluster_id: ClusterId, @@ -573,7 +592,7 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::begin_rewarding_providers())] pub fn begin_rewarding_providers( origin: OriginFor, cluster_id: ClusterId, @@ -604,7 +623,7 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::send_rewarding_providers_batch(payees.len().saturated_into()))] pub fn send_rewarding_providers_batch( origin: OriginFor, cluster_id: ClusterId, @@ -615,6 +634,11 @@ pub mod pallet { let caller = ensure_signed(origin)?; ensure!(Self::authorised_caller() == Some(caller), Error::::Unauthorised); + ensure!( + !payees.is_empty() && payees.len() <= MaxBatchSize::get() as usize, + Error::::BatchSizeIsOutOfBounds + ); + let billing_report = ActiveBillingReports::::try_get(cluster_id, era) .map_err(|_| Error::::BillingReportDoesNotExist)?; @@ -681,7 +705,7 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::end_rewarding_providers())] pub fn end_rewarding_providers( origin: OriginFor, cluster_id: ClusterId, @@ -711,7 +735,7 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::end_billing_report())] pub fn end_billing_report( origin: OriginFor, cluster_id: ClusterId, diff --git a/pallets/ddc-payouts/src/mock.rs b/pallets/ddc-payouts/src/mock.rs index dc519a4a3..3ef864f9a 100644 --- a/pallets/ddc-payouts/src/mock.rs +++ b/pallets/ddc-payouts/src/mock.rs @@ -2,15 +2,20 @@ #![allow(dead_code)] -use ddc_primitives::{ClusterBondingParams, ClusterFeesParams, ClusterPricingParams, NodeType}; +use ddc_primitives::{ + ClusterBondingParams, ClusterFeesParams, ClusterGovParams, ClusterParams, ClusterPricingParams, + NodeType, +}; use ddc_traits::{ - cluster::{ClusterVisitor, ClusterVisitorError}, - customer::CustomerCharger, + cluster::{ClusterCreator, ClusterVisitor, ClusterVisitorError}, + customer::{CustomerCharger, CustomerDepositor}, pallet::PalletVisitor, }; use frame_election_provider_support::SortedListProvider; use frame_support::{ - construct_runtime, parameter_types, + construct_runtime, + dispatch::DispatchError, + parameter_types, traits::{ConstU32, ConstU64, Everything}, weights::constants::RocksDbWeight, PalletId, @@ -21,7 +26,6 @@ use sp_io::TestExternalities; use sp_runtime::{ testing::Header, traits::{BlakeTwo256, IdentityLookup}, - DispatchError, }; use sp_std::prelude::*; @@ -102,9 +106,12 @@ impl crate::pallet::Config for Test { type PalletId = PayoutsPalletId; type Currency = Balances; type CustomerCharger = TestCustomerCharger; + type CustomerDepositor = TestCustomerDepositor; type ClusterVisitor = TestClusterVisitor; type TreasuryVisitor = TestTreasuryVisitor; type ValidatorList = TestValidatorVisitor; + type ClusterCreator = TestClusterCreator; + type WeightInfo = (); } pub struct TestCustomerCharger; @@ -133,6 +140,29 @@ impl CustomerCharger for TestCustomerCharger { } } +pub struct TestClusterCreator; +impl ClusterCreator for TestClusterCreator { + fn create_new_cluster( + _cluster_id: ClusterId, + _cluster_manager_id: T::AccountId, + _cluster_reserve_id: T::AccountId, + _cluster_params: ClusterParams, + _cluster_gov_params: ClusterGovParams, + ) -> DispatchResult { + Ok(()) + } +} + +pub struct TestCustomerDepositor; +impl CustomerDepositor for TestCustomerDepositor { + fn deposit(_customer: T::AccountId, _amount: u128) -> Result<(), DispatchError> { + Ok(()) + } + fn deposit_extra(_customer: T::AccountId, _amount: u128) -> Result<(), DispatchError> { + Ok(()) + } +} + pub const RESERVE_ACCOUNT_ID: AccountId = 999; pub const TREASURY_ACCOUNT_ID: AccountId = 888; pub const VALIDATOR1_ACCOUNT_ID: AccountId = 111; diff --git a/pallets/ddc-payouts/src/weights.rs b/pallets/ddc-payouts/src/weights.rs new file mode 100644 index 000000000..e4764f492 --- /dev/null +++ b/pallets/ddc-payouts/src/weights.rs @@ -0,0 +1,210 @@ +//! Autogenerated weights for pallet_ddc_payouts +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-11-30, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `Yahors-MacBook-Pro.local`, CPU: `` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// ./target/debug/cere +// benchmark +// pallet +// --chain=dev +// --execution=wasm +// --pallet=pallet-ddc-payouts +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --template=./.maintain/frame-weight-template-clippy.hbs +// --output=pallets/ddc-payouts/src/weights.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_ddc_payouts. +pub trait WeightInfo { + fn set_authorised_caller() -> Weight; + fn begin_billing_report() -> Weight; + fn begin_charging_customers() -> Weight; + fn send_charging_customers_batch(b: u32, ) -> Weight; + fn end_charging_customers() -> Weight; + fn begin_rewarding_providers() -> Weight; + fn send_rewarding_providers_batch(b: u32, ) -> Weight; + fn end_rewarding_providers() -> Weight; + fn end_billing_report() -> Weight; +} + +/// Weights for pallet_ddc_payouts using the Substrate node and recommended hardware. +pub struct SubstrateWeight(PhantomData); +impl WeightInfo for SubstrateWeight { + // Storage: DdcPayouts AuthorisedCaller (r:0 w:1) + fn set_authorised_caller() -> Weight { + Weight::from_ref_time(251_000_000_u64) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + fn begin_billing_report() -> Weight { + Weight::from_ref_time(466_000_000_u64) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + fn begin_charging_customers() -> Weight { + Weight::from_ref_time(440_000_000_u64) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + // Storage: DdcClusters ClustersGovParams (r:1 w:0) + // Storage: DdcCustomers Ledger (r:1 w:1) + // Storage: System Account (r:2 w:2) + // Storage: DdcPayouts DebtorCustomers (r:1 w:1) + /// The range of component `b` is `[1, 1000]`. + fn send_charging_customers_batch(b: u32, ) -> Weight { + Weight::from_ref_time(1_267_000_000_u64) + // Standard Error: 3_691_054 + .saturating_add(Weight::from_ref_time(557_422_673_u64).saturating_mul(b as u64)) + .saturating_add(T::DbWeight::get().reads(7_u64)) + .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(b as u64))) + .saturating_add(T::DbWeight::get().writes(5_u64)) + .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(b as u64))) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + // Storage: DdcClusters ClustersGovParams (r:1 w:0) + // Storage: System Account (r:3 w:3) + // Storage: DdcClusters Clusters (r:1 w:0) + // Storage: Staking CounterForValidators (r:1 w:0) + // Storage: Staking Validators (r:2 w:0) + fn end_charging_customers() -> Weight { + Weight::from_ref_time(1_978_000_000_u64) + .saturating_add(T::DbWeight::get().reads(10_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + fn begin_rewarding_providers() -> Weight { + Weight::from_ref_time(446_000_000_u64) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + // Storage: System Account (r:2 w:2) + /// The range of component `b` is `[1, 1000]`. + fn send_rewarding_providers_batch(b: u32, ) -> Weight { + Weight::from_ref_time(758_000_000_u64) + // Standard Error: 148_210 + .saturating_add(Weight::from_ref_time(336_218_526_u64).saturating_mul(b as u64)) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b as u64))) + .saturating_add(T::DbWeight::get().writes(2_u64)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(b as u64))) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + fn end_rewarding_providers() -> Weight { + Weight::from_ref_time(458_000_000_u64) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + fn end_billing_report() -> Weight { + Weight::from_ref_time(449_000_000_u64) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + // Storage: DdcPayouts AuthorisedCaller (r:0 w:1) + fn set_authorised_caller() -> Weight { + Weight::from_ref_time(251_000_000_u64) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + fn begin_billing_report() -> Weight { + Weight::from_ref_time(466_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + fn begin_charging_customers() -> Weight { + Weight::from_ref_time(440_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + // Storage: DdcClusters ClustersGovParams (r:1 w:0) + // Storage: DdcCustomers Ledger (r:1 w:1) + // Storage: System Account (r:2 w:2) + // Storage: DdcPayouts DebtorCustomers (r:1 w:1) + /// The range of component `b` is `[1, 1000]`. + fn send_charging_customers_batch(b: u32, ) -> Weight { + Weight::from_ref_time(1_267_000_000_u64) + // Standard Error: 3_691_054 + .saturating_add(Weight::from_ref_time(557_422_673_u64).saturating_mul(b as u64)) + .saturating_add(RocksDbWeight::get().reads(7_u64)) + .saturating_add(RocksDbWeight::get().reads((2_u64).saturating_mul(b as u64))) + .saturating_add(RocksDbWeight::get().writes(5_u64)) + .saturating_add(RocksDbWeight::get().writes((2_u64).saturating_mul(b as u64))) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + // Storage: DdcClusters ClustersGovParams (r:1 w:0) + // Storage: System Account (r:3 w:3) + // Storage: DdcClusters Clusters (r:1 w:0) + // Storage: Staking CounterForValidators (r:1 w:0) + // Storage: Staking Validators (r:2 w:0) + fn end_charging_customers() -> Weight { + Weight::from_ref_time(1_978_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(10_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + fn begin_rewarding_providers() -> Weight { + Weight::from_ref_time(446_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + // Storage: System Account (r:2 w:2) + /// The range of component `b` is `[1, 1000]`. + fn send_rewarding_providers_batch(b: u32, ) -> Weight { + Weight::from_ref_time(758_000_000_u64) + // Standard Error: 148_210 + .saturating_add(Weight::from_ref_time(336_218_526_u64).saturating_mul(b as u64)) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(b as u64))) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(b as u64))) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + fn end_rewarding_providers() -> Weight { + Weight::from_ref_time(458_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) + // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) + fn end_billing_report() -> Weight { + Weight::from_ref_time(449_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 56df30ee5..eaa458e25 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -20,7 +20,7 @@ pub struct ClusterParams { // ClusterGovParams includes Governance sensitive parameters #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq, Default)] #[scale_info(skip_type_params(Balance, BlockNumber, T))] pub struct ClusterGovParams { pub treasury_share: Perbill, diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 232284a86..4ef882790 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -220,6 +220,7 @@ runtime-benchmarks = [ "pallet-ddc-clusters/runtime-benchmarks", "pallet-ddc-nodes/runtime-benchmarks", "pallet-ddc-staking/runtime-benchmarks", + "pallet-ddc-payouts/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-tips/runtime-benchmarks", "pallet-treasury/runtime-benchmarks", diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 0ef21b0fa..5b0d59c14 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1379,9 +1379,12 @@ impl pallet_ddc_payouts::Config for Runtime { type PalletId = PayoutsPalletId; type Currency = Balances; type CustomerCharger = DdcCustomers; + type CustomerDepositor = DdcCustomers; type ClusterVisitor = DdcClusters; type TreasuryVisitor = TreasureWrapper; type ValidatorList = pallet_staking::UseValidatorsMap; + type ClusterCreator = DdcClusters; + type WeightInfo = pallet_ddc_payouts::weights::SubstrateWeight; } construct_runtime!( @@ -1547,6 +1550,7 @@ mod benches { [pallet_ddc_clusters, DdcClusters] [pallet_ddc_staking, DdcStaking] [pallet_ddc_nodes, DdcNodes] + [pallet_ddc_payouts, DdcPayouts] [frame_system, SystemBench::] [pallet_timestamp, Timestamp] [pallet_tips, Tips] diff --git a/traits/src/customer.rs b/traits/src/customer.rs index 80af26050..ac428137f 100644 --- a/traits/src/customer.rs +++ b/traits/src/customer.rs @@ -1,4 +1,7 @@ +use core::u128; + use sp_runtime::DispatchError; + pub trait CustomerCharger { fn charge_content_owner( content_owner: T::AccountId, @@ -6,3 +9,8 @@ pub trait CustomerCharger { amount: u128, ) -> Result; } + +pub trait CustomerDepositor { + fn deposit(customer: T::AccountId, amount: u128) -> Result<(), DispatchError>; + fn deposit_extra(customer: T::AccountId, amount: u128) -> Result<(), DispatchError>; +} From 7d31190cc24a3353ece88256734d7cd1b059caf6 Mon Sep 17 00:00:00 2001 From: Raid5594 <52794079+Raid5594@users.noreply.github.com> Date: Tue, 5 Dec 2023 00:32:55 +0100 Subject: [PATCH 559/583] Feature/extend clusters tests (#184) - improve test coverage to over 80% - replace copy/pasted arguments with variables - add benchmarking to tests --------- Co-authored-by: aie0 <149175774+aie0@users.noreply.github.com> --- pallets/ddc-clusters/src/benchmarking.rs | 6 + pallets/ddc-clusters/src/mock.rs | 39 ++- pallets/ddc-clusters/src/tests.rs | 349 +++++++++++++++++------ primitives/src/lib.rs | 1 + 4 files changed, 306 insertions(+), 89 deletions(-) diff --git a/pallets/ddc-clusters/src/benchmarking.rs b/pallets/ddc-clusters/src/benchmarking.rs index bf9ec779b..a900921ec 100644 --- a/pallets/ddc-clusters/src/benchmarking.rs +++ b/pallets/ddc-clusters/src/benchmarking.rs @@ -110,4 +110,10 @@ benchmarks! { verify { assert_eq!(ClustersGovParams::::try_get(cluster_id).unwrap(), new_cluster_gov_params); } + + impl_benchmark_test_suite!( + DdcClusters, + crate::mock::ExtBuilder.build(), + crate::mock::Test, + ); } diff --git a/pallets/ddc-clusters/src/mock.rs b/pallets/ddc-clusters/src/mock.rs index a6baae247..a516c990e 100644 --- a/pallets/ddc-clusters/src/mock.rs +++ b/pallets/ddc-clusters/src/mock.rs @@ -18,7 +18,7 @@ use sp_runtime::{ traits::{ BlakeTwo256, Convert, Extrinsic as ExtrinsicT, IdentifyAccount, IdentityLookup, Verify, }, - MultiSignature, + MultiSignature, Perbill, }; use crate::{self as pallet_ddc_clusters, *}; @@ -229,7 +229,7 @@ impl StakerCreator> for TestStaker { pub struct ExtBuilder; impl ExtBuilder { - fn build(self) -> TestExternalities { + pub fn build(self) -> TestExternalities { sp_tracing::try_init_simple(); let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); @@ -243,6 +243,41 @@ impl ExtBuilder { } .assimilate_storage(&mut storage); + let cluster_gov_params = ClusterGovParams { + treasury_share: Perbill::from_float(0.05), + validators_share: Perbill::from_float(0.01), + cluster_reserve_share: Perbill::from_float(0.02), + cdn_bond_size: 100, + cdn_chill_delay: 50, + cdn_unbonding_delay: 50, + storage_bond_size: 100, + storage_chill_delay: 50, + storage_unbonding_delay: 50, + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + }; + + let node_pub_key = NodePubKey::CDNPubKey(AccountId::from([0; 32])); + + // For testing purposes only + pallet_ddc_clusters::GenesisConfig::::default().build(); + + if let Ok(cluster) = Cluster::new( + ClusterId::from([0; 20]), + AccountId::from([0; 32]), + AccountId::from([0; 32]), + ClusterParams { node_provider_auth_contract: Some(AccountId::from([0; 32])) }, + ) { + let _ = pallet_ddc_clusters::GenesisConfig:: { + clusters: vec![cluster], + clusters_gov_params: vec![(ClusterId::from([0; 20]), cluster_gov_params)], + clusters_nodes: vec![(ClusterId::from([0; 20]), vec![node_pub_key])], + } + .assimilate_storage(&mut storage); + } + TestExternalities::new(storage) } pub fn build_and_execute(self, test: impl FnOnce()) { diff --git a/pallets/ddc-clusters/src/tests.rs b/pallets/ddc-clusters/src/tests.rs index a81f41b7a..768ba50b9 100644 --- a/pallets/ddc-clusters/src/tests.rs +++ b/pallets/ddc-clusters/src/tests.rs @@ -1,10 +1,14 @@ //! Tests for the module. -use ddc_primitives::{CDNNodeParams, ClusterId, ClusterParams, NodeParams, NodePubKey}; +use ddc_primitives::{ + CDNNodeParams, ClusterBondingParams, ClusterFeesParams, ClusterId, ClusterParams, + ClusterPricingParams, NodeParams, NodePubKey, +}; +use ddc_traits::cluster::ClusterManager; use frame_support::{assert_noop, assert_ok, error::BadOrigin}; use frame_system::Config; use hex_literal::hex; -use sp_runtime::{traits::Hash, AccountId32, Perbill}; +use sp_runtime::{traits::Hash, Perbill}; use super::{mock::*, *}; @@ -13,6 +17,11 @@ fn create_cluster_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); + let cluster_id = ClusterId::from([1; 20]); + let cluster_manager_id = AccountId::from([1; 32]); + let cluster_reserve_id = AccountId::from([2; 32]); + let auth_contract = AccountId::from([3; 32]); + let cluster_gov_params = ClusterGovParams { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), @@ -33,10 +42,10 @@ fn create_cluster_works() { assert_noop!( DdcClusters::create_cluster( RuntimeOrigin::signed(AccountId::from([1; 32])), - ClusterId::from([1; 20]), - AccountId::from([1; 32]), - AccountId::from([2; 32]), - ClusterParams { node_provider_auth_contract: Some(AccountId::from([1; 32])) }, + cluster_id, + cluster_manager_id.clone(), + cluster_reserve_id.clone(), + ClusterParams { node_provider_auth_contract: Some(auth_contract.clone()) }, cluster_gov_params.clone() ), BadOrigin @@ -45,10 +54,10 @@ fn create_cluster_works() { // Creating 1 cluster should work fine assert_ok!(DdcClusters::create_cluster( RuntimeOrigin::root(), - ClusterId::from([1; 20]), - AccountId::from([1; 32]), - AccountId::from([2; 32]), - ClusterParams { node_provider_auth_contract: Some(AccountId::from([1; 32])) }, + cluster_id, + cluster_manager_id.clone(), + cluster_reserve_id.clone(), + ClusterParams { node_provider_auth_contract: Some(auth_contract.clone()) }, cluster_gov_params.clone() )); @@ -56,20 +65,20 @@ fn create_cluster_works() { assert_noop!( DdcClusters::create_cluster( RuntimeOrigin::root(), - ClusterId::from([1; 20]), - AccountId::from([1; 32]), - AccountId::from([2; 32]), - ClusterParams { node_provider_auth_contract: Some(AccountId::from([1; 32])) }, + cluster_id, + cluster_manager_id, + cluster_reserve_id, + ClusterParams { node_provider_auth_contract: Some(auth_contract) }, cluster_gov_params ), Error::::ClusterAlreadyExists ); + // Checking storage + assert!(Clusters::::contains_key(cluster_id)); // Checking that event was emitted assert_eq!(System::events().len(), 1); - System::assert_last_event( - Event::ClusterCreated { cluster_id: ClusterId::from([1; 20]) }.into(), - ) + System::assert_last_event(Event::ClusterCreated { cluster_id }.into()) }) } @@ -78,14 +87,19 @@ fn add_and_delete_node_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); + let cluster_id = ClusterId::from([1; 20]); + let cluster_manager_id = AccountId::from([1; 32]); + let cluster_reserve_id = AccountId::from([2; 32]); + let node_pub_key = AccountId::from([3; 32]); + let contract_id = deploy_contract(); // Cluster doesn't exist assert_noop!( DdcClusters::add_node( - RuntimeOrigin::signed(AccountId::from([2; 32])), - ClusterId::from([1; 20]), - NodePubKey::CDNPubKey(AccountId::from([4; 32])), + RuntimeOrigin::signed(cluster_manager_id.clone()), + cluster_id, + NodePubKey::CDNPubKey(node_pub_key.clone()), ), Error::::ClusterDoesNotExist ); @@ -93,10 +107,10 @@ fn add_and_delete_node_works() { // Creating 1 cluster should work fine assert_ok!(DdcClusters::create_cluster( RuntimeOrigin::root(), - ClusterId::from([1; 20]), - AccountId::from([1; 32]), - AccountId::from([2; 32]), - ClusterParams { node_provider_auth_contract: Some(AccountId::from([1; 32])) }, + cluster_id, + cluster_manager_id.clone(), + cluster_reserve_id.clone(), + ClusterParams { node_provider_auth_contract: Some(cluster_manager_id.clone()) }, ClusterGovParams { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), @@ -117,9 +131,9 @@ fn add_and_delete_node_works() { // Not Cluster Manager assert_noop!( DdcClusters::add_node( - RuntimeOrigin::signed(AccountId::from([2; 32])), - ClusterId::from([1; 20]), - NodePubKey::CDNPubKey(AccountId::from([4; 32])), + RuntimeOrigin::signed(cluster_reserve_id), + cluster_id, + NodePubKey::CDNPubKey(node_pub_key.clone()), ), Error::::OnlyClusterManager ); @@ -127,17 +141,13 @@ fn add_and_delete_node_works() { // Node doesn't exist assert_noop!( DdcClusters::add_node( - RuntimeOrigin::signed(AccountId::from([1; 32])), - ClusterId::from([1; 20]), - NodePubKey::CDNPubKey(AccountId::from([4; 32])), + RuntimeOrigin::signed(cluster_manager_id.clone()), + cluster_id, + NodePubKey::CDNPubKey(node_pub_key.clone()), ), Error::::AttemptToAddNonExistentNode ); - // Create node - let bytes = [4u8; 32]; - let node_pub_key = AccountId32::from(bytes); - let cdn_node_params = CDNNodeParams { host: vec![1u8, 255], http_port: 35000u16, @@ -147,41 +157,46 @@ fn add_and_delete_node_works() { // Node created assert_ok!(DdcNodes::create_node( - RuntimeOrigin::signed(AccountId::from([1; 32])), - NodePubKey::CDNPubKey(node_pub_key), + RuntimeOrigin::signed(cluster_manager_id.clone()), + NodePubKey::CDNPubKey(node_pub_key.clone()), NodeParams::CDNParams(cdn_node_params) )); // Node doesn't exist assert_noop!( DdcClusters::add_node( - RuntimeOrigin::signed(AccountId::from([1; 32])), - ClusterId::from([1; 20]), - NodePubKey::CDNPubKey(AccountId::from([4; 32])), + RuntimeOrigin::signed(cluster_manager_id.clone()), + cluster_id, + NodePubKey::CDNPubKey(node_pub_key.clone()), ), Error::::NodeAuthContractCallFailed ); // Set the correct address for auth contract assert_ok!(DdcClusters::set_cluster_params( - RuntimeOrigin::signed(AccountId::from([1; 32])), - ClusterId::from([1; 20]), + RuntimeOrigin::signed(cluster_manager_id.clone()), + cluster_id, ClusterParams { node_provider_auth_contract: Some(contract_id) }, )); - // Node doesn't exist + // Node added succesfully assert_ok!(DdcClusters::add_node( - RuntimeOrigin::signed(AccountId::from([1; 32])), - ClusterId::from([1; 20]), - NodePubKey::CDNPubKey(AccountId::from([4; 32])), + RuntimeOrigin::signed(cluster_manager_id.clone()), + cluster_id, + NodePubKey::CDNPubKey(node_pub_key.clone()), + )); + + assert!(>::contains_node( + &cluster_id, + &NodePubKey::CDNPubKey(node_pub_key.clone()) )); // Node already assigned assert_noop!( DdcClusters::add_node( - RuntimeOrigin::signed(AccountId::from([1; 32])), - ClusterId::from([1; 20]), - NodePubKey::CDNPubKey(AccountId::from([4; 32])), + RuntimeOrigin::signed(cluster_manager_id.clone()), + cluster_id, + NodePubKey::CDNPubKey(node_pub_key.clone()), ), Error::::AttemptToAddAlreadyAssignedNode ); @@ -189,24 +204,24 @@ fn add_and_delete_node_works() { // Checking that event was emitted System::assert_last_event( Event::ClusterNodeAdded { - cluster_id: ClusterId::from([1; 20]), - node_pub_key: NodePubKey::CDNPubKey(AccountId::from([4; 32])), + cluster_id, + node_pub_key: NodePubKey::CDNPubKey(node_pub_key.clone()), } .into(), ); // Remove node assert_ok!(DdcClusters::remove_node( - RuntimeOrigin::signed(AccountId::from([1; 32])), - ClusterId::from([1; 20]), - NodePubKey::CDNPubKey(AccountId::from([4; 32])), + RuntimeOrigin::signed(cluster_manager_id.clone()), + cluster_id, + NodePubKey::CDNPubKey(node_pub_key.clone()), )); // Checking that event was emitted System::assert_last_event( Event::ClusterNodeRemoved { - cluster_id: ClusterId::from([1; 20]), - node_pub_key: NodePubKey::CDNPubKey(AccountId::from([4; 32])), + cluster_id, + node_pub_key: NodePubKey::CDNPubKey(node_pub_key.clone()), } .into(), ); @@ -214,9 +229,9 @@ fn add_and_delete_node_works() { // Remove node should fail assert_noop!( DdcClusters::remove_node( - RuntimeOrigin::signed(AccountId::from([1; 32])), - ClusterId::from([1; 20]), - NodePubKey::CDNPubKey(AccountId::from([4; 32])), + RuntimeOrigin::signed(cluster_manager_id), + cluster_id, + NodePubKey::CDNPubKey(node_pub_key), ), Error::::AttemptToRemoveNotAssignedNode ); @@ -233,8 +248,10 @@ fn add_and_delete_node_works() { } fn deploy_contract() -> AccountId { + let cluster_manager_id = AccountId::from([1; 32]); + let node_pub_key = AccountId::from([3; 32]); // Admin account who deploys the contract. - let alice = AccountId::from([1; 32]); + let alice = cluster_manager_id; let _ = Balances::deposit_creating(&alice, 1_000_000_000_000); // Load the contract code. @@ -261,7 +278,7 @@ fn add_and_delete_node_works() { let contract_id = Contracts::contract_address(&alice, &wasm_hash, &[]); pub const ADD_DDC_NODE_SELECTOR: [u8; 4] = hex!("7a04093d"); - let node_pub_key = NodePubKey::CDNPubKey(AccountId::from([4; 32])); + let node_pub_key = NodePubKey::CDNPubKey(node_pub_key); let call_data = { // is_authorized(node_provider: AccountId, node: Vec, node_variant: u8) -> bool @@ -291,12 +308,18 @@ fn set_cluster_params_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); + let cluster_id = ClusterId::from([1; 20]); + let cluster_manager_id = AccountId::from([1; 32]); + let cluster_reserve_id = AccountId::from([2; 32]); + let auth_contract_1 = AccountId::from([3; 32]); + let auth_contract_2 = AccountId::from([4; 32]); + // Cluster doesn't exist assert_noop!( DdcClusters::set_cluster_params( - RuntimeOrigin::signed(AccountId::from([2; 32])), - ClusterId::from([2; 20]), - ClusterParams { node_provider_auth_contract: Some(AccountId::from([2; 32])) }, + RuntimeOrigin::signed(cluster_manager_id.clone()), + cluster_id, + ClusterParams { node_provider_auth_contract: Some(auth_contract_1.clone()) }, ), Error::::ClusterDoesNotExist ); @@ -304,10 +327,10 @@ fn set_cluster_params_works() { // Creating 1 cluster should work fine assert_ok!(DdcClusters::create_cluster( RuntimeOrigin::root(), - ClusterId::from([1; 20]), - AccountId::from([1; 32]), - AccountId::from([2; 32]), - ClusterParams { node_provider_auth_contract: Some(AccountId::from([1; 32])) }, + cluster_id, + cluster_manager_id.clone(), + cluster_reserve_id.clone(), + ClusterParams { node_provider_auth_contract: Some(auth_contract_1) }, ClusterGovParams { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), @@ -327,24 +350,22 @@ fn set_cluster_params_works() { assert_noop!( DdcClusters::set_cluster_params( - RuntimeOrigin::signed(AccountId::from([2; 32])), - ClusterId::from([1; 20]), - ClusterParams { node_provider_auth_contract: Some(AccountId::from([2; 32])) }, + RuntimeOrigin::signed(cluster_reserve_id), + cluster_id, + ClusterParams { node_provider_auth_contract: Some(auth_contract_2.clone()) }, ), Error::::OnlyClusterManager ); assert_ok!(DdcClusters::set_cluster_params( - RuntimeOrigin::signed(AccountId::from([1; 32])), - ClusterId::from([1; 20]), - ClusterParams { node_provider_auth_contract: Some(AccountId::from([2; 32])) }, + RuntimeOrigin::signed(cluster_manager_id), + cluster_id, + ClusterParams { node_provider_auth_contract: Some(auth_contract_2) }, )); // Checking that event was emitted assert_eq!(System::events().len(), 2); - System::assert_last_event( - Event::ClusterParamsSet { cluster_id: ClusterId::from([1; 20]) }.into(), - ) + System::assert_last_event(Event::ClusterParamsSet { cluster_id }.into()) }) } @@ -353,6 +374,11 @@ fn set_cluster_gov_params_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); + let cluster_id = ClusterId::from([1; 20]); + let cluster_manager_id = AccountId::from([1; 32]); + let cluster_reserve_id = AccountId::from([2; 32]); + let auth_contract = AccountId::from([3; 32]); + let cluster_gov_params = ClusterGovParams { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), @@ -373,7 +399,7 @@ fn set_cluster_gov_params_works() { assert_noop!( DdcClusters::set_cluster_gov_params( RuntimeOrigin::root(), - ClusterId::from([2; 20]), + cluster_id, cluster_gov_params.clone() ), Error::::ClusterDoesNotExist @@ -381,17 +407,17 @@ fn set_cluster_gov_params_works() { assert_ok!(DdcClusters::create_cluster( RuntimeOrigin::root(), - ClusterId::from([1; 20]), - AccountId::from([1; 32]), - AccountId::from([2; 32]), - ClusterParams { node_provider_auth_contract: Some(AccountId::from([1; 32])) }, + cluster_id, + cluster_manager_id.clone(), + cluster_reserve_id, + ClusterParams { node_provider_auth_contract: Some(auth_contract) }, cluster_gov_params.clone() )); assert_noop!( DdcClusters::set_cluster_gov_params( - RuntimeOrigin::signed(AccountId::from([1; 32])), - ClusterId::from([1; 20]), + RuntimeOrigin::signed(cluster_manager_id), + cluster_id, cluster_gov_params.clone() ), BadOrigin @@ -399,14 +425,163 @@ fn set_cluster_gov_params_works() { assert_ok!(DdcClusters::set_cluster_gov_params( RuntimeOrigin::root(), - ClusterId::from([1; 20]), + cluster_id, cluster_gov_params )); // Checking that event was emitted assert_eq!(System::events().len(), 2); - System::assert_last_event( - Event::ClusterGovParamsSet { cluster_id: ClusterId::from([1; 20]) }.into(), - ) + System::assert_last_event(Event::ClusterGovParamsSet { cluster_id }.into()) + }) +} + +#[test] +fn cluster_visitor_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let cluster_id = ClusterId::from([1; 20]); + let cluster_manager_id = AccountId::from([1; 32]); + let cluster_reserve_id = AccountId::from([2; 32]); + let auth_contract = AccountId::from([3; 32]); + + let cluster_gov_params = ClusterGovParams { + treasury_share: Perbill::from_float(0.05), + validators_share: Perbill::from_float(0.01), + cluster_reserve_share: Perbill::from_float(0.02), + cdn_bond_size: 100, + cdn_chill_delay: 50, + cdn_unbonding_delay: 50, + storage_bond_size: 100, + storage_chill_delay: 50, + storage_unbonding_delay: 50, + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + }; + + // Creating 1 cluster should work fine + assert_ok!(DdcClusters::create_cluster( + RuntimeOrigin::root(), + cluster_id, + cluster_manager_id, + cluster_reserve_id.clone(), + ClusterParams { node_provider_auth_contract: Some(auth_contract) }, + cluster_gov_params + )); + + assert_ok!(>::ensure_cluster(&cluster_id)); + + assert_eq!( + >::get_bond_size(&cluster_id, NodeType::CDN) + .unwrap(), + 100u128 + ); + assert_eq!( + >::get_bond_size(&cluster_id, NodeType::Storage) + .unwrap(), + 100u128 + ); + + assert_eq!( + >::get_pricing_params(&cluster_id).unwrap(), + ClusterPricingParams { + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + } + ); + + assert_eq!( + >::get_fees_params(&cluster_id).unwrap(), + ClusterFeesParams { + treasury_share: Perbill::from_float(0.05), + validators_share: Perbill::from_float(0.01), + cluster_reserve_share: Perbill::from_float(0.02) + } + ); + + assert_eq!( + >::get_reserve_account_id(&cluster_id).unwrap(), + cluster_reserve_id + ); + + assert_eq!( + >::get_chill_delay(&cluster_id, NodeType::CDN) + .unwrap(), + 50 + ); + assert_eq!( + >::get_chill_delay(&cluster_id, NodeType::Storage) + .unwrap(), + 50 + ); + + assert_eq!( + >::get_unbonding_delay(&cluster_id, NodeType::CDN) + .unwrap(), + 50 + ); + assert_eq!( + >::get_unbonding_delay( + &cluster_id, + NodeType::Storage + ) + .unwrap(), + 50 + ); + + assert_eq!( + >::get_bonding_params(&cluster_id).unwrap(), + ClusterBondingParams::<::BlockNumber> { + cdn_bond_size: 100, + cdn_chill_delay: 50, + cdn_unbonding_delay: 50, + storage_bond_size: 100, + storage_chill_delay: 50, + storage_unbonding_delay: 50, + } + ); + }) +} + +#[test] +fn cluster_creator_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let cluster_id = ClusterId::from([1; 20]); + let cluster_manager_id = AccountId::from([1; 32]); + let cluster_reserve_id = AccountId::from([2; 32]); + let auth_contract = AccountId::from([3; 32]); + + let cluster_gov_params = ClusterGovParams { + treasury_share: Perbill::from_float(0.05), + validators_share: Perbill::from_float(0.01), + cluster_reserve_share: Perbill::from_float(0.02), + cdn_bond_size: 100, + cdn_chill_delay: 50, + cdn_unbonding_delay: 50, + storage_bond_size: 100, + storage_chill_delay: 50, + storage_unbonding_delay: 50, + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + }; + + assert_ok!(>>::create_new_cluster( + cluster_id, + cluster_manager_id, + cluster_reserve_id, + ClusterParams { node_provider_auth_contract: Some(auth_contract) }, + cluster_gov_params + )); + + assert!(Clusters::::contains_key(cluster_id)); + assert!(ClustersGovParams::::contains_key(cluster_id)); }) } diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index eaa458e25..50082b645 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -53,6 +53,7 @@ pub struct ClusterFeesParams { pub cluster_reserve_share: Perbill, } +#[derive(Debug, PartialEq)] pub struct ClusterBondingParams { pub cdn_bond_size: u128, pub cdn_chill_delay: BlockNumber, From 7898edc12081fe8e8b2eec29245f83a9583a9974 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Sun, 10 Dec 2023 17:13:23 +0600 Subject: [PATCH 560/583] Invoke dprint in pre-commit hook (#191) --- dprint.json | 14 ++++---------- scripts/pre-commit.sh | 7 +++++++ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/dprint.json b/dprint.json index 82c59d3ee..46b8be32b 100644 --- a/dprint.json +++ b/dprint.json @@ -1,11 +1,5 @@ { - "includes": [ - "**/*.{toml}" - ], - "excludes": [ - "**/target" - ], - "plugins": [ - "https://plugins.dprint.dev/toml-0.5.3.wasm" - ] - } \ No newline at end of file + "includes": ["**/*.{toml}"], + "excludes": ["**/target"], + "plugins": ["https://plugins.dprint.dev/toml-0.5.3.wasm"] +} diff --git a/scripts/pre-commit.sh b/scripts/pre-commit.sh index 4106624b8..a01d1ba34 100755 --- a/scripts/pre-commit.sh +++ b/scripts/pre-commit.sh @@ -1,8 +1,15 @@ #!/bin/sh # Prevent committing badly formatted code + cargo fmt -- --check if [ $? -ne 0 ]; then echo "Run \`cargo fmt\` to fix formatting issues before committing." exit 1 fi + +dprint check +if [ $? -ne 0 ]; then + echo "Run \`dprint fmt\` to fix formatting issues before committing." + exit 1 +fi From d4427585df22f5570ad079230bc711419592b609 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 11 Dec 2023 14:25:29 +0600 Subject: [PATCH 561/583] Add genesis config for DDC pallets (#176) --- Cargo.lock | 1 + docs/genesis-state.md | 39 +++++ node/service/chain-specs/example.json | 232 ++++++++++++++++++++++++++ node/service/src/chain_spec.rs | 1 + pallets/ddc-customers/src/lib.rs | 36 +++- pallets/ddc-customers/src/mock.rs | 2 +- pallets/ddc-nodes/Cargo.toml | 2 + pallets/ddc-nodes/src/cdn_node.rs | 4 + pallets/ddc-nodes/src/lib.rs | 25 +++ pallets/ddc-nodes/src/storage_node.rs | 4 + 10 files changed, 341 insertions(+), 5 deletions(-) create mode 100644 docs/genesis-state.md create mode 100644 node/service/chain-specs/example.json diff --git a/Cargo.lock b/Cargo.lock index fe193760e..68d46882e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4805,6 +4805,7 @@ dependencies = [ "pallet-timestamp", "parity-scale-codec", "scale-info", + "serde", "sp-core", "sp-io", "sp-runtime", diff --git a/docs/genesis-state.md b/docs/genesis-state.md new file mode 100644 index 000000000..587683b62 --- /dev/null +++ b/docs/genesis-state.md @@ -0,0 +1,39 @@ +# State preset + +Sometimes we use the blockchain as a part of a test environment. +Those tests typically want a certain state of the blockchain. +One option is to make a script which sends a number of transactions to put the blockchain into the desired state. +But those scripts may become large and execution may take significant time. +Another option is to make a chain specification, a JSON file with the desired genesis state of the blockchain. +And launch the chain with the desired state from the first block. + +## Build a chain spec + +Chain specification is a JSON file which contains network parameters with the the initial runtime and a genesis state of the database for each runtime module. +There are two forms of chain specification - a human-readable _plain_ form where each runtime module is represented by it's name. +And a _raw_ form with key-value pairs which will be written to the database. + +1. Create a plain form chain spec. + + ```console + ./target/release/cere build-spec --chain=dev --disable-default-bootnode > plain.json + ``` + +1. Set genesis state for each module. + There is an example in `node/service/example.json`, you can copy everything except the `code` field value from it to the `plain.json`. + +1. Create a raw form chain spec. + + ```console + ./target/release/cere build-spec --chain=plain.json --disable-default-bootnode --raw > raw.json + ``` + +## Launch the chain + +```console +./target/release/cere --chain=raw.json --tmp --alice --unsafe-rpc-external --unsafe-ws-external --rpc-cors=all +``` + +## See also + +[docs.substrate.io: Create a custom chain specification](https://docs.substrate.io/tutorials/build-a-blockchain/add-trusted-nodes/#create-a-custom-chain-specification) diff --git a/node/service/chain-specs/example.json b/node/service/chain-specs/example.json new file mode 100644 index 000000000..7e3b5c97c --- /dev/null +++ b/node/service/chain-specs/example.json @@ -0,0 +1,232 @@ +{ + "name": "Development", + "id": "cere_dev", + "chainType": "Development", + "bootNodes": [], + "telemetryEndpoints": null, + "protocolId": "cere", + "properties": { + "ss58Format": 54, + "tokenDecimals": 10, + "tokenSymbol": "CERE" + }, + "forkBlocks": null, + "badBlocks": null, + "lightSyncState": null, + "codeSubstitutes": {}, + "genesis": { + "runtime": { + "system": { + "code": "0x00" + }, + "babe": { + "authorities": [], + "epochConfig": { + "c": [ + 1, + 4 + ], + "allowed_slots": "PrimaryAndSecondaryPlainSlots" + } + }, + "indices": { + "indices": [] + }, + "balances": { + "balances": [ + [ + "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + 10000000000000 + ], + [ + "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty", + 10000000000000 + ], + [ + "5GNJqTPyNqANBkUVMN1LPPrxXnFouWXoe2wNSmmEoLctxiZY", + 10000000000000 + ], + [ + "5HpG9w8EBLe5XCrbczpwq5TSXvedjrBGCwqxK1iQ7qUsSWFc", + 10000000000000 + ], + [ + "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y", + 10000000000000 + ] + ] + }, + "transactionPayment": { + "multiplier": "10000000000" + }, + "staking": { + "validatorCount": 1, + "minimumValidatorCount": 1, + "invulnerables": [ + "5GNJqTPyNqANBkUVMN1LPPrxXnFouWXoe2wNSmmEoLctxiZY" + ], + "forceEra": "NotForcing", + "slashRewardFraction": 100000000, + "canceledPayout": 0, + "stakers": [ + [ + "5GNJqTPyNqANBkUVMN1LPPrxXnFouWXoe2wNSmmEoLctxiZY", + "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + 1000000000000, + "Validator" + ] + ], + "minNominatorBond": 0, + "minValidatorBond": 0, + "maxValidatorCount": null, + "maxNominatorCount": null + }, + "session": { + "keys": [ + [ + "5GNJqTPyNqANBkUVMN1LPPrxXnFouWXoe2wNSmmEoLctxiZY", + "5GNJqTPyNqANBkUVMN1LPPrxXnFouWXoe2wNSmmEoLctxiZY", + { + "grandpa": "5FA9nQDVg267DEd8m1ZypXLBnvN7SFxYwV7ndqSYGiN9TTpu", + "babe": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + "im_online": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + "authority_discovery": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" + } + ] + ] + }, + "democracy": { + "phantom": null + }, + "council": { + "phantom": null, + "members": [] + }, + "technicalCommittee": { + "phantom": null, + "members": [ + "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty" + ] + }, + "elections": { + "members": [ + [ + "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + 10000000000 + ], + [ + "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty", + 10000000000 + ] + ] + }, + "technicalMembership": { + "members": [], + "phantom": null + }, + "grandpa": { + "authorities": [] + }, + "treasury": null, + "sudo": { + "key": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" + }, + "imOnline": { + "keys": [] + }, + "authorityDiscovery": { + "keys": [] + }, + "society": { + "pot": 0, + "members": [ + "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty" + ], + "maxMembers": 999 + }, + "vesting": { + "vesting": [] + }, + "nominationPools": { + "minJoinBond": 0, + "minCreateBond": 0, + "maxPools": 16, + "maxMembersPerPool": 32, + "maxMembers": 512 + }, + "ddcStaking": { + "cdns": [], + "storages": [] + }, + "ddcCustomers": { + "buckets": [ + [ + "0x0000000000000000000000000000000000000001", + "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty", + 10000000000 + ] + ] + }, + "ddcNodes": { + "storageNodes": [ + { + "pub_key": "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y", + "provider_id": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + "cluster_id": "0x0000000000000000000000000000000000000001", + "props": { + "host": [], + "http_port": 8080, + "grpc_port": 8081, + "p2p_port": 8082 + } + } + ], + "cdnNodes": [] + }, + "ddcClusters": { + "clusters": [ + { + "cluster_id": "0x0000000000000000000000000000000000000001", + "manager_id": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + "reserve_id": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + "props": { + "node_provider_auth_contract": null + } + } + ], + "clustersGovParams": [ + [ + "0x0000000000000000000000000000000000000001", + { + "treasury_share": 0, + "validators_share": 0, + "cluster_reserve_share": 0, + "cdn_bond_size": 0, + "cdn_chill_delay": 0, + "cdn_unbonding_delay": 0, + "storage_bond_size": 0, + "storage_chill_delay": 0, + "storage_unbonding_delay": 0, + "unit_per_mb_stored": 0, + "unit_per_mb_streamed": 0, + "unit_per_put_request": 0, + "unit_per_get_request": 0 + } + ] + ], + "clustersNodes": [ + [ + "0x0000000000000000000000000000000000000001", + [ + { + "StoragePubKey": "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y" + } + ] + ] + ] + } + } + } +} \ No newline at end of file diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index f17f9343f..12859a2c6 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -234,6 +234,7 @@ pub fn cere_dev_genesis( ddc_customers: Default::default(), nomination_pools: Default::default(), ddc_clusters: Default::default(), + ddc_nodes: Default::default(), } } diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index fcefa7036..5ccc4e0b8 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -262,23 +262,51 @@ pub mod pallet { } #[pallet::genesis_config] - pub struct GenesisConfig; + pub struct GenesisConfig { + pub buckets: Vec<(ClusterId, T::AccountId, BalanceOf)>, + } #[cfg(feature = "std")] - impl Default for GenesisConfig { + impl Default for GenesisConfig { fn default() -> Self { - Self + GenesisConfig { buckets: Default::default() } } } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl GenesisBuild for GenesisConfig { fn build(&self) { let account_id = >::account_id(); let min = ::Currency::minimum_balance(); if ::Currency::free_balance(&account_id) < min { let _ = ::Currency::make_free_balance_be(&account_id, min); } + + for &(ref cluster_id, ref owner_id, ref deposit) in &self.buckets { + let cur_bucket_id = >::get() + .checked_add(1) + .ok_or(Error::::ArithmeticOverflow) + .unwrap(); + >::set(cur_bucket_id); + + let bucket = Bucket { + bucket_id: cur_bucket_id, + owner_id: owner_id.clone(), + cluster_id: *cluster_id, + }; + >::insert(cur_bucket_id, bucket); + + let ledger = AccountsLedger::, T> { + owner: owner_id.clone(), + total: *deposit, + active: *deposit, + unlocking: Default::default(), + }; + >::insert(&ledger.owner, &ledger); + + ::Currency::deposit_into_existing(&account_id, *deposit) + .unwrap(); + } } } diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index 3b62bc757..0137a5e93 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -41,7 +41,7 @@ construct_runtime!( System: frame_system::{Pallet, Call, Config, Storage, Event}, Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - DdcCustomers: pallet_ddc_customers::{Pallet, Call, Storage, Config, Event}, + DdcCustomers: pallet_ddc_customers::{Pallet, Call, Storage, Config, Event}, } ); diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index 395c613c6..9369fd55e 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -11,6 +11,7 @@ frame-benchmarking = { default-features = false, git = "https://github.com/parit frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } +serde = { version = "1.0.136", default-features = false, features = ["derive"], optional = true } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -34,6 +35,7 @@ std = [ "sp-runtime/std", "sp-std/std", "sp-core/std", + "serde", ] runtime-benchmarks = [ "ddc-primitives/runtime-benchmarks", diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index edde9de68..7ec266f54 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -2,6 +2,8 @@ use codec::{Decode, Encode}; use ddc_primitives::{CDNNodePubKey, ClusterId, NodeParams, NodePubKey, NodeType}; use frame_support::{parameter_types, BoundedVec}; use scale_info::TypeInfo; +#[cfg(feature = "std")] +use serde::{Deserialize, Serialize}; use sp_runtime::RuntimeDebug; use sp_std::prelude::*; @@ -12,6 +14,7 @@ parameter_types! { pub MaxHostLen: u8 = 255; } +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] #[scale_info(skip_type_params(T))] pub struct CDNNode { @@ -21,6 +24,7 @@ pub struct CDNNode { pub props: CDNNodeProps, } +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct CDNNodeProps { pub host: BoundedVec, diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index a6ce51fb7..b0ab6e6b2 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -92,6 +92,31 @@ pub mod pallet { #[pallet::getter(fn cdn_nodes)] pub type CDNNodes = StorageMap<_, Blake2_128Concat, CDNNodePubKey, CDNNode>; + #[pallet::genesis_config] + pub struct GenesisConfig { + pub storage_nodes: Vec>, + pub cdn_nodes: Vec>, + } + + #[cfg(feature = "std")] + impl Default for GenesisConfig { + fn default() -> Self { + GenesisConfig { storage_nodes: Default::default(), cdn_nodes: Default::default() } + } + } + + #[pallet::genesis_build] + impl GenesisBuild for GenesisConfig { + fn build(&self) { + for storage_node in &self.storage_nodes { + >::insert(storage_node.pub_key.clone(), storage_node); + } + for cdn_node in &self.cdn_nodes { + >::insert(cdn_node.pub_key.clone(), cdn_node); + } + } + } + #[pallet::call] impl Pallet { #[pallet::weight(T::WeightInfo::create_node())] diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index d299bfe31..3a6798c71 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -2,6 +2,8 @@ use codec::{Decode, Encode}; use ddc_primitives::{ClusterId, NodeParams, NodePubKey, NodeType, StorageNodePubKey}; use frame_support::{parameter_types, BoundedVec}; use scale_info::TypeInfo; +#[cfg(feature = "std")] +use serde::{Deserialize, Serialize}; use sp_runtime::RuntimeDebug; use crate::node::{NodeError, NodeProps, NodeTrait}; @@ -11,6 +13,7 @@ parameter_types! { pub MaxHostLen: u8 = 255; } +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] #[scale_info(skip_type_params(T))] pub struct StorageNode { @@ -20,6 +23,7 @@ pub struct StorageNode { pub props: StorageNodeProps, } +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNodeProps { pub host: BoundedVec, From db328cf6697ab44844dcb1aafd5562d8a4e25d30 Mon Sep 17 00:00:00 2001 From: Rakan Al-Huneiti Date: Wed, 13 Dec 2023 10:55:15 +0300 Subject: [PATCH 562/583] Create dev-latest image and tag it properly (#194) --- .github/workflows/dev.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/dev.yaml b/.github/workflows/dev.yaml index 045091f41..163c796df 100644 --- a/.github/workflows/dev.yaml +++ b/.github/workflows/dev.yaml @@ -3,7 +3,6 @@ on: push: branches: - 'dev' - - 'deployment-0.9.30' workflow_dispatch: env: @@ -69,7 +68,7 @@ jobs: tags: | ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} - ${{ steps.login-ecr.outputs.registry }}/pos-network-node:deployment-0.9.30-latest + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest - name: Copy wasm artifacts from the image run: | From ca3cb0721deaf02b0d3a7b7c4bb55d4532b4e35e Mon Sep 17 00:00:00 2001 From: Yahor Tsaryk Date: Fri, 15 Dec 2023 13:17:57 +0100 Subject: [PATCH 563/583] CDN node type is removed (#197) This PR removes the CDN node type from the protocol as now the DDC network uses Storage nodes with enabled cache mode instead of CDN nodes --- node/service/chain-specs/example.json | 5 - pallets/ddc-clusters/src/benchmarking.rs | 126 ++++---- pallets/ddc-clusters/src/lib.rs | 6 - pallets/ddc-clusters/src/mock.rs | 5 +- pallets/ddc-clusters/src/testing_utils.rs | 18 +- pallets/ddc-clusters/src/tests.rs | 66 ++--- pallets/ddc-clusters/src/weights.rs | 113 ++++---- pallets/ddc-customers/src/benchmarking.rs | 79 +++-- pallets/ddc-customers/src/lib.rs | 9 +- pallets/ddc-customers/src/mock.rs | 15 - pallets/ddc-customers/src/weights.rs | 63 ++-- pallets/ddc-nodes/src/benchmarking.rs | 42 +-- pallets/ddc-nodes/src/cdn_node.rs | 106 ------- pallets/ddc-nodes/src/lib.rs | 42 +-- pallets/ddc-nodes/src/node.rs | 27 -- pallets/ddc-nodes/src/storage_node.rs | 6 +- pallets/ddc-nodes/src/testing_utils.rs | 10 +- pallets/ddc-nodes/src/tests.rs | 336 +--------------------- pallets/ddc-nodes/src/weights.rs | 83 +++--- pallets/ddc-payouts/src/tests.rs | 6 +- pallets/ddc-payouts/src/weights.rs | 60 ++-- pallets/ddc-staking/README.md | 3 +- pallets/ddc-staking/src/benchmarking.rs | 41 ++- pallets/ddc-staking/src/lib.rs | 163 ++--------- pallets/ddc-staking/src/mock.rs | 69 +---- pallets/ddc-staking/src/testing_utils.rs | 29 +- pallets/ddc-staking/src/tests.rs | 211 +++----------- pallets/ddc-staking/src/weights.rs | 116 ++------ primitives/src/lib.rs | 20 -- 29 files changed, 446 insertions(+), 1429 deletions(-) delete mode 100644 pallets/ddc-nodes/src/cdn_node.rs diff --git a/node/service/chain-specs/example.json b/node/service/chain-specs/example.json index 7e3b5c97c..a9394d98b 100644 --- a/node/service/chain-specs/example.json +++ b/node/service/chain-specs/example.json @@ -157,7 +157,6 @@ "maxMembers": 512 }, "ddcStaking": { - "cdns": [], "storages": [] }, "ddcCustomers": { @@ -183,7 +182,6 @@ } } ], - "cdnNodes": [] }, "ddcClusters": { "clusters": [ @@ -203,9 +201,6 @@ "treasury_share": 0, "validators_share": 0, "cluster_reserve_share": 0, - "cdn_bond_size": 0, - "cdn_chill_delay": 0, - "cdn_unbonding_delay": 0, "storage_bond_size": 0, "storage_chill_delay": 0, "storage_unbonding_delay": 0, diff --git a/pallets/ddc-clusters/src/benchmarking.rs b/pallets/ddc-clusters/src/benchmarking.rs index a900921ec..cb9b47397 100644 --- a/pallets/ddc-clusters/src/benchmarking.rs +++ b/pallets/ddc-clusters/src/benchmarking.rs @@ -22,93 +22,87 @@ benchmarks! { T::AccountId: UncheckedFrom + AsRef<[u8]> } create_cluster { - let cluster_id = ClusterId::from([1; 20]); + let cluster_id = ClusterId::from([1; 20]); let user = account::("user", USER_SEED, 0u32); - let cluster_params = ClusterParams { node_provider_auth_contract: Some(user.clone()) }; - let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { - treasury_share: Perbill::default(), - validators_share: Perbill::default(), - cluster_reserve_share: Perbill::default(), - cdn_bond_size: 100u32.into(), - cdn_chill_delay: 50u32.into(), - cdn_unbonding_delay: 50u32.into(), - storage_bond_size: 100u32.into(), - storage_chill_delay: 50u32.into(), - storage_unbonding_delay: 50u32.into(), - unit_per_mb_stored: 10, - unit_per_mb_streamed: 10, - unit_per_put_request: 10, - unit_per_get_request: 10, - }; + let cluster_params = ClusterParams { node_provider_auth_contract: Some(user.clone()) }; + let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { + treasury_share: Perbill::default(), + validators_share: Perbill::default(), + cluster_reserve_share: Perbill::default(), + storage_bond_size: 100u32.into(), + storage_chill_delay: 50u32.into(), + storage_unbonding_delay: 50u32.into(), + unit_per_mb_stored: 10, + unit_per_mb_streamed: 10, + unit_per_put_request: 10, + unit_per_get_request: 10, + }; }: _(RawOrigin::Root, cluster_id, user.clone(), user, cluster_params, cluster_gov_params) verify { assert!(Clusters::::contains_key(cluster_id)); } - add_node { - let bytes = [0u8; 32]; - let node_pub_key = NodePubKey::CDNPubKey(AccountId32::from(bytes)); - let cluster_id = ClusterId::from([1; 20]); + add_node { + let bytes = [0u8; 32]; + let node_pub_key = NodePubKey::StoragePubKey(AccountId32::from(bytes)); + let cluster_id = ClusterId::from([1; 20]); let user = account::("user", USER_SEED, 0u32); - let balance = ::Currency::minimum_balance() * 1_000_000u32.into(); - let _ = ::Currency::make_free_balance_be(&user, balance); - let _ = config_cluster_and_node::(user.clone(), node_pub_key.clone(), cluster_id); - }: _(RawOrigin::Signed(user.clone()), cluster_id, node_pub_key.clone()) - verify { - assert!(ClustersNodes::::contains_key(cluster_id, node_pub_key)); - } + let balance = ::Currency::minimum_balance() * 1_000_000u32.into(); + let _ = ::Currency::make_free_balance_be(&user, balance); + let _ = config_cluster_and_node::(user.clone(), node_pub_key.clone(), cluster_id); + }: _(RawOrigin::Signed(user.clone()), cluster_id, node_pub_key.clone()) + verify { + assert!(ClustersNodes::::contains_key(cluster_id, node_pub_key)); + } - remove_node { - let bytes = [0u8; 32]; - let node_pub_key = NodePubKey::CDNPubKey(AccountId32::from(bytes)); - let cluster_id = ClusterId::from([1; 20]); + remove_node { + let bytes = [0u8; 32]; + let node_pub_key = NodePubKey::StoragePubKey(AccountId32::from(bytes)); + let cluster_id = ClusterId::from([1; 20]); let user = account::("user", USER_SEED, 0u32); - let balance = ::Currency::minimum_balance() * 1_000_000u32.into(); - let _ = ::Currency::make_free_balance_be(&user, balance); - let _ = config_cluster_and_node::(user.clone(), node_pub_key.clone(), cluster_id); - let _ = DdcClusters::::add_node( - RawOrigin::Signed(user.clone()).into(), - cluster_id, - node_pub_key.clone() - ); - }: _(RawOrigin::Signed(user.clone()), cluster_id, node_pub_key.clone()) - verify { - assert!(!ClustersNodes::::contains_key(cluster_id, node_pub_key)); - } + let balance = ::Currency::minimum_balance() * 1_000_000u32.into(); + let _ = ::Currency::make_free_balance_be(&user, balance); + let _ = config_cluster_and_node::(user.clone(), node_pub_key.clone(), cluster_id); + let _ = DdcClusters::::add_node( + RawOrigin::Signed(user.clone()).into(), + cluster_id, + node_pub_key.clone() + ); + }: _(RawOrigin::Signed(user.clone()), cluster_id, node_pub_key.clone()) + verify { + assert!(!ClustersNodes::::contains_key(cluster_id, node_pub_key)); + } set_cluster_params { - let cluster_id = ClusterId::from([1; 20]); + let cluster_id = ClusterId::from([1; 20]); let user = account::("user", USER_SEED, 0u32); let user_2 = account::("user", USER_SEED_2, 0u32); - let _ = config_cluster::(user.clone(), cluster_id); - let new_cluster_params = ClusterParams { node_provider_auth_contract: Some(user_2.clone()) }; + let _ = config_cluster::(user.clone(), cluster_id); + let new_cluster_params = ClusterParams { node_provider_auth_contract: Some(user_2.clone()) }; }: _(RawOrigin::Signed(user.clone()), cluster_id, new_cluster_params) verify { - assert_eq!(Clusters::::try_get(cluster_id).unwrap().props, ClusterProps { node_provider_auth_contract: Some(user_2) }); + assert_eq!(Clusters::::try_get(cluster_id).unwrap().props, ClusterProps { node_provider_auth_contract: Some(user_2) }); } set_cluster_gov_params { - let cluster_id = ClusterId::from([1; 20]); + let cluster_id = ClusterId::from([1; 20]); let user = account::("user", USER_SEED, 0u32); - let _ = config_cluster::(user, cluster_id); - let new_cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { - treasury_share: Perbill::default(), - validators_share: Perbill::default(), - cluster_reserve_share: Perbill::default(), - cdn_bond_size: 10u32.into(), - cdn_chill_delay: 5u32.into(), - cdn_unbonding_delay: 5u32.into(), - storage_bond_size: 10u32.into(), - storage_chill_delay: 5u32.into(), - storage_unbonding_delay: 5u32.into(), - unit_per_mb_stored: 1, - unit_per_mb_streamed: 1, - unit_per_put_request: 1, - unit_per_get_request: 1, - }; + let _ = config_cluster::(user, cluster_id); + let new_cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { + treasury_share: Perbill::default(), + validators_share: Perbill::default(), + cluster_reserve_share: Perbill::default(), + storage_bond_size: 10u32.into(), + storage_chill_delay: 5u32.into(), + storage_unbonding_delay: 5u32.into(), + unit_per_mb_stored: 1, + unit_per_mb_streamed: 1, + unit_per_put_request: 1, + unit_per_get_request: 1, + }; }: _(RawOrigin::Root, cluster_id, new_cluster_gov_params.clone()) verify { - assert_eq!(ClustersGovParams::::try_get(cluster_id).unwrap(), new_cluster_gov_params); + assert_eq!(ClustersGovParams::::try_get(cluster_id).unwrap(), new_cluster_gov_params); } impl_benchmark_test_suite!( diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 73cf62932..e10ce6aac 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -352,7 +352,6 @@ pub mod pallet { match node_type { NodeType::Storage => Ok(cluster_gov_params.storage_bond_size.saturated_into::()), - NodeType::CDN => Ok(cluster_gov_params.cdn_bond_size.saturated_into::()), } } @@ -398,7 +397,6 @@ pub mod pallet { .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; match node_type { NodeType::Storage => Ok(cluster_gov_params.storage_chill_delay), - NodeType::CDN => Ok(cluster_gov_params.cdn_chill_delay), } } @@ -410,7 +408,6 @@ pub mod pallet { .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; match node_type { NodeType::Storage => Ok(cluster_gov_params.storage_unbonding_delay), - NodeType::CDN => Ok(cluster_gov_params.cdn_unbonding_delay), } } @@ -420,9 +417,6 @@ pub mod pallet { let cluster_gov_params = ClustersGovParams::::try_get(cluster_id) .map_err(|_| ClusterVisitorError::ClusterGovParamsNotSet)?; Ok(ClusterBondingParams { - cdn_bond_size: cluster_gov_params.cdn_bond_size.saturated_into::(), - cdn_chill_delay: cluster_gov_params.cdn_chill_delay, - cdn_unbonding_delay: cluster_gov_params.cdn_unbonding_delay, storage_bond_size: cluster_gov_params.storage_bond_size.saturated_into::(), storage_chill_delay: cluster_gov_params.storage_chill_delay, storage_unbonding_delay: cluster_gov_params.storage_unbonding_delay, diff --git a/pallets/ddc-clusters/src/mock.rs b/pallets/ddc-clusters/src/mock.rs index a516c990e..d06aa1837 100644 --- a/pallets/ddc-clusters/src/mock.rs +++ b/pallets/ddc-clusters/src/mock.rs @@ -247,9 +247,6 @@ impl ExtBuilder { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), cluster_reserve_share: Perbill::from_float(0.02), - cdn_bond_size: 100, - cdn_chill_delay: 50, - cdn_unbonding_delay: 50, storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, @@ -259,7 +256,7 @@ impl ExtBuilder { unit_per_get_request: 10, }; - let node_pub_key = NodePubKey::CDNPubKey(AccountId::from([0; 32])); + let node_pub_key = NodePubKey::StoragePubKey(AccountId::from([0; 32])); // For testing purposes only pallet_ddc_clusters::GenesisConfig::::default().build(); diff --git a/pallets/ddc-clusters/src/testing_utils.rs b/pallets/ddc-clusters/src/testing_utils.rs index 9e97b0904..2f8cd1982 100644 --- a/pallets/ddc-clusters/src/testing_utils.rs +++ b/pallets/ddc-clusters/src/testing_utils.rs @@ -1,7 +1,7 @@ //! DdcStaking pallet benchmarking. use ddc_primitives::{ - CDNNodeParams, ClusterGovParams, ClusterId, ClusterParams, NodeParams, NodePubKey, + ClusterGovParams, ClusterId, ClusterParams, NodeParams, NodePubKey, StorageNodeParams, }; pub use frame_benchmarking::{ account, benchmarks, impl_benchmark_test_suite, whitelist_account, whitelisted_caller, @@ -24,9 +24,6 @@ where treasury_share: Perbill::default(), validators_share: Perbill::default(), cluster_reserve_share: Perbill::default(), - cdn_bond_size: 100u32.into(), - cdn_chill_delay: 50u32.into(), - cdn_unbonding_delay: 50u32.into(), storage_bond_size: 100u32.into(), storage_chill_delay: 50u32.into(), storage_unbonding_delay: 50u32.into(), @@ -55,7 +52,7 @@ where T::AccountId: UncheckedFrom + AsRef<[u8]>, { let cluster_params = ClusterParams { node_provider_auth_contract: Some(user.clone()) }; - let cdn_node_params = CDNNodeParams { + let storage_node_params = StorageNodeParams { host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, @@ -66,9 +63,6 @@ where treasury_share: Perbill::default(), validators_share: Perbill::default(), cluster_reserve_share: Perbill::default(), - cdn_bond_size: 100u32.into(), - cdn_chill_delay: 50u32.into(), - cdn_unbonding_delay: 50u32.into(), storage_bond_size: 100u32.into(), storage_chill_delay: 50u32.into(), storage_unbonding_delay: 50u32.into(), @@ -87,9 +81,11 @@ where cluster_gov_params, ); - if let Ok(new_node) = - Node::::new(node_pub_key.clone(), user.clone(), NodeParams::CDNParams(cdn_node_params)) - { + if let Ok(new_node) = Node::::new( + node_pub_key.clone(), + user.clone(), + NodeParams::StorageParams(storage_node_params), + ) { let _ = T::NodeRepository::create(new_node); } diff --git a/pallets/ddc-clusters/src/tests.rs b/pallets/ddc-clusters/src/tests.rs index 768ba50b9..aefe3a87d 100644 --- a/pallets/ddc-clusters/src/tests.rs +++ b/pallets/ddc-clusters/src/tests.rs @@ -1,8 +1,8 @@ //! Tests for the module. use ddc_primitives::{ - CDNNodeParams, ClusterBondingParams, ClusterFeesParams, ClusterId, ClusterParams, - ClusterPricingParams, NodeParams, NodePubKey, + ClusterBondingParams, ClusterFeesParams, ClusterId, ClusterParams, ClusterPricingParams, + NodeParams, NodePubKey, StorageNodeParams, }; use ddc_traits::cluster::ClusterManager; use frame_support::{assert_noop, assert_ok, error::BadOrigin}; @@ -26,9 +26,6 @@ fn create_cluster_works() { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), cluster_reserve_share: Perbill::from_float(0.02), - cdn_bond_size: 100, - cdn_chill_delay: 50, - cdn_unbonding_delay: 50, storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, @@ -99,7 +96,7 @@ fn add_and_delete_node_works() { DdcClusters::add_node( RuntimeOrigin::signed(cluster_manager_id.clone()), cluster_id, - NodePubKey::CDNPubKey(node_pub_key.clone()), + NodePubKey::StoragePubKey(node_pub_key.clone()), ), Error::::ClusterDoesNotExist ); @@ -115,9 +112,6 @@ fn add_and_delete_node_works() { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), cluster_reserve_share: Perbill::from_float(0.02), - cdn_bond_size: 100, - cdn_chill_delay: 50, - cdn_unbonding_delay: 50, storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, @@ -133,7 +127,7 @@ fn add_and_delete_node_works() { DdcClusters::add_node( RuntimeOrigin::signed(cluster_reserve_id), cluster_id, - NodePubKey::CDNPubKey(node_pub_key.clone()), + NodePubKey::StoragePubKey(node_pub_key.clone()), ), Error::::OnlyClusterManager ); @@ -143,12 +137,12 @@ fn add_and_delete_node_works() { DdcClusters::add_node( RuntimeOrigin::signed(cluster_manager_id.clone()), cluster_id, - NodePubKey::CDNPubKey(node_pub_key.clone()), + NodePubKey::StoragePubKey(node_pub_key.clone()), ), Error::::AttemptToAddNonExistentNode ); - let cdn_node_params = CDNNodeParams { + let storage_node_params = StorageNodeParams { host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, @@ -158,8 +152,8 @@ fn add_and_delete_node_works() { // Node created assert_ok!(DdcNodes::create_node( RuntimeOrigin::signed(cluster_manager_id.clone()), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params) + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::StorageParams(storage_node_params) )); // Node doesn't exist @@ -167,7 +161,7 @@ fn add_and_delete_node_works() { DdcClusters::add_node( RuntimeOrigin::signed(cluster_manager_id.clone()), cluster_id, - NodePubKey::CDNPubKey(node_pub_key.clone()), + NodePubKey::StoragePubKey(node_pub_key.clone()), ), Error::::NodeAuthContractCallFailed ); @@ -183,12 +177,12 @@ fn add_and_delete_node_works() { assert_ok!(DdcClusters::add_node( RuntimeOrigin::signed(cluster_manager_id.clone()), cluster_id, - NodePubKey::CDNPubKey(node_pub_key.clone()), + NodePubKey::StoragePubKey(node_pub_key.clone()), )); assert!(>::contains_node( &cluster_id, - &NodePubKey::CDNPubKey(node_pub_key.clone()) + &NodePubKey::StoragePubKey(node_pub_key.clone()) )); // Node already assigned @@ -196,7 +190,7 @@ fn add_and_delete_node_works() { DdcClusters::add_node( RuntimeOrigin::signed(cluster_manager_id.clone()), cluster_id, - NodePubKey::CDNPubKey(node_pub_key.clone()), + NodePubKey::StoragePubKey(node_pub_key.clone()), ), Error::::AttemptToAddAlreadyAssignedNode ); @@ -205,7 +199,7 @@ fn add_and_delete_node_works() { System::assert_last_event( Event::ClusterNodeAdded { cluster_id, - node_pub_key: NodePubKey::CDNPubKey(node_pub_key.clone()), + node_pub_key: NodePubKey::StoragePubKey(node_pub_key.clone()), } .into(), ); @@ -214,14 +208,14 @@ fn add_and_delete_node_works() { assert_ok!(DdcClusters::remove_node( RuntimeOrigin::signed(cluster_manager_id.clone()), cluster_id, - NodePubKey::CDNPubKey(node_pub_key.clone()), + NodePubKey::StoragePubKey(node_pub_key.clone()), )); // Checking that event was emitted System::assert_last_event( Event::ClusterNodeRemoved { cluster_id, - node_pub_key: NodePubKey::CDNPubKey(node_pub_key.clone()), + node_pub_key: NodePubKey::StoragePubKey(node_pub_key.clone()), } .into(), ); @@ -231,7 +225,7 @@ fn add_and_delete_node_works() { DdcClusters::remove_node( RuntimeOrigin::signed(cluster_manager_id), cluster_id, - NodePubKey::CDNPubKey(node_pub_key), + NodePubKey::StoragePubKey(node_pub_key), ), Error::::AttemptToRemoveNotAssignedNode ); @@ -278,7 +272,7 @@ fn add_and_delete_node_works() { let contract_id = Contracts::contract_address(&alice, &wasm_hash, &[]); pub const ADD_DDC_NODE_SELECTOR: [u8; 4] = hex!("7a04093d"); - let node_pub_key = NodePubKey::CDNPubKey(node_pub_key); + let node_pub_key = NodePubKey::StoragePubKey(node_pub_key); let call_data = { // is_authorized(node_provider: AccountId, node: Vec, node_variant: u8) -> bool @@ -335,9 +329,6 @@ fn set_cluster_params_works() { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), cluster_reserve_share: Perbill::from_float(0.02), - cdn_bond_size: 100, - cdn_chill_delay: 50, - cdn_unbonding_delay: 50, storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, @@ -383,9 +374,6 @@ fn set_cluster_gov_params_works() { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), cluster_reserve_share: Perbill::from_float(0.02), - cdn_bond_size: 100, - cdn_chill_delay: 50, - cdn_unbonding_delay: 50, storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, @@ -449,9 +437,6 @@ fn cluster_visitor_works() { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), cluster_reserve_share: Perbill::from_float(0.02), - cdn_bond_size: 100, - cdn_chill_delay: 50, - cdn_unbonding_delay: 50, storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, @@ -474,7 +459,7 @@ fn cluster_visitor_works() { assert_ok!(>::ensure_cluster(&cluster_id)); assert_eq!( - >::get_bond_size(&cluster_id, NodeType::CDN) + >::get_bond_size(&cluster_id, NodeType::Storage) .unwrap(), 100u128 ); @@ -509,7 +494,7 @@ fn cluster_visitor_works() { ); assert_eq!( - >::get_chill_delay(&cluster_id, NodeType::CDN) + >::get_chill_delay(&cluster_id, NodeType::Storage) .unwrap(), 50 ); @@ -520,8 +505,11 @@ fn cluster_visitor_works() { ); assert_eq!( - >::get_unbonding_delay(&cluster_id, NodeType::CDN) - .unwrap(), + >::get_unbonding_delay( + &cluster_id, + NodeType::Storage + ) + .unwrap(), 50 ); assert_eq!( @@ -536,9 +524,6 @@ fn cluster_visitor_works() { assert_eq!( >::get_bonding_params(&cluster_id).unwrap(), ClusterBondingParams::<::BlockNumber> { - cdn_bond_size: 100, - cdn_chill_delay: 50, - cdn_unbonding_delay: 50, storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, @@ -561,9 +546,6 @@ fn cluster_creator_works() { treasury_share: Perbill::from_float(0.05), validators_share: Perbill::from_float(0.01), cluster_reserve_share: Perbill::from_float(0.02), - cdn_bond_size: 100, - cdn_chill_delay: 50, - cdn_unbonding_delay: 50, storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, diff --git a/pallets/ddc-clusters/src/weights.rs b/pallets/ddc-clusters/src/weights.rs index 96e4b735f..af2bb5559 100644 --- a/pallets/ddc-clusters/src/weights.rs +++ b/pallets/ddc-clusters/src/weights.rs @@ -1,27 +1,22 @@ - -//! Autogenerated weights for `pallet_ddc_clusters` +//! Autogenerated weights for pallet_ddc_clusters //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-16, STEPS: `200`, REPEAT: 1000, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! HOSTNAME: `Raids-MacBook-Pro-2.local`, CPU: `` -//! EXECUTION: None, WASM-EXECUTION: Interpreted, CHAIN: Some("dev"), DB CACHE: 1024 +//! DATE: 2023-12-14, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `Yahors-MacBook-Pro.local`, CPU: `` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: // ./target/release/cere // benchmark // pallet -// --chain -// dev -// --pallet -// pallet_ddc_clusters -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 50 -// --output -// pallets/ddc-clusters/src/weights.rs +// --chain=dev +// --execution=wasm +// --pallet=pallet-ddc-clusters +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --template=./.maintain/frame-weight-template.hbs +// --output=pallets/ddc-clusters/src/weights.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -39,24 +34,22 @@ pub trait WeightInfo { fn set_cluster_gov_params() -> Weight; } -/// Weight functions for `pallet_ddc_clusters`. +/// Weights for pallet_ddc_clusters using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { // Storage: DdcClusters Clusters (r:1 w:1) // Storage: DdcClusters ClustersGovParams (r:0 w:1) fn create_cluster() -> Weight { - // Minimum execution time: 14_000 nanoseconds. - Weight::from_ref_time(15_000_000u64) - .saturating_add(T::DbWeight::get().reads(1u64)) - .saturating_add(T::DbWeight::get().writes(2u64)) + Weight::from_ref_time(15_000_000_u64) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcClusters Clusters (r:1 w:0) - // Storage: DdcNodes CDNNodes (r:1 w:1) // Storage: DdcStaking Nodes (r:1 w:0) - // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) // Storage: DdcStaking Bonded (r:1 w:0) // Storage: DdcStaking Ledger (r:1 w:0) + // Storage: DdcNodes StorageNodes (r:1 w:1) // Storage: System Account (r:1 w:0) // Storage: Contracts ContractInfoOf (r:1 w:1) // Storage: Contracts CodeStorage (r:1 w:0) @@ -66,54 +59,48 @@ impl WeightInfo for SubstrateWeight { // Storage: unknown [0x89eb0d6a8a691dae2cd15ed0369931ce0a949ecafa5c3f93f8121833646e15c3] (r:1 w:0) // Storage: unknown [0xc3ad1d87683b6ac25f2e809346840d7a7ed0c05653ee606dba68aba3bdb5d957] (r:1 w:0) fn add_node() -> Weight { - // Minimum execution time: 307_000 nanoseconds. - Weight::from_ref_time(354_000_000u64) - .saturating_add(T::DbWeight::get().reads(15u64)) - .saturating_add(T::DbWeight::get().writes(5u64)) + Weight::from_ref_time(599_000_000_u64) + .saturating_add(T::DbWeight::get().reads(14_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) } // Storage: DdcClusters Clusters (r:1 w:0) - // Storage: DdcNodes CDNNodes (r:1 w:1) + // Storage: DdcNodes StorageNodes (r:1 w:1) // Storage: DdcClusters ClustersNodes (r:0 w:1) fn remove_node() -> Weight { - // Minimum execution time: 23_000 nanoseconds. - Weight::from_ref_time(24_000_000u64) - .saturating_add(T::DbWeight::get().reads(2u64)) - .saturating_add(T::DbWeight::get().writes(2u64)) + Weight::from_ref_time(24_000_000_u64) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcClusters Clusters (r:1 w:1) fn set_cluster_params() -> Weight { - // Minimum execution time: 15_000 nanoseconds. - Weight::from_ref_time(16_000_000u64) - .saturating_add(T::DbWeight::get().reads(1u64)) - .saturating_add(T::DbWeight::get().writes(1u64)) + Weight::from_ref_time(16_000_000_u64) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcClusters Clusters (r:1 w:0) // Storage: DdcClusters ClustersGovParams (r:0 w:1) fn set_cluster_gov_params() -> Weight { - // Minimum execution time: 15_000 nanoseconds. - Weight::from_ref_time(16_000_000u64) - .saturating_add(T::DbWeight::get().reads(1u64)) - .saturating_add(T::DbWeight::get().writes(1u64)) + Weight::from_ref_time(17_000_000_u64) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } } // For backwards compatibility and tests impl WeightInfo for () { - // Storage: DdcClusters Clusters (r:1 w:1) + // Storage: DdcClusters Clusters (r:1 w:1) // Storage: DdcClusters ClustersGovParams (r:0 w:1) fn create_cluster() -> Weight { - // Minimum execution time: 14_000 nanoseconds. - Weight::from_ref_time(15_000_000u64) - .saturating_add(RocksDbWeight::get().reads(1u64)) - .saturating_add(RocksDbWeight::get().writes(2u64)) + Weight::from_ref_time(15_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcClusters Clusters (r:1 w:0) - // Storage: DdcNodes CDNNodes (r:1 w:1) // Storage: DdcStaking Nodes (r:1 w:0) - // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) // Storage: DdcStaking Bonded (r:1 w:0) // Storage: DdcStaking Ledger (r:1 w:0) + // Storage: DdcNodes StorageNodes (r:1 w:1) // Storage: System Account (r:1 w:0) // Storage: Contracts ContractInfoOf (r:1 w:1) // Storage: Contracts CodeStorage (r:1 w:0) @@ -123,33 +110,29 @@ impl WeightInfo for () { // Storage: unknown [0x89eb0d6a8a691dae2cd15ed0369931ce0a949ecafa5c3f93f8121833646e15c3] (r:1 w:0) // Storage: unknown [0xc3ad1d87683b6ac25f2e809346840d7a7ed0c05653ee606dba68aba3bdb5d957] (r:1 w:0) fn add_node() -> Weight { - // Minimum execution time: 307_000 nanoseconds. - Weight::from_ref_time(354_000_000u64) - .saturating_add(RocksDbWeight::get().reads(15u64)) - .saturating_add(RocksDbWeight::get().writes(5u64)) + Weight::from_ref_time(599_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(14_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) } // Storage: DdcClusters Clusters (r:1 w:0) - // Storage: DdcNodes CDNNodes (r:1 w:1) + // Storage: DdcNodes StorageNodes (r:1 w:1) // Storage: DdcClusters ClustersNodes (r:0 w:1) fn remove_node() -> Weight { - // Minimum execution time: 23_000 nanoseconds. - Weight::from_ref_time(24_000_000u64) - .saturating_add(RocksDbWeight::get().reads(2u64)) - .saturating_add(RocksDbWeight::get().writes(2u64)) + Weight::from_ref_time(24_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcClusters Clusters (r:1 w:1) fn set_cluster_params() -> Weight { - // Minimum execution time: 15_000 nanoseconds. - Weight::from_ref_time(16_000_000u64) - .saturating_add(RocksDbWeight::get().reads(1u64)) - .saturating_add(RocksDbWeight::get().writes(1u64)) + Weight::from_ref_time(16_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcClusters Clusters (r:1 w:0) // Storage: DdcClusters ClustersGovParams (r:0 w:1) fn set_cluster_gov_params() -> Weight { - // Minimum execution time: 15_000 nanoseconds. - Weight::from_ref_time(16_000_000u64) - .saturating_add(RocksDbWeight::get().reads(1u64)) - .saturating_add(RocksDbWeight::get().writes(1u64)) + Weight::from_ref_time(17_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } } \ No newline at end of file diff --git a/pallets/ddc-customers/src/benchmarking.rs b/pallets/ddc-customers/src/benchmarking.rs index 59bb17b5e..b51a47015 100644 --- a/pallets/ddc-customers/src/benchmarking.rs +++ b/pallets/ddc-customers/src/benchmarking.rs @@ -22,13 +22,10 @@ benchmarks! { let cluster_id = ClusterId::from([1; 20]); let user = account::("user", USER_SEED, 0u32); - let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { + let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { treasury_share: Perbill::default(), validators_share: Perbill::default(), cluster_reserve_share: Perbill::default(), - cdn_bond_size: 100u32.into(), - cdn_chill_delay: 50u32.into(), - cdn_unbonding_delay: 50u32.into(), storage_bond_size: 100u32.into(), storage_chill_delay: 50u32.into(), storage_unbonding_delay: 50u32.into(), @@ -38,13 +35,13 @@ benchmarks! { unit_per_get_request: 10, }; - let _ = ::ClusterCreator::create_new_cluster( - ClusterId::from([1; 20]), - user.clone(), - user.clone(), - ClusterParams { node_provider_auth_contract: Some(user.clone()) }, - cluster_gov_params - ); + let _ = ::ClusterCreator::create_new_cluster( + ClusterId::from([1; 20]), + user.clone(), + user.clone(), + ClusterParams { node_provider_auth_contract: Some(user.clone()) }, + cluster_gov_params + ); whitelist_account!(user); }: _(RawOrigin::Signed(user), cluster_id) @@ -70,7 +67,7 @@ benchmarks! { let _ = ::Currency::make_free_balance_be(&user, balance); let amount = ::Currency::minimum_balance() * 50u32.into(); - let _ = DdcCustomers::::deposit(RawOrigin::Signed(user.clone()).into(), amount); + let _ = DdcCustomers::::deposit(RawOrigin::Signed(user.clone()).into(), amount); whitelist_account!(user); }: _(RawOrigin::Signed(user.clone()), amount) @@ -84,71 +81,71 @@ benchmarks! { let _ = ::Currency::make_free_balance_be(&user, balance); let amount = ::Currency::minimum_balance() * 50u32.into(); - let _ = DdcCustomers::::deposit(RawOrigin::Signed(user.clone()).into(), amount); + let _ = DdcCustomers::::deposit(RawOrigin::Signed(user.clone()).into(), amount); - whitelist_account!(user); + whitelist_account!(user); }: unlock_deposit(RawOrigin::Signed(user.clone()), amount) verify { assert!(Ledger::::contains_key(user)); } - // Worst case scenario, 31/32 chunks unlocked after the unlocking duration + // Worst case scenario, 31/32 chunks unlocked after the unlocking duration withdraw_unlocked_deposit_update { - System::::set_block_number(1u32.into()); + System::::set_block_number(1u32.into()); let user = account::("user", USER_SEED, 0u32); let balance = ::Currency::minimum_balance() * 2000u32.into(); let _ = ::Currency::make_free_balance_be(&user, balance); let amount = ::Currency::minimum_balance() * 32u32.into(); - let _ = DdcCustomers::::deposit(RawOrigin::Signed(user.clone()).into(), amount); + let _ = DdcCustomers::::deposit(RawOrigin::Signed(user.clone()).into(), amount); - for _k in 1 .. 32 { - let _ = DdcCustomers::::unlock_deposit(RawOrigin::Signed(user.clone()).into(), ::Currency::minimum_balance() * 1u32.into()); - } + for _k in 1 .. 32 { + let _ = DdcCustomers::::unlock_deposit(RawOrigin::Signed(user.clone()).into(), ::Currency::minimum_balance() * 1u32.into()); + } - System::::set_block_number(5256001u32.into()); + System::::set_block_number(5256001u32.into()); - whitelist_account!(user); + whitelist_account!(user); }: withdraw_unlocked_deposit(RawOrigin::Signed(user.clone())) verify { - let ledger = Ledger::::try_get(user).unwrap(); + let ledger = Ledger::::try_get(user).unwrap(); assert_eq!(ledger.active, amount / 32u32.into()); } - // Worst case scenario, everything is removed after the unlocking duration + // Worst case scenario, everything is removed after the unlocking duration withdraw_unlocked_deposit_kill { - System::::set_block_number(1u32.into()); + System::::set_block_number(1u32.into()); let user = account::("user", USER_SEED, 0u32); - let user2 = account::("user", USER_SEED, 1u32); + let user2 = account::("user", USER_SEED, 1u32); let balance = ::Currency::minimum_balance() * 2000u32.into(); let _ = ::Currency::make_free_balance_be(&user, balance); - let _ = ::Currency::make_free_balance_be(&user2, balance); + let _ = ::Currency::make_free_balance_be(&user2, balance); let amount = ::Currency::minimum_balance() * 32u32.into(); - let _ = DdcCustomers::::deposit(RawOrigin::Signed(user.clone()).into(), amount); - // To keep the balance of pallet positive - let _ = DdcCustomers::::deposit(RawOrigin::Signed(user2).into(), amount); + let _ = DdcCustomers::::deposit(RawOrigin::Signed(user.clone()).into(), amount); + // To keep the balance of pallet positive + let _ = DdcCustomers::::deposit(RawOrigin::Signed(user2).into(), amount); - for _k in 1 .. 33 { - let _ = DdcCustomers::::unlock_deposit(RawOrigin::Signed(user.clone()).into(), ::Currency::minimum_balance() * 1u32.into()); - } + for _k in 1 .. 33 { + let _ = DdcCustomers::::unlock_deposit(RawOrigin::Signed(user.clone()).into(), ::Currency::minimum_balance() * 1u32.into()); + } - System::::set_block_number(5256001u32.into()); + System::::set_block_number(5256001u32.into()); - whitelist_account!(user); + whitelist_account!(user); }: withdraw_unlocked_deposit(RawOrigin::Signed(user.clone())) verify { - assert!(!Ledger::::contains_key(user)); + assert!(!Ledger::::contains_key(user)); } - impl_benchmark_test_suite!( - DdcCustomers, - crate::mock::ExtBuilder.build(), - crate::mock::Test, - ); + impl_benchmark_test_suite!( + DdcCustomers, + crate::mock::ExtBuilder.build(), + crate::mock::Test, + ); } diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 5ccc4e0b8..f835bf879 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -74,14 +74,15 @@ pub struct BucketsDetails { #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] #[scale_info(skip_type_params(T))] pub struct AccountsLedger { - /// The owner account whose balance is actually locked and can be used for CDN usage. + /// The owner account whose balance is actually locked and can be used to pay for DDC network + /// usage. pub owner: AccountId, /// The total amount of the owner's balance that we are currently accounting for. /// It's just `active` plus all the `unlocking` balances. #[codec(compact)] pub total: Balance, - /// The total amount of the owner's balance that will be accessible for CDN payments in any - /// forthcoming rounds. + /// The total amount of the owner's balance that will be accessible for DDC network payouts in + /// any forthcoming rounds. #[codec(compact)] pub active: Balance, /// Any balance that is becoming free, which may eventually be transferred out of the owner @@ -353,7 +354,7 @@ pub mod pallet { } /// Add some extra amount that have appeared in the owner `free_balance` into the balance up - /// for CDN payments. + /// for DDC network payouts. /// /// The dispatch origin for this call must be _Signed_ by the owner. /// diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index 0137a5e93..3e779f06c 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -163,21 +163,6 @@ impl ClusterVisitor for TestClusterVisitor { cluster_id: &ClusterId, ) -> Result, ClusterVisitorError> { Ok(ClusterBondingParams { - cdn_bond_size: >::get_bond_size( - cluster_id, - NodeType::CDN, - ) - .unwrap_or_default(), - cdn_chill_delay: >::get_chill_delay( - cluster_id, - NodeType::CDN, - ) - .unwrap_or_default(), - cdn_unbonding_delay: >::get_unbonding_delay( - cluster_id, - NodeType::CDN, - ) - .unwrap_or_default(), storage_bond_size: >::get_bond_size( cluster_id, NodeType::Storage, diff --git a/pallets/ddc-customers/src/weights.rs b/pallets/ddc-customers/src/weights.rs index 66ae43d01..b024b6808 100644 --- a/pallets/ddc-customers/src/weights.rs +++ b/pallets/ddc-customers/src/weights.rs @@ -1,27 +1,22 @@ - -//! Autogenerated weights for `pallet_ddc_customers` +//! Autogenerated weights for pallet_ddc_customers //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-16, STEPS: `200`, REPEAT: 1000, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! HOSTNAME: `Raids-MacBook-Pro-2.local`, CPU: `` -//! EXECUTION: None, WASM-EXECUTION: Interpreted, CHAIN: Some("dev"), DB CACHE: 1024 +//! DATE: 2023-12-14, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `Yahors-MacBook-Pro.local`, CPU: `` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: // ./target/release/cere // benchmark // pallet -// --chain -// dev -// --pallet -// pallet_ddc_customers -// --extrinsic -// * -// --steps -// 200 -// --repeat -// 1000 -// --output -// pallets/ddc-customers/src/weights.rs +// --chain=dev +// --execution=wasm +// --pallet=pallet-ddc-customers +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --template=./.maintain/frame-weight-template.hbs +// --output=pallets/ddc-customers/src/weights.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -30,7 +25,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use sp_std::marker::PhantomData; -/// Weight functions needed for pallet_ddc_nodes. +/// Weight functions needed for pallet_ddc_customers. pub trait WeightInfo { fn create_bucket() -> Weight; fn deposit() -> Weight; @@ -40,28 +35,28 @@ pub trait WeightInfo { fn withdraw_unlocked_deposit_kill() -> Weight; } -/// Weight functions for `pallet_ddc_customers`. +/// Weights for pallet_ddc_customers using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { // Storage: DdcCustomers BucketsCount (r:1 w:1) // Storage: DdcClusters Clusters (r:1 w:0) // Storage: DdcCustomers Buckets (r:0 w:1) fn create_bucket() -> Weight { - Weight::from_ref_time(18_000_000_u64) + Weight::from_ref_time(17_000_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn deposit() -> Weight { - Weight::from_ref_time(26_000_000_u64) + Weight::from_ref_time(28_000_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn deposit_extra() -> Weight { - Weight::from_ref_time(28_000_000_u64) + Weight::from_ref_time(29_000_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -72,15 +67,16 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) + // Storage: System Account (r:1 w:1) fn withdraw_unlocked_deposit_update() -> Weight { - Weight::from_ref_time(14_000_000_u64) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) + Weight::from_ref_time(30_000_000_u64) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unlocked_deposit_kill() -> Weight { - Weight::from_ref_time(31_000_000_u64) + Weight::from_ref_time(36_000_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -92,21 +88,21 @@ impl WeightInfo for () { // Storage: DdcClusters Clusters (r:1 w:0) // Storage: DdcCustomers Buckets (r:0 w:1) fn create_bucket() -> Weight { - Weight::from_ref_time(18_000_000_u64) + Weight::from_ref_time(17_000_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn deposit() -> Weight { - Weight::from_ref_time(26_000_000_u64) + Weight::from_ref_time(28_000_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn deposit_extra() -> Weight { - Weight::from_ref_time(28_000_000_u64) + Weight::from_ref_time(29_000_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -117,15 +113,16 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) + // Storage: System Account (r:1 w:1) fn withdraw_unlocked_deposit_update() -> Weight { - Weight::from_ref_time(14_000_000_u64) - .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) + Weight::from_ref_time(30_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unlocked_deposit_kill() -> Weight { - Weight::from_ref_time(31_000_000_u64) + Weight::from_ref_time(36_000_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } diff --git a/pallets/ddc-nodes/src/benchmarking.rs b/pallets/ddc-nodes/src/benchmarking.rs index b1ae3e629..1e65c7ea0 100644 --- a/pallets/ddc-nodes/src/benchmarking.rs +++ b/pallets/ddc-nodes/src/benchmarking.rs @@ -1,6 +1,6 @@ //! DdcStaking pallet benchmarking. -use ddc_primitives::CDNNodePubKey; +use ddc_primitives::StorageNodePubKey; pub use frame_benchmarking::{ account, benchmarks, impl_benchmark_test_suite, whitelist_account, whitelisted_caller, }; @@ -9,47 +9,47 @@ use sp_std::prelude::*; use testing_utils::*; use super::*; -use crate::{cdn_node::CDNNodeProps, Pallet as DdcNodes}; +use crate::{storage_node::StorageNodeProps, Pallet as DdcNodes}; const USER_SEED: u32 = 999666; benchmarks! { create_node { - let (user, node, cdn_node_params, _) = create_user_and_config::("user", USER_SEED); + let (user, node, storage_node_params, _) = create_user_and_config::("user", USER_SEED); - whitelist_account!(user); - }: _(RawOrigin::Signed(user.clone()), node, cdn_node_params) + whitelist_account!(user); + }: _(RawOrigin::Signed(user.clone()), node, storage_node_params) verify { - assert!(CDNNodes::::contains_key(CDNNodePubKey::new([0; 32]))); + assert!(StorageNodes::::contains_key(StorageNodePubKey::new([0; 32]))); } delete_node { - let (user, node, cdn_node_params, _) = create_user_and_config::("user", USER_SEED); + let (user, node, storage_node_params, _) = create_user_and_config::("user", USER_SEED); - DdcNodes::::create_node(RawOrigin::Signed(user.clone()).into(),node.clone(), cdn_node_params)?; + DdcNodes::::create_node(RawOrigin::Signed(user.clone()).into(),node.clone(), storage_node_params)?; whitelist_account!(user); }: _(RawOrigin::Signed(user.clone()), node) verify { - assert!(!CDNNodes::::contains_key(CDNNodePubKey::new([0; 32]))); + assert!(!StorageNodes::::contains_key(StorageNodePubKey::new([0; 32]))); } set_node_params { - let (user, node, cdn_node_params, cdn_node_params_new) = create_user_and_config::("user", USER_SEED); + let (user, node, storage_node_params, new_storage_node_params) = create_user_and_config::("user", USER_SEED); - DdcNodes::::create_node(RawOrigin::Signed(user.clone()).into(),node.clone(), cdn_node_params)?; + DdcNodes::::create_node(RawOrigin::Signed(user.clone()).into(),node.clone(), storage_node_params)?; - whitelist_account!(user); - }: _(RawOrigin::Signed(user.clone()), node, cdn_node_params_new) + whitelist_account!(user); + }: _(RawOrigin::Signed(user.clone()), node, new_storage_node_params) verify { - assert_eq!(CDNNodes::::try_get( - CDNNodePubKey::new([0; 32])).unwrap().props, - CDNNodeProps { - host: vec![2u8, 255].try_into().unwrap(), - http_port: 45000u16, - grpc_port: 55000u16, - p2p_port: 65000u16, - }); + assert_eq!(StorageNodes::::try_get( + StorageNodePubKey::new([0; 32])).unwrap().props, + StorageNodeProps { + host: vec![2u8, 255].try_into().unwrap(), + http_port: 45000u16, + grpc_port: 55000u16, + p2p_port: 65000u16, + }); } impl_benchmark_test_suite!( diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs deleted file mode 100644 index 7ec266f54..000000000 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ /dev/null @@ -1,106 +0,0 @@ -use codec::{Decode, Encode}; -use ddc_primitives::{CDNNodePubKey, ClusterId, NodeParams, NodePubKey, NodeType}; -use frame_support::{parameter_types, BoundedVec}; -use scale_info::TypeInfo; -#[cfg(feature = "std")] -use serde::{Deserialize, Serialize}; -use sp_runtime::RuntimeDebug; -use sp_std::prelude::*; - -use crate::node::{NodeError, NodeProps, NodeTrait}; - -parameter_types! { - pub MaxCDNNodeParamsLen: u16 = 2048; - pub MaxHostLen: u8 = 255; -} - -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -#[scale_info(skip_type_params(T))] -pub struct CDNNode { - pub pub_key: CDNNodePubKey, - pub provider_id: T::AccountId, - pub cluster_id: Option, - pub props: CDNNodeProps, -} - -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct CDNNodeProps { - pub host: BoundedVec, - pub http_port: u16, - pub grpc_port: u16, - pub p2p_port: u16, -} - -impl CDNNode { - pub fn new( - node_pub_key: NodePubKey, - provider_id: T::AccountId, - node_params: NodeParams, - ) -> Result { - match node_pub_key { - NodePubKey::CDNPubKey(pub_key) => match node_params { - NodeParams::CDNParams(node_params) => Ok(CDNNode:: { - provider_id, - pub_key, - cluster_id: None, - props: CDNNodeProps { - host: match node_params.host.try_into() { - Ok(vec) => vec, - Err(_) => return Err(NodeError::CDNHostLenExceedsLimit), - }, - http_port: node_params.http_port, - grpc_port: node_params.grpc_port, - p2p_port: node_params.p2p_port, - }, - }), - _ => Err(NodeError::InvalidCDNNodeParams), - }, - _ => Err(NodeError::InvalidCDNNodePubKey), - } - } -} - -impl NodeTrait for CDNNode { - fn get_pub_key(&self) -> NodePubKey { - NodePubKey::CDNPubKey(self.pub_key.clone()) - } - fn get_provider_id(&self) -> &T::AccountId { - &self.provider_id - } - fn get_props(&self) -> NodeProps { - NodeProps::CDNProps(self.props.clone()) - } - fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError> { - self.props = match props { - NodeProps::CDNProps(props) => props, - _ => return Err(NodeError::InvalidCDNNodeProps), - }; - Ok(()) - } - fn set_params(&mut self, node_params: NodeParams) -> Result<(), NodeError> { - match node_params { - NodeParams::CDNParams(cdn_params) => { - self.props.host = match cdn_params.host.try_into() { - Ok(vec) => vec, - Err(_) => return Err(NodeError::CDNHostLenExceedsLimit), - }; - self.props.http_port = cdn_params.http_port; - self.props.grpc_port = cdn_params.grpc_port; - self.props.p2p_port = cdn_params.p2p_port; - }, - _ => return Err(NodeError::InvalidCDNNodeParams), - }; - Ok(()) - } - fn get_cluster_id(&self) -> &Option { - &self.cluster_id - } - fn set_cluster_id(&mut self, cluster_id: Option) { - self.cluster_id = cluster_id; - } - fn get_type(&self) -> NodeType { - NodeType::CDN - } -} diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index b0ab6e6b2..5f85f1114 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -27,7 +27,7 @@ pub mod benchmarking; #[cfg(any(feature = "runtime-benchmarks", test))] pub mod testing_utils; -use ddc_primitives::{CDNNodePubKey, ClusterId, NodeParams, NodePubKey, StorageNodePubKey}; +use ddc_primitives::{ClusterId, NodeParams, NodePubKey, StorageNodePubKey}; use ddc_traits::{ node::{NodeCreator, NodeVisitor, NodeVisitorError}, staking::StakingVisitor, @@ -36,12 +36,10 @@ use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; pub use pallet::*; use sp_std::prelude::*; -mod cdn_node; mod node; mod storage_node; pub use crate::{ - cdn_node::CDNNode, node::{Node, NodeError, NodeTrait}, storage_node::StorageNode, }; @@ -74,9 +72,6 @@ pub mod pallet { pub enum Error { NodeAlreadyExists, NodeDoesNotExist, - InvalidNodePubKey, - InvalidNodeParams, - NodeParamsExceedsLimit, OnlyNodeProvider, NodeIsAssignedToCluster, HostLenExceedsLimit, @@ -88,20 +83,15 @@ pub mod pallet { pub type StorageNodes = StorageMap<_, Blake2_128Concat, StorageNodePubKey, StorageNode>; - #[pallet::storage] - #[pallet::getter(fn cdn_nodes)] - pub type CDNNodes = StorageMap<_, Blake2_128Concat, CDNNodePubKey, CDNNode>; - #[pallet::genesis_config] pub struct GenesisConfig { pub storage_nodes: Vec>, - pub cdn_nodes: Vec>, } #[cfg(feature = "std")] impl Default for GenesisConfig { fn default() -> Self { - GenesisConfig { storage_nodes: Default::default(), cdn_nodes: Default::default() } + GenesisConfig { storage_nodes: Default::default() } } } @@ -111,9 +101,6 @@ pub mod pallet { for storage_node in &self.storage_nodes { >::insert(storage_node.pub_key.clone(), storage_node); } - for cdn_node in &self.cdn_nodes { - >::insert(cdn_node.pub_key.clone(), cdn_node); - } } } @@ -172,18 +159,14 @@ pub mod pallet { #[derive(Debug, PartialEq)] pub enum NodeRepositoryError { StorageNodeAlreadyExists, - CDNNodeAlreadyExists, StorageNodeDoesNotExist, - CDNNodeDoesNotExist, } impl From for Error { fn from(error: NodeRepositoryError) -> Self { match error { NodeRepositoryError::StorageNodeAlreadyExists => Error::::NodeAlreadyExists, - NodeRepositoryError::CDNNodeAlreadyExists => Error::::NodeAlreadyExists, NodeRepositoryError::StorageNodeDoesNotExist => Error::::NodeDoesNotExist, - NodeRepositoryError::CDNNodeDoesNotExist => Error::::NodeDoesNotExist, } } } @@ -198,13 +181,6 @@ pub mod pallet { StorageNodes::::insert(storage_node.pub_key.clone(), storage_node); Ok(()) }, - Node::CDN(cdn_node) => { - if CDNNodes::::contains_key(&cdn_node.pub_key) { - return Err(NodeRepositoryError::CDNNodeAlreadyExists) - } - CDNNodes::::insert(cdn_node.pub_key.clone(), cdn_node); - Ok(()) - }, } } @@ -214,10 +190,6 @@ pub mod pallet { Ok(storage_node) => Ok(Node::Storage(storage_node)), Err(_) => Err(NodeRepositoryError::StorageNodeDoesNotExist), }, - NodePubKey::CDNPubKey(pub_key) => match CDNNodes::::try_get(pub_key) { - Ok(cdn_node) => Ok(Node::CDN(cdn_node)), - Err(_) => Err(NodeRepositoryError::CDNNodeDoesNotExist), - }, } } @@ -229,12 +201,6 @@ pub mod pallet { } StorageNodes::::insert(storage_node.pub_key.clone(), storage_node); }, - Node::CDN(cdn_node) => { - if !CDNNodes::::contains_key(&cdn_node.pub_key) { - return Err(NodeRepositoryError::CDNNodeDoesNotExist) - } - CDNNodes::::insert(cdn_node.pub_key.clone(), cdn_node); - }, } Ok(()) } @@ -245,10 +211,6 @@ pub mod pallet { StorageNodes::::remove(pub_key); Ok(()) }, - NodePubKey::CDNPubKey(pub_key) => { - CDNNodes::::remove(pub_key); - Ok(()) - }, } } } diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 99fbdea81..0d7478435 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -6,7 +6,6 @@ use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; use crate::{ - cdn_node::{CDNNode, CDNNodeProps}, pallet::Error, storage_node::{StorageNode, StorageNodeProps}, ClusterId, @@ -15,14 +14,12 @@ use crate::{ #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum Node { Storage(StorageNode), - CDN(CDNNode), } // Props fields may include internal protocol properties #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodeProps { StorageProps(StorageNodeProps), - CDNProps(CDNNodeProps), } pub trait NodeTrait { @@ -45,8 +42,6 @@ impl Node { match node_pub_key { NodePubKey::StoragePubKey(_) => StorageNode::new(node_pub_key, provider_id, node_params).map(|n| Node::Storage(n)), - NodePubKey::CDNPubKey(_) => - CDNNode::new(node_pub_key, provider_id, node_params).map(|n| Node::CDN(n)), } } } @@ -55,76 +50,54 @@ impl NodeTrait for Node { fn get_pub_key(&self) -> NodePubKey { match &self { Node::Storage(node) => node.get_pub_key(), - Node::CDN(node) => node.get_pub_key(), } } fn get_provider_id(&self) -> &T::AccountId { match &self { Node::Storage(node) => node.get_provider_id(), - Node::CDN(node) => node.get_provider_id(), } } fn get_props(&self) -> NodeProps { match &self { Node::Storage(node) => node.get_props(), - Node::CDN(node) => node.get_props(), } } fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError> { match self { Node::Storage(node) => node.set_props(props), - Node::CDN(node) => node.set_props(props), } } fn set_params(&mut self, params: NodeParams) -> Result<(), NodeError> { match self { Node::Storage(node) => node.set_params(params), - Node::CDN(node) => node.set_params(params), } } fn get_cluster_id(&self) -> &Option { match &self { Node::Storage(node) => node.get_cluster_id(), - Node::CDN(node) => node.get_cluster_id(), } } fn set_cluster_id(&mut self, cluster_id: Option) { match self { Node::Storage(node) => node.set_cluster_id(cluster_id), - Node::CDN(node) => node.set_cluster_id(cluster_id), } } fn get_type(&self) -> NodeType { match &self { Node::Storage(node) => node.get_type(), - Node::CDN(node) => node.get_type(), } } } #[derive(Debug, PartialEq)] pub enum NodeError { - InvalidStorageNodePubKey, - InvalidCDNNodePubKey, - InvalidStorageNodeParams, - InvalidCDNNodeParams, StorageHostLenExceedsLimit, - CDNHostLenExceedsLimit, - InvalidCDNNodeProps, - InvalidStorageNodeProps, } impl From for Error { fn from(error: NodeError) -> Self { match error { - NodeError::InvalidStorageNodePubKey => Error::::InvalidNodePubKey, - NodeError::InvalidCDNNodePubKey => Error::::InvalidNodePubKey, - NodeError::InvalidStorageNodeParams => Error::::InvalidNodeParams, - NodeError::InvalidCDNNodeParams => Error::::InvalidNodeParams, NodeError::StorageHostLenExceedsLimit => Error::::HostLenExceedsLimit, - NodeError::CDNHostLenExceedsLimit => Error::::HostLenExceedsLimit, - NodeError::InvalidStorageNodeProps => Error::::InvalidNodeParams, - NodeError::InvalidCDNNodeProps => Error::::InvalidNodeParams, } } } diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index 3a6798c71..ce83664ef 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -54,9 +54,7 @@ impl StorageNode { p2p_port: node_params.p2p_port, }, }), - _ => Err(NodeError::InvalidStorageNodeParams), }, - _ => Err(NodeError::InvalidStorageNodePubKey), } } } @@ -74,7 +72,6 @@ impl NodeTrait for StorageNode { fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError> { self.props = match props { NodeProps::StorageProps(props) => props, - _ => return Err(NodeError::InvalidStorageNodeProps), }; Ok(()) } @@ -83,13 +80,12 @@ impl NodeTrait for StorageNode { NodeParams::StorageParams(storage_params) => { self.props.host = match storage_params.host.try_into() { Ok(vec) => vec, - Err(_) => return Err(NodeError::CDNHostLenExceedsLimit), + Err(_) => return Err(NodeError::StorageHostLenExceedsLimit), }; self.props.http_port = storage_params.http_port; self.props.grpc_port = storage_params.grpc_port; self.props.p2p_port = storage_params.p2p_port; }, - _ => return Err(NodeError::InvalidStorageNodeParams), }; Ok(()) } diff --git a/pallets/ddc-nodes/src/testing_utils.rs b/pallets/ddc-nodes/src/testing_utils.rs index aec9892d2..67feb7142 100644 --- a/pallets/ddc-nodes/src/testing_utils.rs +++ b/pallets/ddc-nodes/src/testing_utils.rs @@ -1,6 +1,6 @@ //! Testing utils for ddc-staking. -use ddc_primitives::{CDNNodeParams, CDNNodePubKey, NodeParams}; +use ddc_primitives::{NodeParams, StorageNodeParams, StorageNodePubKey}; use frame_benchmarking::account; use sp_std::vec; @@ -14,19 +14,19 @@ pub fn create_user_and_config( n: u32, ) -> (T::AccountId, NodePubKey, NodeParams, NodeParams) { let user = account(string, n, SEED); - let node = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); - let cdn_node_params = NodeParams::CDNParams(CDNNodeParams { + let node = NodePubKey::StoragePubKey(StorageNodePubKey::new([0; 32])); + let storage_node_params = NodeParams::StorageParams(StorageNodeParams { host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, }); - let cdn_node_params_new = NodeParams::CDNParams(CDNNodeParams { + let new_storage_node_params = NodeParams::StorageParams(StorageNodeParams { host: vec![2u8, 255], http_port: 45000u16, grpc_port: 55000u16, p2p_port: 65000u16, }); - (user, node, cdn_node_params, cdn_node_params_new) + (user, node, storage_node_params, new_storage_node_params) } diff --git a/pallets/ddc-nodes/src/tests.rs b/pallets/ddc-nodes/src/tests.rs index c678de436..192433e59 100644 --- a/pallets/ddc-nodes/src/tests.rs +++ b/pallets/ddc-nodes/src/tests.rs @@ -1,133 +1,11 @@ //! Tests for the module. -use ddc_primitives::{CDNNodeParams, NodePubKey, StorageNodeParams}; +use ddc_primitives::{NodePubKey, StorageNodeParams}; use frame_support::{assert_noop, assert_ok}; use sp_runtime::AccountId32; use super::{mock::*, *}; -#[test] -fn create_cdn_node_works() { - ExtBuilder.build_and_execute(|| { - System::set_block_number(1); - let bytes = [0u8; 32]; - let node_pub_key = AccountId32::from(bytes); - let cdn_node_params = CDNNodeParams { - host: vec![1u8, 255], - http_port: 35000u16, - grpc_port: 25000u16, - p2p_port: 15000u16, - }; - - // Node params are not valid - assert_noop!( - DdcNodes::create_node( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::StorageParams(StorageNodeParams { - host: vec![1u8, 255], - http_port: 35000u16, - grpc_port: 25000u16, - p2p_port: 15000u16, - }) - ), - Error::::InvalidNodeParams - ); - - // Pub key invalid - assert_noop!( - CDNNode::::new( - NodePubKey::StoragePubKey(node_pub_key.clone()), - 1u64, - NodeParams::CDNParams(cdn_node_params.clone()) - ), - NodeError::InvalidCDNNodePubKey - ); - - // Host length exceeds limit - assert_noop!( - DdcNodes::create_node( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(CDNNodeParams { - host: vec![1u8; 256], - http_port: 35000u16, - grpc_port: 25000u16, - p2p_port: 15000u16, - }) - ), - Error::::HostLenExceedsLimit - ); - - // Node created - assert_ok!(DdcNodes::create_node( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params.clone()) - )); - - // Check storage - assert!(CDNNodes::::contains_key(node_pub_key.clone())); - assert!(DdcNodes::exists(&NodePubKey::CDNPubKey(node_pub_key.clone()))); - if let Ok(cluster_id) = - DdcNodes::get_cluster_id(&NodePubKey::CDNPubKey(node_pub_key.clone())) - { - assert_eq!(cluster_id, None); - } - let cdn_node = DdcNodes::cdn_nodes(&node_pub_key).unwrap(); - assert_eq!(cdn_node.pub_key, node_pub_key); - - // Node already exists - assert_noop!( - DdcNodes::create_node( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params) - ), - Error::::NodeAlreadyExists - ); - - // Checking that event was emitted - assert_eq!(System::events().len(), 1); - System::assert_last_event( - Event::NodeCreated { node_pub_key: NodePubKey::CDNPubKey(node_pub_key) }.into(), - ) - }) -} - -#[test] -fn create_cdn_node_with_node_creator() { - ExtBuilder.build_and_execute(|| { - System::set_block_number(1); - let bytes = [0u8; 32]; - let node_pub_key = AccountId32::from(bytes); - let cdn_node_params = CDNNodeParams { - host: vec![1u8, 255], - http_port: 35000u16, - grpc_port: 25000u16, - p2p_port: 15000u16, - }; - - // Node created - assert_ok!(>::create_node( - NodePubKey::CDNPubKey(node_pub_key.clone()), - 1u64, - NodeParams::CDNParams(cdn_node_params) - )); - - // Check storage - assert!(CDNNodes::::contains_key(node_pub_key.clone())); - assert!(DdcNodes::exists(&NodePubKey::CDNPubKey(node_pub_key.clone()))); - if let Ok(cluster_id) = - DdcNodes::get_cluster_id(&NodePubKey::CDNPubKey(node_pub_key.clone())) - { - assert_eq!(cluster_id, None); - } - let cdn_node = DdcNodes::cdn_nodes(&node_pub_key).unwrap(); - assert_eq!(cdn_node.pub_key, node_pub_key); - }) -} - #[test] fn create_storage_node_works() { ExtBuilder.build_and_execute(|| { @@ -141,31 +19,6 @@ fn create_storage_node_works() { p2p_port: 15000u16, }; - // Node params are not valid - assert_noop!( - DdcNodes::create_node( - RuntimeOrigin::signed(1), - NodePubKey::StoragePubKey(node_pub_key.clone()), - NodeParams::CDNParams(CDNNodeParams { - host: vec![1u8, 255], - http_port: 35000u16, - grpc_port: 25000u16, - p2p_port: 15000u16, - }) - ), - Error::::InvalidNodeParams - ); - - // Pub key invalid - assert_noop!( - StorageNode::::new( - NodePubKey::CDNPubKey(node_pub_key.clone()), - 1u64, - NodeParams::StorageParams(storage_node_params.clone()) - ), - NodeError::InvalidStorageNodePubKey - ); - // Host length exceeds limit assert_noop!( DdcNodes::create_node( @@ -245,123 +98,8 @@ fn create_storage_node_with_node_creator() { { assert_eq!(cluster_id, None); } - let cdn_node = DdcNodes::storage_nodes(&node_pub_key).unwrap(); - assert_eq!(cdn_node.pub_key, node_pub_key); - }) -} - -#[test] -fn set_cdn_node_params_works() { - ExtBuilder.build_and_execute(|| { - System::set_block_number(1); - let bytes = [0u8; 32]; - let node_pub_key = AccountId32::from(bytes); - let storage_node_params = StorageNodeParams { - host: vec![1u8, 255], - http_port: 35000u16, - grpc_port: 25000u16, - p2p_port: 15000u16, - }; - let cdn_node_params = CDNNodeParams { - host: vec![1u8, 255], - http_port: 35000u16, - grpc_port: 25000u16, - p2p_port: 15000u16, - }; - - // Node doesn't exist - assert_noop!( - DdcNodes::set_node_params( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params.clone()) - ), - Error::::NodeDoesNotExist - ); - - // Node created - assert_ok!(DdcNodes::create_node( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params.clone()) - )); - - // Set node params - assert_ok!(DdcNodes::set_node_params( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params.clone()) - )); - - // Node params are not valid - assert_noop!( - DdcNodes::set_node_params( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::StorageParams(storage_node_params) - ), - Error::::InvalidNodeParams - ); - - // Only node provider can set params - assert_noop!( - DdcNodes::set_node_params( - RuntimeOrigin::signed(2), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params.clone()) - ), - Error::::OnlyNodeProvider - ); - - // CDN host length exceeds limit - assert_noop!( - DdcNodes::set_node_params( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(CDNNodeParams { - host: vec![1u8; 256], - http_port: 35000u16, - grpc_port: 25000u16, - p2p_port: 15000u16, - }) - ), - Error::::HostLenExceedsLimit - ); - - let bytes_2 = [1u8; 32]; - let node_pub_key_2 = AccountId32::from(bytes_2); - let node = Node::::new( - NodePubKey::CDNPubKey(node_pub_key_2), - 2u64, - NodeParams::CDNParams(cdn_node_params), - ) - .unwrap(); - - // Update should fail if node doesn't exist - assert_noop!( - >::update(node), - NodeRepositoryError::CDNNodeDoesNotExist - ); - - assert_noop!( - DdcNodes::set_node_params( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(CDNNodeParams { - host: vec![1u8; 256], - http_port: 35000u16, - grpc_port: 25000u16, - p2p_port: 15000u16, - }) - ), - Error::::HostLenExceedsLimit - ); - - // Checking that event was emitted - assert_eq!(System::events().len(), 2); - System::assert_last_event( - Event::NodeParamsChanged { node_pub_key: NodePubKey::CDNPubKey(node_pub_key) }.into(), - ) + let storage_node = DdcNodes::storage_nodes(&node_pub_key).unwrap(); + assert_eq!(storage_node.pub_key, node_pub_key); }) } @@ -377,12 +115,6 @@ fn set_storage_node_params_works() { grpc_port: 25000u16, p2p_port: 15000u16, }; - let cdn_node_params = CDNNodeParams { - host: vec![1u8, 255], - http_port: 35000u16, - grpc_port: 25000u16, - p2p_port: 15000u16, - }; // Node doesn't exist assert_noop!( @@ -408,16 +140,6 @@ fn set_storage_node_params_works() { NodeParams::StorageParams(storage_node_params.clone()) )); - // Node params are not valid - assert_noop!( - DdcNodes::set_node_params( - RuntimeOrigin::signed(1), - NodePubKey::StoragePubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params) - ), - Error::::InvalidNodeParams - ); - // Only node provider can set params assert_noop!( DdcNodes::set_node_params( @@ -467,58 +189,6 @@ fn set_storage_node_params_works() { }) } -#[test] -fn delete_cdn_node_works() { - ExtBuilder.build_and_execute(|| { - System::set_block_number(1); - let bytes = [0u8; 32]; - let node_pub_key = AccountId32::from(bytes); - let cdn_node_params = CDNNodeParams { - host: vec![1u8, 255], - http_port: 35000u16, - grpc_port: 25000u16, - p2p_port: 15000u16, - }; - - // Node doesn't exist - assert_noop!( - DdcNodes::delete_node( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()) - ), - Error::::NodeDoesNotExist - ); - - // Create node - assert_ok!(DdcNodes::create_node( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()), - NodeParams::CDNParams(cdn_node_params) - )); - - // Only node provider can delete - assert_noop!( - DdcNodes::delete_node( - RuntimeOrigin::signed(2), - NodePubKey::CDNPubKey(node_pub_key.clone()) - ), - Error::::OnlyNodeProvider - ); - - // Delete node - assert_ok!(DdcNodes::delete_node( - RuntimeOrigin::signed(1), - NodePubKey::CDNPubKey(node_pub_key.clone()), - )); - - // Checking that event was emitted - assert_eq!(System::events().len(), 2); - System::assert_last_event( - Event::NodeDeleted { node_pub_key: NodePubKey::CDNPubKey(node_pub_key) }.into(), - ) - }) -} - #[test] fn delete_storage_node_works() { ExtBuilder.build_and_execute(|| { diff --git a/pallets/ddc-nodes/src/weights.rs b/pallets/ddc-nodes/src/weights.rs index 868380f40..776e717a0 100644 --- a/pallets/ddc-nodes/src/weights.rs +++ b/pallets/ddc-nodes/src/weights.rs @@ -1,27 +1,22 @@ - -//! Autogenerated weights for `pallet_ddc_nodes` +//! Autogenerated weights for pallet_ddc_nodes //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-16, STEPS: `200`, REPEAT: 1000, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! HOSTNAME: `Raids-MBP-2`, CPU: `` -//! EXECUTION: None, WASM-EXECUTION: Interpreted, CHAIN: Some("dev"), DB CACHE: 1024 +//! DATE: 2023-12-14, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `Yahors-MacBook-Pro.local`, CPU: `` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: // ./target/release/cere // benchmark // pallet -// --chain -// dev -// --pallet -// pallet_ddc_nodes -// --extrinsic -// * -// --steps -// 200 -// --repeat -// 1000 -// --output -// pallets/ddc-nodes/src/weights.rs +// --chain=dev +// --execution=wasm +// --pallet=pallet-ddc-nodes +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --template=./.maintain/frame-weight-template.hbs +// --output=pallets/ddc-nodes/src/weights.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -37,47 +32,49 @@ pub trait WeightInfo { fn set_node_params() -> Weight; } -/// Weights for pallet_ddc_nodes. +/// Weights for pallet_ddc_nodes using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); -impl WeightInfo for SubstrateWeight { - // Storage: DdcNodes CDNNodes (r:1 w:1) +impl WeightInfo for SubstrateWeight { + // Storage: DdcNodes StorageNodes (r:1 w:1) fn create_node() -> Weight { - Weight::from_ref_time(12_000_000u64) - .saturating_add(T::DbWeight::get().reads(1u64)) - .saturating_add(T::DbWeight::get().writes(1u64)) + Weight::from_ref_time(13_000_000_u64) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } - // Storage: DdcNodes CDNNodes (r:1 w:1) + // Storage: DdcNodes StorageNodes (r:1 w:1) + // Storage: DdcStaking Nodes (r:1 w:0) fn delete_node() -> Weight { - Weight::from_ref_time(14_000_000u64) - .saturating_add(T::DbWeight::get().reads(1u64)) - .saturating_add(T::DbWeight::get().writes(1u64)) + Weight::from_ref_time(17_000_000_u64) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } - // Storage: DdcNodes CDNNodes (r:1 w:1) + // Storage: DdcNodes StorageNodes (r:1 w:1) fn set_node_params() -> Weight { - Weight::from_ref_time(15_000_000u64) - .saturating_add(T::DbWeight::get().reads(1u64)) - .saturating_add(T::DbWeight::get().writes(1u64)) + Weight::from_ref_time(16_000_000_u64) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } } // For backwards compatibility and tests impl WeightInfo for () { - // Storage: DdcNodes CDNNodes (r:1 w:1) + // Storage: DdcNodes StorageNodes (r:1 w:1) fn create_node() -> Weight { - Weight::from_ref_time(12_000_000u64) - .saturating_add(RocksDbWeight::get().reads(1u64)) - .saturating_add(RocksDbWeight::get().writes(1u64)) + Weight::from_ref_time(13_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } - // Storage: DdcNodes CDNNodes (r:1 w:1) + // Storage: DdcNodes StorageNodes (r:1 w:1) + // Storage: DdcStaking Nodes (r:1 w:0) fn delete_node() -> Weight { - Weight::from_ref_time(14_000_000u64) - .saturating_add(RocksDbWeight::get().reads(1u64)) - .saturating_add(RocksDbWeight::get().writes(1u64)) + Weight::from_ref_time(17_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } - // Storage: DdcNodes CDNNodes (r:1 w:1) + // Storage: DdcNodes StorageNodes (r:1 w:1) fn set_node_params() -> Weight { - Weight::from_ref_time(15_000_000u64) - .saturating_add(RocksDbWeight::get().reads(1u64)) - .saturating_add(RocksDbWeight::get().writes(1u64)) + Weight::from_ref_time(16_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } } \ No newline at end of file diff --git a/pallets/ddc-payouts/src/tests.rs b/pallets/ddc-payouts/src/tests.rs index 2197f6654..6cd8d2552 100644 --- a/pallets/ddc-payouts/src/tests.rs +++ b/pallets/ddc-payouts/src/tests.rs @@ -1159,7 +1159,7 @@ fn send_rewarding_providers_batch_works() { }; let node_usage1 = NodeUsage { - // CDN + // Storage 1 transferred_bytes: usage1.transferred_bytes * 2 / 3, stored_bytes: 0, number_of_puts: usage1.number_of_puts * 2 / 3, @@ -1167,7 +1167,7 @@ fn send_rewarding_providers_batch_works() { }; let node_usage2 = NodeUsage { - // Storage + // Storage 2 transferred_bytes: 0, stored_bytes: usage1.stored_bytes * 2, number_of_puts: 0, @@ -1175,7 +1175,7 @@ fn send_rewarding_providers_batch_works() { }; let node_usage3 = NodeUsage { - // CDN + Storage + // Storage 1 + Storage 2 transferred_bytes: usage1.transferred_bytes * 2, stored_bytes: usage1.stored_bytes * 3, number_of_puts: usage1.number_of_puts * 2, diff --git a/pallets/ddc-payouts/src/weights.rs b/pallets/ddc-payouts/src/weights.rs index e4764f492..5f0578c31 100644 --- a/pallets/ddc-payouts/src/weights.rs +++ b/pallets/ddc-payouts/src/weights.rs @@ -1,12 +1,12 @@ //! Autogenerated weights for pallet_ddc_payouts //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-30, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-14, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! HOSTNAME: `Yahors-MacBook-Pro.local`, CPU: `` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: -// ./target/debug/cere +// ./target/release/cere // benchmark // pallet // --chain=dev @@ -15,7 +15,7 @@ // --extrinsic=* // --steps=50 // --repeat=20 -// --template=./.maintain/frame-weight-template-clippy.hbs +// --template=./.maintain/frame-weight-template.hbs // --output=pallets/ddc-payouts/src/weights.rs #![cfg_attr(rustfmt, rustfmt_skip)] @@ -43,20 +43,20 @@ pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { // Storage: DdcPayouts AuthorisedCaller (r:0 w:1) fn set_authorised_caller() -> Weight { - Weight::from_ref_time(251_000_000_u64) + Weight::from_ref_time(11_000_000_u64) .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn begin_billing_report() -> Weight { - Weight::from_ref_time(466_000_000_u64) + Weight::from_ref_time(19_000_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn begin_charging_customers() -> Weight { - Weight::from_ref_time(440_000_000_u64) + Weight::from_ref_time(19_000_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -68,9 +68,9 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcPayouts DebtorCustomers (r:1 w:1) /// The range of component `b` is `[1, 1000]`. fn send_charging_customers_batch(b: u32, ) -> Weight { - Weight::from_ref_time(1_267_000_000_u64) - // Standard Error: 3_691_054 - .saturating_add(Weight::from_ref_time(557_422_673_u64).saturating_mul(b as u64)) + Weight::from_ref_time(12_333_820_u64) + // Standard Error: 298_759 + .saturating_add(Weight::from_ref_time(24_367_120_u64).saturating_mul(b as u64)) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(b as u64))) .saturating_add(T::DbWeight::get().writes(5_u64)) @@ -84,14 +84,14 @@ impl WeightInfo for SubstrateWeight { // Storage: Staking CounterForValidators (r:1 w:0) // Storage: Staking Validators (r:2 w:0) fn end_charging_customers() -> Weight { - Weight::from_ref_time(1_978_000_000_u64) + Weight::from_ref_time(89_000_000_u64) .saturating_add(T::DbWeight::get().reads(10_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn begin_rewarding_providers() -> Weight { - Weight::from_ref_time(446_000_000_u64) + Weight::from_ref_time(18_000_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -100,9 +100,9 @@ impl WeightInfo for SubstrateWeight { // Storage: System Account (r:2 w:2) /// The range of component `b` is `[1, 1000]`. fn send_rewarding_providers_batch(b: u32, ) -> Weight { - Weight::from_ref_time(758_000_000_u64) - // Standard Error: 148_210 - .saturating_add(Weight::from_ref_time(336_218_526_u64).saturating_mul(b as u64)) + Weight::from_ref_time(32_000_000_u64) + // Standard Error: 5_087 + .saturating_add(Weight::from_ref_time(14_402_776_u64).saturating_mul(b as u64)) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b as u64))) .saturating_add(T::DbWeight::get().writes(2_u64)) @@ -111,14 +111,14 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn end_rewarding_providers() -> Weight { - Weight::from_ref_time(458_000_000_u64) + Weight::from_ref_time(18_000_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn end_billing_report() -> Weight { - Weight::from_ref_time(449_000_000_u64) + Weight::from_ref_time(18_000_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -128,20 +128,20 @@ impl WeightInfo for SubstrateWeight { impl WeightInfo for () { // Storage: DdcPayouts AuthorisedCaller (r:0 w:1) fn set_authorised_caller() -> Weight { - Weight::from_ref_time(251_000_000_u64) + Weight::from_ref_time(11_000_000_u64) .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn begin_billing_report() -> Weight { - Weight::from_ref_time(466_000_000_u64) + Weight::from_ref_time(19_000_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn begin_charging_customers() -> Weight { - Weight::from_ref_time(440_000_000_u64) + Weight::from_ref_time(19_000_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -153,9 +153,9 @@ impl WeightInfo for () { // Storage: DdcPayouts DebtorCustomers (r:1 w:1) /// The range of component `b` is `[1, 1000]`. fn send_charging_customers_batch(b: u32, ) -> Weight { - Weight::from_ref_time(1_267_000_000_u64) - // Standard Error: 3_691_054 - .saturating_add(Weight::from_ref_time(557_422_673_u64).saturating_mul(b as u64)) + Weight::from_ref_time(12_333_820_u64) + // Standard Error: 298_759 + .saturating_add(Weight::from_ref_time(24_367_120_u64).saturating_mul(b as u64)) .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().reads((2_u64).saturating_mul(b as u64))) .saturating_add(RocksDbWeight::get().writes(5_u64)) @@ -169,14 +169,14 @@ impl WeightInfo for () { // Storage: Staking CounterForValidators (r:1 w:0) // Storage: Staking Validators (r:2 w:0) fn end_charging_customers() -> Weight { - Weight::from_ref_time(1_978_000_000_u64) + Weight::from_ref_time(89_000_000_u64) .saturating_add(RocksDbWeight::get().reads(10_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn begin_rewarding_providers() -> Weight { - Weight::from_ref_time(446_000_000_u64) + Weight::from_ref_time(18_000_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -185,9 +185,9 @@ impl WeightInfo for () { // Storage: System Account (r:2 w:2) /// The range of component `b` is `[1, 1000]`. fn send_rewarding_providers_batch(b: u32, ) -> Weight { - Weight::from_ref_time(758_000_000_u64) - // Standard Error: 148_210 - .saturating_add(Weight::from_ref_time(336_218_526_u64).saturating_mul(b as u64)) + Weight::from_ref_time(32_000_000_u64) + // Standard Error: 5_087 + .saturating_add(Weight::from_ref_time(14_402_776_u64).saturating_mul(b as u64)) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(b as u64))) .saturating_add(RocksDbWeight::get().writes(2_u64)) @@ -196,15 +196,15 @@ impl WeightInfo for () { // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn end_rewarding_providers() -> Weight { - Weight::from_ref_time(458_000_000_u64) + Weight::from_ref_time(18_000_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn end_billing_report() -> Weight { - Weight::from_ref_time(449_000_000_u64) + Weight::from_ref_time(18_000_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } -} +} \ No newline at end of file diff --git a/pallets/ddc-staking/README.md b/pallets/ddc-staking/README.md index f8ac2385a..2db79884a 100644 --- a/pallets/ddc-staking/README.md +++ b/pallets/ddc-staking/README.md @@ -4,13 +4,12 @@ The DDC Staking module is used to manage funds at stake by Cere DDC participants ## Overview -The DDC Staking module is the means by which an account can voluntarily place funds under deposit to join DDC CDN or storage network. +The DDC Staking module is the means by which an account can voluntarily place funds under deposit to join DDC network. ### Terminology - DDC Staking: The process of locking up funds for some time in order to become a participant of the DDC. - Stash account: The account holding an owner's funds used for staking. - Controller account: The account that controls an owner's funds for staking. -- CDN: CDN network participant. - Storage: Storage network participant. - Era: A time period of DDC participants activity data capture and accumulation which will further be used to calculate pay outs. diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index 67afcea68..1ebf69ec3 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -1,6 +1,6 @@ //! DdcStaking pallet benchmarking. -use ddc_primitives::{CDNNodeParams, CDNNodePubKey, NodeParams, NodeType, StorageNodePubKey}; +use ddc_primitives::{NodeParams, NodeType, StorageNodeParams, StorageNodePubKey}; pub use frame_benchmarking::{ account, benchmarks, impl_benchmark_test_suite, whitelist_account, whitelisted_caller, }; @@ -21,11 +21,11 @@ benchmarks! { let controller = create_funded_user::("controller", USER_SEED, 100); let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); - let node = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); + let node = NodePubKey::StoragePubKey(StorageNodePubKey::new([0; 32])); let _ = T::NodeCreator::create_node( node.clone(), stash.clone(), - NodeParams::CDNParams(CDNNodeParams { + NodeParams::StorageParams(StorageNodeParams { host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, @@ -43,7 +43,7 @@ benchmarks! { unbond { // clean up any existing state. - clear_storages_and_cdns::(); + clear_activated_nodes::(); let (stash, controller, _) = create_stash_controller_node::(0, 100)?; let ledger = Ledger::::get(&controller).ok_or("ledger not created before")?; @@ -75,7 +75,7 @@ benchmarks! { store { let node_pub_key = NodePubKey::StoragePubKey(StorageNodePubKey::new([0; 32])); - let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(100u128), node_pub_key)?; + let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::Storage).unwrap_or(100u128), node_pub_key)?; whitelist_account!(controller); }: _(RawOrigin::Signed(controller), ClusterId::from([1; 20])) @@ -83,32 +83,23 @@ benchmarks! { assert!(Storages::::contains_key(&stash)); } - serve { - let node_pub_key = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); - let (stash, controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(10u128), node_pub_key)?; - - whitelist_account!(controller); - }: _(RawOrigin::Signed(controller), ClusterId::from([1; 20])) - verify { - assert!(CDNs::::contains_key(&stash)); - } chill { // clean up any existing state. - clear_storages_and_cdns::(); + clear_activated_nodes::(); - let node_pub_key = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); - let (cdn_stash, cdn_controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or(10u128), node_pub_key)?; - DdcStaking::::serve(RawOrigin::Signed(cdn_controller.clone()).into(), ClusterId::from([1; 20]))?; - assert!(CDNs::::contains_key(&cdn_stash)); + let node_pub_key = NodePubKey::StoragePubKey(StorageNodePubKey::new([0; 32])); + let (storage_stash, storage_controller, _) = create_stash_controller_node_with_balance::(0, T::ClusterVisitor::get_bond_size(&ClusterId::from([1; 20]), NodeType::Storage).unwrap_or(10u128), node_pub_key)?; + DdcStaking::::store(RawOrigin::Signed(storage_controller.clone()).into(), ClusterId::from([1; 20]))?; + assert!(Storages::::contains_key(&storage_stash)); frame_system::Pallet::::set_block_number(T::BlockNumber::from(1u32)); - DdcStaking::::chill(RawOrigin::Signed(cdn_controller.clone()).into())?; - frame_system::Pallet::::set_block_number(T::BlockNumber::from(1u32) + T::ClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::CDN).unwrap_or_else(|_| T::BlockNumber::from(10u32))); + DdcStaking::::chill(RawOrigin::Signed(storage_controller.clone()).into())?; + frame_system::Pallet::::set_block_number(T::BlockNumber::from(1u32) + T::ClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::Storage).unwrap_or_else(|_| T::BlockNumber::from(10u32))); - whitelist_account!(cdn_controller); - }: _(RawOrigin::Signed(cdn_controller)) + whitelist_account!(storage_controller); + }: _(RawOrigin::Signed(storage_controller)) verify { - assert!(!CDNs::::contains_key(&cdn_stash)); + assert!(!Storages::::contains_key(&storage_stash)); } set_controller { @@ -123,7 +114,7 @@ benchmarks! { set_node { let (stash, _, _) = create_stash_controller_node::(USER_SEED, 100)?; - let new_node = NodePubKey::CDNPubKey(CDNNodePubKey::new([1; 32])); + let new_node = NodePubKey::StoragePubKey(StorageNodePubKey::new([1; 32])); whitelist_account!(stash); }: _(RawOrigin::Signed(stash), new_node.clone()) verify { diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index f012c35dc..10a7feb56 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -1,6 +1,6 @@ //! # DDC Staking Pallet //! -//! The DDC Staking pallet is used to manage funds at stake by CDN and storage network maintainers. +//! The DDC Staking pallet is used to manage funds at stake by DDC network maintainers. //! //! - [`Config`] //! - [`Call`] @@ -189,12 +189,6 @@ pub mod pallet { pub type Ledger = StorageMap<_, Blake2_128Concat, T::AccountId, StakingLedger, T>>; - /// The map of (wannabe) CDN nodes participants stash keys to the DDC cluster ID they wish to - /// participate into. - #[pallet::storage] - #[pallet::getter(fn cdns)] - pub type CDNs = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; - /// The map of (wannabe) Storage nodes participants stash keys to the DDC cluster ID they /// wish to participate into. #[pallet::storage] @@ -216,15 +210,8 @@ pub mod pallet { #[pallet::getter(fn leaving_storages)] pub type LeavingStorages = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; - // Map of CDN node provider stash accounts that aim to leave a cluster - #[pallet::storage] - #[pallet::getter(fn leaving_cdns)] - pub type LeavingCDNs = StorageMap<_, Twox64Concat, T::AccountId, ClusterId>; - #[pallet::genesis_config] pub struct GenesisConfig { - #[allow(clippy::type_complexity)] - pub cdns: Vec<(T::AccountId, T::AccountId, NodePubKey, BalanceOf, ClusterId)>, #[allow(clippy::type_complexity)] pub storages: Vec<(T::AccountId, T::AccountId, NodePubKey, BalanceOf, ClusterId)>, } @@ -232,31 +219,13 @@ pub mod pallet { #[cfg(feature = "std")] impl Default for GenesisConfig { fn default() -> Self { - GenesisConfig { cdns: Default::default(), storages: Default::default() } + GenesisConfig { storages: Default::default() } } } #[pallet::genesis_build] impl GenesisBuild for GenesisConfig { fn build(&self) { - // Add initial CDN participants - for &(ref stash, ref controller, ref node, balance, cluster) in &self.cdns { - assert!( - T::Currency::free_balance(stash) >= balance, - "Stash do not have enough balance to participate in CDN." - ); - assert_ok!(Pallet::::bond( - T::RuntimeOrigin::from(Some(stash.clone()).into()), - T::Lookup::unlookup(controller.clone()), - node.clone(), - balance, - )); - assert_ok!(Pallet::::serve( - T::RuntimeOrigin::from(Some(controller.clone()).into()), - cluster, - )); - } - // Add initial storage network participants for &(ref stash, ref controller, ref node, balance, cluster) in &self.storages { assert!( @@ -290,20 +259,20 @@ pub mod pallet { /// An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` /// from the unlocking queue. \[stash, amount\] Withdrawn(T::AccountId, BalanceOf), - /// An account has stopped participating as either a storage network or CDN participant. + /// An account has stopped participating as DDC network participant. /// \[stash\] Chilled(T::AccountId), - /// An account has declared desire to stop participating in CDN or storage network soon. + /// An account has declared desire to stop participating in DDC network soon. /// \[stash, cluster, block\] ChillSoon(T::AccountId, ClusterId, T::BlockNumber), - /// An account that started participating as either a storage network or CDN participant. + /// An account that started participating as DDC network participant. /// \[stash\] Activated(T::AccountId), /// An account that started unbonding tokens below the minimum value set for the cluster - /// his CDN or Storage node is assigned to \[stash\] + /// his DDC node is assigned to \[stash\] LeaveSoon(T::AccountId), /// An account that unbonded tokens below the minimum value set for the cluster his - /// CDN or Storage node was assigned to \[stash\] + /// DDC node was assigned to \[stash\] Left(T::AccountId), } @@ -317,9 +286,9 @@ pub mod pallet { AlreadyBonded, /// Controller or node is already paired. AlreadyPaired, - /// Cannot have a storage network or CDN participant, with the size less than defined by + /// Cannot have a DDC network participant, with the size less than defined by /// governance (see `BondSize`). If unbonding is the intention, `chill` first to remove - /// one's role as storage/cdn node. + /// one's role as activated DDC node. InsufficientBond, /// Can not schedule more unlock chunks. NoMoreChunks, @@ -340,8 +309,6 @@ pub mod pallet { NoClusterGovParams, /// Conditions for fast chill are not met, try the regular `chill` from FastChillProhibited, - /// Serving operation is called for non-CDN node - ServingProhibited, /// Storing operation is called for non-Storage node StoringProhibited, /// Arithmetic overflow occurred @@ -465,11 +432,7 @@ pub mod pallet { ledger.active = Zero::zero(); } - let min_active_bond = if let Some(cluster_id) = Self::cdns(&ledger.stash) { - let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, NodeType::CDN) - .map_err(Into::>::into)?; - bond_size.saturated_into::>() - } else if let Some(cluster_id) = Self::storages(&ledger.stash) { + let min_active_bond = if let Some(cluster_id) = Self::storages(&ledger.stash) { let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, NodeType::Storage) .map_err(Into::>::into)?; @@ -496,7 +459,6 @@ pub mod pallet { .map_err(Into::>::into)?; let min_bond_size = match node_pub_key { - NodePubKey::CDNPubKey(_) => bonding_params.cdn_bond_size, NodePubKey::StoragePubKey(_) => bonding_params.storage_bond_size, }; @@ -504,8 +466,6 @@ pub mod pallet { // cluster eventually, we keep its stake till the end of unbonding period. if ledger.active < min_bond_size.saturated_into::>() { match node_pub_key { - NodePubKey::CDNPubKey(_) => - LeavingCDNs::::insert(ledger.stash.clone(), cluster_id), NodePubKey::StoragePubKey(_) => LeavingStorages::::insert(ledger.stash.clone(), cluster_id), }; @@ -514,7 +474,6 @@ pub mod pallet { }; match node_pub_key { - NodePubKey::CDNPubKey(_) => bonding_params.cdn_unbonding_delay, NodePubKey::StoragePubKey(_) => bonding_params.storage_unbonding_delay, } } else { @@ -590,15 +549,12 @@ pub mod pallet { // If provider aimed to leave the cluster and the unbonding period ends, remove // the node from the cluster - if let Some(cluster_id) = - >::get(&stash).or_else(|| >::get(&stash)) - { + if let Some(cluster_id) = >::get(&stash) { // Cluster manager could remove the node from cluster by this moment already, so // it is ok to ignore result. let _ = T::ClusterManager::remove_node(&cluster_id, &node_pub_key); >::remove(&stash); - >::remove(&stash); Self::deposit_event(Event::::Left(stash)); } @@ -607,59 +563,6 @@ pub mod pallet { Ok(()) } - /// Declare the desire to participate in CDN for the origin controller. Also works to cancel - /// a previous "chill". - /// - /// `cluster` is the ID of the DDC cluster the participant wishes to join. - /// - /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. The - /// bond size must be greater than or equal to the `CDNBondSize`. - #[pallet::weight(T::WeightInfo::serve())] - pub fn serve(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { - let controller = ensure_signed(origin)?; - - T::ClusterVisitor::ensure_cluster(&cluster_id).map_err(Into::>::into)?; - - let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - // Retrieve the respective bond size from Cluster Visitor - let bond_size = T::ClusterVisitor::get_bond_size(&cluster_id, NodeType::CDN) - .map_err(Into::>::into)?; - - ensure!( - ledger.active >= bond_size.saturated_into::>(), - Error::::InsufficientBond - ); - let stash = &ledger.stash; - - // Can't participate in CDN if already participating in storage network. - ensure!(!Storages::::contains_key(stash), Error::::AlreadyInRole); - - // Only CDN node can perform serving (i.e. streaming content) - let node_pub_key = >::get(stash).ok_or(Error::::BadState)?; - ensure!( - matches!(node_pub_key, NodePubKey::CDNPubKey(_)), - Error::::ServingProhibited - ); - - // Is it an attempt to cancel a previous "chill"? - if let Some(current_cluster) = Self::cdns(stash) { - // Switching the cluster is prohibited. The user should chill first. - ensure!(current_cluster == cluster_id, Error::::AlreadyInRole); - // Cancel previous "chill" attempts - Self::reset_chilling(&controller); - return Ok(()) - } else { - // Can't participate in new CDN network if provider hasn't left the previous cluster - // yet - ensure!(!LeavingCDNs::::contains_key(stash), Error::::NodeIsLeaving); - } - - Self::do_add_cdn(stash, cluster_id); - Self::deposit_event(Event::::Activated(stash.clone())); - - Ok(()) - } - /// Declare the desire to participate in storage network for the origin controller. Also /// works to cancel a previous "chill". /// @@ -683,9 +586,6 @@ pub mod pallet { ); let stash = &ledger.stash; - // Can't participate in storage network if already participating in CDN. - ensure!(!CDNs::::contains_key(stash), Error::::AlreadyInRole); - // Only Storage node can perform storing (i.e. saving content) let node_pub_key = >::get(stash).ok_or(Error::::BadState)?; ensure!( @@ -712,15 +612,15 @@ pub mod pallet { Ok(()) } - /// Declare no desire to either participate in storage network or CDN. + /// Declare no desire to either participate in DDC network. /// /// Only in case the delay for the role _origin_ maintains in the cluster is set to zero in /// cluster settings, it removes the participant immediately. Otherwise, it requires at /// least two invocations to effectively remove the participant. The first invocation only /// updates the [`Ledger`] to note the block number at which the participant may "chill" /// (current block + the delay from the cluster settings). The second invocation made at the - /// noted block (or any further block) will remove the participant from the list of CDN or - /// storage network participants. If the cluster settings updated significantly decreasing + /// noted block (or any further block) will remove the participant from the list of DDC + /// network participants. If the cluster settings updated significantly decreasing /// the delay, one may invoke it again to decrease the block at with the participant may /// "chill". But it never increases the block at which the participant may "chill" even when /// the cluster settings updated increasing the delay. @@ -735,11 +635,7 @@ pub mod pallet { let current_block = >::block_number(); // Extract delay from the cluster settings. - let (cluster, delay) = if let Some(cluster) = Self::cdns(&ledger.stash) { - let chill_delay = T::ClusterVisitor::get_chill_delay(&cluster, NodeType::CDN) - .map_err(Into::>::into)?; - (cluster, chill_delay) - } else if let Some(cluster) = Self::storages(&ledger.stash) { + let (cluster, delay) = if let Some(cluster) = Self::storages(&ledger.stash) { let chill_delay = T::ClusterVisitor::get_chill_delay(&cluster, NodeType::Storage) .map_err(Into::>::into)?; (cluster, chill_delay) @@ -821,12 +717,10 @@ pub mod pallet { } // Ensure only one node per stash. - ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); ensure!(!>::contains_key(&stash), Error::::AlreadyInRole); // Ensure that provider is not about leaving the cluster as it may cause the removal // of an unexpected node after unbonding. - ensure!(!>::contains_key(&stash), Error::::NodeIsLeaving); ensure!(!>::contains_key(&stash), Error::::NodeIsLeaving); >::insert(new_node.clone(), stash.clone()); @@ -847,9 +741,7 @@ pub mod pallet { let node_stash = >::get(&node_pub_key).ok_or(Error::::BadState)?; ensure!(stash == node_stash, Error::::NotNodeController); - let cluster_id = >::get(&stash) - .or_else(|| >::get(&stash)) - .ok_or(Error::::NodeHasNoStake)?; + let cluster_id = >::get(&stash).ok_or(Error::::NodeHasNoStake)?; let is_cluster_node = T::ClusterManager::contains_node(&cluster_id, &node_pub_key); ensure!(!is_cluster_node, Error::::FastChillProhibited); @@ -883,8 +775,7 @@ pub mod pallet { /// Chill a stash account. fn chill_stash(stash: &T::AccountId) { let chilled_as_storage = Self::do_remove_storage(stash); - let chilled_as_cdn = Self::do_remove_cdn(stash); - if chilled_as_storage || chilled_as_cdn { + if chilled_as_storage { Self::deposit_event(Event::::Chilled(stash.clone())); } } @@ -922,27 +813,12 @@ pub mod pallet { }; Self::do_remove_storage(stash); - Self::do_remove_cdn(stash); frame_system::Pallet::::dec_consumers(stash); Ok(()) } - /// This function will add a CDN participant to the `CDNs` storage map. - /// - /// If the CDN participant already exists, their cluster will be updated. - pub fn do_add_cdn(who: &T::AccountId, cluster: ClusterId) { - CDNs::::insert(who, cluster); - } - - /// This function will remove a CDN participant from the `CDNs` map. - /// - /// Returns true if `who` was removed from `CDNs`, otherwise false. - pub fn do_remove_cdn(who: &T::AccountId) -> bool { - CDNs::::take(who).is_some() - } - /// This function will add a storage network participant to the `Storages` storage map. /// /// If the storage network participant already exists, their cluster will be updated. @@ -991,7 +867,6 @@ pub mod pallet { Self::update_ledger(&controller, &item); match node { NodePubKey::StoragePubKey(_node) => Self::do_add_storage(&stash, cluster_id), - NodePubKey::CDNPubKey(_node) => Self::do_add_cdn(&stash, cluster_id), } Ok(()) @@ -1005,11 +880,9 @@ pub mod pallet { ) -> Result { let stash = >::get(node_pub_key).ok_or(StakingVisitorError::NodeStakeDoesNotExist)?; - let maybe_cdn_in_cluster = CDNs::::get(&stash); let maybe_storage_in_cluster = Storages::::get(&stash); - let has_activated_stake: bool = maybe_cdn_in_cluster - .or(maybe_storage_in_cluster) + let has_activated_stake: bool = maybe_storage_in_cluster .is_some_and(|staking_cluster| staking_cluster == *cluster_id); Ok(has_activated_stake) diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index ef35f6515..7ff3fbd1e 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -5,8 +5,8 @@ use std::cell::RefCell; use ddc_primitives::{ - CDNNodePubKey, ClusterBondingParams, ClusterFeesParams, ClusterGovParams, ClusterParams, - ClusterPricingParams, NodeParams, NodePubKey, StorageNodePubKey, + ClusterBondingParams, ClusterFeesParams, ClusterGovParams, ClusterParams, ClusterPricingParams, + NodeParams, NodePubKey, StorageNodePubKey, }; use ddc_traits::{ cluster::{ClusterManager, ClusterManagerError, ClusterVisitor, ClusterVisitorError}, @@ -195,21 +195,6 @@ impl ClusterVisitor for TestClusterVisitor { cluster_id: &ClusterId, ) -> Result, ClusterVisitorError> { Ok(ClusterBondingParams { - cdn_bond_size: >::get_bond_size( - cluster_id, - NodeType::CDN, - ) - .unwrap_or_default(), - cdn_chill_delay: >::get_chill_delay( - cluster_id, - NodeType::CDN, - ) - .unwrap_or_default(), - cdn_unbonding_delay: >::get_unbonding_delay( - cluster_id, - NodeType::CDN, - ) - .unwrap_or_default(), storage_bond_size: >::get_bond_size( cluster_id, NodeType::Storage, @@ -301,30 +286,18 @@ impl NodeVisitor for MockNodeVisitor { } pub struct ExtBuilder { - has_cdns: bool, has_storages: bool, stakes: BTreeMap, - cdns: Vec<(AccountId, AccountId, Balance, ClusterId)>, storages: Vec<(AccountId, AccountId, Balance, ClusterId)>, } impl Default for ExtBuilder { fn default() -> Self { - Self { - has_cdns: true, - has_storages: true, - stakes: Default::default(), - cdns: Default::default(), - storages: Default::default(), - } + Self { has_storages: true, stakes: Default::default(), storages: Default::default() } } } impl ExtBuilder { - pub fn has_cdns(mut self, has: bool) -> Self { - self.has_cdns = has; - self - } pub fn has_storages(mut self, has: bool) -> Self { self.has_storages = has; self @@ -333,16 +306,6 @@ impl ExtBuilder { self.stakes.insert(who, stake); self } - pub fn add_cdn( - mut self, - stash: AccountId, - controller: AccountId, - stake: Balance, - cluster: ClusterId, - ) -> Self { - self.cdns.push((stash, controller, stake, cluster)); - self - } pub fn add_storage( mut self, stash: AccountId, @@ -363,45 +326,37 @@ impl ExtBuilder { (2, 100), (3, 100), (4, 100), - // cdn controllers + // storage controllers (10, 100), (20, 100), - // storage controllers (30, 100), (40, 100), - // cdn stashes + // storage stashes (11, 100), (21, 100), - // storage stashes (31, 100), (41, 100), ], } .assimilate_storage(&mut storage); - let mut cdns = vec![]; - if self.has_cdns { - cdns = vec![ + let mut storages = vec![]; + if self.has_storages { + storages = vec![ // (stash, controller, node, stake, cluster) ( 11, 10, - NodePubKey::CDNPubKey(CDNNodePubKey::new([12; 32])), + NodePubKey::StoragePubKey(StorageNodePubKey::new([12; 32])), 100, ClusterId::from([1; 20]), ), ( 21, 20, - NodePubKey::CDNPubKey(CDNNodePubKey::new([22; 32])), + NodePubKey::StoragePubKey(StorageNodePubKey::new([22; 32])), 100, ClusterId::from([1; 20]), ), - ]; - } - let mut storages = vec![]; - if self.has_storages { - storages = vec![ - // (stash, controller, node, stake, cluster) ( 31, 30, @@ -419,8 +374,8 @@ impl ExtBuilder { ]; } - let _ = pallet_ddc_staking::GenesisConfig:: { cdns, storages } - .assimilate_storage(&mut storage); + let _ = + pallet_ddc_staking::GenesisConfig:: { storages }.assimilate_storage(&mut storage); TestExternalities::new(storage) } diff --git a/pallets/ddc-staking/src/testing_utils.rs b/pallets/ddc-staking/src/testing_utils.rs index ccc0b8c02..7a4cdc7be 100644 --- a/pallets/ddc-staking/src/testing_utils.rs +++ b/pallets/ddc-staking/src/testing_utils.rs @@ -1,8 +1,7 @@ //! Testing utils for ddc-staking. use ddc_primitives::{ - CDNNodeParams, CDNNodePubKey, ClusterGovParams, ClusterId, ClusterParams, NodeParams, - StorageNodeParams, + ClusterGovParams, ClusterId, ClusterParams, NodeParams, StorageNodeParams, StorageNodePubKey, }; use frame_benchmarking::account; use frame_support::traits::Currency; @@ -14,11 +13,10 @@ use crate::{Pallet as DdcStaking, *}; const SEED: u32 = 0; -/// This function removes all storage and CDN nodes from storage. -pub fn clear_storages_and_cdns() { +/// This function removes all storage and Storages nodes from storage. +pub fn clear_activated_nodes() { #[allow(unused_must_use)] { - CDNs::::clear(u32::MAX, None); Storages::::clear(u32::MAX, None); } } @@ -56,12 +54,12 @@ pub fn create_stash_controller_node( let controller = create_funded_user::("controller", n, balance_factor); let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); - let node = NodePubKey::CDNPubKey(CDNNodePubKey::new([0; 32])); + let node = NodePubKey::StoragePubKey(StorageNodePubKey::new([0; 32])); T::NodeCreator::create_node( node.clone(), stash.clone(), - NodeParams::CDNParams(CDNNodeParams { + NodeParams::StorageParams(StorageNodeParams { host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, @@ -91,21 +89,9 @@ pub fn create_stash_controller_node_with_balance( let node_pub = node_pub_key.clone(); match node_pub_key { - NodePubKey::CDNPubKey(node_pub_key) => { - T::NodeCreator::create_node( - ddc_primitives::NodePubKey::CDNPubKey(node_pub_key), - stash.clone(), - NodeParams::CDNParams(CDNNodeParams { - host: vec![1u8, 255], - http_port: 35000u16, - grpc_port: 25000u16, - p2p_port: 15000u16, - }), - )?; - }, NodePubKey::StoragePubKey(node_pub_key) => { T::NodeCreator::create_node( - NodePubKey::StoragePubKey(node_pub_key), + ddc_primitives::NodePubKey::StoragePubKey(node_pub_key), stash.clone(), NodeParams::StorageParams(StorageNodeParams { host: vec![1u8, 255], @@ -123,9 +109,6 @@ pub fn create_stash_controller_node_with_balance( treasury_share: Perbill::default(), validators_share: Perbill::default(), cluster_reserve_share: Perbill::default(), - cdn_bond_size: 10u32.into(), - cdn_chill_delay: 50u32.into(), - cdn_unbonding_delay: 50u32.into(), storage_bond_size: 10u32.into(), storage_chill_delay: 50u32.into(), storage_unbonding_delay: 50u32.into(), diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index ad1ff7914..5442803e3 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -1,6 +1,6 @@ //! Tests for the module. -use ddc_primitives::{CDNNodePubKey, StorageNodePubKey}; +use ddc_primitives::StorageNodePubKey; use frame_support::{assert_noop, assert_ok, traits::ReservableCurrency}; use pallet_balances::Error as BalancesError; @@ -81,11 +81,11 @@ fn change_controller_works() { // 10 is no longer in control. assert_noop!( - DdcStaking::serve(RuntimeOrigin::signed(10), ClusterId::from([1; 20])), + DdcStaking::store(RuntimeOrigin::signed(10), ClusterId::from([1; 20])), Error::::NotController ); // 3 is a new controller. - assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(3), ClusterId::from([1; 20]))); + assert_ok!(DdcStaking::store(RuntimeOrigin::signed(3), ClusterId::from([1; 20]))); }) } @@ -94,17 +94,17 @@ fn not_enough_inital_bond_flow() { ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); - // Add new CDN participant, account 3 controlled by 4 with node 5. + // Add new Storage participant, account 3 controlled by 4 with node 5. assert_ok!(DdcStaking::bond( RuntimeOrigin::signed(3), 4, - NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + NodePubKey::StoragePubKey(StorageNodePubKey::new([5; 32])), 5 )); // Not enough tokens bonded to serve assert_noop!( - DdcStaking::serve(RuntimeOrigin::signed(4), ClusterId::from([1; 20])), + DdcStaking::store(RuntimeOrigin::signed(4), ClusterId::from([1; 20])), Error::::InsufficientBond ); @@ -127,7 +127,7 @@ fn not_enough_inital_bond_flow() { DdcStaking::bond( RuntimeOrigin::signed(3), 4, - NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + NodePubKey::StoragePubKey(StorageNodePubKey::new([5; 32])), 5 ), Error::::AlreadyBonded @@ -145,12 +145,12 @@ fn not_enough_inital_bond_flow() { assert_ok!(DdcStaking::bond( RuntimeOrigin::signed(3), 4, - NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + NodePubKey::StoragePubKey(StorageNodePubKey::new([5; 32])), 10 )); // Serving should work - assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), ClusterId::from([1; 20]))); + assert_ok!(DdcStaking::store(RuntimeOrigin::signed(4), ClusterId::from([1; 20]))); }) } @@ -159,15 +159,15 @@ fn unbonding_edge_cases_work() { ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); - // Add new CDN participant, account 3 controlled by 4 with node 5. + // Add new Storage participant, account 3 controlled by 4 with node 5. assert_ok!(DdcStaking::bond( RuntimeOrigin::signed(3), 4, - NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + NodePubKey::StoragePubKey(StorageNodePubKey::new([5; 32])), 100 )); - assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), ClusterId::from([1; 20]))); + assert_ok!(DdcStaking::store(RuntimeOrigin::signed(4), ClusterId::from([1; 20]))); assert_ok!(DdcStaking::unbond(RuntimeOrigin::signed(4), 1)); while System::block_number() < 33 { @@ -180,41 +180,6 @@ fn unbonding_edge_cases_work() { }) } -#[test] -fn serve_or_store_should_be_prohibited() { - ExtBuilder::default().build_and_execute(|| { - System::set_block_number(1); - - // Add new CDN participant, account 3 controlled by 4 with node 5. - assert_ok!(DdcStaking::bond( - RuntimeOrigin::signed(3), - 4, - NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), - 100 - )); - - // Add new Storage participant, account 1 controlled by 2 with node 3. - assert_ok!(DdcStaking::bond( - RuntimeOrigin::signed(1), - 2, - NodePubKey::StoragePubKey(StorageNodePubKey::new([3; 32])), - 100 - )); - - // Not enough tokens bonded to serve - assert_noop!( - DdcStaking::serve(RuntimeOrigin::signed(2), ClusterId::from([1; 20])), - Error::::ServingProhibited - ); - - // Not enough tokens bonded to store - assert_noop!( - DdcStaking::store(RuntimeOrigin::signed(4), ClusterId::from([1; 20])), - Error::::StoringProhibited - ); - }) -} - #[test] fn set_node_works() { ExtBuilder::default().build_and_execute(|| { @@ -226,7 +191,7 @@ fn set_node_works() { assert_noop!( DdcStaking::set_node( RuntimeOrigin::signed(10), - NodePubKey::CDNPubKey(CDNNodePubKey::new([12; 32])) + NodePubKey::StoragePubKey(StorageNodePubKey::new([12; 32])) ), Error::::AlreadyPaired ); @@ -235,21 +200,21 @@ fn set_node_works() { assert_noop!( DdcStaking::set_node( RuntimeOrigin::signed(11), - NodePubKey::CDNPubKey(CDNNodePubKey::new([12; 32])) + NodePubKey::StoragePubKey(StorageNodePubKey::new([12; 32])) ), Error::::AlreadyInRole ); - // Schedule CDN participant removal. + // Schedule Storage participant removal. assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(10))); System::set_block_number(11); - // Actual CDN participant removal. + // Actual Storage participant removal. assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(10))); // Setting node should work assert_ok!(DdcStaking::set_node( RuntimeOrigin::signed(11), - NodePubKey::CDNPubKey(CDNNodePubKey::new([13; 32])) + NodePubKey::StoragePubKey(StorageNodePubKey::new([13; 32])) )); }) } @@ -260,11 +225,11 @@ fn cancel_previous_chill_works() { System::set_block_number(1); let cluster_id = ClusterId::from([1; 20]); - // Add new CDN participant, account 3 controlled by 4 with node 5. + // Add new Storage participant, account 3 controlled by 4 with node 5. assert_ok!(DdcStaking::bond( RuntimeOrigin::signed(3), 4, - NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + NodePubKey::StoragePubKey(StorageNodePubKey::new([5; 32])), 100 )); @@ -277,16 +242,16 @@ fn cancel_previous_chill_works() { )); // Not enough tokens bonded to serve - assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), cluster_id)); + assert_ok!(DdcStaking::store(RuntimeOrigin::signed(4), cluster_id)); assert_ok!(DdcStaking::store(RuntimeOrigin::signed(2), ClusterId::from([1; 20]))); - // Schedule CDN participant removal. + // Schedule Storage participant removal. assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); // Not enough tokens bonded to serve - assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), cluster_id)); + assert_ok!(DdcStaking::store(RuntimeOrigin::signed(4), cluster_id)); - // Schedule CDN participant removal. + // Schedule Storage participant removal. assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(2))); // Not enough tokens bonded to serve assert_ok!(DdcStaking::store(RuntimeOrigin::signed(2), cluster_id)); @@ -308,21 +273,21 @@ fn staking_should_work() { DdcStaking::bond( RuntimeOrigin::signed(3), 4, - NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + NodePubKey::StoragePubKey(StorageNodePubKey::new([5; 32])), 0 ), Error::::InsufficientBond ); - // Add new CDN participant, account 3 controlled by 4 with node 5. + // Add new Storage participant, account 3 controlled by 4 with node 5. assert_ok!(DdcStaking::bond( RuntimeOrigin::signed(3), 4, - NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + NodePubKey::StoragePubKey(StorageNodePubKey::new([5; 32])), 1500 )); System::assert_last_event(Event::Bonded(3, 1500).into()); - assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), ClusterId::from([0; 20]))); + assert_ok!(DdcStaking::store(RuntimeOrigin::signed(4), ClusterId::from([0; 20]))); System::assert_last_event(Event::Activated(3).into()); // Controller already paired @@ -330,7 +295,7 @@ fn staking_should_work() { DdcStaking::bond( RuntimeOrigin::signed(5), 4, - NodePubKey::CDNPubKey(CDNNodePubKey::new([10; 32])), + NodePubKey::StoragePubKey(StorageNodePubKey::new([10; 32])), 10 ), Error::::AlreadyPaired @@ -341,13 +306,13 @@ fn staking_should_work() { DdcStaking::bond( RuntimeOrigin::signed(5), 6, - NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])), + NodePubKey::StoragePubKey(StorageNodePubKey::new([5; 32])), 10 ), Error::::AlreadyPaired ); - // Account 4 controls the stash from account 3, which is 1500 units, 3 is a CDN + // Account 4 controls the stash from account 3, which is 1500 units, 3 is a Storage // participant, 5 is a DDC node. assert_eq!(DdcStaking::bonded(&3), Some(4)); assert_eq!( @@ -360,19 +325,22 @@ fn staking_should_work() { unlocking: Default::default(), }) ); - assert_eq!(DdcStaking::cdns(3), Some(ClusterId::from([0; 20]))); - assert_eq!(DdcStaking::nodes(NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32]))), Some(3)); + assert_eq!(DdcStaking::storages(3), Some(ClusterId::from([0; 20]))); + assert_eq!( + DdcStaking::nodes(NodePubKey::StoragePubKey(StorageNodePubKey::new([5; 32]))), + Some(3) + ); // Set initial block timestamp. Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); - // Schedule CDN participant removal. + // Schedule Storage participant removal. assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); System::assert_last_event(Event::ChillSoon(3, ClusterId::from([0; 20]), 11).into()); // Removal is scheduled, stashed value of 4 is still lock. let chilling = System::block_number() + 10u64; - // TestClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::CDN) + // TestClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::Storage) // .unwrap_or(10_u64); assert_eq!( DdcStaking::ledger(&4), @@ -415,92 +383,12 @@ fn staking_should_work() { }) ); - // Actual CDN participant removal. + // Actual Storage participant removal. assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(4))); System::assert_last_event(Event::Chilled(3).into()); - // Account 3 is no longer a CDN participant. - assert_eq!(DdcStaking::cdns(3), None); - }); -} - -#[test] -fn cdn_full_unbonding_works() { - ExtBuilder::default().build_and_execute(|| { - System::set_block_number(1); - - let provider_stash: u64 = 1; - let provider_controller: u64 = 2; - let cluster_id = ClusterId::from([1; 20]); - let node_pub_key = NodePubKey::CDNPubKey(CDNNodePubKey::new([1; 32])); - - let lock = MockNodeVisitor::set_and_hold_lock(MockNode { - cluster_id: Some(cluster_id), - exists: true, - }); - - let cdn_bond_size = 10_u128; - let cdn_chill_delay = 10_u64; - let cdn_unbond_delay = 10_u64; - - // Put some money in account that we'll use. - let _ = Balances::make_free_balance_be(&provider_controller, 2000); - let _ = Balances::make_free_balance_be(&provider_stash, 2000); - - // Add new CDN participant, account 1 controlled by 2 with node 1. - assert_ok!(DdcStaking::bond( - RuntimeOrigin::signed(provider_stash), - provider_controller, - node_pub_key.clone(), - cdn_bond_size, // min bond size - )); - System::assert_last_event(Event::Bonded(provider_stash, cdn_bond_size).into()); - assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(provider_controller), cluster_id)); - System::assert_last_event(Event::Activated(provider_stash).into()); - - assert_eq!(DdcStaking::cdns(provider_stash), Some(cluster_id)); - assert_eq!(DdcStaking::nodes(node_pub_key), Some(provider_stash)); - - // Set block timestamp. - Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); - - // Schedule CDN participant removal. - assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(provider_controller))); - let chilling = System::block_number() + cdn_chill_delay; - System::assert_last_event(Event::ChillSoon(provider_stash, cluster_id, chilling).into()); - - // Set the block number that allows us to chill. - while System::block_number() < chilling { - System::set_block_number(System::block_number() + 1); - Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); - } - - // Actual CDN participant removal. - assert_ok!(DdcStaking::chill(RuntimeOrigin::signed(provider_controller))); - System::assert_last_event(Event::Chilled(provider_stash).into()); - - // Account is no longer a CDN participant. - assert_eq!(DdcStaking::cdns(provider_stash), None); - - // Start unbonding all tokens - assert_ok!(DdcStaking::unbond(RuntimeOrigin::signed(provider_controller), cdn_bond_size)); - System::assert_has_event(Event::LeaveSoon(provider_stash).into()); - assert_eq!(DdcStaking::leaving_cdns(provider_stash), Some(cluster_id)); - System::assert_last_event(Event::Unbonded(provider_stash, cdn_bond_size).into()); - - let unbonding = System::block_number() + cdn_unbond_delay; - // Set the block number that allows us to chill. - while System::block_number() < unbonding { - System::set_block_number(System::block_number() + 1); - Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); - } - - assert_ok!(DdcStaking::withdraw_unbonded(RuntimeOrigin::signed(provider_controller))); - System::assert_has_event(Event::Withdrawn(provider_stash, cdn_bond_size).into()); - assert_eq!(DdcStaking::leaving_cdns(provider_stash), None); - System::assert_last_event(Event::Left(provider_stash).into()); - - MockNodeVisitor::reset_and_release_lock(lock); + // Account 3 is no longer a Storage participant. + assert_eq!(DdcStaking::storages(3), None); }); } @@ -595,18 +483,7 @@ fn staking_creator_works() { let controller: u64 = 2; let cluster_id = ClusterId::from([1; 20]); let value = 5; - let cdn_node_pub_key = NodePubKey::StoragePubKey(StorageNodePubKey::new([2; 32])); - let storage_node_pub_key = NodePubKey::CDNPubKey(CDNNodePubKey::new([2; 32])); - - assert_ok!( - >>::bond_stake_and_participate( - stash, - controller, - cdn_node_pub_key, - value, - cluster_id, - ) - ); + let storage_node_pub_key = NodePubKey::StoragePubKey(StorageNodePubKey::new([2; 32])); assert_ok!( >>::bond_stake_and_participate( @@ -625,9 +502,9 @@ fn staking_visitor_works() { // Verifies initial conditions of mock ExtBuilder::default().build_and_execute(|| { let cluster_id = ClusterId::from([1; 20]); - let node_pub_key = NodePubKey::CDNPubKey(CDNNodePubKey::new([5; 32])); + let node_pub_key = NodePubKey::StoragePubKey(StorageNodePubKey::new([5; 32])); - // Add new CDN participant, account 3 controlled by 4 with node 5. + // Add new Storage participant, account 3 controlled by 4 with node 5. assert_ok!(DdcStaking::bond(RuntimeOrigin::signed(3), 4, node_pub_key.clone(), 100)); assert!(>::has_stake(&node_pub_key,)); @@ -638,7 +515,7 @@ fn staking_visitor_works() { assert!(!result); } - assert_ok!(DdcStaking::serve(RuntimeOrigin::signed(4), ClusterId::from([1; 20]))); + assert_ok!(DdcStaking::store(RuntimeOrigin::signed(4), ClusterId::from([1; 20]))); if let Ok(result) = >::has_activated_stake(&node_pub_key, &cluster_id) diff --git a/pallets/ddc-staking/src/weights.rs b/pallets/ddc-staking/src/weights.rs index 5437d12a2..e7157a60d 100644 --- a/pallets/ddc-staking/src/weights.rs +++ b/pallets/ddc-staking/src/weights.rs @@ -1,8 +1,8 @@ //! Autogenerated weights for pallet_ddc_staking //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-10-10, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! HOSTNAME: `e14`, CPU: `11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz` +//! DATE: 2023-12-14, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `Yahors-MacBook-Pro.local`, CPU: `` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: @@ -10,14 +10,13 @@ // benchmark // pallet // --chain=dev +// --execution=wasm +// --pallet=pallet-ddc-staking +// --extrinsic=* // --steps=50 // --repeat=20 -// --pallet=pallet_ddc_staking -// --extrinsic=* -// --execution=wasm -// --wasm-execution=compiled // --template=./.maintain/frame-weight-template.hbs -// --output=./pallets/ddc-staking/src +// --output=pallets/ddc-staking/src/weights.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -32,7 +31,6 @@ pub trait WeightInfo { fn unbond() -> Weight; fn withdraw_unbonded() -> Weight; fn store() -> Weight; - fn serve() -> Weight; fn chill() -> Weight; fn set_controller() -> Weight; fn set_node() -> Weight; @@ -45,93 +43,67 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking Nodes (r:1 w:1) // Storage: DdcStaking Providers (r:1 w:1) - // Storage: DdcNodes CDNNodes (r:1 w:0) + // Storage: DdcNodes StorageNodes (r:1 w:0) // Storage: Balances Locks (r:1 w:1) fn bond() -> Weight { - // Minimum execution time: 35_000 nanoseconds. - Weight::from_ref_time(37_000_000_u64) + Weight::from_ref_time(39_000_000_u64) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) - // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) // Storage: DdcStaking Providers (r:1 w:0) - // Storage: DdcNodes CDNNodes (r:1 w:0) + // Storage: DdcNodes StorageNodes (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn unbond() -> Weight { - // Minimum execution time: 37_000 nanoseconds. - Weight::from_ref_time(38_000_000_u64) - .saturating_add(T::DbWeight::get().reads(7_u64)) + Weight::from_ref_time(37_000_000_u64) + .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking Providers (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) - // Storage: DdcStaking LeavingCDNs (r:1 w:0) // Storage: DdcStaking LeavingStorages (r:1 w:0) fn withdraw_unbonded() -> Weight { - // Minimum execution time: 33_000 nanoseconds. - Weight::from_ref_time(34_000_000_u64) - .saturating_add(T::DbWeight::get().reads(6_u64)) + Weight::from_ref_time(33_000_000_u64) + .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } // Storage: DdcClusters Clusters (r:1 w:0) // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcClusters ClustersGovParams (r:1 w:0) - // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Providers (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:1) // Storage: DdcStaking LeavingStorages (r:1 w:0) fn store() -> Weight { - // Minimum execution time: 28_000 nanoseconds. - Weight::from_ref_time(29_000_000_u64) - .saturating_add(T::DbWeight::get().reads(7_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - // Storage: DdcClusters Clusters (r:1 w:0) - // Storage: DdcStaking Ledger (r:1 w:0) - // Storage: DdcClusters ClustersGovParams (r:1 w:0) - // Storage: DdcStaking Storages (r:1 w:0) - // Storage: DdcStaking Providers (r:1 w:0) - // Storage: DdcStaking CDNs (r:1 w:1) - // Storage: DdcStaking LeavingCDNs (r:1 w:0) - fn serve() -> Weight { - // Minimum execution time: 27_000 nanoseconds. Weight::from_ref_time(28_000_000_u64) - .saturating_add(T::DbWeight::get().reads(7_u64)) + .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) - // Storage: DdcStaking CDNs (r:1 w:1) + // Storage: DdcStaking Storages (r:1 w:1) // Storage: DdcClusters ClustersGovParams (r:1 w:0) - // Storage: DdcStaking Storages (r:1 w:0) fn chill() -> Weight { - // Minimum execution time: 27_000 nanoseconds. Weight::from_ref_time(28_000_000_u64) - .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:2 w:2) fn set_controller() -> Weight { - // Minimum execution time: 12_000 nanoseconds. - Weight::from_ref_time(13_000_000_u64) + Weight::from_ref_time(14_000_000_u64) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } // Storage: DdcStaking Nodes (r:1 w:2) // Storage: DdcStaking Providers (r:1 w:1) - // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) - // Storage: DdcStaking LeavingCDNs (r:1 w:0) // Storage: DdcStaking LeavingStorages (r:1 w:0) fn set_node() -> Weight { - // Minimum execution time: 13_000 nanoseconds. Weight::from_ref_time(14_000_000_u64) - .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } } @@ -142,93 +114,67 @@ impl WeightInfo for () { // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking Nodes (r:1 w:1) // Storage: DdcStaking Providers (r:1 w:1) - // Storage: DdcNodes CDNNodes (r:1 w:0) + // Storage: DdcNodes StorageNodes (r:1 w:0) // Storage: Balances Locks (r:1 w:1) fn bond() -> Weight { - // Minimum execution time: 35_000 nanoseconds. - Weight::from_ref_time(37_000_000_u64) + Weight::from_ref_time(39_000_000_u64) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) - // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) // Storage: DdcStaking Providers (r:1 w:0) - // Storage: DdcNodes CDNNodes (r:1 w:0) + // Storage: DdcNodes StorageNodes (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) fn unbond() -> Weight { - // Minimum execution time: 37_000 nanoseconds. - Weight::from_ref_time(38_000_000_u64) - .saturating_add(RocksDbWeight::get().reads(7_u64)) + Weight::from_ref_time(37_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) // Storage: DdcStaking Providers (r:1 w:0) // Storage: Balances Locks (r:1 w:1) // Storage: System Account (r:1 w:1) - // Storage: DdcStaking LeavingCDNs (r:1 w:0) // Storage: DdcStaking LeavingStorages (r:1 w:0) fn withdraw_unbonded() -> Weight { - // Minimum execution time: 33_000 nanoseconds. - Weight::from_ref_time(34_000_000_u64) - .saturating_add(RocksDbWeight::get().reads(6_u64)) + Weight::from_ref_time(33_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } // Storage: DdcClusters Clusters (r:1 w:0) // Storage: DdcStaking Ledger (r:1 w:0) // Storage: DdcClusters ClustersGovParams (r:1 w:0) - // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Providers (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:1) // Storage: DdcStaking LeavingStorages (r:1 w:0) fn store() -> Weight { - // Minimum execution time: 28_000 nanoseconds. - Weight::from_ref_time(29_000_000_u64) - .saturating_add(RocksDbWeight::get().reads(7_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - // Storage: DdcClusters Clusters (r:1 w:0) - // Storage: DdcStaking Ledger (r:1 w:0) - // Storage: DdcClusters ClustersGovParams (r:1 w:0) - // Storage: DdcStaking Storages (r:1 w:0) - // Storage: DdcStaking Providers (r:1 w:0) - // Storage: DdcStaking CDNs (r:1 w:1) - // Storage: DdcStaking LeavingCDNs (r:1 w:0) - fn serve() -> Weight { - // Minimum execution time: 27_000 nanoseconds. Weight::from_ref_time(28_000_000_u64) - .saturating_add(RocksDbWeight::get().reads(7_u64)) + .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcStaking Ledger (r:1 w:1) - // Storage: DdcStaking CDNs (r:1 w:1) + // Storage: DdcStaking Storages (r:1 w:1) // Storage: DdcClusters ClustersGovParams (r:1 w:0) - // Storage: DdcStaking Storages (r:1 w:0) fn chill() -> Weight { - // Minimum execution time: 27_000 nanoseconds. Weight::from_ref_time(28_000_000_u64) - .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcStaking Bonded (r:1 w:1) // Storage: DdcStaking Ledger (r:2 w:2) fn set_controller() -> Weight { - // Minimum execution time: 12_000 nanoseconds. - Weight::from_ref_time(13_000_000_u64) + Weight::from_ref_time(14_000_000_u64) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } // Storage: DdcStaking Nodes (r:1 w:2) // Storage: DdcStaking Providers (r:1 w:1) - // Storage: DdcStaking CDNs (r:1 w:0) // Storage: DdcStaking Storages (r:1 w:0) - // Storage: DdcStaking LeavingCDNs (r:1 w:0) // Storage: DdcStaking LeavingStorages (r:1 w:0) fn set_node() -> Weight { - // Minimum execution time: 13_000 nanoseconds. Weight::from_ref_time(14_000_000_u64) - .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } -} +} \ No newline at end of file diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 50082b645..38fd21d3b 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -10,7 +10,6 @@ pub type ClusterId = H160; pub type DdcEra = u32; pub type BucketId = u64; pub type StorageNodePubKey = AccountId32; -pub type CDNNodePubKey = AccountId32; // ClusterParams includes Governance non-sensetive parameters only #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] @@ -26,9 +25,6 @@ pub struct ClusterGovParams { pub treasury_share: Perbill, pub validators_share: Perbill, pub cluster_reserve_share: Perbill, - pub cdn_bond_size: Balance, - pub cdn_chill_delay: BlockNumber, - pub cdn_unbonding_delay: BlockNumber, pub storage_bond_size: Balance, pub storage_chill_delay: BlockNumber, pub storage_unbonding_delay: BlockNumber, @@ -55,9 +51,6 @@ pub struct ClusterFeesParams { #[derive(Debug, PartialEq)] pub struct ClusterBondingParams { - pub cdn_bond_size: u128, - pub cdn_chill_delay: BlockNumber, - pub cdn_unbonding_delay: BlockNumber, pub storage_bond_size: u128, pub storage_chill_delay: BlockNumber, pub storage_unbonding_delay: BlockNumber, @@ -67,20 +60,17 @@ pub struct ClusterBondingParams { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodePubKey { StoragePubKey(StorageNodePubKey), - CDNPubKey(CDNNodePubKey), } #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodeType { Storage = 1, - CDN = 2, } impl From for u8 { fn from(node_type: NodeType) -> Self { match node_type { NodeType::Storage => 1, - NodeType::CDN => 2, } } } @@ -90,20 +80,11 @@ impl TryFrom for NodeType { fn try_from(value: u8) -> Result { match value { 1 => Ok(NodeType::Storage), - 2 => Ok(NodeType::CDN), _ => Err(()), } } } -#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] -pub struct CDNNodeParams { - pub host: Vec, - pub http_port: u16, - pub grpc_port: u16, - pub p2p_port: u16, -} - #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNodeParams { pub host: Vec, @@ -116,5 +97,4 @@ pub struct StorageNodeParams { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodeParams { StorageParams(StorageNodeParams), - CDNParams(CDNNodeParams), } From 9ab362edd3269f563ea432163e42c377718096b8 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Mon, 18 Dec 2023 17:48:10 +0600 Subject: [PATCH 564/583] Genesis config value example for `pallet-ddc-nodes::StorageNodes::host` field (#201) --- docs/genesis-state.md | 7 ++++++- node/service/chain-specs/example.json | 12 +++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/genesis-state.md b/docs/genesis-state.md index 587683b62..0e1c8b98f 100644 --- a/docs/genesis-state.md +++ b/docs/genesis-state.md @@ -1,4 +1,4 @@ -# State preset +# Genesis state Sometimes we use the blockchain as a part of a test environment. Those tests typically want a certain state of the blockchain. @@ -22,6 +22,11 @@ And a _raw_ form with key-value pairs which will be written to the database. 1. Set genesis state for each module. There is an example in `node/service/example.json`, you can copy everything except the `code` field value from it to the `plain.json`. + > Special note for a `ddcNodes.storageNodes.host` field. + > In the `example.json` it is set as: + > `"host": [ 49, 50, 55, 46, 48, 46, 48, 46, 49 ]`. + > Where the array is an encoded `127.0.0.1` value. + 1. Create a raw form chain spec. ```console diff --git a/node/service/chain-specs/example.json b/node/service/chain-specs/example.json index a9394d98b..fcec23193 100644 --- a/node/service/chain-specs/example.json +++ b/node/service/chain-specs/example.json @@ -175,7 +175,17 @@ "provider_id": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", "cluster_id": "0x0000000000000000000000000000000000000001", "props": { - "host": [], + "host": [ + 49, + 50, + 55, + 46, + 48, + 46, + 48, + 46, + 49 + ], "http_port": 8080, "grpc_port": 8081, "p2p_port": 8082 From b10ebb046c01b99c57a2cc31e6c103640be0e43e Mon Sep 17 00:00:00 2001 From: Yahor Tsaryk Date: Mon, 18 Dec 2023 13:29:03 +0100 Subject: [PATCH 565/583] Bucket params with 'is_public' flag added (#199) This PR introduces Bucket parameters with `is_public` flag and provides extrinsic to update parameters for the bucket owner. --- node/service/chain-specs/example.json | 3 +- pallets/ddc-customers/src/benchmarking.rs | 33 +++++- pallets/ddc-customers/src/lib.rs | 48 ++++++-- pallets/ddc-customers/src/tests.rs | 130 +++++++++++++++++++++- pallets/ddc-customers/src/weights.rs | 21 +++- 5 files changed, 216 insertions(+), 19 deletions(-) diff --git a/node/service/chain-specs/example.json b/node/service/chain-specs/example.json index fcec23193..e61b43fbc 100644 --- a/node/service/chain-specs/example.json +++ b/node/service/chain-specs/example.json @@ -164,7 +164,8 @@ [ "0x0000000000000000000000000000000000000001", "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty", - 10000000000 + 10000000000, + false ] ] }, diff --git a/pallets/ddc-customers/src/benchmarking.rs b/pallets/ddc-customers/src/benchmarking.rs index b51a47015..87da166fb 100644 --- a/pallets/ddc-customers/src/benchmarking.rs +++ b/pallets/ddc-customers/src/benchmarking.rs @@ -43,8 +43,12 @@ benchmarks! { cluster_gov_params ); + let bucket_params = BucketParams { + is_public: false + }; + whitelist_account!(user); - }: _(RawOrigin::Signed(user), cluster_id) + }: _(RawOrigin::Signed(user), cluster_id, bucket_params) verify { assert_eq!(Pallet::::buckets_count(), 1); } @@ -143,6 +147,33 @@ benchmarks! { assert!(!Ledger::::contains_key(user)); } + set_bucket_params { + let cluster_id = ClusterId::from([1; 20]); + let user = account::("user", USER_SEED, 0u32); + + let bucket_id = 1; + let bucket = Bucket { + bucket_id, + owner_id: user.clone(), + cluster_id, + is_public: false, + }; + + >::set(bucket_id); + >::insert(bucket_id, bucket); + + whitelist_account!(user); + + let bucket_params = BucketParams { + is_public: true + }; + + }: _(RawOrigin::Signed(user), bucket_id, bucket_params) + verify { + let bucket = >::get(bucket_id).unwrap(); + assert!(bucket.is_public); + } + impl_benchmark_test_suite!( DdcCustomers, crate::mock::ExtBuilder.build(), diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index f835bf879..181821ea5 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -63,12 +63,12 @@ pub struct Bucket { bucket_id: BucketId, owner_id: AccountId, cluster_id: ClusterId, + is_public: bool, } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct BucketsDetails { - pub bucket_id: BucketId, - pub amount: Balance, +pub struct BucketParams { + is_public: bool, } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] @@ -230,6 +230,8 @@ pub mod pallet { Charged(T::AccountId, BalanceOf), /// Bucket with specific id created BucketCreated(BucketId), + /// Bucket with specific id updated + BucketUpdated(BucketId), } #[pallet::error] @@ -264,7 +266,7 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { - pub buckets: Vec<(ClusterId, T::AccountId, BalanceOf)>, + pub buckets: Vec<(ClusterId, T::AccountId, BalanceOf, bool)>, } #[cfg(feature = "std")] @@ -283,7 +285,7 @@ pub mod pallet { let _ = ::Currency::make_free_balance_be(&account_id, min); } - for &(ref cluster_id, ref owner_id, ref deposit) in &self.buckets { + for &(ref cluster_id, ref owner_id, ref deposit, ref is_public) in &self.buckets { let cur_bucket_id = >::get() .checked_add(1) .ok_or(Error::::ArithmeticOverflow) @@ -294,6 +296,7 @@ pub mod pallet { bucket_id: cur_bucket_id, owner_id: owner_id.clone(), cluster_id: *cluster_id, + is_public: *is_public, }; >::insert(cur_bucket_id, bucket); @@ -317,7 +320,11 @@ pub mod pallet { /// /// Anyone can create a bucket #[pallet::weight(T::WeightInfo::create_bucket())] - pub fn create_bucket(origin: OriginFor, cluster_id: ClusterId) -> DispatchResult { + pub fn create_bucket( + origin: OriginFor, + cluster_id: ClusterId, + bucket_params: BucketParams, + ) -> DispatchResult { let bucket_owner = ensure_signed(origin)?; let cur_bucket_id = Self::buckets_count().checked_add(1).ok_or(Error::::ArithmeticOverflow)?; @@ -325,7 +332,12 @@ pub mod pallet { ::ClusterVisitor::ensure_cluster(&cluster_id) .map_err(|_| Error::::ClusterDoesNotExist)?; - let bucket = Bucket { bucket_id: cur_bucket_id, owner_id: bucket_owner, cluster_id }; + let bucket = Bucket { + bucket_id: cur_bucket_id, + owner_id: bucket_owner, + cluster_id, + is_public: bucket_params.is_public, + }; >::set(cur_bucket_id); >::insert(cur_bucket_id, bucket); @@ -498,6 +510,28 @@ pub mod pallet { Ok(post_info_weight.into()) } + + /// Sets bucket parameters. + /// + /// The dispatch origin for this call must be _Signed_ by the bucket owner. + /// + /// Emits `BucketUpdated`. + #[pallet::weight(T::WeightInfo::set_bucket_params())] + pub fn set_bucket_params( + origin: OriginFor, + bucket_id: BucketId, + bucket_params: BucketParams, + ) -> DispatchResult { + let owner = ensure_signed(origin)?; + let mut bucket = Self::buckets(bucket_id).ok_or(Error::::NoBucketWithId)?; + ensure!(bucket.owner_id == owner, Error::::NotBucketOwner); + + bucket.is_public = bucket_params.is_public; + >::insert(bucket_id, bucket); + Self::deposit_event(Event::::BucketUpdated(bucket_id)); + + Ok(()) + } } impl Pallet { diff --git a/pallets/ddc-customers/src/tests.rs b/pallets/ddc-customers/src/tests.rs index aa83b1c54..e88846a5c 100644 --- a/pallets/ddc-customers/src/tests.rs +++ b/pallets/ddc-customers/src/tests.rs @@ -13,15 +13,25 @@ fn create_bucket_works() { let cluster_id = ClusterId::from([1; 20]); let account_1 = 1; + let bucket_params = BucketParams { is_public: false }; // Bucket created - assert_ok!(DdcCustomers::create_bucket(RuntimeOrigin::signed(account_1), cluster_id)); + assert_ok!(DdcCustomers::create_bucket( + RuntimeOrigin::signed(account_1), + cluster_id, + bucket_params.clone() + )); // Check storage assert_eq!(DdcCustomers::buckets_count(), 1); assert_eq!( DdcCustomers::buckets(1), - Some(Bucket { bucket_id: 1, owner_id: account_1, cluster_id }) + Some(Bucket { + bucket_id: 1, + owner_id: account_1, + cluster_id, + is_public: bucket_params.is_public + }) ); // Checking that event was emitted @@ -37,12 +47,22 @@ fn create_two_buckets_works() { let cluster_id = ClusterId::from([1; 20]); let account_1 = 1; + let bucket_1_params = BucketParams { is_public: false }; + let bucket_2_params = BucketParams { is_public: true }; // Buckets created - assert_ok!(DdcCustomers::create_bucket(RuntimeOrigin::signed(account_1), cluster_id)); + assert_ok!(DdcCustomers::create_bucket( + RuntimeOrigin::signed(account_1), + cluster_id, + bucket_1_params.clone() + )); assert_eq!(System::events().len(), 1); System::assert_last_event(Event::BucketCreated(1u64).into()); - assert_ok!(DdcCustomers::create_bucket(RuntimeOrigin::signed(account_1), cluster_id)); + assert_ok!(DdcCustomers::create_bucket( + RuntimeOrigin::signed(account_1), + cluster_id, + bucket_2_params.clone() + )); assert_eq!(System::events().len(), 2); System::assert_last_event(Event::BucketCreated(2u64).into()); @@ -50,11 +70,21 @@ fn create_two_buckets_works() { assert_eq!(DdcCustomers::buckets_count(), 2); assert_eq!( DdcCustomers::buckets(1), - Some(Bucket { bucket_id: 1, owner_id: account_1, cluster_id }) + Some(Bucket { + bucket_id: 1, + owner_id: account_1, + cluster_id, + is_public: bucket_1_params.is_public + }) ); assert_eq!( DdcCustomers::buckets(2), - Some(Bucket { bucket_id: 2, owner_id: account_1, cluster_id }) + Some(Bucket { + bucket_id: 2, + owner_id: account_1, + cluster_id, + is_public: bucket_2_params.is_public + }) ); }) } @@ -289,3 +319,91 @@ fn unlock_and_withdraw_deposit_works() { assert_eq!(DdcCustomers::ledger(&account_1), None); }) } + +#[test] +fn set_bucket_params_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let cluster_id = ClusterId::from([1; 20]); + let bucket_owner = 1; + let bucket_params = BucketParams { is_public: false }; + + // Bucket created + assert_ok!(DdcCustomers::create_bucket( + RuntimeOrigin::signed(bucket_owner), + cluster_id, + bucket_params + )); + + // Checking that event was emitted + assert_eq!(System::events().len(), 1); + System::assert_last_event(Event::BucketCreated(1u64).into()); + + let bucket_id = 1; + let update_bucket_params = BucketParams { is_public: true }; + assert_ok!(DdcCustomers::set_bucket_params( + RuntimeOrigin::signed(bucket_owner), + bucket_id, + update_bucket_params.clone() + )); + + assert_eq!(DdcCustomers::buckets_count(), 1); + assert_eq!( + DdcCustomers::buckets(1), + Some(Bucket { + bucket_id, + owner_id: bucket_owner, + cluster_id, + is_public: update_bucket_params.is_public + }) + ); + + // Checking that event was emitted + assert_eq!(System::events().len(), 2); + System::assert_last_event(Event::BucketUpdated(bucket_id).into()); + }) +} + +#[test] +fn set_bucket_params_checks_work() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let cluster_id = ClusterId::from([1; 20]); + let bucket_owner = 1; + let bucket_params = BucketParams { is_public: false }; + + // Bucket created + assert_ok!(DdcCustomers::create_bucket( + RuntimeOrigin::signed(bucket_owner), + cluster_id, + bucket_params + )); + + // Checking that event was emitted + assert_eq!(System::events().len(), 1); + System::assert_last_event(Event::BucketCreated(1u64).into()); + let bucket_id = 1; + + let non_existent_bucket_id = 2; + assert_noop!( + DdcCustomers::set_bucket_params( + RuntimeOrigin::signed(bucket_owner), + non_existent_bucket_id, + BucketParams { is_public: true } + ), + Error::::NoBucketWithId + ); + + let not_bucket_owner_id = 2; + assert_noop!( + DdcCustomers::set_bucket_params( + RuntimeOrigin::signed(not_bucket_owner_id), + bucket_id, + BucketParams { is_public: true } + ), + Error::::NotBucketOwner + ); + }) +} diff --git a/pallets/ddc-customers/src/weights.rs b/pallets/ddc-customers/src/weights.rs index b024b6808..09351dbe1 100644 --- a/pallets/ddc-customers/src/weights.rs +++ b/pallets/ddc-customers/src/weights.rs @@ -1,7 +1,7 @@ //! Autogenerated weights for pallet_ddc_customers //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-14, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-15, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! HOSTNAME: `Yahors-MacBook-Pro.local`, CPU: `` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 @@ -33,6 +33,7 @@ pub trait WeightInfo { fn unlock_deposit() -> Weight; fn withdraw_unlocked_deposit_update() -> Weight; fn withdraw_unlocked_deposit_kill() -> Weight; + fn set_bucket_params() -> Weight; } /// Weights for pallet_ddc_customers using the Substrate node and recommended hardware. @@ -76,10 +77,16 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unlocked_deposit_kill() -> Weight { - Weight::from_ref_time(36_000_000_u64) + Weight::from_ref_time(32_000_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } + // Storage: DdcCustomers Buckets (r:1 w:1) + fn set_bucket_params() -> Weight { + Weight::from_ref_time(14_000_000_u64) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } } // For backwards compatibility and tests @@ -122,8 +129,14 @@ impl WeightInfo for () { // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unlocked_deposit_kill() -> Weight { - Weight::from_ref_time(36_000_000_u64) + Weight::from_ref_time(32_000_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } -} \ No newline at end of file + // Storage: DdcCustomers Buckets (r:1 w:1) + fn set_bucket_params() -> Weight { + Weight::from_ref_time(14_000_000_u64) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} From 54d418337c71ce983b485e8823511ce2599d1c13 Mon Sep 17 00:00:00 2001 From: Yahor Tsaryk Date: Mon, 18 Dec 2023 14:19:49 +0100 Subject: [PATCH 566/583] Operation mode for DDC Storage node type is added (#200) --- pallets/ddc-clusters/src/testing_utils.rs | 4 +++- pallets/ddc-clusters/src/tests.rs | 3 ++- pallets/ddc-nodes/src/benchmarking.rs | 3 ++- pallets/ddc-nodes/src/storage_node.rs | 6 +++++- pallets/ddc-nodes/src/testing_utils.rs | 4 +++- pallets/ddc-nodes/src/tests.rs | 8 +++++++- pallets/ddc-nodes/src/weights.rs | 16 ++++++++-------- pallets/ddc-staking/src/benchmarking.rs | 3 ++- pallets/ddc-staking/src/testing_utils.rs | 5 ++++- primitives/src/lib.rs | 12 ++++++++++++ 10 files changed, 48 insertions(+), 16 deletions(-) diff --git a/pallets/ddc-clusters/src/testing_utils.rs b/pallets/ddc-clusters/src/testing_utils.rs index 2f8cd1982..cc08a264c 100644 --- a/pallets/ddc-clusters/src/testing_utils.rs +++ b/pallets/ddc-clusters/src/testing_utils.rs @@ -1,7 +1,8 @@ //! DdcStaking pallet benchmarking. use ddc_primitives::{ - ClusterGovParams, ClusterId, ClusterParams, NodeParams, NodePubKey, StorageNodeParams, + ClusterGovParams, ClusterId, ClusterParams, NodeParams, NodePubKey, StorageNodeMode, + StorageNodeParams, }; pub use frame_benchmarking::{ account, benchmarks, impl_benchmark_test_suite, whitelist_account, whitelisted_caller, @@ -53,6 +54,7 @@ where { let cluster_params = ClusterParams { node_provider_auth_contract: Some(user.clone()) }; let storage_node_params = StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, diff --git a/pallets/ddc-clusters/src/tests.rs b/pallets/ddc-clusters/src/tests.rs index aefe3a87d..86f4202de 100644 --- a/pallets/ddc-clusters/src/tests.rs +++ b/pallets/ddc-clusters/src/tests.rs @@ -2,7 +2,7 @@ use ddc_primitives::{ ClusterBondingParams, ClusterFeesParams, ClusterId, ClusterParams, ClusterPricingParams, - NodeParams, NodePubKey, StorageNodeParams, + NodeParams, NodePubKey, StorageNodeMode, StorageNodeParams, }; use ddc_traits::cluster::ClusterManager; use frame_support::{assert_noop, assert_ok, error::BadOrigin}; @@ -143,6 +143,7 @@ fn add_and_delete_node_works() { ); let storage_node_params = StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, diff --git a/pallets/ddc-nodes/src/benchmarking.rs b/pallets/ddc-nodes/src/benchmarking.rs index 1e65c7ea0..451ef0c2a 100644 --- a/pallets/ddc-nodes/src/benchmarking.rs +++ b/pallets/ddc-nodes/src/benchmarking.rs @@ -1,6 +1,6 @@ //! DdcStaking pallet benchmarking. -use ddc_primitives::StorageNodePubKey; +use ddc_primitives::{StorageNodeMode, StorageNodePubKey}; pub use frame_benchmarking::{ account, benchmarks, impl_benchmark_test_suite, whitelist_account, whitelisted_caller, }; @@ -45,6 +45,7 @@ benchmarks! { assert_eq!(StorageNodes::::try_get( StorageNodePubKey::new([0; 32])).unwrap().props, StorageNodeProps { + mode: StorageNodeMode::Storage, host: vec![2u8, 255].try_into().unwrap(), http_port: 45000u16, grpc_port: 55000u16, diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index ce83664ef..c17d63dfa 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,5 +1,7 @@ use codec::{Decode, Encode}; -use ddc_primitives::{ClusterId, NodeParams, NodePubKey, NodeType, StorageNodePubKey}; +use ddc_primitives::{ + ClusterId, NodeParams, NodePubKey, NodeType, StorageNodeMode, StorageNodePubKey, +}; use frame_support::{parameter_types, BoundedVec}; use scale_info::TypeInfo; #[cfg(feature = "std")] @@ -30,6 +32,7 @@ pub struct StorageNodeProps { pub http_port: u16, pub grpc_port: u16, pub p2p_port: u16, + pub mode: StorageNodeMode, } impl StorageNode { @@ -45,6 +48,7 @@ impl StorageNode { pub_key, cluster_id: None, props: StorageNodeProps { + mode: node_params.mode, host: match node_params.host.try_into() { Ok(vec) => vec, Err(_) => return Err(NodeError::StorageHostLenExceedsLimit), diff --git a/pallets/ddc-nodes/src/testing_utils.rs b/pallets/ddc-nodes/src/testing_utils.rs index 67feb7142..858d5975c 100644 --- a/pallets/ddc-nodes/src/testing_utils.rs +++ b/pallets/ddc-nodes/src/testing_utils.rs @@ -1,6 +1,6 @@ //! Testing utils for ddc-staking. -use ddc_primitives::{NodeParams, StorageNodeParams, StorageNodePubKey}; +use ddc_primitives::{NodeParams, StorageNodeMode, StorageNodeParams, StorageNodePubKey}; use frame_benchmarking::account; use sp_std::vec; @@ -16,6 +16,7 @@ pub fn create_user_and_config( let user = account(string, n, SEED); let node = NodePubKey::StoragePubKey(StorageNodePubKey::new([0; 32])); let storage_node_params = NodeParams::StorageParams(StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, @@ -23,6 +24,7 @@ pub fn create_user_and_config( }); let new_storage_node_params = NodeParams::StorageParams(StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![2u8, 255], http_port: 45000u16, grpc_port: 55000u16, diff --git a/pallets/ddc-nodes/src/tests.rs b/pallets/ddc-nodes/src/tests.rs index 192433e59..8b0b646ea 100644 --- a/pallets/ddc-nodes/src/tests.rs +++ b/pallets/ddc-nodes/src/tests.rs @@ -1,6 +1,6 @@ //! Tests for the module. -use ddc_primitives::{NodePubKey, StorageNodeParams}; +use ddc_primitives::{NodePubKey, StorageNodeMode, StorageNodeParams}; use frame_support::{assert_noop, assert_ok}; use sp_runtime::AccountId32; @@ -13,6 +13,7 @@ fn create_storage_node_works() { let bytes = [0u8; 32]; let node_pub_key = AccountId32::from(bytes); let storage_node_params = StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, @@ -25,6 +26,7 @@ fn create_storage_node_works() { RuntimeOrigin::signed(1), NodePubKey::StoragePubKey(node_pub_key.clone()), NodeParams::StorageParams(StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![1u8; 256], http_port: 35000u16, grpc_port: 25000u16, @@ -77,6 +79,7 @@ fn create_storage_node_with_node_creator() { let bytes = [0u8; 32]; let node_pub_key = AccountId32::from(bytes); let storage_node_params = StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, @@ -110,6 +113,7 @@ fn set_storage_node_params_works() { let bytes = [0u8; 32]; let node_pub_key = AccountId32::from(bytes); let storage_node_params = StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, @@ -171,6 +175,7 @@ fn set_storage_node_params_works() { RuntimeOrigin::signed(1), NodePubKey::StoragePubKey(node_pub_key.clone()), NodeParams::StorageParams(StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![1u8; 256], http_port: 35000u16, grpc_port: 25000u16, @@ -196,6 +201,7 @@ fn delete_storage_node_works() { let bytes = [0u8; 32]; let node_pub_key = AccountId32::from(bytes); let storage_node_params = StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, diff --git a/pallets/ddc-nodes/src/weights.rs b/pallets/ddc-nodes/src/weights.rs index 776e717a0..bc05729ba 100644 --- a/pallets/ddc-nodes/src/weights.rs +++ b/pallets/ddc-nodes/src/weights.rs @@ -1,7 +1,7 @@ //! Autogenerated weights for pallet_ddc_nodes //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-14, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-15, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! HOSTNAME: `Yahors-MacBook-Pro.local`, CPU: `` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 @@ -37,20 +37,20 @@ pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { // Storage: DdcNodes StorageNodes (r:1 w:1) fn create_node() -> Weight { - Weight::from_ref_time(13_000_000_u64) + Weight::from_ref_time(12_000_000_u64) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcNodes StorageNodes (r:1 w:1) // Storage: DdcStaking Nodes (r:1 w:0) fn delete_node() -> Weight { - Weight::from_ref_time(17_000_000_u64) + Weight::from_ref_time(16_000_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcNodes StorageNodes (r:1 w:1) fn set_node_params() -> Weight { - Weight::from_ref_time(16_000_000_u64) + Weight::from_ref_time(15_000_000_u64) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -60,21 +60,21 @@ impl WeightInfo for SubstrateWeight { impl WeightInfo for () { // Storage: DdcNodes StorageNodes (r:1 w:1) fn create_node() -> Weight { - Weight::from_ref_time(13_000_000_u64) + Weight::from_ref_time(12_000_000_u64) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcNodes StorageNodes (r:1 w:1) // Storage: DdcStaking Nodes (r:1 w:0) fn delete_node() -> Weight { - Weight::from_ref_time(17_000_000_u64) + Weight::from_ref_time(16_000_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcNodes StorageNodes (r:1 w:1) fn set_node_params() -> Weight { - Weight::from_ref_time(16_000_000_u64) + Weight::from_ref_time(15_000_000_u64) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } -} \ No newline at end of file +} diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index 1ebf69ec3..2596c3f11 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -1,6 +1,6 @@ //! DdcStaking pallet benchmarking. -use ddc_primitives::{NodeParams, NodeType, StorageNodeParams, StorageNodePubKey}; +use ddc_primitives::{NodeParams, NodeType, StorageNodeMode, StorageNodeParams, StorageNodePubKey}; pub use frame_benchmarking::{ account, benchmarks, impl_benchmark_test_suite, whitelist_account, whitelisted_caller, }; @@ -26,6 +26,7 @@ benchmarks! { node.clone(), stash.clone(), NodeParams::StorageParams(StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, diff --git a/pallets/ddc-staking/src/testing_utils.rs b/pallets/ddc-staking/src/testing_utils.rs index 7a4cdc7be..7851ba072 100644 --- a/pallets/ddc-staking/src/testing_utils.rs +++ b/pallets/ddc-staking/src/testing_utils.rs @@ -1,7 +1,8 @@ //! Testing utils for ddc-staking. use ddc_primitives::{ - ClusterGovParams, ClusterId, ClusterParams, NodeParams, StorageNodeParams, StorageNodePubKey, + ClusterGovParams, ClusterId, ClusterParams, NodeParams, StorageNodeMode, StorageNodeParams, + StorageNodePubKey, }; use frame_benchmarking::account; use frame_support::traits::Currency; @@ -60,6 +61,7 @@ pub fn create_stash_controller_node( node.clone(), stash.clone(), NodeParams::StorageParams(StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, @@ -94,6 +96,7 @@ pub fn create_stash_controller_node_with_balance( ddc_primitives::NodePubKey::StoragePubKey(node_pub_key), stash.clone(), NodeParams::StorageParams(StorageNodeParams { + mode: StorageNodeMode::Storage, host: vec![1u8, 255], http_port: 35000u16, grpc_port: 25000u16, diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 38fd21d3b..f0e9c1331 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -85,8 +85,20 @@ impl TryFrom for NodeType { } } +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub enum StorageNodeMode { + /// DDC Storage node operates with enabled caching in RAM and stores data in Hard Drive + Full = 1, + /// DDC Storage node operates with disabled caching in RAM and stores data in Hard Drive + Storage = 2, + /// DDC Storage node operates with enabled caching in RAM and doesn't store data in Hard Drive + Cache = 3, +} + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNodeParams { + pub mode: StorageNodeMode, pub host: Vec, pub http_port: u16, pub grpc_port: u16, From 5f529420a01601e328f5a4d9489c8e297e0ae56f Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Tue, 19 Dec 2023 17:37:03 +0600 Subject: [PATCH 567/583] Add storage node mode to `example.json` chain spec (#204) Related to https://github.com/Cerebellum-Network/blockchain-node/pull/200. Tested manually with a local node. --- node/service/chain-specs/example.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/node/service/chain-specs/example.json b/node/service/chain-specs/example.json index e61b43fbc..6014d0a00 100644 --- a/node/service/chain-specs/example.json +++ b/node/service/chain-specs/example.json @@ -189,7 +189,8 @@ ], "http_port": 8080, "grpc_port": 8081, - "p2p_port": 8082 + "p2p_port": 8082, + "mode": "Storage" } } ], From efe72fcc1b2e70eea737b6fc93253a11348d92c9 Mon Sep 17 00:00:00 2001 From: Raid5594 <52794079+Raid5594@users.noreply.github.com> Date: Tue, 19 Dec 2023 14:36:11 +0100 Subject: [PATCH 568/583] DDC pallets for the `cere` runtime (#189) Co-authored-by: yahortsaryk --- Cargo.lock | 6 +++ runtime/cere-dev/Cargo.toml | 27 +++++++------ runtime/cere-dev/src/lib.rs | 8 ++-- runtime/cere/Cargo.toml | 30 +++++++++++--- runtime/cere/src/lib.rs | 80 ++++++++++++++++++++++++++++++++++++- 5 files changed, 126 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 68d46882e..5a86e9baf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -968,6 +968,7 @@ version = "4.8.2" dependencies = [ "cere-runtime-common", "cere-runtime-constants", + "ddc-traits", "frame-benchmarking", "frame-election-provider-support", "frame-executive", @@ -991,7 +992,12 @@ dependencies = [ "pallet-collective", "pallet-contracts", "pallet-contracts-primitives", + "pallet-ddc-clusters", + "pallet-ddc-customers", "pallet-ddc-metrics-offchain-worker", + "pallet-ddc-nodes", + "pallet-ddc-payouts", + "pallet-ddc-staking", "pallet-democracy", "pallet-election-provider-multi-phase", "pallet-election-provider-support-benchmarking", diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 4ef882790..daf3ca346 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -37,9 +37,6 @@ sp-transaction-pool = { default-features = false, git = "https://github.com/pari sp-version = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } # frame dependencies -cere-dev-runtime-constants = { path = "./constants", default-features = false } -cere-runtime-common = { path = "../common", default-features = false } -ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-executive = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -54,24 +51,15 @@ pallet-babe = { default-features = false, git = "https://github.com/paritytech/s pallet-bags-list = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-cere-ddc = { version = "4.8.2", default-features = false, path = "../../pallets/ddc" } pallet-chainbridge = { version = "4.8.2", default-features = false, path = "../../pallets/chainbridge" } pallet-child-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-collective = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-contracts-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-ddc-clusters = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-clusters" } -pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } -pallet-ddc-metrics-offchain-worker = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } -pallet-ddc-nodes = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-nodes" } -pallet-ddc-payouts = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-payouts" } -pallet-ddc-staking = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-staking" } pallet-democracy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-multi-phase = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-support-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } pallet-elections-phragmen = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-erc20 = { version = "4.8.2", default-features = false, path = "../../pallets/erc20" } -pallet-erc721 = { version = "4.8.2", default-features = false, path = "../../pallets/erc721" } pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } pallet-grandpa = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-identity = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -102,6 +90,20 @@ pallet-treasury = { default-features = false, git = "https://github.com/parityte pallet-utility = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-vesting = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +# cere dependencies +cere-dev-runtime-constants = { path = "./constants", default-features = false } +cere-runtime-common = { path = "../common", default-features = false } +ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } +pallet-cere-ddc = { version = "4.8.2", default-features = false, path = "../../pallets/ddc" } +pallet-ddc-clusters = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-clusters" } +pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } +pallet-ddc-metrics-offchain-worker = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } +pallet-ddc-nodes = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-nodes" } +pallet-ddc-payouts = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-payouts" } +pallet-ddc-staking = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-staking" } +pallet-erc20 = { version = "4.8.2", default-features = false, path = "../../pallets/erc20" } +pallet-erc721 = { version = "4.8.2", default-features = false, path = "../../pallets/erc721" } + [build-dependencies] substrate-wasm-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -182,7 +184,6 @@ std = [ "cere-runtime-common/std", "cere-dev-runtime-constants/std", "pallet-ddc-customers/std", - "pallet-ddc-nodes/std", "pallet-ddc-clusters/std", ] runtime-benchmarks = [ diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 5b0d59c14..1cb03a695 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -1335,7 +1335,7 @@ impl pallet_ddc_staking::Config for Runtime { parameter_types! { pub const DdcCustomersPalletId: PalletId = PalletId(*b"accounts"); // DDC maintainer's stake - pub const UnlockingDelay: BlockNumber = 5256000u32; // 1 hour * 24 * 365 = 1 day; (1 hour is 600 blocks) + pub const UnlockingDelay: BlockNumber = 100800_u32; // 1 hour * 24 * 7 = 7 days; (1 hour is 600 blocks) } impl pallet_ddc_customers::Config for Runtime { @@ -1367,8 +1367,8 @@ parameter_types! { pub const PayoutsPalletId: PalletId = PalletId(*b"payouts_"); } -pub struct TreasureWrapper; -impl PalletVisitor for TreasureWrapper { +pub struct TreasuryWrapper; +impl PalletVisitor for TreasuryWrapper { fn get_account_id() -> T::AccountId { TreasuryPalletId::get().into_account_truncating() } @@ -1381,7 +1381,7 @@ impl pallet_ddc_payouts::Config for Runtime { type CustomerCharger = DdcCustomers; type CustomerDepositor = DdcCustomers; type ClusterVisitor = DdcClusters; - type TreasuryVisitor = TreasureWrapper; + type TreasuryVisitor = TreasuryWrapper; type ValidatorList = pallet_staking::UseValidatorsMap; type ClusterCreator = DdcClusters; type WeightInfo = pallet_ddc_payouts::weights::SubstrateWeight; diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index c320c3dda..d2da2b23e 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -37,8 +37,6 @@ sp-transaction-pool = { default-features = false, git = "https://github.com/pari sp-version = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } # frame dependencies -cere-runtime-common = { path = "../common", default-features = false } -cere-runtime-constants = { path = "./constants", default-features = false } frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-executive = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -53,19 +51,15 @@ pallet-babe = { default-features = false, git = "https://github.com/paritytech/s pallet-bags-list = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-cere-ddc = { version = "4.8.2", default-features = false, path = "../../pallets/ddc" } pallet-chainbridge = { version = "4.8.2", default-features = false, path = "../../pallets/chainbridge" } pallet-child-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-collective = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-contracts-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-ddc-metrics-offchain-worker = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } pallet-democracy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-multi-phase = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-election-provider-support-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } pallet-elections-phragmen = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-erc20 = { version = "4.8.2", default-features = false, path = "../../pallets/erc20" } -pallet-erc721 = { version = "4.8.2", default-features = false, path = "../../pallets/erc721" } pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } pallet-grandpa = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-identity = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -96,6 +90,20 @@ pallet-treasury = { default-features = false, git = "https://github.com/parityte pallet-utility = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } pallet-vesting = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +# cere dependencies +cere-runtime-common = { path = "../common", default-features = false } +cere-runtime-constants = { path = "./constants", default-features = false } +ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } +pallet-cere-ddc = { version = "4.8.2", default-features = false, path = "../../pallets/ddc" } +pallet-ddc-clusters = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-clusters" } +pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } +pallet-ddc-metrics-offchain-worker = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } +pallet-ddc-nodes = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-nodes" } +pallet-ddc-payouts = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-payouts" } +pallet-ddc-staking = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-staking" } +pallet-erc20 = { version = "4.8.2", default-features = false, path = "../../pallets/erc20" } +pallet-erc721 = { version = "4.8.2", default-features = false, path = "../../pallets/erc721" } + [build-dependencies] substrate-wasm-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -170,6 +178,11 @@ std = [ "sp-io/std", "pallet-child-bounties/std", "pallet-ddc-metrics-offchain-worker/std", + "pallet-ddc-clusters/std", + "pallet-ddc-customers/std", + "pallet-ddc-nodes/std", + "pallet-ddc-payouts/std", + "pallet-ddc-staking/std", "cere-runtime-common/std", "cere-runtime-constants/std", ] @@ -185,6 +198,11 @@ runtime-benchmarks = [ "pallet-child-bounties/runtime-benchmarks", "pallet-collective/runtime-benchmarks", "pallet-contracts/runtime-benchmarks", + "pallet-ddc-customers/runtime-benchmarks", + "pallet-ddc-clusters/runtime-benchmarks", + "pallet-ddc-nodes/runtime-benchmarks", + "pallet-ddc-staking/runtime-benchmarks", + "pallet-ddc-payouts/runtime-benchmarks", "pallet-democracy/runtime-benchmarks", "pallet-election-provider-multi-phase/runtime-benchmarks", "pallet-election-provider-support-benchmarking/runtime-benchmarks", diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 16b3fbb53..40fbf4fd3 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -23,6 +23,7 @@ #![recursion_limit = "256"] use codec::{Decode, Encode, MaxEncodedLen}; +use ddc_traits::pallet::PalletVisitor; use frame_election_provider_support::{onchain, BalancingConfig, SequentialPhragmen, VoteWeight}; use frame_support::{ construct_runtime, @@ -77,8 +78,8 @@ use sp_runtime::{ curve::PiecewiseLinear, generic, impl_opaque_keys, traits::{ - self, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, NumberFor, OpaqueKeys, - SaturatedConversion, StaticLookup, + self, AccountIdConversion, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, NumberFor, + OpaqueKeys, SaturatedConversion, StaticLookup, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedPointNumber, FixedU128, Perbill, Percent, Permill, Perquintill, @@ -1317,6 +1318,71 @@ impl pallet_ddc_metrics_offchain_worker::Config for Runtime { type RuntimeCall = RuntimeCall; } +parameter_types! { + pub const DdcCustomersPalletId: PalletId = PalletId(*b"accounts"); // DDC maintainer's stake + pub const UnlockingDelay: BlockNumber = 100800_u32; // 1 hour * 24 * 7 = 7 days; (1 hour is 600 blocks) +} + +impl pallet_ddc_customers::Config for Runtime { + type UnlockingDelay = UnlockingDelay; + type Currency = Balances; + type PalletId = DdcCustomersPalletId; + type RuntimeEvent = RuntimeEvent; + type ClusterVisitor = pallet_ddc_clusters::Pallet; + type ClusterCreator = pallet_ddc_clusters::Pallet; + type WeightInfo = pallet_ddc_customers::weights::SubstrateWeight; +} + +impl pallet_ddc_clusters::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type NodeRepository = pallet_ddc_nodes::Pallet; + type StakingVisitor = pallet_ddc_staking::Pallet; + type StakerCreator = pallet_ddc_staking::Pallet; + type Currency = Balances; + type WeightInfo = pallet_ddc_clusters::weights::SubstrateWeight; +} + +impl pallet_ddc_nodes::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type StakingVisitor = pallet_ddc_staking::Pallet; + type WeightInfo = pallet_ddc_nodes::weights::SubstrateWeight; +} + +parameter_types! { + pub const PayoutsPalletId: PalletId = PalletId(*b"payouts_"); +} + +pub struct TreasuryWrapper; +impl PalletVisitor for TreasuryWrapper { + fn get_account_id() -> T::AccountId { + TreasuryPalletId::get().into_account_truncating() + } +} + +impl pallet_ddc_payouts::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type PalletId = PayoutsPalletId; + type Currency = Balances; + type CustomerCharger = DdcCustomers; + type CustomerDepositor = DdcCustomers; + type ClusterVisitor = DdcClusters; + type TreasuryVisitor = TreasuryWrapper; + type ValidatorList = pallet_staking::UseValidatorsMap; + type ClusterCreator = DdcClusters; + type WeightInfo = pallet_ddc_payouts::weights::SubstrateWeight; +} + +impl pallet_ddc_staking::Config for Runtime { + type Currency = Balances; + type RuntimeEvent = RuntimeEvent; + type WeightInfo = pallet_ddc_staking::weights::SubstrateWeight; + type ClusterVisitor = pallet_ddc_clusters::Pallet; + type ClusterCreator = pallet_ddc_clusters::Pallet; + type ClusterManager = pallet_ddc_clusters::Pallet; + type NodeVisitor = pallet_ddc_nodes::Pallet; + type NodeCreator = pallet_ddc_nodes::Pallet; +} + construct_runtime!( pub enum Runtime where Block = Block, @@ -1368,6 +1434,11 @@ construct_runtime!( Erc721: pallet_erc721::{Pallet, Call, Storage, Event}, Erc20: pallet_erc20::{Pallet, Call, Storage, Event}, DdcMetricsOffchainWorker: pallet_ddc_metrics_offchain_worker::{Pallet, Call, Storage, Event}, + DdcStaking: pallet_ddc_staking, + DdcCustomers: pallet_ddc_customers, + DdcNodes: pallet_ddc_nodes, + DdcClusters: pallet_ddc_clusters, + DdcPayouts: pallet_ddc_payouts } ); @@ -1441,6 +1512,11 @@ mod benches { [pallet_child_bounties, ChildBounties] [pallet_collective, Council] [pallet_contracts, Contracts] + [pallet_ddc_customers, DdcCustomers] + [pallet_ddc_clusters, DdcClusters] + [pallet_ddc_staking, DdcStaking] + [pallet_ddc_nodes, DdcNodes] + [pallet_ddc_payouts, DdcPayouts] [pallet_democracy, Democracy] [pallet_election_provider_multi_phase, ElectionProviderMultiPhase] [pallet_election_provider_support_benchmarking, EPSBench::] From bf7205f951d75c6eb1fb6cece86744b6bec889e0 Mon Sep 17 00:00:00 2001 From: "Alisher A. Khassanov" Date: Wed, 20 Dec 2023 17:34:06 +0600 Subject: [PATCH 569/583] Genesis config for `pallet-ddc-payouts` (#207) --- node/service/chain-specs/example.json | 12 +++++++++++- node/service/src/chain_spec.rs | 1 + pallets/ddc-payouts/src/lib.rs | 27 +++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/node/service/chain-specs/example.json b/node/service/chain-specs/example.json index 6014d0a00..961ae7795 100644 --- a/node/service/chain-specs/example.json +++ b/node/service/chain-specs/example.json @@ -193,7 +193,7 @@ "mode": "Storage" } } - ], + ] }, "ddcClusters": { "clusters": [ @@ -233,6 +233,16 @@ ] ] ] + }, + "ddcPayouts": { + "authorisedCaller": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + "debtorCustomers": [ + [ + "0x0000000000000000000000000000000000000001", + "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + 10000000000 + ] + ] } } } diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index 12859a2c6..45f26873e 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -235,6 +235,7 @@ pub fn cere_dev_genesis( nomination_pools: Default::default(), ddc_clusters: Default::default(), ddc_nodes: Default::default(), + ddc_payouts: Default::default(), } } diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index 9d7b12003..51eb7bc15 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -286,6 +286,33 @@ pub mod pallet { Finalized = 7, } + #[pallet::genesis_config] + pub struct GenesisConfig { + pub authorised_caller: Option, + pub debtor_customers: Vec<(ClusterId, T::AccountId, u128)>, + } + + #[cfg(feature = "std")] + impl Default for GenesisConfig { + fn default() -> Self { + GenesisConfig { + authorised_caller: Default::default(), + debtor_customers: Default::default(), + } + } + } + + #[pallet::genesis_build] + impl GenesisBuild for GenesisConfig { + fn build(&self) { + AuthorisedCaller::::set(self.authorised_caller.clone()); + + for (cluster_id, customer_id, debt) in &self.debtor_customers { + DebtorCustomers::::insert(cluster_id, customer_id, debt); + } + } + } + #[pallet::call] impl Pallet { #[pallet::weight(T::WeightInfo::set_authorised_caller())] From b782db4d1f09e9c2e91d1034160d2c10d9785959 Mon Sep 17 00:00:00 2001 From: rakanalh Date: Thu, 21 Dec 2023 12:51:26 +0300 Subject: [PATCH 570/583] Increment devnet runtime version --- runtime/cere-dev/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 1cb03a695..509a1893b 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -129,10 +129,10 @@ 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: 48016, + spec_version: 48017, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 7, + transaction_version: 8, state_version: 0, }; From 94507381aa4e17f7da01e688da85d93ca4ae226c Mon Sep 17 00:00:00 2001 From: Yahor Tsaryk Date: Thu, 21 Dec 2023 18:56:01 +0100 Subject: [PATCH 571/583] DDC Storage node params updated with `domain` and `ssl` fields; Tests are enhanced (#211) This PR introduces `domain` and `ssl` fields for storage node params --- node/service/chain-specs/example.json | 2 + pallets/ddc-clusters/src/testing_utils.rs | 4 +- pallets/ddc-clusters/src/tests.rs | 110 +++++++++++++++++++++- pallets/ddc-nodes/src/benchmarking.rs | 4 +- pallets/ddc-nodes/src/lib.rs | 1 + pallets/ddc-nodes/src/node.rs | 2 + pallets/ddc-nodes/src/storage_node.rs | 15 ++- pallets/ddc-nodes/src/testing_utils.rs | 8 +- pallets/ddc-nodes/src/tests.rs | 102 +++++++++++++++++++- pallets/ddc-staking/src/benchmarking.rs | 4 +- pallets/ddc-staking/src/testing_utils.rs | 8 +- primitives/src/lib.rs | 2 + 12 files changed, 245 insertions(+), 17 deletions(-) diff --git a/node/service/chain-specs/example.json b/node/service/chain-specs/example.json index 961ae7795..5ad984508 100644 --- a/node/service/chain-specs/example.json +++ b/node/service/chain-specs/example.json @@ -187,6 +187,8 @@ 46, 49 ], + "domain": [], + "ssl": false, "http_port": 8080, "grpc_port": 8081, "p2p_port": 8082, diff --git a/pallets/ddc-clusters/src/testing_utils.rs b/pallets/ddc-clusters/src/testing_utils.rs index cc08a264c..efba60338 100644 --- a/pallets/ddc-clusters/src/testing_utils.rs +++ b/pallets/ddc-clusters/src/testing_utils.rs @@ -55,7 +55,9 @@ where let cluster_params = ClusterParams { node_provider_auth_contract: Some(user.clone()) }; let storage_node_params = StorageNodeParams { mode: StorageNodeMode::Storage, - host: vec![1u8, 255], + host: vec![1u8; 255], + domain: vec![2u8; 255], + ssl: true, http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, diff --git a/pallets/ddc-clusters/src/tests.rs b/pallets/ddc-clusters/src/tests.rs index 86f4202de..5f33a4b8f 100644 --- a/pallets/ddc-clusters/src/tests.rs +++ b/pallets/ddc-clusters/src/tests.rs @@ -58,6 +58,51 @@ fn create_cluster_works() { cluster_gov_params.clone() )); + let created_cluster = DdcClusters::clusters(cluster_id).unwrap(); + assert_eq!(created_cluster.cluster_id, cluster_id); + assert_eq!(created_cluster.manager_id, cluster_manager_id); + assert_eq!(created_cluster.reserve_id, cluster_reserve_id); + assert_eq!(created_cluster.props.node_provider_auth_contract, Some(auth_contract.clone())); + + let created_cluster_gov_params = DdcClusters::clusters_gov_params(cluster_id).unwrap(); + assert_eq!(created_cluster_gov_params.treasury_share, cluster_gov_params.treasury_share); + assert_eq!( + created_cluster_gov_params.validators_share, + cluster_gov_params.validators_share + ); + assert_eq!( + created_cluster_gov_params.cluster_reserve_share, + cluster_gov_params.cluster_reserve_share + ); + assert_eq!( + created_cluster_gov_params.storage_bond_size, + cluster_gov_params.storage_bond_size + ); + assert_eq!( + created_cluster_gov_params.storage_chill_delay, + cluster_gov_params.storage_chill_delay + ); + assert_eq!( + created_cluster_gov_params.storage_unbonding_delay, + cluster_gov_params.storage_unbonding_delay + ); + assert_eq!( + created_cluster_gov_params.unit_per_mb_stored, + cluster_gov_params.unit_per_mb_stored + ); + assert_eq!( + created_cluster_gov_params.unit_per_mb_streamed, + cluster_gov_params.unit_per_mb_streamed + ); + assert_eq!( + created_cluster_gov_params.unit_per_put_request, + cluster_gov_params.unit_per_put_request + ); + assert_eq!( + created_cluster_gov_params.unit_per_get_request, + cluster_gov_params.unit_per_get_request + ); + // Creating cluster with same id should fail assert_noop!( DdcClusters::create_cluster( @@ -144,7 +189,9 @@ fn add_and_delete_node_works() { let storage_node_params = StorageNodeParams { mode: StorageNodeMode::Storage, - host: vec![1u8, 255], + host: vec![1u8; 255], + domain: vec![2u8; 255], + ssl: true, http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, @@ -352,9 +399,12 @@ fn set_cluster_params_works() { assert_ok!(DdcClusters::set_cluster_params( RuntimeOrigin::signed(cluster_manager_id), cluster_id, - ClusterParams { node_provider_auth_contract: Some(auth_contract_2) }, + ClusterParams { node_provider_auth_contract: Some(auth_contract_2.clone()) }, )); + let updated_cluster = DdcClusters::clusters(cluster_id).unwrap(); + assert_eq!(updated_cluster.props.node_provider_auth_contract, Some(auth_contract_2)); + // Checking that event was emitted assert_eq!(System::events().len(), 2); System::assert_last_event(Event::ClusterParamsSet { cluster_id }.into()) @@ -407,17 +457,69 @@ fn set_cluster_gov_params_works() { DdcClusters::set_cluster_gov_params( RuntimeOrigin::signed(cluster_manager_id), cluster_id, - cluster_gov_params.clone() + cluster_gov_params ), BadOrigin ); + let updated_gov_params = ClusterGovParams { + treasury_share: Perbill::from_float(0.06), + validators_share: Perbill::from_float(0.02), + cluster_reserve_share: Perbill::from_float(0.03), + storage_bond_size: 1000, + storage_chill_delay: 500, + storage_unbonding_delay: 500, + unit_per_mb_stored: 100, + unit_per_mb_streamed: 100, + unit_per_put_request: 100, + unit_per_get_request: 100, + }; + assert_ok!(DdcClusters::set_cluster_gov_params( RuntimeOrigin::root(), cluster_id, - cluster_gov_params + updated_gov_params.clone() )); + let updated_cluster_gov_params = DdcClusters::clusters_gov_params(cluster_id).unwrap(); + assert_eq!(updated_cluster_gov_params.treasury_share, updated_gov_params.treasury_share); + assert_eq!( + updated_cluster_gov_params.validators_share, + updated_gov_params.validators_share + ); + assert_eq!( + updated_cluster_gov_params.cluster_reserve_share, + updated_gov_params.cluster_reserve_share + ); + assert_eq!( + updated_cluster_gov_params.storage_bond_size, + updated_gov_params.storage_bond_size + ); + assert_eq!( + updated_cluster_gov_params.storage_chill_delay, + updated_gov_params.storage_chill_delay + ); + assert_eq!( + updated_cluster_gov_params.storage_unbonding_delay, + updated_gov_params.storage_unbonding_delay + ); + assert_eq!( + updated_cluster_gov_params.unit_per_mb_stored, + updated_gov_params.unit_per_mb_stored + ); + assert_eq!( + updated_cluster_gov_params.unit_per_mb_streamed, + updated_gov_params.unit_per_mb_streamed + ); + assert_eq!( + updated_cluster_gov_params.unit_per_put_request, + updated_gov_params.unit_per_put_request + ); + assert_eq!( + updated_cluster_gov_params.unit_per_get_request, + updated_gov_params.unit_per_get_request + ); + // Checking that event was emitted assert_eq!(System::events().len(), 2); System::assert_last_event(Event::ClusterGovParamsSet { cluster_id }.into()) diff --git a/pallets/ddc-nodes/src/benchmarking.rs b/pallets/ddc-nodes/src/benchmarking.rs index 451ef0c2a..b13012d4c 100644 --- a/pallets/ddc-nodes/src/benchmarking.rs +++ b/pallets/ddc-nodes/src/benchmarking.rs @@ -46,7 +46,9 @@ benchmarks! { StorageNodePubKey::new([0; 32])).unwrap().props, StorageNodeProps { mode: StorageNodeMode::Storage, - host: vec![2u8, 255].try_into().unwrap(), + host: vec![3u8; 255].try_into().unwrap(), + domain: vec![4u8; 255].try_into().unwrap(), + ssl: true, http_port: 45000u16, grpc_port: 55000u16, p2p_port: 65000u16, diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 5f85f1114..b5cc37a1f 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -75,6 +75,7 @@ pub mod pallet { OnlyNodeProvider, NodeIsAssignedToCluster, HostLenExceedsLimit, + DomainLenExceedsLimit, NodeHasDanglingStake, } diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 0d7478435..617d9f501 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -92,12 +92,14 @@ impl NodeTrait for Node { #[derive(Debug, PartialEq)] pub enum NodeError { StorageHostLenExceedsLimit, + StorageDomainLenExceedsLimit, } impl From for Error { fn from(error: NodeError) -> Self { match error { NodeError::StorageHostLenExceedsLimit => Error::::HostLenExceedsLimit, + NodeError::StorageDomainLenExceedsLimit => Error::::DomainLenExceedsLimit, } } } diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index c17d63dfa..eb5c05215 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -11,8 +11,8 @@ use sp_runtime::RuntimeDebug; use crate::node::{NodeError, NodeProps, NodeTrait}; parameter_types! { - pub MaxStorageNodeParamsLen: u16 = 2048; pub MaxHostLen: u8 = 255; + pub MaxDomainLen: u8 = 255; } #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] @@ -29,6 +29,8 @@ pub struct StorageNode { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct StorageNodeProps { pub host: BoundedVec, + pub domain: BoundedVec, + pub ssl: bool, pub http_port: u16, pub grpc_port: u16, pub p2p_port: u16, @@ -53,6 +55,11 @@ impl StorageNode { Ok(vec) => vec, Err(_) => return Err(NodeError::StorageHostLenExceedsLimit), }, + domain: match node_params.domain.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::StorageDomainLenExceedsLimit), + }, + ssl: node_params.ssl, http_port: node_params.http_port, grpc_port: node_params.grpc_port, p2p_port: node_params.p2p_port, @@ -82,10 +89,16 @@ impl NodeTrait for StorageNode { fn set_params(&mut self, node_params: NodeParams) -> Result<(), NodeError> { match node_params { NodeParams::StorageParams(storage_params) => { + self.props.mode = storage_params.mode; self.props.host = match storage_params.host.try_into() { Ok(vec) => vec, Err(_) => return Err(NodeError::StorageHostLenExceedsLimit), }; + self.props.domain = match storage_params.domain.try_into() { + Ok(vec) => vec, + Err(_) => return Err(NodeError::StorageDomainLenExceedsLimit), + }; + self.props.ssl = storage_params.ssl; self.props.http_port = storage_params.http_port; self.props.grpc_port = storage_params.grpc_port; self.props.p2p_port = storage_params.p2p_port; diff --git a/pallets/ddc-nodes/src/testing_utils.rs b/pallets/ddc-nodes/src/testing_utils.rs index 858d5975c..52e0198fa 100644 --- a/pallets/ddc-nodes/src/testing_utils.rs +++ b/pallets/ddc-nodes/src/testing_utils.rs @@ -17,7 +17,9 @@ pub fn create_user_and_config( let node = NodePubKey::StoragePubKey(StorageNodePubKey::new([0; 32])); let storage_node_params = NodeParams::StorageParams(StorageNodeParams { mode: StorageNodeMode::Storage, - host: vec![1u8, 255], + host: vec![1u8; 255], + domain: vec![2u8; 255], + ssl: false, http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, @@ -25,7 +27,9 @@ pub fn create_user_and_config( let new_storage_node_params = NodeParams::StorageParams(StorageNodeParams { mode: StorageNodeMode::Storage, - host: vec![2u8, 255], + host: vec![3u8; 255], + domain: vec![4u8; 255], + ssl: true, http_port: 45000u16, grpc_port: 55000u16, p2p_port: 65000u16, diff --git a/pallets/ddc-nodes/src/tests.rs b/pallets/ddc-nodes/src/tests.rs index 8b0b646ea..618a01c8e 100644 --- a/pallets/ddc-nodes/src/tests.rs +++ b/pallets/ddc-nodes/src/tests.rs @@ -3,6 +3,7 @@ use ddc_primitives::{NodePubKey, StorageNodeMode, StorageNodeParams}; use frame_support::{assert_noop, assert_ok}; use sp_runtime::AccountId32; +use storage_node::{MaxDomainLen, MaxHostLen}; use super::{mock::*, *}; @@ -14,7 +15,9 @@ fn create_storage_node_works() { let node_pub_key = AccountId32::from(bytes); let storage_node_params = StorageNodeParams { mode: StorageNodeMode::Storage, - host: vec![1u8, 255], + host: vec![1u8; 255], + domain: vec![2u8; 255], + ssl: true, http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, @@ -28,6 +31,8 @@ fn create_storage_node_works() { NodeParams::StorageParams(StorageNodeParams { mode: StorageNodeMode::Storage, host: vec![1u8; 256], + domain: vec![2u8; 255], + ssl: true, http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, @@ -36,6 +41,24 @@ fn create_storage_node_works() { Error::::HostLenExceedsLimit ); + // Host length exceeds limit + assert_noop!( + DdcNodes::create_node( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::StorageParams(StorageNodeParams { + mode: StorageNodeMode::Storage, + host: vec![1u8; 255], + domain: vec![2u8; 256], + ssl: true, + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }) + ), + Error::::DomainLenExceedsLimit + ); + // Node created assert_ok!(DdcNodes::create_node( RuntimeOrigin::signed(1), @@ -43,6 +66,23 @@ fn create_storage_node_works() { NodeParams::StorageParams(storage_node_params.clone()) )); + let created_storage_node = DdcNodes::storage_nodes(&node_pub_key).unwrap(); + let expected_host: BoundedVec = + storage_node_params.clone().host.try_into().unwrap(); + let expected_domain: BoundedVec = + storage_node_params.clone().domain.try_into().unwrap(); + + assert_eq!(created_storage_node.pub_key, node_pub_key); + assert_eq!(created_storage_node.provider_id, 1); + assert_eq!(created_storage_node.cluster_id, None); + assert_eq!(created_storage_node.props.host, expected_host); + assert_eq!(created_storage_node.props.domain, expected_domain); + assert_eq!(created_storage_node.props.ssl, storage_node_params.ssl); + assert_eq!(created_storage_node.props.http_port, storage_node_params.http_port); + assert_eq!(created_storage_node.props.grpc_port, storage_node_params.grpc_port); + assert_eq!(created_storage_node.props.p2p_port, storage_node_params.p2p_port); + assert_eq!(created_storage_node.props.mode, storage_node_params.mode); + // Check storage assert!(StorageNodes::::contains_key(node_pub_key.clone())); assert!(DdcNodes::exists(&NodePubKey::StoragePubKey(node_pub_key.clone()))); @@ -80,7 +120,9 @@ fn create_storage_node_with_node_creator() { let node_pub_key = AccountId32::from(bytes); let storage_node_params = StorageNodeParams { mode: StorageNodeMode::Storage, - host: vec![1u8, 255], + host: vec![1u8; 255], + domain: vec![2u8; 255], + ssl: true, http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, @@ -114,7 +156,9 @@ fn set_storage_node_params_works() { let node_pub_key = AccountId32::from(bytes); let storage_node_params = StorageNodeParams { mode: StorageNodeMode::Storage, - host: vec![1u8, 255], + host: vec![1u8; 255], + domain: vec![2u8; 255], + ssl: true, http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, @@ -137,13 +181,39 @@ fn set_storage_node_params_works() { NodeParams::StorageParams(storage_node_params.clone()) )); + let updated_params = StorageNodeParams { + mode: StorageNodeMode::Full, + host: vec![3u8; 255], + domain: vec![4u8; 255], + ssl: false, + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }; + // Set node params assert_ok!(DdcNodes::set_node_params( RuntimeOrigin::signed(1), NodePubKey::StoragePubKey(node_pub_key.clone()), - NodeParams::StorageParams(storage_node_params.clone()) + NodeParams::StorageParams(updated_params.clone()) )); + let updated_storage_node = DdcNodes::storage_nodes(&node_pub_key).unwrap(); + let expected_host: BoundedVec = updated_params.host.try_into().unwrap(); + let expected_domain: BoundedVec = + updated_params.domain.try_into().unwrap(); + + assert_eq!(updated_storage_node.pub_key, node_pub_key); + assert_eq!(updated_storage_node.provider_id, 1); + assert_eq!(updated_storage_node.cluster_id, None); + assert_eq!(updated_storage_node.props.host, expected_host); + assert_eq!(updated_storage_node.props.domain, expected_domain); + assert_eq!(updated_storage_node.props.ssl, updated_params.ssl); + assert_eq!(updated_storage_node.props.http_port, updated_params.http_port); + assert_eq!(updated_storage_node.props.grpc_port, updated_params.grpc_port); + assert_eq!(updated_storage_node.props.p2p_port, updated_params.p2p_port); + assert_eq!(updated_storage_node.props.mode, updated_params.mode); + // Only node provider can set params assert_noop!( DdcNodes::set_node_params( @@ -177,6 +247,8 @@ fn set_storage_node_params_works() { NodeParams::StorageParams(StorageNodeParams { mode: StorageNodeMode::Storage, host: vec![1u8; 256], + domain: vec![2u8; 255], + ssl: true, http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, @@ -185,6 +257,24 @@ fn set_storage_node_params_works() { Error::::HostLenExceedsLimit ); + // Storage domain length exceeds limit + assert_noop!( + DdcNodes::set_node_params( + RuntimeOrigin::signed(1), + NodePubKey::StoragePubKey(node_pub_key.clone()), + NodeParams::StorageParams(StorageNodeParams { + mode: StorageNodeMode::Storage, + host: vec![1u8; 255], + domain: vec![2u8; 256], + ssl: true, + http_port: 35000u16, + grpc_port: 25000u16, + p2p_port: 15000u16, + }) + ), + Error::::DomainLenExceedsLimit + ); + // Checking that event was emitted assert_eq!(System::events().len(), 2); System::assert_last_event( @@ -202,7 +292,9 @@ fn delete_storage_node_works() { let node_pub_key = AccountId32::from(bytes); let storage_node_params = StorageNodeParams { mode: StorageNodeMode::Storage, - host: vec![1u8, 255], + host: vec![1u8; 255], + domain: vec![2u8; 255], + ssl: true, http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, diff --git a/pallets/ddc-staking/src/benchmarking.rs b/pallets/ddc-staking/src/benchmarking.rs index 2596c3f11..ebf8e27d4 100644 --- a/pallets/ddc-staking/src/benchmarking.rs +++ b/pallets/ddc-staking/src/benchmarking.rs @@ -27,7 +27,9 @@ benchmarks! { stash.clone(), NodeParams::StorageParams(StorageNodeParams { mode: StorageNodeMode::Storage, - host: vec![1u8, 255], + host: vec![1u8; 255], + domain: vec![2u8; 256], + ssl: true, http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, diff --git a/pallets/ddc-staking/src/testing_utils.rs b/pallets/ddc-staking/src/testing_utils.rs index 7851ba072..21b35ffe1 100644 --- a/pallets/ddc-staking/src/testing_utils.rs +++ b/pallets/ddc-staking/src/testing_utils.rs @@ -62,7 +62,9 @@ pub fn create_stash_controller_node( stash.clone(), NodeParams::StorageParams(StorageNodeParams { mode: StorageNodeMode::Storage, - host: vec![1u8, 255], + host: vec![1u8; 255], + domain: vec![2u8; 256], + ssl: true, http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, @@ -97,7 +99,9 @@ pub fn create_stash_controller_node_with_balance( stash.clone(), NodeParams::StorageParams(StorageNodeParams { mode: StorageNodeMode::Storage, - host: vec![1u8, 255], + host: vec![1u8; 255], + domain: vec![2u8; 256], + ssl: true, http_port: 35000u16, grpc_port: 25000u16, p2p_port: 15000u16, diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index f0e9c1331..164f0338b 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -100,6 +100,8 @@ pub enum StorageNodeMode { pub struct StorageNodeParams { pub mode: StorageNodeMode, pub host: Vec, + pub domain: Vec, + pub ssl: bool, pub http_port: u16, pub grpc_port: u16, pub p2p_port: u16, From 82a1b5ceb1294c850801687ffb4072a8d8106506 Mon Sep 17 00:00:00 2001 From: Rakan Al-Huneiti Date: Fri, 29 Dec 2023 13:14:09 +0300 Subject: [PATCH 572/583] Remove ddc & offchain pallets (#198) Co-authored-by: Raid Ateir --- .gitguardian.yaml | 7 + .github/workflows/check.yaml | 52 -- .github/workflows/ci.yaml | 143 ++- .github/workflows/{dev.yaml => e2e.yaml} | 2 +- .github/workflows/ecr.yaml | 57 ++ .gitignore | 3 - Cargo.lock | 195 +--- Cargo.toml | 2 - cli/src/cli.rs | 9 - cli/src/command.rs | 11 +- node/service/src/lib.rs | 34 +- pallets/ddc-customers/Cargo.toml | 2 +- .../ddc-metrics-offchain-worker/Cargo.toml | 49 - pallets/ddc-metrics-offchain-worker/README.md | 14 - .../ddc-metrics-offchain-worker/src/lib.rs | 839 ------------------ .../src/tests/mod.rs | 387 -------- .../src/tests/test_data/ddc.wasm | 0 .../tests/test_data/ddc_metrics_node-0.json | 16 - .../tests/test_data/ddc_metrics_node-3.json | 9 - .../src/tests/test_data/generate.sh | 10 - .../src/tests/test_data/metadata.json | 0 .../src/tests/test_runtime.rs | 219 ----- pallets/ddc/Cargo.toml | 40 - pallets/ddc/LICENSE-APACHE2 | 211 ----- pallets/ddc/README.md | 132 --- pallets/ddc/src/lib.rs | 108 --- pallets/ddc/src/mock.rs | 71 -- pallets/ddc/src/tests.rs | 35 - runtime/cere-dev/Cargo.toml | 7 +- runtime/cere-dev/src/impls.rs | 341 ------- runtime/cere-dev/src/lib.rs | 32 - runtime/cere/Cargo.toml | 7 +- runtime/cere/src/impls.rs | 341 ------- runtime/cere/src/lib.rs | 32 - rustfmt.toml | 2 - .../0001-ddc-validation/ddc-validation.toml | 2 +- 36 files changed, 205 insertions(+), 3216 deletions(-) create mode 100644 .gitguardian.yaml delete mode 100644 .github/workflows/check.yaml rename .github/workflows/{dev.yaml => e2e.yaml} (99%) create mode 100644 .github/workflows/ecr.yaml delete mode 100644 pallets/ddc-metrics-offchain-worker/Cargo.toml delete mode 100644 pallets/ddc-metrics-offchain-worker/README.md delete mode 100644 pallets/ddc-metrics-offchain-worker/src/lib.rs delete mode 100644 pallets/ddc-metrics-offchain-worker/src/tests/mod.rs delete mode 100644 pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc.wasm delete mode 100644 pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc_metrics_node-0.json delete mode 100644 pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc_metrics_node-3.json delete mode 100755 pallets/ddc-metrics-offchain-worker/src/tests/test_data/generate.sh delete mode 100644 pallets/ddc-metrics-offchain-worker/src/tests/test_data/metadata.json delete mode 100644 pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs delete mode 100644 pallets/ddc/Cargo.toml delete mode 100644 pallets/ddc/LICENSE-APACHE2 delete mode 100644 pallets/ddc/README.md delete mode 100644 pallets/ddc/src/lib.rs delete mode 100644 pallets/ddc/src/mock.rs delete mode 100644 pallets/ddc/src/tests.rs diff --git a/.gitguardian.yaml b/.gitguardian.yaml new file mode 100644 index 000000000..dd1ee3e4e --- /dev/null +++ b/.gitguardian.yaml @@ -0,0 +1,7 @@ +# Required, otherwise ggshield considers the file to use the deprecated v1 format +version: 2 + +secret: + # Exclude files and paths by globbing + ignored-paths: + - node/service/chain-specs/example.json diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml deleted file mode 100644 index 04af2420e..000000000 --- a/.github/workflows/check.yaml +++ /dev/null @@ -1,52 +0,0 @@ -name: Check Set-Up & Build - -# Controls when the action will run. -on: - # Triggers the workflow on push or pull request events but only for the master branch - push: - branches: [ '**' ] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - check: - # The type of runner that the job will run on - runs-on: ubuntu-22.04 - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v4 - - - name: Install linux dependencies - run: sudo apt install -y clang libssl-dev llvm libudev-dev protobuf-compiler - - - name: Install Rust - run: | - rustup update stable --no-self-update - rustup target add wasm32-unknown-unknown - - - name: Check TOML - uses: dprint/check@v2.2 - - - name: Check Format - run: | - cargo fmt -- --check - - - name: Rust Cache - uses: Swatinem/rust-cache@v2 - - - name: Check with Clippy - run: | - cargo clippy --no-deps --all-targets --features runtime-benchmarks --workspace -- --deny warnings - - - name: Check Build - run: | - SKIP_WASM_BUILD=1 cargo check --release - - - name: Check Build for Benchmarking - run: > - pushd node && - cargo check --features=runtime-benchmarks --release diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 969c0f124..1fd160065 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,58 +1,109 @@ -name: CI +name: PR +# Controls when the action will run. on: - pull_request: - branches: - - dev - - master - - 'feature/**' - - 'release/**' - - 'hotfix/**' - types: - - opened - - synchronize - - edited - -env: - PROFILE: release + # Triggers the workflow on push or pull request events but only for the master branch + push: + branches: [ '**' ] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +permissions: + id-token: write + contents: read + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: - build: - runs-on: ubuntu-latest - concurrency: dev + format: + name: Check Lints + runs-on: ubuntu-22.04 steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v3 - - - name: Cache cargo registry - uses: actions/cache@v3 - continue-on-error: false + - name: Install nightly toolchain + uses: actions-rs/toolchain@v1 with: - path: | - ~/.cargo/registry - ~/.cargo/git - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - restore-keys: | - ${{ runner.os }}-cargo- - - - name: Configure AWS credentials ORG - uses: aws-actions/configure-aws-credentials@v1 + toolchain: nightly-2022-10-09 + override: true + components: rustfmt + - name: Check TOML + uses: dprint/check@v2.2 + - name: Check Format + run: | + cargo fmt -- --check + + check: + name: Cargo check + needs: format + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + - name: Install linux dependencies + run: sudo apt update && sudo apt install -y cargo clang libssl-dev llvm libudev-dev protobuf-compiler + - name: Install nightly toolchain + uses: actions-rs/toolchain@v1 with: - aws-access-key-id: ${{ secrets.ORG_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.ORG_AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 + toolchain: nightly-2022-10-09 + override: true + target: wasm32-unknown-unknown + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + - name: Check Build + run: | + SKIP_WASM_BUILD=1 cargo check --release + - name: Check Build for Benchmarking + run: > + pushd node && + cargo check --features=runtime-benchmarks --release - - name: Login to Amazon ECR ORG - id: login-ecr-org - uses: aws-actions/amazon-ecr-login@v1 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + clippy: + name: Run Clippy + needs: format + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + - name: Install linux dependencies + run: sudo apt update && sudo apt install -y cargo clang libssl-dev llvm libudev-dev protobuf-compiler + - name: Install nightly toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly-2022-10-09 + override: true + target: wasm32-unknown-unknown + components: clippy + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + - name: Check with Clippy + run: | + cargo clippy --no-deps --all-targets --features runtime-benchmarks --workspace -- --deny warnings - - name: Build and push docker image to ECR Docker - uses: docker/build-push-action@v4 + tests: + name: Run tests + needs: format + # The type of runner that the job will run on + runs-on: ["self-hosted", "cere-network-memory-large"] + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v3 + - name: Install linux dependencies + run: sudo apt update && sudo apt install -y cargo clang libssl-dev llvm libudev-dev protobuf-compiler + - name: Install nightly toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly-2022-10-09 + override: true + target: wasm32-unknown-unknown + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + - name: Run cargo-tarpaulin + uses: actions-rs/tarpaulin@v0.1 + with: + version: '0.22.0' + args: '--verbose --locked --no-fail-fast --workspace --features runtime-benchmarks --out "Xml"' + - name: Upload coverage report + uses: actions/upload-artifact@v3 with: - context: . - file: Dockerfile.tests - push: false - build-args: | - "ECR_REGISTRY=${{ steps.login-ecr-org.outputs.registry }}" + name: tarpaulin coverage + path: ./tarpaulin-report.xml diff --git a/.github/workflows/dev.yaml b/.github/workflows/e2e.yaml similarity index 99% rename from .github/workflows/dev.yaml rename to .github/workflows/e2e.yaml index 163c796df..8eefae485 100644 --- a/.github/workflows/dev.yaml +++ b/.github/workflows/e2e.yaml @@ -1,4 +1,4 @@ -name: Release to dev +name: E2E on: push: branches: diff --git a/.github/workflows/ecr.yaml b/.github/workflows/ecr.yaml new file mode 100644 index 000000000..a75c755e9 --- /dev/null +++ b/.github/workflows/ecr.yaml @@ -0,0 +1,57 @@ +name: ECR + +on: + pull_request: + branches: + - dev + - master + - 'release/**' + - 'hotfix/**' + types: + - opened + - synchronize + - edited + +env: + PROFILE: release + +jobs: + build: + runs-on: ubuntu-latest + concurrency: dev + steps: + - uses: actions/checkout@v3 + + - name: Cache cargo registry + uses: actions/cache@v3 + continue-on-error: false + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Configure AWS credentials ORG + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.ORG_AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.ORG_AWS_SECRET_ACCESS_KEY }} + aws-region: us-west-2 + + - name: Login to Amazon ECR ORG + id: login-ecr-org + uses: aws-actions/amazon-ecr-login@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Build and push docker image to ECR Docker + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile.tests + push: false + build-args: | + "ECR_REGISTRY=${{ steps.login-ecr-org.outputs.registry }}" diff --git a/.gitignore b/.gitignore index ac9d585fc..339fc5fda 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,3 @@ .direnv .idea - -# ddc-metrics-offchain-worker mock files -pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc.contract diff --git a/Cargo.lock b/Cargo.lock index 5a86e9baf..1d8eec70e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -91,26 +91,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "alt_serde" -version = "1.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbdd08f26bc9972e3597a32bb7fe2b0de4e85ccfb4214acec94165b940aa537e" -dependencies = [ - "alt_serde_derive", -] - -[[package]] -name = "alt_serde_derive" -version = "1.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629ddaf5b2675d9a27e9521a88870f8edea113e4a83d6d5178268b0d70e9a9a3" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "android-tzdata" version = "0.1.1" @@ -126,15 +106,6 @@ dependencies = [ "libc", ] -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -dependencies = [ - "winapi", -] - [[package]] name = "ansi_term" version = "0.12.1" @@ -766,7 +737,7 @@ dependencies = [ "cargo-platform", "semver 1.0.20", "serde", - "serde_json 1.0.108", + "serde_json", ] [[package]] @@ -858,7 +829,6 @@ dependencies = [ "pallet-bags-list", "pallet-balances", "pallet-bounties", - "pallet-cere-ddc", "pallet-chainbridge", "pallet-child-bounties", "pallet-collective", @@ -866,7 +836,6 @@ dependencies = [ "pallet-contracts-primitives", "pallet-ddc-clusters", "pallet-ddc-customers", - "pallet-ddc-metrics-offchain-worker", "pallet-ddc-nodes", "pallet-ddc-payouts", "pallet-ddc-staking", @@ -986,7 +955,6 @@ dependencies = [ "pallet-bags-list", "pallet-balances", "pallet-bounties", - "pallet-cere-ddc", "pallet-chainbridge", "pallet-child-bounties", "pallet-collective", @@ -994,7 +962,6 @@ dependencies = [ "pallet-contracts-primitives", "pallet-ddc-clusters", "pallet-ddc-customers", - "pallet-ddc-metrics-offchain-worker", "pallet-ddc-nodes", "pallet-ddc-payouts", "pallet-ddc-staking", @@ -1526,16 +1493,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn 1.0.109", -] - [[package]] name = "ctr" version = "0.9.2" @@ -1668,12 +1625,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "difference" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" - [[package]] name = "difflib" version = "0.4.0" @@ -2228,7 +2179,7 @@ dependencies = [ "sc-service", "sc-sysinfo", "serde", - "serde_json 1.0.108", + "serde_json", "serde_nanos", "sp-api", "sp-blockchain", @@ -2736,7 +2687,7 @@ dependencies = [ "pest", "pest_derive", "serde", - "serde_json 1.0.108", + "serde_json", "thiserror", ] @@ -2862,7 +2813,7 @@ checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", - "itoa 1.0.9", + "itoa", ] [[package]] @@ -2909,7 +2860,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.9", + "itoa", "pin-project-lite 0.2.13", "socket2 0.4.10", "tokio", @@ -3143,12 +3094,6 @@ dependencies = [ "either", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.9" @@ -3232,7 +3177,7 @@ dependencies = [ "rand 0.8.5", "rustc-hash", "serde", - "serde_json 1.0.108", + "serde_json", "soketto", "thiserror", "tokio", @@ -3253,7 +3198,7 @@ dependencies = [ "jsonrpsee-core", "jsonrpsee-types", "serde", - "serde_json 1.0.108", + "serde_json", "tokio", "tracing", "tracing-futures", @@ -3280,7 +3225,7 @@ dependencies = [ "anyhow", "beef", "serde", - "serde_json 1.0.108", + "serde_json", "thiserror", "tracing", ] @@ -3308,7 +3253,7 @@ dependencies = [ "http", "jsonrpsee-core", "jsonrpsee-types", - "serde_json 1.0.108", + "serde_json", "soketto", "tokio", "tokio-stream", @@ -4383,7 +4328,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" dependencies = [ "arrayvec 0.7.4", - "itoa 1.0.9", + "itoa", ] [[package]] @@ -4491,15 +4436,6 @@ version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" -[[package]] -name = "output_vt100" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" -dependencies = [ - "winapi", -] - [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" @@ -4608,21 +4544,6 @@ dependencies = [ "sp-std", ] -[[package]] -name = "pallet-cere-ddc" -version = "4.8.2" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - [[package]] name = "pallet-chainbridge" version = "4.8.2" @@ -4753,7 +4674,7 @@ dependencies = [ [[package]] name = "pallet-ddc-customers" -version = "0.1.0" +version = "4.8.2" dependencies = [ "ddc-primitives", "ddc-traits", @@ -4774,30 +4695,6 @@ dependencies = [ "substrate-test-utils", ] -[[package]] -name = "pallet-ddc-metrics-offchain-worker" -version = "4.8.2" -dependencies = [ - "alt_serde", - "frame-support", - "frame-system", - "hex", - "hex-literal", - "pallet-balances", - "pallet-contracts", - "pallet-randomness-collective-flip", - "pallet-timestamp", - "parity-scale-codec", - "pretty_assertions", - "scale-info", - "serde_json 1.0.44", - "sp-core", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-std", -] - [[package]] name = "pallet-ddc-nodes" version = "4.8.2" @@ -5883,18 +5780,6 @@ dependencies = [ "termtree", ] -[[package]] -name = "pretty_assertions" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" -dependencies = [ - "ansi_term 0.11.0", - "ctor", - "difference", - "output_vt100", -] - [[package]] name = "prettyplease" version = "0.1.25" @@ -5982,7 +5867,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83cd1b99916654a69008fd66b4f9397fbe08e6e51dfe23d4417acf5d3b8cb87c" dependencies = [ "dtoa", - "itoa 1.0.9", + "itoa", "parking_lot 0.12.1", "prometheus-client-derive-text-encode", ] @@ -6355,7 +6240,7 @@ dependencies = [ "log", "parity-scale-codec", "serde", - "serde_json 1.0.108", + "serde_json", "sp-core", "sp-io", "sp-runtime", @@ -6699,7 +6584,7 @@ dependencies = [ "sc-network-common", "sc-telemetry", "serde", - "serde_json 1.0.108", + "serde_json", "sp-core", "sp-runtime", ] @@ -6742,7 +6627,7 @@ dependencies = [ "sc-tracing", "sc-utils", "serde", - "serde_json 1.0.108", + "serde_json", "sp-blockchain", "sp-core", "sp-keyring", @@ -7049,7 +6934,7 @@ dependencies = [ "sc-network-gossip", "sc-telemetry", "sc-utils", - "serde_json 1.0.108", + "serde_json", "sp-api", "sp-application-crypto", "sp-arithmetic", @@ -7077,7 +6962,7 @@ dependencies = [ "sc-finality-grandpa", "sc-rpc", "serde", - "serde_json 1.0.108", + "serde_json", "sp-blockchain", "sp-core", "sp-runtime", @@ -7089,7 +6974,7 @@ name = "sc-informant" version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ - "ansi_term 0.12.1", + "ansi_term", "futures", "futures-timer", "log", @@ -7109,7 +6994,7 @@ dependencies = [ "array-bytes", "async-trait", "parking_lot 0.12.1", - "serde_json 1.0.108", + "serde_json", "sp-application-crypto", "sp-core", "sp-keystore", @@ -7150,7 +7035,7 @@ dependencies = [ "sc-peerset", "sc-utils", "serde", - "serde_json 1.0.108", + "serde_json", "smallvec", "sp-arithmetic", "sp-blockchain", @@ -7336,7 +7221,7 @@ dependencies = [ "libp2p", "log", "sc-utils", - "serde_json 1.0.108", + "serde_json", "wasm-timer", ] @@ -7367,7 +7252,7 @@ dependencies = [ "sc-tracing", "sc-transaction-pool-api", "sc-utils", - "serde_json 1.0.108", + "serde_json", "sp-api", "sp-blockchain", "sp-core", @@ -7393,7 +7278,7 @@ dependencies = [ "sc-transaction-pool-api", "scale-info", "serde", - "serde_json 1.0.108", + "serde_json", "sp-core", "sp-rpc", "sp-runtime", @@ -7410,7 +7295,7 @@ dependencies = [ "futures", "jsonrpsee", "log", - "serde_json 1.0.108", + "serde_json", "substrate-prometheus-endpoint", "tokio", ] @@ -7477,7 +7362,7 @@ dependencies = [ "sc-transaction-pool-api", "sc-utils", "serde", - "serde_json 1.0.108", + "serde_json", "sp-api", "sp-application-crypto", "sp-block-builder", @@ -7532,7 +7417,7 @@ dependencies = [ "sc-consensus-epochs", "sc-finality-grandpa", "serde", - "serde_json 1.0.108", + "serde_json", "sp-blockchain", "sp-runtime", "thiserror", @@ -7551,7 +7436,7 @@ dependencies = [ "regex", "sc-telemetry", "serde", - "serde_json 1.0.108", + "serde_json", "sp-core", "sp-io", "sp-std", @@ -7570,7 +7455,7 @@ dependencies = [ "pin-project", "rand 0.7.3", "serde", - "serde_json 1.0.108", + "serde_json", "thiserror", "wasm-timer", ] @@ -7580,7 +7465,7 @@ name = "sc-tracing" version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ - "ansi_term 0.12.1", + "ansi_term", "atty", "chrono", "lazy_static", @@ -7856,23 +7741,13 @@ dependencies = [ "syn 2.0.39", ] -[[package]] -name = "serde_json" -version = "1.0.44" -source = "git+https://github.com/Cerebellum-Network/json?branch=no-std-cere#17b8b39421fb94ffb1ddb8fe65630542b0679ada" -dependencies = [ - "alt_serde", - "itoa 0.4.8", - "ryu", -] - [[package]] name = "serde_json" version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ - "itoa 1.0.9", + "itoa", "ryu", "serde", ] @@ -8804,7 +8679,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "serde_json 1.0.108", + "serde_json", "unicode-xid", ] @@ -8923,7 +8798,7 @@ dependencies = [ "sc-client-api", "sc-rpc-api", "sc-transaction-pool-api", - "serde_json 1.0.108", + "serde_json", "sp-api", "sp-block-builder", "sp-blockchain", @@ -9004,7 +8879,7 @@ name = "substrate-wasm-builder" version = "5.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" dependencies = [ - "ansi_term 0.12.1", + "ansi_term", "build-helper", "cargo_metadata", "filetime", @@ -9357,14 +9232,14 @@ version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" dependencies = [ - "ansi_term 0.12.1", + "ansi_term", "chrono", "lazy_static", "matchers", "parking_lot 0.11.2", "regex", "serde", - "serde_json 1.0.108", + "serde_json", "sharded-slab", "smallvec", "thread_local", diff --git a/Cargo.toml b/Cargo.toml index da767c50a..8de02d305 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,11 +25,9 @@ members = [ "runtime/cere", "runtime/cere-dev", "pallets/chainbridge", - "pallets/ddc", "pallets/ddc-staking", "pallets/erc721", "pallets/erc20", - "pallets/ddc-metrics-offchain-worker", "pallets/ddc-customers", "pallets/ddc-nodes", "pallets/ddc-clusters", diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 4d6229b06..7dc8c42f2 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -14,15 +14,6 @@ pub struct RunCmd { #[clap(flatten)] pub base: sc_cli::RunCmd, - /// Enable DDC validation (disabled by default). Works only on validator nodes with enabled - /// offchain workers. - #[arg(long, requires = "dac_url")] - pub enable_ddc_validation: bool, - - /// DAC DataModel HTTP endpoint to retrieve DDC activity data for validation. - #[arg(long, requires = "enable_ddc_validation", value_parser = url::Url::parse)] - pub dac_url: Option, - /// Force using Cere Dev runtime. #[arg(long = "force-cere-dev")] pub force_cere_dev: bool, diff --git a/cli/src/command.rs b/cli/src/command.rs index 06de8607f..e327ff1df 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -245,14 +245,9 @@ pub fn run() -> sc_cli::Result<()> { None => { let runner = cli.create_runner(&cli.run.base)?; runner.run_node_until_exit(|config| async move { - cere_service::build_full( - config, - cli.run.no_hardware_benchmarks, - cli.run.enable_ddc_validation, - cli.run.dac_url, - ) - .map(|full| full.task_manager) - .map_err(Error::Service) + cere_service::build_full(config, cli.run.no_hardware_benchmarks) + .map(|full| full.task_manager) + .map_err(Error::Service) }) }, } diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 774ff1e1d..a8d6c24f3 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -7,7 +7,7 @@ pub use cere_dev_runtime; #[cfg(feature = "cere-native")] pub use cere_runtime; use futures::prelude::*; -use sc_client_api::{Backend, BlockBackend}; +use sc_client_api::BlockBackend; use sc_consensus_babe::{self, SlotProportion}; pub use sc_executor::NativeExecutionDispatch; use sc_network::Event; @@ -28,7 +28,6 @@ pub use sc_executor::NativeElseWasmExecutor; use sc_network_common::service::NetworkEventStream; pub use sc_service::ChainSpec; pub use sp_api::ConstructRuntimeApi; -pub use sp_core::offchain::OffchainStorage; type FullSelectChain = sc_consensus::LongestChain; type FullGrandpaBlockImport = sc_finality_grandpa::GrandpaBlockImport< @@ -270,16 +269,12 @@ where pub fn build_full( config: Configuration, disable_hardware_benchmarks: bool, - enable_ddc_validation: bool, - dac_url: Option, ) -> Result, ServiceError> { #[cfg(feature = "cere-dev-native")] if config.chain_spec.is_cere_dev() { return new_full::( config, disable_hardware_benchmarks, - enable_ddc_validation, - dac_url, |_, _| (), ) .map(|full| full.with_client(Client::CereDev)) @@ -290,8 +285,6 @@ pub fn build_full( new_full::( config, disable_hardware_benchmarks, - enable_ddc_validation, - dac_url, |_, _| (), ) .map(|full| full.with_client(Client::Cere)) @@ -325,8 +318,6 @@ impl NewFull { pub fn new_full( mut config: Configuration, disable_hardware_benchmarks: bool, - enable_ddc_validation: bool, - dac_url: Option, with_startup_data: impl FnOnce( &sc_consensus_babe::BabeBlockImport< Block, @@ -356,20 +347,6 @@ where let basics = new_partial_basics::(&config)?; - let mut offchain_storage = basics - .backend - .offchain_storage() - .expect("no off-chain storage, DDC validation is not possible"); - - offchain_storage.set( - sp_core::offchain::STORAGE_PREFIX, - b"enable-ddc-validation", - if enable_ddc_validation { &[1] } else { &[0] }, - ); - if let Some(dac_url) = dac_url { - offchain_storage.set(sp_core::offchain::STORAGE_PREFIX, b"dac-url", dac_url.as_bytes()); - }; - let sc_service::PartialComponents { client, backend, @@ -409,15 +386,6 @@ where warp_sync: Some(warp_sync), })?; - if config.offchain_worker.enabled { - sc_service::build_offchain_workers( - &config, - task_manager.spawn_handle(), - client.clone(), - network.clone(), - ); - } - let role = config.role.clone(); let force_authoring = config.force_authoring; let backoff_authoring_blocks = diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 7ba910a68..25bbd10c6 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-ddc-customers" -version = "0.1.0" +version = "4.8.2" edition = "2021" [dependencies] diff --git a/pallets/ddc-metrics-offchain-worker/Cargo.toml b/pallets/ddc-metrics-offchain-worker/Cargo.toml deleted file mode 100644 index dbf72f5de..000000000 --- a/pallets/ddc-metrics-offchain-worker/Cargo.toml +++ /dev/null @@ -1,49 +0,0 @@ -[package] -name = "pallet-ddc-metrics-offchain-worker" -version = "4.8.2" -authors = ["Parity Technologies "] -edition = "2021" -homepage = "https://substrate.dev" -license = "Unlicense" -readme = "README.md" -repository = "https://github.com/paritytech/substrate/" -description = "FRAME example pallet for offchain worker" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -alt_serde = { version = "1", default-features = false, features = ["derive"] } -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["full"] } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -hex = { version = "0.4", default-features = false } -hex-literal = "^0.3.1" -pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -serde_json = { version = "1", default-features = false, git = "https://github.com/Cerebellum-Network/json", branch = "no-std-cere", features = ["alloc"] } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-keystore = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } - -[features] -default = ["std"] -std = [ - "codec/std", - "sp-keystore", - "frame-support/std", - "frame-system/std", - "sp-core/std", - "sp-io/std", - "sp-runtime/std", - "sp-std/std", - "pallet-contracts/std", -] - -[dev-dependencies] -pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pretty_assertions = "0.6.1" diff --git a/pallets/ddc-metrics-offchain-worker/README.md b/pallets/ddc-metrics-offchain-worker/README.md deleted file mode 100644 index 7d2c21996..000000000 --- a/pallets/ddc-metrics-offchain-worker/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# DDC Storage Inspector (Offchain Worker) - -## Usage - -See the [Cere Network Book](https://cere-network.gitbook.io/cere-network/ddc/how-to-configure-reporter-ocw). - -## Documentation - -Run `cargo doc --package pallet-ddc-metrics-offchain-worker --open` to view this module's -documentation. - -- [`pallet_ddc_metrics_offchain_worker::Trait`](https://docs.rs/pallet-ddc-metrics-offchain-worker/latest/pallet_ddc_metrics_offchain_worker/trait.Trait.html) -- [`Call`](https://docs.rs/pallet-ddc-metrics-offchain-worker/latest/pallet_ddc_metrics_offchain_worker/enum.Call.html) -- [`Module`](https://docs.rs/pallet-ddc-metrics-offchain-worker/latest/pallet_ddc_metrics_offchain_worker/struct.Module.html) \ No newline at end of file diff --git a/pallets/ddc-metrics-offchain-worker/src/lib.rs b/pallets/ddc-metrics-offchain-worker/src/lib.rs deleted file mode 100644 index f49749d72..000000000 --- a/pallets/ddc-metrics-offchain-worker/src/lib.rs +++ /dev/null @@ -1,839 +0,0 @@ -// Offchain worker for DDC metrics. -// -// Inspired from https://github.com/paritytech/substrate/tree/master/frame/example-offchain-worker -#![allow(clippy::all)] -#![cfg_attr(not(feature = "std"), no_std)] - -#[cfg(test)] -mod tests; - -use alt_serde::{de::DeserializeOwned, Deserialize}; -use codec::{Decode, Encode, HasCompact}; -use frame_support::{ - decl_event, decl_module, decl_storage, - log::{error, info, warn}, - traits::{Currency, Get}, -}; -use frame_system::offchain::{ - AppCrypto, CreateSignedTransaction, SendSignedTransaction, Signer, SigningTypes, -}; -use hex_literal::hex; -use sp_core::crypto::{KeyTypeId, UncheckedFrom}; -use sp_runtime::{ - offchain::{http, storage::StorageValueRef, Duration}, - traits::StaticLookup, - AccountId32, -}; -use sp_std::vec::Vec; - -#[macro_use] -extern crate alloc; - -use alloc::string::String; -use core::fmt::Debug; - -use frame_support::weights::Weight; -use scale_info::TypeInfo; - -pub const BLOCK_INTERVAL: u32 = 100; // TODO: Change to 1200 later [1h]. Now - 200 [10 minutes] for testing purposes. - -// Smart contract method selectors -pub const REPORT_METRICS_DDN_SELECTOR: [u8; 4] = hex!("de028ad8"); -pub const REPORT_METRICS_SELECTOR: [u8; 4] = hex!("35320bbe"); -pub const REPORT_DDN_STATUS_SELECTOR: [u8; 4] = hex!("83fd8226"); -pub const CURRENT_PERIOD_MS: [u8; 4] = hex!("ace4ecb3"); -pub const GET_ALL_DDC_NODES_SELECTOR: [u8; 4] = hex!("e6c98b60"); -pub const FINALIZE_METRIC_PERIOD: [u8; 4] = hex!("b269d557"); - -type BalanceOf = <::Currency as Currency< - ::AccountId, ->>::Balance; - -#[derive(Encode, Decode)] -pub struct DDCNode { - p2p_id: String, - p2p_addr: String, - url: String, - permissions: u64, -} - -struct Metric { - app_id: String, - storage_bytes: u64, - wcu_used: u64, - rcu_used: u64, -} - -struct MetricDDN { - p2p_id: String, - storage_bytes: u64, - wcu_used: u64, - rcu_used: u64, -} - -#[derive(Deserialize)] -#[serde(crate = "alt_serde")] -#[allow(non_snake_case)] -struct ApiMetric { - appPubKey: String, - storageBytes: u64, - wcuUsed: u64, - rcuUsed: u64, -} - -/// Defines application identifier for crypto keys of this module. -/// -/// Every module that deals with signatures needs to declare its unique identifier for -/// its crypto keys. -/// When offchain worker is signing transactions it's going to request keys of type -/// `KeyTypeId` from the keystore and use the ones it finds to sign the transaction. -/// The keys can be inserted manually via RPC (see `author_insertKey`). -pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"ddc1"); - -pub const HTTP_NODES: &str = "/api/rest/nodes"; -pub const HTTP_METRICS: &str = "/api/rest/metrics?isMaster=true&active=true"; -pub const METRICS_PARAM_FROM: &str = "&from="; -pub const METRICS_PARAM_TO: &str = "&to="; -pub const END_TIME_DELAY_MS: u64 = 120_000; -pub const HTTP_TIMEOUT_MS: u64 = 30_000; // in milli-seconds - -/// Based on the above `KeyTypeId` we need to generate a pallet-specific crypto type wrappers. -/// We can use from supported crypto kinds (`sr25519`, `ed25519` and `ecdsa`) and augment -/// the types with this pallet-specific identifier. -pub mod crypto { - use frame_system::offchain::AppCrypto; - use sp_core::sr25519::Signature as Sr25519Signature; - use sp_runtime::{ - app_crypto::{app_crypto, sr25519}, - traits::Verify, - }; - - use super::KEY_TYPE; - app_crypto!(sr25519, KEY_TYPE); - - use sp_runtime::{MultiSignature, MultiSigner}; - - pub struct TestAuthId; - - impl AppCrypto<::Signer, Sr25519Signature> for TestAuthId { - type RuntimeAppPublic = Public; - type GenericSignature = sp_core::sr25519::Signature; - type GenericPublic = sp_core::sr25519::Public; - } - - impl AppCrypto for TestAuthId { - type RuntimeAppPublic = Public; - type GenericSignature = sp_core::sr25519::Signature; - type GenericPublic = sp_core::sr25519::Public; - } -} - -type ResultStr = Result; - -const MS_PER_DAY: u64 = 24 * 3600 * 1000; - -decl_module! { - /// A public part of the pallet. - pub struct Module for enum Call where - origin: T::RuntimeOrigin, - ::AccountId: AsRef<[u8]>, - ::AccountId: UncheckedFrom, - as HasCompact>::Type: Clone, - as HasCompact>::Type: Eq, - as HasCompact>::Type: PartialEq, - as HasCompact>::Type: Debug, - as HasCompact>::Type: TypeInfo, - as HasCompact>::Type: Encode { - //fn deposit_event() = default; - - /// Offchain Worker entry point. - /// - /// By implementing `fn offchain_worker` within `decl_module!` you declare a new offchain - /// worker. - /// This function will be called when the node is fully synced and a new best block is - /// succesfuly imported. - /// Note that it's not guaranteed for offchain workers to run on EVERY block, there might - /// be cases where some blocks are skipped, or for some the worker runs twice (re-orgs), - /// so the code should be able to handle that. - /// You can use `Local Storage` API to coordinate runs of the worker. - /// You can use `debug::native` namespace to not log in wasm mode. - fn offchain_worker(block_number: T::BlockNumber) { - let res = Self::offchain_worker_main(block_number); - match res { - Ok(()) => info!("[OCW] Offchain Worker complete."), - Err(err) => error!("[OCW] Error in Offchain Worker: {}", err), - }; - } - } -} - -decl_storage! { - trait Store for Module as DdcMetricsOffchainWorker - where ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode { - } -} - -impl Module -where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, -{ - fn offchain_worker_main(block_number: T::BlockNumber) -> ResultStr<()> { - let signer = match Self::get_signer() { - Err(e) => { - warn!("{:?}", e); - return Ok(()) - }, - Ok(signer) => signer, - }; - - let contract_address = match Self::get_contract_id() { - None => return Ok(()), - Some(contract_address) => contract_address, - }; - - let should_proceed = Self::check_if_should_proceed(block_number); - if !should_proceed { - return Ok(()) - } - - let day_start_ms = - Self::sc_get_current_period_ms(contract_address.clone()).map_err(|err| { - error!("[OCW] Contract error occurred: {:?}", err); - "Could not call get_current_period_ms TX" - })?; - - let day_end_ms = day_start_ms + MS_PER_DAY; - - let (aggregated_metrics, ddn_aggregated_metrics, offline_nodes) = - Self::fetch_all_metrics(contract_address.clone(), day_start_ms).map_err(|err| { - error!("[OCW] HTTP error occurred: {:?}", err); - "could not fetch metrics" - })?; - - for offline_node in offline_nodes { - let p2p_id = offline_node.p2p_id; - let contract_id = contract_address.clone(); - Self::report_ddn_status_to_sc(contract_id, &signer, &p2p_id, false).map_err(|err| { - error!("[OCW] Contract error occurred: {:?}", err); - "could not submit report_ddn_status TX" - })?; - } - - Self::send_metrics_to_sc( - contract_address.clone(), - &signer, - day_start_ms, - aggregated_metrics, - ) - .map_err(|err| { - error!("[OCW] Contract error occurred: {:?}", err); - "could not submit report_metrics TX" - })?; - - Self::send_metrics_ddn_to_sc( - contract_address.clone(), - &signer, - day_start_ms, - ddn_aggregated_metrics, - ) - .map_err(|err| { - error!("[OCW] Contract error occurred: {:?}", err); - "could not submit report_metrics_ddn TX" - })?; - - let block_timestamp = sp_io::offchain::timestamp().unix_millis(); - - if day_end_ms < block_timestamp { - Self::finalize_metric_period(contract_address, &signer, day_start_ms).map_err( - |err| { - error!("[OCW] Contract error occurred: {:?}", err); - "could not call finalize_metric_period TX" - }, - )?; - } - - Ok(()) - } - - fn get_contract_id() -> Option<::AccountId> { - let value = StorageValueRef::persistent(b"ddc-metrics-offchain-worker::sc_address").get(); - - match value { - Ok(None) => { - warn!("[OCW] Smart Contract is not configured. Please configure it using offchain_localStorageSet with key=ddc-metrics-offchain-worker::sc_address"); - None - }, - Ok(Some(contract_address)) => Some(contract_address), - Err(_) => { - error!("[OCW] Smart Contract is configured but the value could not be decoded to an account ID"); - None - }, - } - } - - fn get_block_interval() -> Option { - let value = StorageValueRef::persistent(b"ddc-metrics-offchain-worker::block_interval") - .get::(); - - match value { - Ok(None) => None, - Ok(Some(block_interval)) => Some(block_interval), - Err(_) => { - error!("[OCW] Block Interval could not be decoded"); - None - }, - } - } - - fn check_if_should_proceed(block_number: T::BlockNumber) -> bool { - let s_next_at = StorageValueRef::persistent(b"ddc-metrics-offchain-worker::next-at"); - - match s_next_at.mutate(|current_next_at| { - let current_next_at = match current_next_at { - Ok(Some(val)) => Some(val), - _ => Some(T::BlockNumber::default()), - }; - - if let Some(current_next_at) = current_next_at { - if current_next_at > block_number { - info!( - "[OCW] Too early to execute. Current: {:?}, next execution at: {:?}", - block_number, current_next_at - ); - Err("Skipping") - } else { - let mut block_interval = T::BlockInterval::get(); - if let Some(block_interval_configured) = Self::get_block_interval() { - block_interval = ::BlockNumber::from( - block_interval_configured, - ); - } - - // set new value - Ok(block_interval + block_number) - } - } else { - error!("[OCW] Something went wrong in `check_if_should_proceed`"); - Err("Unexpected error") - } - }) { - Ok(_val) => true, - Err(_e) => false, - } - } - - fn get_start_of_day_ms() -> u64 { - let now = sp_io::offchain::timestamp(); - - (now.unix_millis() / MS_PER_DAY) * MS_PER_DAY - } - - fn get_signer() -> ResultStr> { - let signer = Signer::<_, _>::any_account(); - if !signer.can_sign() { - return Err("[OCW] No local accounts available. Consider adding one via `author_insertKey` RPC."); - } - Ok(signer) - } - - fn sc_get_current_period_ms( - contract_id: ::AccountId, - ) -> ResultStr { - let call_data = Self::encode_get_current_period_ms(); - let nobody = T::AccountId::decode(&mut sp_runtime::traits::TrailingZeroInput::zeroes()); - let contract_exec_result = pallet_contracts::Pallet::::bare_call( - nobody.unwrap(), - contract_id, - 0u32.into(), - Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), - None, - call_data, - false, - ); - - let mut data = match &contract_exec_result.result { - Ok(v) => &v.data[..], - Err(exec_error) => { - // Return default value in case of error - warn!("[OCW] Error in call get_current_period_ms of smart contract. Return default value for period. Details: {:?}", exec_error); - return Ok(Self::get_start_of_day_ms()) - }, - }; - - let current_period_ms = u64::decode(&mut data) - .map_err(|_| "[OCW] error decoding get_current_period_ms result")?; - - info!("[OCW] sc_get_current_period_ms - data response from sc: {:?}", current_period_ms); - - Ok(current_period_ms) - } - - fn finalize_metric_period( - contract_id: ::AccountId, - signer: &Signer, - in_day_start_ms: u64, - ) -> ResultStr<()> { - let contract_id_unl = - <::Lookup as StaticLookup>::unlookup(contract_id); - - let call_data = Self::encode_finalize_metric_period(in_day_start_ms); - - let results = signer.send_signed_transaction(|_account| pallet_contracts::Call::call { - dest: contract_id_unl.clone(), - value: 0u32.into(), - gas_limit: Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), - storage_deposit_limit: None, - data: call_data.clone(), - }); - - match &results { - None | Some((_, Err(()))) => - return Err("Error while submitting finalize_metric_period TX to SC"), - Some((_, Ok(()))) => {}, - } - - Ok(()) - } - - fn send_metrics_to_sc( - contract_id: ::AccountId, - signer: &Signer, - day_start_ms: u64, - metrics: Vec, - ) -> ResultStr<()> { - info!("[OCW] Using Contract Address: {:?}", contract_id); - - for one_metric in metrics.iter() { - let app_id = Self::account_id_from_hex(&one_metric.app_id)?; - - if one_metric.storage_bytes == 0 && one_metric.wcu_used == 0 && one_metric.rcu_used == 0 - { - continue - } - - let results = signer.send_signed_transaction(|account| { - info!( - "[OCW] Sending transactions from {:?}: report_metrics({:?}, {:?}, {:?}, {:?}, {:?})", - account.id, - one_metric.app_id, - day_start_ms, - one_metric.storage_bytes, - one_metric.wcu_used, - one_metric.rcu_used, - ); - - let call_data = Self::encode_report_metrics( - &app_id, - day_start_ms, - one_metric.storage_bytes, - one_metric.wcu_used, - one_metric.rcu_used, - ); - - let contract_id_unl = - <::Lookup as StaticLookup>::unlookup( - contract_id.clone(), - ); - - pallet_contracts::Call::call { - dest: contract_id_unl, - value: 0u32.into(), - gas_limit: Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), - storage_deposit_limit: None, - data: call_data, - } - }); - - match &results { - None | Some((_, Err(()))) => return Err("Error while submitting TX to SC"), - Some((_, Ok(()))) => {}, - } - } - - Ok(()) - } - - fn send_metrics_ddn_to_sc( - contract_id: ::AccountId, - signer: &Signer, - day_start_ms: u64, - metrics: Vec, - ) -> ResultStr<()> { - info!("[OCW] Using Contract Address: {:?}", contract_id); - - for one_metric in metrics.iter() { - let results = signer.send_signed_transaction(|account| { - info!( - "[OCW] Sending transactions from {:?}: report_metrics_ddn({:?}, {:?}, {:?}, {:?}, {:?})", - account.id, - one_metric.p2p_id, - day_start_ms, - one_metric.storage_bytes, - one_metric.wcu_used, - one_metric.rcu_used, - ); - - let call_data = Self::encode_report_metrics_ddn( - one_metric.p2p_id.clone(), - day_start_ms, - one_metric.storage_bytes, - one_metric.wcu_used, - one_metric.rcu_used, - ); - - let contract_id_unl = - <::Lookup as StaticLookup>::unlookup( - contract_id.clone(), - ); - pallet_contracts::Call::call { - dest: contract_id_unl, - value: 0u32.into(), - gas_limit: Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), - storage_deposit_limit: None, - data: call_data, - } - }); - - match &results { - None | Some((_, Err(()))) => return Err("Error while submitting TX to SC"), - Some((_, Ok(()))) => {}, - } - } - - Ok(()) - } - - fn report_ddn_status_to_sc( - contract_id: ::AccountId, - signer: &Signer, - p2p_id: &String, - is_online: bool, - ) -> ResultStr<()> { - info!("[OCW] Using Contract Address: {:?}", contract_id); - - let results = signer.send_signed_transaction(|account| { - info!( - "[OCW] Sending transactions from {:?}: report_ddn_status({:?}, {:?})", - account.id, p2p_id, is_online, - ); - - let call_data = Self::encode_report_ddn_status(p2p_id, is_online); - - let contract_id_unl = <::Lookup as StaticLookup>::unlookup( - contract_id.clone(), - ); - - pallet_contracts::Call::call { - dest: contract_id_unl, - value: 0u32.into(), - gas_limit: Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), - storage_deposit_limit: None, - data: call_data, - } - }); - - match &results { - None | Some((_, Err(()))) => return Err("Error while submitting TX to SC"), - Some((_, Ok(()))) => {}, - } - - Ok(()) - } - - fn fetch_all_metrics( - contract_id: ::AccountId, - day_start_ms: u64, - ) -> ResultStr<(Vec, Vec, Vec)> { - let a_moment_ago_ms = sp_io::offchain::timestamp() - .sub(Duration::from_millis(END_TIME_DELAY_MS)) - .unix_millis(); - - let mut aggregated_metrics = MetricsAggregator::default(); - let mut ddn_aggregated_metrics = DDNMetricsAggregator::default(); - - let nodes = Self::fetch_nodes(contract_id)?; - let mut offline_nodes: Vec = Vec::new(); - - for node in nodes { - let metrics_of_node = - match Self::fetch_node_metrics(&node.url, day_start_ms, a_moment_ago_ms) { - Ok(value) => value, - Err(_) => { - offline_nodes.push(node); - continue - }, - }; - - ddn_aggregated_metrics.add(node.p2p_id.clone(), &metrics_of_node); - - for metric in &metrics_of_node { - aggregated_metrics.add(metric); - } - } - - Ok((aggregated_metrics.finish(), ddn_aggregated_metrics.finish(), offline_nodes)) - } - - fn fetch_nodes(contract_id: ::AccountId) -> ResultStr> { - let nobody = T::AccountId::decode(&mut sp_runtime::traits::TrailingZeroInput::zeroes()); - let call_data = Self::encode_get_all_ddc_nodes(); - let contract_exec_result = pallet_contracts::Pallet::::bare_call( - nobody.unwrap(), - contract_id, - 0u32.into(), - Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), - None, - call_data, - false, - ); - - let mut data = match &contract_exec_result.result { - Ok(v) => &v.data[..], - Err(exec_error) => { - warn!( - "[OCW] Error in call get_all_ddc_nodes of smart contract. Error: {:?}", - exec_error - ); - return Ok(Vec::new()) - }, - }; - - let ddc_nodes = Vec::::decode(&mut data) - .map_err(|_| "[OCW] error decoding get_all_ddc_nodes result")?; - - Ok(ddc_nodes) - } - - fn fetch_node_metrics( - node_url: &str, - day_start_ms: u64, - end_ms: u64, - ) -> ResultStr> { - let metrics_url = format!( - "{}{}{}{}{}{}", - node_url, - HTTP_METRICS, - METRICS_PARAM_FROM, - day_start_ms / 1000, - METRICS_PARAM_TO, - end_ms / 1000 - ); - - let metrics: Vec = Self::http_get_json(&metrics_url)?; - - Ok(metrics - .into_iter() - .map(|data| Metric { - app_id: data.appPubKey, - storage_bytes: data.storageBytes, - wcu_used: data.wcuUsed, - rcu_used: data.rcuUsed, - }) - .collect()) - } - - fn http_get_json(url: &str) -> ResultStr { - let body = Self::http_get_request(url).map_err(|err| { - error!("[OCW] Error while getting {}: {:?}", url, err); - "HTTP GET error" - })?; - - serde_json::from_slice(&body).map_err(|err| { - warn!("[OCW] Error while parsing JSON from {}: {:?}", url, err); - "HTTP JSON parse error" - }) - } - - fn http_get_request(http_url: &str) -> Result, http::Error> { - info!("[OCW] Sending request to: {:?}", http_url); - - // Initiate an external HTTP GET request. This is using high-level wrappers from - // `sp_runtime`. - let request = http::Request::get(http_url); - - let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(HTTP_TIMEOUT_MS)); - - let pending = request.deadline(deadline).send().map_err(|_| http::Error::IoError)?; - - let response = pending.try_wait(deadline).map_err(|_| http::Error::DeadlineReached)??; - - if response.code != 200 { - warn!("[OCW] http_get_request unexpected status code: {}", response.code); - return Err(http::Error::Unknown) - } - - // Next we fully read the response body and collect it to a vector of bytes. - Ok(response.body().collect::>()) - } - - /// Prepare get_current_period_ms call params. - /// Must match the contract function here: https://github.com/Cerebellum-Network/cere-enterprise-smart-contracts/blob/dev/cere02/lib.rs - fn encode_get_current_period_ms() -> Vec { - CURRENT_PERIOD_MS.to_vec() - } - - /// Prepare encode_get_current_period_ms call params. - fn encode_get_all_ddc_nodes() -> Vec { - GET_ALL_DDC_NODES_SELECTOR.to_vec() - } - - /// Prepare finalize_metric_period call params. - /// Must match the contract function here: https://github.com/Cerebellum-Network/cere-enterprise-smart-contracts/blob/dev/cere02/lib.rs - fn encode_finalize_metric_period(in_day_start_ms: u64) -> Vec { - let mut call_data = FINALIZE_METRIC_PERIOD.to_vec(); - in_day_start_ms.encode_to(&mut call_data); - - call_data - } - - /// Prepare report_metrics call params. - /// Must match the contract function here: https://github.com/Cerebellum-Network/cere-enterprise-smart-contracts/blob/dev/cere02/lib.rs - fn encode_report_metrics( - app_id: &AccountId32, - day_start_ms: u64, - storage_bytes: u64, - wcu_used: u64, - rcu_used: u64, - ) -> Vec { - let mut call_data = REPORT_METRICS_SELECTOR.to_vec(); - app_id.encode_to(&mut call_data); - day_start_ms.encode_to(&mut call_data); - storage_bytes.encode_to(&mut call_data); - wcu_used.encode_to(&mut call_data); - rcu_used.encode_to(&mut call_data); - - call_data - } - - fn encode_report_metrics_ddn( - p2p_id: String, - day_start_ms: u64, - storage_bytes: u64, - wcu_used: u64, - rcu_used: u64, - ) -> Vec { - let mut call_data = REPORT_METRICS_DDN_SELECTOR.to_vec(); - p2p_id.encode_to(&mut call_data); - day_start_ms.encode_to(&mut call_data); - storage_bytes.encode_to(&mut call_data); - wcu_used.encode_to(&mut call_data); - rcu_used.encode_to(&mut call_data); - - call_data - } - - fn encode_report_ddn_status(p2p_id: &String, is_online: bool) -> Vec { - let mut call_data = REPORT_DDN_STATUS_SELECTOR.to_vec(); - p2p_id.encode_to(&mut call_data); - is_online.encode_to(&mut call_data); - call_data - } - - fn account_id_from_hex(id_hex: &str) -> ResultStr { - let id_hex = id_hex.trim_start_matches("0x"); - if id_hex.len() != 64 { - return Err("Wrong length of hex-encoded account ID, expected 64") - } - let mut bytes = [0u8; 32]; - hex::decode_to_slice(id_hex, &mut bytes).map_err(|_| "invalid hex address.")?; - Ok(AccountId32::from(bytes)) - } -} - -#[derive(Default)] -struct MetricsAggregator(Vec); - -impl MetricsAggregator { - fn add(&mut self, metric: &Metric) { - let existing_pubkey_index = - self.0.iter().position(|one_result_obj| metric.app_id == one_result_obj.app_id); - - if let Some(existing_pubkey_index) = existing_pubkey_index { - // Add to metrics of an existing app. - self.0[existing_pubkey_index].storage_bytes += metric.storage_bytes; - self.0[existing_pubkey_index].wcu_used += metric.wcu_used; - self.0[existing_pubkey_index].rcu_used += metric.rcu_used; - } else { - // New app. - let new_metric_obj = Metric { - app_id: metric.app_id.clone(), - storage_bytes: metric.storage_bytes, - wcu_used: metric.wcu_used, - rcu_used: metric.rcu_used, - }; - self.0.push(new_metric_obj); - } - } - - fn finish(self) -> Vec { - self.0 - } -} - -#[derive(Default)] -struct DDNMetricsAggregator(Vec); - -impl DDNMetricsAggregator { - fn add(&mut self, p2p_id: String, metrics: &Vec) { - let existing_pubkey_index = - self.0.iter().position(|one_result_obj| p2p_id == one_result_obj.p2p_id); - - // Only if key does not exists - add new item, otherwise - skip - if existing_pubkey_index.is_none() { - let mut storage_bytes_sum = 0; - let mut wcu_used_sum = 0; - let mut rcu_used_sum = 0; - - for metric_item in metrics.iter() { - storage_bytes_sum += metric_item.storage_bytes; - wcu_used_sum += metric_item.wcu_used; - rcu_used_sum += metric_item.rcu_used; - } - - let new_metric_obj = MetricDDN { - p2p_id, - storage_bytes: storage_bytes_sum, - wcu_used: wcu_used_sum, - rcu_used: rcu_used_sum, - }; - self.0.push(new_metric_obj); - } - } - - fn finish(self) -> Vec { - self.0 - } -} - -// TODO: remove, or write meaningful events. -decl_event!( - /// Events generated by the module. - pub enum Event - where - AccountId = ::AccountId, - { - NewDdcMetric(AccountId, Vec), - } -); - -pub trait Config: - frame_system::Config - + pallet_contracts::Config - + CreateSignedTransaction> -where - ::AccountId: AsRef<[u8]> + UncheckedFrom, - as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, -{ - /// The identifier type for an offchain worker. - type AuthorityId: AppCrypto<::Public, ::Signature>; - - // TODO: remove, or use Event and Call. - /// The overarching event type. - type RuntimeEvent: From> + Into<::RuntimeEvent>; - /// The overarching dispatch call type. - type RuntimeCall: From>; - - type BlockInterval: Get; -} diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs b/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs deleted file mode 100644 index aa7a6a480..000000000 --- a/pallets/ddc-metrics-offchain-worker/src/tests/mod.rs +++ /dev/null @@ -1,387 +0,0 @@ -use std::sync::Arc; - -use codec::Encode; -use frame_support::{ - traits::{Currency, OffchainWorker}, - weights::Weight, -}; -use frame_system::Config as FSC; -use hex_literal::hex; -use sp_core::{ - bytes::from_hex, - offchain::{ - testing, OffchainDbExt, OffchainWorkerExt, Timestamp as OCWTimestamp, TransactionPoolExt, - }, -}; -use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStore}; -use sp_runtime::{traits::Hash, AccountId32, RuntimeAppPublic}; -use test_runtime::{ - AccountId, Balance, Balances, Contracts, DdcMetricsOffchainWorker, RuntimeOrigin, System, Test, - Timestamp, -}; - -use crate::{ - CURRENT_PERIOD_MS, FINALIZE_METRIC_PERIOD, REPORT_DDN_STATUS_SELECTOR, REPORT_METRICS_SELECTOR, -}; - -mod test_runtime; - -type T = Test; - -#[test] -fn test_contract_api() { - // Parse the contract spec. - let contract_meta = include_str!("./test_data/metadata.json"); - let contract_meta: serde_json::Value = serde_json::from_str(contract_meta).unwrap(); - let messages = contract_meta.pointer("/spec/messages").unwrap().as_array().unwrap(); - - // Find the report_metrics function. - let report_metrics = messages - .iter() - .find(|msg| msg.pointer("/name/0").unwrap().as_str().unwrap() == "report_metrics") - .unwrap(); - - // Check the selector. - let selector = from_hex(report_metrics.get("selector").unwrap().as_str().unwrap()).unwrap(); - assert_eq!(REPORT_METRICS_SELECTOR.to_vec(), selector); - - // Find the get_current_period_ms function. - let get_current_period_ms = messages - .iter() - .find(|msg| msg.pointer("/name/0").unwrap().as_str().unwrap() == "get_current_period_ms") - .unwrap(); - - // Check the selector for get_current_period_ms - let selector_get_current_period_ms = - from_hex(get_current_period_ms.get("selector").unwrap().as_str().unwrap()).unwrap(); - assert_eq!(CURRENT_PERIOD_MS.to_vec(), selector_get_current_period_ms); - - // Find the finalize_metric_period function. - let finalize_metric_period = messages - .iter() - .find(|msg| msg.pointer("/name/0").unwrap().as_str().unwrap() == "finalize_metric_period") - .unwrap(); - - // Check the selector for finalize_metric_period - let selector_finalize_metric_period = - from_hex(finalize_metric_period.get("selector").unwrap().as_str().unwrap()).unwrap(); - assert_eq!(FINALIZE_METRIC_PERIOD.to_vec(), selector_finalize_metric_period); - - // Find the report_ddn_status function. - let report_ddn_status = messages - .iter() - .find(|msg| msg.pointer("/name/0").unwrap().as_str().unwrap() == "report_ddn_status") - .unwrap(); - - // Check the selector for report_ddn_status - let selector_report_ddn_status = - from_hex(report_ddn_status.get("selector").unwrap().as_str().unwrap()).unwrap(); - assert_eq!(REPORT_DDN_STATUS_SELECTOR.to_vec(), selector_report_ddn_status); -} - -#[test] -fn test_encode_report_metrics() { - let call_data = DdcMetricsOffchainWorker::encode_report_metrics( - &AccountId32::from([2; 32]), - 3 + (4 << 8), - 5 + (6 << 16), - 7 + (8 << 24), - 9 + (16 << 24), - ); - assert_eq!( - call_data, - vec![ - 53, 50, 11, 190, // Selector - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, // 32 bytes, app_id - 3, 4, 0, 0, 0, 0, 0, 0, // 8 bytes, day_start_ms - 5, 0, 6, 0, 0, 0, 0, 0, // 8 bytes, storage_bytes - 7, 0, 0, 8, 0, 0, 0, 0, // 8 bytes, wcu_used - 9, 0, 0, 16, 0, 0, 0, 0 // 8 bytes, rcu_used - ] - ); -} - -#[test] -fn test_encode_get_current_period_ms() { - let call_data = DdcMetricsOffchainWorker::encode_get_current_period_ms(); - assert_eq!( - call_data, - vec![ - 172, 228, 236, 179, // Selector - ] - ); -} - -#[test] -fn test_encode_finalize_metric_period() { - let call_data = DdcMetricsOffchainWorker::encode_finalize_metric_period(INIT_TIME_MS); - assert_eq!( - call_data, - vec![ - 178, 105, 213, 87, // Selector - 80, 152, 94, 120, 118, 1, 0, 0, // 8 bytes, in_day_start_ms - ] - ); -} - -#[test] -fn test_encode_report_ddn_status() { - let call_data = DdcMetricsOffchainWorker::encode_report_ddn_status( - &String::from_utf8(vec![0, 1, 2, 3]).unwrap(), - true, - ); - assert_eq!( - call_data, - [ - REPORT_DDN_STATUS_SELECTOR.to_vec(), // Selector - vec![ - 16, // size of p2p_id - 0, 1, 2, 3, // p2p_id - 1 // is_online - ], - ] - .concat() - ); -} - -fn build_ext() -> sp_io::TestExternalities { - build_ext_for_contracts() -} - -// Some day, and some time during that day. -const INIT_DAY_MS: u64 = 51 * 365 * 24 * 3_600 * 1_000; -const INIT_TIME_MS: u64 = INIT_DAY_MS + 1234 * 1000; - -// Taken from pallet_contracts::tests::ExtBuilder -fn build_ext_for_contracts() -> sp_io::TestExternalities { - let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); - pallet_balances::GenesisConfig:: { balances: vec![] } - .assimilate_storage(&mut t) - .unwrap(); - let mut ext = sp_io::TestExternalities::new(t); - ext.execute_with(|| { - System::set_block_number(1); - Timestamp::set_timestamp(INIT_TIME_MS); - }); - ext -} - -#[test] -fn should_submit_signed_transaction_on_chain() { - let mut t = build_ext(); - - let (pool, pool_state) = testing::TestTransactionPoolExt::new(); - t.register_extension(TransactionPoolExt::new(pool)); - - const PHRASE: &str = - "news slush supreme milk chapter athlete soap sausage put clutch what kitten"; - let keystore = KeyStore::new(); - keystore - .sr25519_generate_new(crate::crypto::Public::ID, Some(&format!("{}/hunter1", PHRASE))) - .unwrap(); - t.register_extension(KeystoreExt(Arc::new(keystore))); - - let (offchain, offchain_state) = testing::TestOffchainExt::new(); - t.register_extension(OffchainDbExt::new(offchain.clone())); - t.register_extension(OffchainWorkerExt::new(offchain)); - - { - let mut state = offchain_state.write(); - - state.timestamp = OCWTimestamp::from_unix_millis(INIT_TIME_MS); - - let mut expect_request = |url: &str, response: &[u8]| { - state.expect_request(testing::PendingRequest { - method: "GET".into(), - uri: url.to_string(), - response: Some(response.to_vec()), - sent: true, - ..Default::default() - }); - }; - - // List partitions from a boot node. - expect_request("https://node-0.ddc.stage.cere.network/api/rest/metrics?isMaster=true&active=true&from=1608336000&to=1608337114", - include_bytes!("test_data/ddc_metrics_node-0.json")); - - // List partitions from a boot node. - expect_request("https://node-3.ddc.stage.cere.network/api/rest/metrics?isMaster=true&active=true&from=1608336000&to=1608337114", - include_bytes!("test_data/ddc_metrics_node-3.json")); - } - - t.execute_with(|| { - let contract_id = deploy_contract(); - - let kind = sp_core::offchain::StorageKind::PERSISTENT; - sp_io::offchain::local_storage_set( - kind, - b"ddc-metrics-offchain-worker::sc_address", - contract_id.as_ref(), - ); - - // Trigger the worker. - DdcMetricsOffchainWorker::offchain_worker(0); - - let events = System::events(); - eprintln!("Events: {:?}\n", events); - - // Get the transaction from the worker. - let transactions = pool_state.read().transactions.clone(); - eprintln!("Transactions: {:?}\n", transactions); - assert_eq!(transactions.len(), 4); // (2 x send_metrics_to_sc) + (2 x send_metrics_ddn_to_sc) - - // Check metrics of an app based on ddc_metrics_node-0.json and ddc_metrics_node-3.json. - let app_id = AccountId32::from(hex!( - "00a2e826451b78afb99241b1331e7594526329225ff8937dbc62f43ec20d1830" - )); - let expected_call = - DdcMetricsOffchainWorker::encode_report_metrics(&app_id, INIT_DAY_MS, 2 + 20, 0, 0); - assert!( - transactions[0].ends_with(&expected_call), - "Expected a specific call to the report_metrics function" - ); - - // Check metrics of the second app. - let app_id = AccountId32::from(hex!( - "100ad4097b6e60700a5d5c5294cb6d663090ef5f547e84cc20ec6bcc7a552f13" - )); - let expected_call = - DdcMetricsOffchainWorker::encode_report_metrics(&app_id, INIT_DAY_MS, 200, 0, 0); - assert!( - transactions[1].ends_with(&expected_call), - "Expected a specific call to the report_metrics function" - ); - - let expected_call = DdcMetricsOffchainWorker::encode_report_metrics_ddn( - "12D3KooWB4SMhKK12ASU4qH1ZYh3pN9vsW9QbFTwkjZxUhTqmYaS".to_string(), - INIT_DAY_MS, - 2 + 200, - 0, - 0, - ); - assert!( - transactions[2].ends_with(&expected_call), - "Expected a specific call to the report_metrics_ddn function" - ); - - let expected_call = DdcMetricsOffchainWorker::encode_report_metrics_ddn( - "12D3KooWJLuJEmtYf3bakUwe2q1uMcnbCBKRg7GkpG6Ws74Aq6NC".to_string(), - INIT_DAY_MS, - 20, - 0, - 0, - ); - assert!( - transactions[3].ends_with(&expected_call), - "Expected a specific call to the report_metrics_ddn function" - ); - }); -} - -#[test] -fn should_run_contract() { - let mut t = build_ext(); - - t.execute_with(|| { - let alice = AccountId::from([1; 32]); - let contract_id = deploy_contract(); - let call_data = DdcMetricsOffchainWorker::encode_get_current_period_ms(); - - pallet_contracts::Pallet::::call( - RuntimeOrigin::signed(alice.clone()), - contract_id.clone(), - 0, - Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), - None, - call_data.clone(), - ) - .unwrap(); - - let contract_exec_result = pallet_contracts::Pallet::::bare_call( - alice, - contract_id, - 0, - Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX), - None, - call_data, - false, - ); - match &contract_exec_result.result { - Ok(res) => { - //println!("XXX Contract returned {:?}", res.data); - assert_eq!(res.data.len(), 8); // size of u64 - }, - Err(_) => panic!("error in contract call"), - }; - }); -} - -pub const CTOR_SELECTOR: [u8; 4] = hex!("9bae9d5e"); - -fn encode_constructor() -> Vec { - let mut call_data = CTOR_SELECTOR.to_vec(); - let x = 0_u128; - for _ in 0..9 { - x.encode_to(&mut call_data); - } - call_data -} - -fn deploy_contract() -> AccountId { - // Admin account who deploys the contract. - let alice = AccountId::from([1; 32]); - let _ = Balances::deposit_creating(&alice, 1_000_000_000_000); - - // Load the contract code. - let wasm = &include_bytes!("./test_data/ddc.wasm")[..]; - let wasm_hash = ::Hashing::hash(wasm); - let contract_args = encode_constructor(); - - // Deploy the contract. - //let endowment = contracts::Config::::subsistence_threshold_uncached(); - const GAS_LIMIT: frame_support::weights::Weight = - Weight::from_ref_time(100_000_000_000).set_proof_size(u64::MAX); - const ENDOWMENT: Balance = 100_000_000_000; - Contracts::instantiate_with_code( - RuntimeOrigin::signed(alice.clone()), - ENDOWMENT, - GAS_LIMIT, - None, - wasm.to_vec(), - contract_args, - vec![], - ) - .unwrap(); - - // Configure worker with the contract address. - let contract_id = Contracts::contract_address(&alice, &wasm_hash, &[]); - - pub const ADD_DDC_NODE_SELECTOR: [u8; 4] = hex!("11a9e1b9"); - - let call_data_items = vec![ - ["12D3KooWB4SMhKK12ASU4qH1ZYh3pN9vsW9QbFTwkjZxUhTqmYaS", "/dns4/node-0.ddc.dev.cere.network/tcp/5000/p2p/12D3KooWB4SMhKK12ASU4qH1ZYh3pN9vsW9QbFTwkjZxUhTqmYaS", "https://node-0.ddc.stage.cere.network"], - ["12D3KooWJLuJEmtYf3bakUwe2q1uMcnbCBKRg7GkpG6Ws74Aq6NC", "/dns4/node-3.ddc.dev.cere.network/tcp/5000/p2p/12D3KooWJLuJEmtYf3bakUwe2q1uMcnbCBKRg7GkpG6Ws74Aq6NC", "https://node-3.ddc.stage.cere.network"], - ]; - let permissions: u64 = 1; - - for call_data_item in call_data_items { - let mut call_data = ADD_DDC_NODE_SELECTOR.to_vec(); - call_data_item[0].encode_to(&mut call_data); - call_data_item[1].encode_to(&mut call_data); - call_data_item[2].encode_to(&mut call_data); - permissions.encode_to(&mut call_data); - - let results = Contracts::call( - RuntimeOrigin::signed(alice.clone()), - contract_id.clone(), - 0, - Weight::from_ref_time(1_000_000_000_000).set_proof_size(u64::MAX), - None, - call_data, - ); - results.unwrap(); - } - - contract_id -} diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc.wasm b/pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc.wasm deleted file mode 100644 index e69de29bb..000000000 diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc_metrics_node-0.json b/pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc_metrics_node-0.json deleted file mode 100644 index 42e3c28d9..000000000 --- a/pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc_metrics_node-0.json +++ /dev/null @@ -1,16 +0,0 @@ -[ - { - "appPubKey" : "0x00a2e826451b78afb99241b1331e7594526329225ff8937dbc62f43ec20d1830", - "partitionId" : "0cb0f451-255b-4a4f-918b-6c34c7047331", - "storageBytes" : 2, - "wcuUsed": 0, - "rcuUsed": 0 - }, - { - "appPubKey" : "0x100ad4097b6e60700a5d5c5294cb6d663090ef5f547e84cc20ec6bcc7a552f13", - "partitionId" : "d9fb155d-6e15-44c5-8d71-ff22db7a0193", - "storageBytes" : 200, - "wcuUsed": 0, - "rcuUsed": 0 - } -] diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc_metrics_node-3.json b/pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc_metrics_node-3.json deleted file mode 100644 index 6d284ae02..000000000 --- a/pallets/ddc-metrics-offchain-worker/src/tests/test_data/ddc_metrics_node-3.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "appPubKey" : "0x00a2e826451b78afb99241b1331e7594526329225ff8937dbc62f43ec20d1830", - "partitionId" : "f6cbe4e6-ef3a-4970-b3da-f8ae29cd22bd", - "storageBytes" : 20, - "wcuUsed": 0, - "rcuUsed": 0 - } -] diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/test_data/generate.sh b/pallets/ddc-metrics-offchain-worker/src/tests/test_data/generate.sh deleted file mode 100755 index 180acda0b..000000000 --- a/pallets/ddc-metrics-offchain-worker/src/tests/test_data/generate.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -# These commands were used to get sample data from DDC nodes. -# The data was modified to simplify testing. - -curl https://node-0.ddc.stage.cere.network/api/rest/nodes | json_pp > ddc_nodes.json - -curl "https://node-0.ddc.stage.cere.network/api/rest/metrics?isMaster=true&active=true" | json_pp > ddc_metrics_node-0.json - -curl "https://node-3.ddc.stage.cere.network/api/rest/metrics?isMaster=true&active=true" | json_pp > ddc_metrics_node-3.json diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/test_data/metadata.json b/pallets/ddc-metrics-offchain-worker/src/tests/test_data/metadata.json deleted file mode 100644 index e69de29bb..000000000 diff --git a/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs b/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs deleted file mode 100644 index 322d564dd..000000000 --- a/pallets/ddc-metrics-offchain-worker/src/tests/test_runtime.rs +++ /dev/null @@ -1,219 +0,0 @@ -//! Runtime for testing an offchain worker. -// -// Inspired from pos-network-node/frame/contracts/src/tests.rs - -use std::cell::RefCell; - -use frame_support::{ - parameter_types, - traits::{ConstU32, Currency, Everything, Get, Nothing}, - weights::Weight, -}; -use sp_core::H256; -use sp_runtime::{ - generic, - testing::TestXt, - traits::{ - BlakeTwo256, Convert, Extrinsic as ExtrinsicT, IdentifyAccount, IdentityLookup, Verify, - }, - MultiSignature, Perbill, -}; - -use crate::{self as pallet_ddc_metrics_offchain_worker, *}; - -pub type Signature = MultiSignature; -pub type AccountId = <::Signer as IdentifyAccount>::AccountId; -pub type Balance = u128; -pub type BlockNumber = u32; -pub type Moment = u64; - -// -- Implement a contracts runtime for testing -- - -// Macro hack: Give names to the pallets. -use pallet_contracts as contracts; - -type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; -type Block = frame_system::mocking::MockBlock; - -frame_support::construct_runtime!( - pub enum Test where - Block = Block, - NodeBlock = Block, - UncheckedExtrinsic = UncheckedExtrinsic, - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - Contracts: contracts::{Pallet, Call, Storage, Event}, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, - Randomness: pallet_randomness_collective_flip::{Pallet, Storage}, - DdcMetricsOffchainWorker: pallet_ddc_metrics_offchain_worker::{Pallet, Call, Event}, - } -); - -parameter_types! { - pub const BlockHashCount: BlockNumber = 250; - pub const MaximumBlockWeight: Weight = Weight::from_ref_time(1024); - pub const MaximumBlockLength: u32 = 2 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::one(); -} - -impl frame_system::Config for Test { - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - type RuntimeOrigin = RuntimeOrigin; - type Index = u64; - type BlockNumber = BlockNumber; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - // u64; // sp_core::sr25519::Public; - type Lookup = IdentityLookup; - type Header = generic::Header; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_balances::Config for Test { - type Balance = Balance; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = (); -} - -thread_local! { - static EXISTENTIAL_DEPOSIT: RefCell = RefCell::new(1); -} - -pub struct ExistentialDeposit; - -impl Get for ExistentialDeposit { - fn get() -> Balance { - EXISTENTIAL_DEPOSIT.with(|v| *v.borrow()) - } -} - -parameter_types! { - pub const MinimumPeriod: u64 = 1; -} -impl pallet_timestamp::Config for Test { - type Moment = Moment; - type OnTimestampSet = (); - type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); -} -parameter_types! { - pub const SignedClaimHandicap: BlockNumber = 2; - pub const TombstoneDeposit: Balance = 16; - pub const StorageSizeOffset: u32 = 8; - pub const RentByteFee: Balance = 4; - pub const RentDepositOffset: Balance = 10_000; - pub const SurchargeReward: Balance = 150; - pub const MaxDepth: u32 = 100; - pub const MaxValueSize: u32 = 16_384; - pub Schedule: pallet_contracts::Schedule = Default::default(); -} - -// Contracts for Test Runtime. -use contracts::Config as contractsConfig; - -type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; - -impl contracts::Config for Test { - type Time = Timestamp; - type Randomness = Randomness; - type Currency = Balances; - type RuntimeEvent = RuntimeEvent; - type CallStack = [pallet_contracts::Frame; 31]; - type WeightPrice = Self; //pallet_transaction_payment::Module; - type WeightInfo = (); - type ChainExtension = (); - type DeletionQueueDepth = (); - type DeletionWeightLimit = (); - type Schedule = Schedule; - type RuntimeCall = RuntimeCall; - type CallFilter = Nothing; - type DepositPerByte = DepositPerByte; - type DepositPerItem = DepositPerItem; - type AddressGenerator = pallet_contracts::DefaultAddressGenerator; - type MaxCodeLen = ConstU32<{ 128 * 1024 }>; - type MaxStorageKeyLen = ConstU32<128>; -} - -parameter_types! { - pub const TransactionByteFee: u64 = 0; - pub const DepositPerItem: Balance = 0; - pub const DepositPerByte: Balance = 0; -} - -impl Convert> for Test { - fn convert(w: Weight) -> BalanceOf { - w.ref_time().into() - } -} - -// -- End contracts runtime -- - -use frame_system::offchain::{ - AppCrypto, CreateSignedTransaction, SendTransactionTypes, SigningTypes, -}; - -pub type Extrinsic = TestXt; - -impl SigningTypes for Test { - type Public = ::Signer; - type Signature = Signature; -} - -impl SendTransactionTypes for Test -where - RuntimeCall: From, -{ - type OverarchingCall = RuntimeCall; - type Extrinsic = Extrinsic; -} -impl pallet_randomness_collective_flip::Config for Test {} - -impl CreateSignedTransaction for Test -where - RuntimeCall: From, -{ - fn create_transaction>( - call: RuntimeCall, - _public: ::Signer, - _account: AccountId, - nonce: u64, - ) -> Option<(RuntimeCall, ::SignaturePayload)> { - Some((call, (nonce, ()))) - } -} - -parameter_types! { - pub const OcwBlockInterval: u32 = crate::BLOCK_INTERVAL; -} - -impl Config for Test { - type BlockInterval = OcwBlockInterval; - - type AuthorityId = crypto::TestAuthId; - - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; -} diff --git a/pallets/ddc/Cargo.toml b/pallets/ddc/Cargo.toml deleted file mode 100644 index 7778b0c71..000000000 --- a/pallets/ddc/Cargo.toml +++ /dev/null @@ -1,40 +0,0 @@ -[package] -name = 'pallet-cere-ddc' -version = '4.8.2' -authors = ['Substrate DevHub '] -edition = '2021' -homepage = 'https://www.cere.network/' -license = 'Unlicense' -readme = 'README.md' -repository = 'https://github.com/Cerebellum-Network/ddc-pallet' -description = 'FRAME pallet template for defining custom runtime logic.' - -[package.metadata.docs.rs] -targets = ['x86_64-unknown-linux-gnu'] - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } - -[dev-dependencies] -serde = { version = "1.0.101" } -sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } - -[features] -default = ['std'] -std = [ - 'codec/std', - 'sp-io/std', - 'sp-std/std', - 'sp-runtime/std', - 'frame-support/std', - 'frame-system/std', -] - -[package.metadata.cargo-machete] -ignored = ["scale-info", "codec"] diff --git a/pallets/ddc/LICENSE-APACHE2 b/pallets/ddc/LICENSE-APACHE2 deleted file mode 100644 index fbb0616d1..000000000 --- a/pallets/ddc/LICENSE-APACHE2 +++ /dev/null @@ -1,211 +0,0 @@ - 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/pallets/ddc/README.md b/pallets/ddc/README.md deleted file mode 100644 index f943ea5be..000000000 --- a/pallets/ddc/README.md +++ /dev/null @@ -1,132 +0,0 @@ -# CereDDCModule - -A module for sending any character sequence-based data from wallet A to wallet B in the Network. - -## Overview - -### Terminology - -DDC - Decentralized Data Cloud by Cere Network. - -### Goals - -Send any character sequence-based data from wallet A to wallet B in the Network. -* Data can be updated. - -## Interface - -### Dispatchable Functions - -* `send_data` - Transfers character sequence-based data from the function caller's account (`origin`) to a `send_to` account. - -### Public Functions - -* `stringDataOf` - Get the character sequence-based data data of `AccountId`. -* `send_data` - Send character sequence-based data an account. - -## Usage - -* Go to `Developer` -> `Extrinsic submission` sub menu, execute the cereDdcModule's `send_data` method. -* Go to `Developer` -> `Chain state` sub menu, query chain state of the cereDdcModule's `stringDataOf`. - -### Prerequisites - -Import the CereDDCModule and derive your runtime configuration traits from the CereDDCModule trait. - -### Import Instruction - -* Pull ddc-pallet. From project root folder: - ```bash - git submodule update --remote - ``` - -* Import to frame structure node. In `./Cargo.toml` add: - ```rust - [workspace] - members = [ - "bin/node-template/node", - ... - "frame/vesting", - "frame/ddc-pallet", - "primitives/allocator", - ... - "utils/wasm-builder", - ] - ``` - -### Code Snippet - -1. In ./bin/node/runtime/Cargo.toml add: - ```rust - frame-executive = { default-features = false, path = "../../../frame/executive" } - ... - pallet-cere-ddc = { version = "7.3.0", default-features = false, path = "../../../frame/ddc-pallet" } - ``` - -1. In .bin/node/runtime/src/lib.rs find "construct_runtime!" then add bellow source: - ```rust - pub use pallet_cere_ddc; - ... - parameter_types! { - // Minimum bounds on storage are important to secure your chain. - pub const MinDataLength: usize = 1; - // Maximum bounds on storage are important to secure your chain. - pub const MaxDataLength: usize = usize::MAX; - } - - /// Configure the send data pallet - impl pallet_cere_ddc::Trait for Runtime { - type MinLength = MinDataLength; - type MaxLength = MaxDataLength; - // The ubiquitous event type. - type Event = Event; - } - - construct_runtime!( - pub enum Runtime where - Block = Block, - NodeBlock = node_primitives::Block, - UncheckedExtrinsic = UncheckedExtrinsic - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - ... - Multisig: pallet_multisig::{Pallet, Call, Storage, Event}, - CereDDCModule: pallet_cere_ddc::{Pallet, Call, Storage, Event}, - } - ); - ``` - -### Command List -* Check before compiling node by command: - ```bash - cd ./frame/ddc-pallet - SKIP_WASM_BUILD=1 cargo check - ``` - -* Run unit test command: - ```bash - cd ./frame/ddc-pallet - SKIP_WASM_BUILD=1 cargo test - ``` - -* Build and run node. From project root folder: - ```bash - cargo build --release - ./target/release/cere --dev --ws-external - ``` - -## Assumptions - -Below are assumptions that must be held when using this module. If any of -them are violated, the behavior of this module is undefined. -* The length of string data should be greater than `1`. -* The length of string data should be less than `usize::MAX`. - -## Related Modules - -* [`System`](https://docs.rs/frame-system/latest/frame_system/) -* [`Support`](https://docs.rs/frame-support/latest/frame_support/) - -## License - -[LICENSE-APACHE2](LICENSE-APACHE2) diff --git a/pallets/ddc/src/lib.rs b/pallets/ddc/src/lib.rs deleted file mode 100644 index eaadf59f9..000000000 --- a/pallets/ddc/src/lib.rs +++ /dev/null @@ -1,108 +0,0 @@ -#![allow(clippy::all)] -#![cfg_attr(not(feature = "std"), no_std)] - -use frame_support::{ - decl_error, - decl_event, - decl_module, - decl_storage, - // dispatch, - ensure, - traits::Get, -}; -use frame_system::ensure_signed; -/// Edit this file to define custom logic or remove it if it is not needed. -/// Learn more about FRAME and the core library of Substrate FRAME pallets: -/// https://substrate.dev/docs/en/knowledgebase/runtime/frame -use sp_std::prelude::*; - -#[cfg(test)] -mod mock; - -#[cfg(test)] -mod tests; - -/// Configure the pallet by specifying the parameters and types on which it depends. -pub trait Config: frame_system::Config { - /// Because this pallet emits events, it depends on the runtime's definition of an event. - type RuntimeEvent: From> + Into<::RuntimeEvent>; - - /// The minimum length a name may be. - type MinLength: Get; - - /// The maximum length a name may be. - type MaxLength: Get; -} - -// The pallet's runtime storage items. -// https://substrate.dev/docs/en/knowledgebase/runtime/storage -decl_storage! { - // A unique name is used to ensure that the pallet's storage items are isolated. - // This name may be updated, but each pallet in the runtime must use a unique name. - // ---------------------------------vvvvvvvvvvvvvv - trait Store for Module as CereDDCModule { - /// The lookup table for string. - StringDataOf: map hasher(twox_64_concat) T::AccountId => Option>; - } -} - -// Pallets use events to inform users when important changes are made. -// https://substrate.dev/docs/en/knowledgebase/runtime/events -decl_event!( - pub enum Event - where - AccountId = ::AccountId, - { - /// A data string was set. \[who\] - DataStringSet(AccountId), - - /// A data string was changed. \[who\] - DataStringChanged(AccountId), - } -); - -// Errors inform users that something went wrong. -decl_error! { - pub enum Error for Module { - /// A name is too short. - TooShort, - /// A name is too long. - TooLong, - } -} - -// Dispatchable functions allows users to interact with the pallet and invoke state changes. -// These functions materialize as "extrinsics", which are often compared to transactions. -// Dispatchable functions must be annotated with a weight and must return a DispatchResult. -decl_module! { - /// CereDDCModule declaration. - pub struct Module for enum Call where origin: T::RuntimeOrigin { - // Errors must be initialized if they are used by the pallet. - type Error = Error; - - // Events must be initialized if they are used by the pallet. - fn deposit_event() = default; - - /// The minimum length a name may be. - const MinLength: u32 = T::MinLength::get() as u32; - - /// The maximum length a name may be. - const MaxLength: u32 = T::MaxLength::get() as u32; - - #[weight = 50_000_000] - fn send_data(origin, send_to: T::AccountId, data: Vec) { - let sender = ensure_signed(origin)?; - - ensure!(data.len() >= T::MinLength::get(), Error::::TooShort); - ensure!(data.len() <= T::MaxLength::get(), Error::::TooLong); - - if >::get(&sender).is_some() { - Self::deposit_event(RawEvent::DataStringChanged(sender)); - } else { - Self::deposit_event(RawEvent::DataStringSet(sender)); - }; - - >::insert(send_to, data); - } - } -} diff --git a/pallets/ddc/src/mock.rs b/pallets/ddc/src/mock.rs deleted file mode 100644 index 47674efbd..000000000 --- a/pallets/ddc/src/mock.rs +++ /dev/null @@ -1,71 +0,0 @@ -use frame_support::{construct_runtime, parameter_types, traits::Everything}; -use frame_system as system; -use sp_core::H256; -use sp_runtime::{ - testing::Header, - traits::{BlakeTwo256, IdentityLookup}, -}; - -use crate as pallet_cere_ddc; - -// Configure a mock runtime to test the pallet. -type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; -type Block = frame_system::mocking::MockBlock; - -construct_runtime!( - pub enum Test where - Block = Block, - NodeBlock = Block, - UncheckedExtrinsic = UncheckedExtrinsic, - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - CereDDCModule: pallet_cere_ddc::{Pallet, Call, Storage, Event}, - } -); - -parameter_types! { - pub const BlockHashCount: u64 = 250; -} - -impl system::Config for Test { - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Index = u64; - type BlockNumber = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Header = Header; - type RuntimeEvent = (); - type BlockHashCount = BlockHashCount; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -parameter_types! { - pub const MinLength: usize = 8; - pub const MaxLength: usize = 10; -} - -impl pallet_cere_ddc::Config for Test { - type RuntimeEvent = (); - type MinLength = MinLength; - type MaxLength = MaxLength; -} - -// Build genesis storage according to the mock runtime. -pub fn new_test_ext() -> sp_io::TestExternalities { - system::GenesisConfig::default().build_storage::().unwrap().into() -} diff --git a/pallets/ddc/src/tests.rs b/pallets/ddc/src/tests.rs deleted file mode 100644 index 0e797721c..000000000 --- a/pallets/ddc/src/tests.rs +++ /dev/null @@ -1,35 +0,0 @@ -use frame_support::{assert_noop, assert_ok}; - -use crate::{mock::*, Error}; - -const BOB: u64 = 2; - -#[test] -fn send_data_works_valid_input() { - new_test_ext().execute_with(|| { - // Dispatch a signed extrinsic. - assert_ok!(CereDDCModule::send_data(RuntimeOrigin::signed(1), BOB, b"12345678".to_vec())); - }); -} - -#[test] -fn send_data_error_too_long() { - new_test_ext().execute_with(|| { - // Ensure the expected error is thrown when no value is present. - assert_noop!( - CereDDCModule::send_data(RuntimeOrigin::signed(1), BOB, b"TestTooLongString".to_vec()), - Error::::TooLong - ); - }); -} - -#[test] -fn send_data_error_too_short() { - new_test_ext().execute_with(|| { - // Ensure the expected error is thrown when no value is present. - assert_noop!( - CereDDCModule::send_data(RuntimeOrigin::signed(1), BOB, b"Short".to_vec()), - Error::::TooShort - ); - }); -} diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index daf3ca346..6e8abc597 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -94,10 +94,8 @@ pallet-vesting = { default-features = false, git = "https://github.com/paritytec cere-dev-runtime-constants = { path = "./constants", default-features = false } cere-runtime-common = { path = "../common", default-features = false } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } -pallet-cere-ddc = { version = "4.8.2", default-features = false, path = "../../pallets/ddc" } pallet-ddc-clusters = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-clusters" } -pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } -pallet-ddc-metrics-offchain-worker = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } +pallet-ddc-customers = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-customers" } pallet-ddc-nodes = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-nodes" } pallet-ddc-payouts = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-payouts" } pallet-ddc-staking = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-staking" } @@ -129,7 +127,6 @@ std = [ "pallet-fast-unstake/std", "pallet-elections-phragmen/std", "frame-executive/std", - "pallet-cere-ddc/std", "pallet-chainbridge/std", "pallet-erc721/std", "pallet-erc20/std", @@ -144,7 +141,6 @@ std = [ "pallet-identity/std", "pallet-scheduler/std", "node-primitives/std", - "sp-offchain/std", "pallet-offences/std", "pallet-proxy/std", "sp-core/std", @@ -177,7 +173,6 @@ std = [ "frame-try-runtime/std", "sp-io/std", "pallet-child-bounties/std", - "pallet-ddc-metrics-offchain-worker/std", "pallet-ddc-payouts/std", "pallet-ddc-nodes/std", "pallet-ddc-staking/std", diff --git a/runtime/cere-dev/src/impls.rs b/runtime/cere-dev/src/impls.rs index 3009254a1..25d3f1be5 100644 --- a/runtime/cere-dev/src/impls.rs +++ b/runtime/cere-dev/src/impls.rs @@ -29,344 +29,3 @@ impl OnUnbalanced for Author { } } } - -#[cfg(test)] -mod multiplier_tests { - use cere_dev_runtime_constants::{currency::*, time::*}; - use frame_support::{ - dispatch::DispatchClass, - weights::{Weight, WeightToFee as WeightToFeeT}, - }; - use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment}; - use sp_runtime::{ - assert_eq_error_rate, - traits::{Convert, One, Zero}, - FixedPointNumber, - }; - - use crate::{ - AdjustmentVariable, MaximumMultiplier, MinimumMultiplier, Runtime, - RuntimeBlockWeights as BlockWeights, System, TargetBlockFullness, TransactionPayment, - }; - - fn max_normal() -> Weight { - BlockWeights::get() - .get(DispatchClass::Normal) - .max_total - .unwrap_or_else(|| BlockWeights::get().max_block) - } - - fn min_multiplier() -> Multiplier { - MinimumMultiplier::get() - } - - fn target() -> Weight { - TargetBlockFullness::get() * max_normal() - } - - // update based on runtime impl. - fn runtime_multiplier_update(fm: Multiplier) -> Multiplier { - TargetedFeeAdjustment::< - Runtime, - TargetBlockFullness, - AdjustmentVariable, - MinimumMultiplier, - MaximumMultiplier, - >::convert(fm) - } - - // update based on reference impl. - fn truth_value_update(block_weight: Weight, previous: Multiplier) -> Multiplier { - let accuracy = Multiplier::accuracy() as f64; - let previous_float = previous.into_inner() as f64 / accuracy; - // bump if it is zero. - let previous_float = previous_float.max(min_multiplier().into_inner() as f64 / accuracy); - - // maximum tx weight - let m = max_normal().ref_time() as f64; - // block weight always truncated to max weight - let block_weight = (block_weight.ref_time() as f64).min(m); - let v: f64 = AdjustmentVariable::get().to_float(); - - // Ideal saturation in terms of weight - let ss = target().ref_time() as f64; - // Current saturation in terms of weight - let s = block_weight; - - let t1 = v * (s / m - ss / m); - let t2 = v.powi(2) * (s / m - ss / m).powi(2) / 2.0; - let next_float = previous_float * (1.0 + t1 + t2); - Multiplier::from_float(next_float) - } - - fn run_with_system_weight(w: Weight, assertions: F) - where - F: Fn(), - { - let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() - .build_storage::() - .unwrap() - .into(); - t.execute_with(|| { - System::set_block_consumed_resources(w, 0); - assertions() - }); - } - - #[test] - fn truth_value_update_poc_works() { - let fm = Multiplier::saturating_from_rational(1, 2); - let test_set = vec![ - (0, fm), - (100, fm), - (1000, fm), - (target().ref_time(), fm), - (max_normal().ref_time() / 2, fm), - (max_normal().ref_time(), fm), - ]; - test_set.into_iter().for_each(|(w, fm)| { - run_with_system_weight(Weight::from_ref_time(w), || { - assert_eq_error_rate!( - truth_value_update(Weight::from_ref_time(w), fm), - runtime_multiplier_update(fm), - // Error is only 1 in 100^18 - Multiplier::from_inner(100), - ); - }) - }) - } - - #[test] - fn multiplier_can_grow_from_zero() { - // if the min is too small, then this will not change, and we are doomed forever. - // the weight is 1/100th bigger than target. - run_with_system_weight(target() * 101 / 100, || { - let next = runtime_multiplier_update(min_multiplier()); - assert!(next > min_multiplier(), "{:?} !>= {:?}", next, min_multiplier()); - }) - } - - #[test] - fn multiplier_cannot_go_below_limit() { - // will not go any further below even if block is empty. - run_with_system_weight(Weight::from_ref_time(0), || { - let next = runtime_multiplier_update(min_multiplier()); - assert_eq!(next, min_multiplier()); - }) - } - - #[test] - fn time_to_reach_zero() { - // blocks per 24h in substrate-node: 28,800 (k) - // s* = 0.1875 - // The bound from the research in an empty chain is: - // v <~ (p / k(0 - s*)) - // p > v * k * -0.1875 - // to get p == -1 we'd need - // -1 > 0.00001 * k * -0.1875 - // 1 < 0.00001 * k * 0.1875 - // 10^9 / 1875 < k - // k > 533_333 ~ 18,5 days. - run_with_system_weight(Weight::from_ref_time(0), || { - // start from 1, the default. - let mut fm = Multiplier::one(); - let mut iterations: u64 = 0; - loop { - let next = runtime_multiplier_update(fm); - fm = next; - if fm == min_multiplier() { - break - } - iterations += 1; - } - assert!(iterations > 533_333); - }) - } - - #[test] - fn min_change_per_day() { - run_with_system_weight(max_normal(), || { - let mut fm = Multiplier::one(); - // See the example in the doc of `TargetedFeeAdjustment`. are at least 0.234, hence - // `fm > 1.234`. - for _ in 0..DAYS { - let next = runtime_multiplier_update(fm); - fm = next; - } - assert!(fm > Multiplier::saturating_from_rational(1114, 1000)); - }) - } - - #[test] - #[ignore] - fn congested_chain_simulation() { - // `cargo test congested_chain_simulation -- --nocapture` to get some insight. - - // almost full. The entire quota of normal transactions is taken. - let block_weight = BlockWeights::get().get(DispatchClass::Normal).max_total.unwrap() - - Weight::from_ref_time(100); - - // Default substrate weight. - let tx_weight = frame_support::weights::constants::ExtrinsicBaseWeight::get(); - - run_with_system_weight(block_weight, || { - // initial value configured on module - let mut fm = Multiplier::one(); - assert_eq!(fm, TransactionPayment::next_fee_multiplier()); - - let mut iterations: u64 = 0; - loop { - let next = runtime_multiplier_update(fm); - // if no change, panic. This should never happen in this case. - if fm == next { - panic!("The fee should ever increase"); - } - fm = next; - iterations += 1; - let fee = - ::WeightToFee::weight_to_fee( - &tx_weight, - ); - let adjusted_fee = fm.saturating_mul_acc_int(fee); - println!( - "iteration {}, new fm = {:?}. Fee at this point is: {} units / {} millicents, \ - {} cents, {} dollars", - iterations, - fm, - adjusted_fee, - adjusted_fee / MILLICENTS, - adjusted_fee / CENTS, - adjusted_fee / DOLLARS, - ); - } - }); - } - - #[test] - fn stateless_weight_mul() { - let fm = Multiplier::saturating_from_rational(1, 2); - run_with_system_weight(target() / 4, || { - let next = runtime_multiplier_update(fm); - assert_eq_error_rate!( - next, - truth_value_update(target() / 4, fm), - Multiplier::from_inner(100), - ); - - // Light block. Multiplier is reduced a little. - assert!(next < fm); - }); - - run_with_system_weight(target() / 2, || { - let next = runtime_multiplier_update(fm); - assert_eq_error_rate!( - next, - truth_value_update(target() / 2, fm), - Multiplier::from_inner(100), - ); - // Light block. Multiplier is reduced a little. - assert!(next < fm); - }); - run_with_system_weight(target(), || { - let next = runtime_multiplier_update(fm); - assert_eq_error_rate!( - next, - truth_value_update(target(), fm), - Multiplier::from_inner(100), - ); - // ideal. No changes. - assert_eq!(next, fm) - }); - run_with_system_weight(target() * 2, || { - // More than ideal. Fee is increased. - let next = runtime_multiplier_update(fm); - assert_eq_error_rate!( - next, - truth_value_update(target() * 2, fm), - Multiplier::from_inner(100), - ); - - // Heavy block. Fee is increased a little. - assert!(next > fm); - }); - } - - #[test] - fn weight_mul_grow_on_big_block() { - run_with_system_weight(target() * 2, || { - let mut original = Multiplier::zero(); - let mut next = Multiplier::default(); - - (0..1_000).for_each(|_| { - next = runtime_multiplier_update(original); - assert_eq_error_rate!( - next, - truth_value_update(target() * 2, original), - Multiplier::from_inner(100), - ); - // must always increase - assert!(next > original, "{:?} !>= {:?}", next, original); - original = next; - }); - }); - } - - #[test] - fn weight_mul_decrease_on_small_block() { - run_with_system_weight(target() / 2, || { - let mut original = Multiplier::saturating_from_rational(1, 2); - let mut next; - - for _ in 0..100 { - // decreases - next = runtime_multiplier_update(original); - assert!(next < original, "{:?} !<= {:?}", next, original); - original = next; - } - }) - } - - #[test] - fn weight_to_fee_should_not_overflow_on_large_weights() { - let kb = 1024_u64; - let mb = kb * kb; - let max_fm = Multiplier::saturating_from_integer(i128::MAX); - - // check that for all values it can compute, correctly. - vec![ - 0, - 1, - 10, - 1000, - kb, - 10 * kb, - 100 * kb, - mb, - 10 * mb, - 2147483647, - 4294967295, - BlockWeights::get().max_block.ref_time() / 2, - BlockWeights::get().max_block.ref_time(), - u64::MAX / 2, - u64::MAX, - ] - .into_iter() - .for_each(|i| { - run_with_system_weight(Weight::from_ref_time(i), || { - let next = runtime_multiplier_update(Multiplier::one()); - let truth = truth_value_update(Weight::from_ref_time(i), Multiplier::one()); - assert_eq_error_rate!(truth, next, Multiplier::from_inner(50_000_000)); - }); - }); - - // Some values that are all above the target and will cause an increase. - let t = target().ref_time(); - vec![t + 100, t * 2, t * 4].into_iter().for_each(|i| { - run_with_system_weight(Weight::from_ref_time(i), || { - let fm = runtime_multiplier_update(max_fm); - // won't grow. The convert saturates everything. - assert_eq!(fm, max_fm); - }) - }); - } -} diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 509a1893b..66389b9f4 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -51,11 +51,9 @@ pub use node_primitives::{AccountId, Signature}; use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; #[cfg(any(feature = "std", test))] pub use pallet_balances::Call as BalancesCall; -pub use pallet_cere_ddc; pub use pallet_chainbridge; pub use pallet_ddc_clusters; pub use pallet_ddc_customers; -pub use pallet_ddc_metrics_offchain_worker; pub use pallet_ddc_nodes; pub use pallet_ddc_payouts; pub use pallet_ddc_staking; @@ -1213,21 +1211,6 @@ impl pallet_vesting::Config for Runtime { const MAX_VESTING_SCHEDULES: u32 = 28; } -parameter_types! { - // Minimum bounds on storage are important to secure your chain. - pub const MinDataLength: usize = 1; - // Maximum bounds on storage are important to secure your chain. - pub const MaxDataLength: usize = usize::MAX; -} - -/// Configure the send data pallet -impl pallet_cere_ddc::Config for Runtime { - type MinLength = MinDataLength; - type MaxLength = MaxDataLength; - // The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; -} - parameter_types! { pub const ChainId: u8 = 1; pub const ProposalLifetime: BlockNumber = 1000; @@ -1264,10 +1247,6 @@ impl pallet_erc20::Config for Runtime { type Erc721Id = NFTTokenId; } -parameter_types! { - pub const OcwBlockInterval: u32 = pallet_ddc_metrics_offchain_worker::BLOCK_INTERVAL; -} - parameter_types! { pub const PoolsPalletId: PalletId = PalletId(*b"py/nopls"); // Allow pools that got slashed up to 90% to remain operational. @@ -1313,15 +1292,6 @@ impl frame_support::traits::OnRuntimeUpgrade for InitiateNominationPools { } } -impl pallet_ddc_metrics_offchain_worker::Config for Runtime { - type BlockInterval = OcwBlockInterval; - - type AuthorityId = pallet_ddc_metrics_offchain_worker::crypto::TestAuthId; - - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; -} - impl pallet_ddc_staking::Config for Runtime { type Currency = Balances; type RuntimeEvent = RuntimeEvent; @@ -1433,11 +1403,9 @@ construct_runtime!( ChildBounties: pallet_child_bounties, NominationPools: pallet_nomination_pools, FastUnstake: pallet_fast_unstake, - CereDDCModule: pallet_cere_ddc::{Pallet, Call, Storage, Event}, ChainBridge: pallet_chainbridge::{Pallet, Call, Storage, Event}, Erc721: pallet_erc721::{Pallet, Call, Storage, Event}, Erc20: pallet_erc20::{Pallet, Call, Storage, Event}, - DdcMetricsOffchainWorker: pallet_ddc_metrics_offchain_worker::{Pallet, Call, Storage, Event}, DdcStaking: pallet_ddc_staking, DdcCustomers: pallet_ddc_customers, DdcNodes: pallet_ddc_nodes, diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index d2da2b23e..f14f04142 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -94,10 +94,8 @@ pallet-vesting = { default-features = false, git = "https://github.com/paritytec cere-runtime-common = { path = "../common", default-features = false } cere-runtime-constants = { path = "./constants", default-features = false } ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } -pallet-cere-ddc = { version = "4.8.2", default-features = false, path = "../../pallets/ddc" } pallet-ddc-clusters = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-clusters" } -pallet-ddc-customers = { version = "0.1.0", default-features = false, path = "../../pallets/ddc-customers" } -pallet-ddc-metrics-offchain-worker = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-metrics-offchain-worker" } +pallet-ddc-customers = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-customers" } pallet-ddc-nodes = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-nodes" } pallet-ddc-payouts = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-payouts" } pallet-ddc-staking = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-staking" } @@ -129,7 +127,6 @@ std = [ "pallet-fast-unstake/std", "pallet-elections-phragmen/std", "frame-executive/std", - "pallet-cere-ddc/std", "pallet-chainbridge/std", "pallet-erc721/std", "pallet-erc20/std", @@ -144,7 +141,6 @@ std = [ "pallet-identity/std", "pallet-scheduler/std", "node-primitives/std", - "sp-offchain/std", "pallet-offences/std", "pallet-proxy/std", "sp-core/std", @@ -177,7 +173,6 @@ std = [ "frame-try-runtime/std", "sp-io/std", "pallet-child-bounties/std", - "pallet-ddc-metrics-offchain-worker/std", "pallet-ddc-clusters/std", "pallet-ddc-customers/std", "pallet-ddc-nodes/std", diff --git a/runtime/cere/src/impls.rs b/runtime/cere/src/impls.rs index 6a6b77537..25d3f1be5 100644 --- a/runtime/cere/src/impls.rs +++ b/runtime/cere/src/impls.rs @@ -29,344 +29,3 @@ impl OnUnbalanced for Author { } } } - -#[cfg(test)] -mod multiplier_tests { - use cere_runtime_constants::{currency::*, time::*}; - use frame_support::{ - dispatch::DispatchClass, - weights::{Weight, WeightToFee as WeightToFeeT}, - }; - use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment}; - use sp_runtime::{ - assert_eq_error_rate, - traits::{Convert, One, Zero}, - FixedPointNumber, - }; - - use crate::{ - AdjustmentVariable, MaximumMultiplier, MinimumMultiplier, Runtime, - RuntimeBlockWeights as BlockWeights, System, TargetBlockFullness, TransactionPayment, - }; - - fn max_normal() -> Weight { - BlockWeights::get() - .get(DispatchClass::Normal) - .max_total - .unwrap_or_else(|| BlockWeights::get().max_block) - } - - fn min_multiplier() -> Multiplier { - MinimumMultiplier::get() - } - - fn target() -> Weight { - TargetBlockFullness::get() * max_normal() - } - - // update based on runtime impl. - fn runtime_multiplier_update(fm: Multiplier) -> Multiplier { - TargetedFeeAdjustment::< - Runtime, - TargetBlockFullness, - AdjustmentVariable, - MinimumMultiplier, - MaximumMultiplier, - >::convert(fm) - } - - // update based on reference impl. - fn truth_value_update(block_weight: Weight, previous: Multiplier) -> Multiplier { - let accuracy = Multiplier::accuracy() as f64; - let previous_float = previous.into_inner() as f64 / accuracy; - // bump if it is zero. - let previous_float = previous_float.max(min_multiplier().into_inner() as f64 / accuracy); - - // maximum tx weight - let m = max_normal().ref_time() as f64; - // block weight always truncated to max weight - let block_weight = (block_weight.ref_time() as f64).min(m); - let v: f64 = AdjustmentVariable::get().to_float(); - - // Ideal saturation in terms of weight - let ss = target().ref_time() as f64; - // Current saturation in terms of weight - let s = block_weight; - - let t1 = v * (s / m - ss / m); - let t2 = v.powi(2) * (s / m - ss / m).powi(2) / 2.0; - let next_float = previous_float * (1.0 + t1 + t2); - Multiplier::from_float(next_float) - } - - fn run_with_system_weight(w: Weight, assertions: F) - where - F: Fn(), - { - let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() - .build_storage::() - .unwrap() - .into(); - t.execute_with(|| { - System::set_block_consumed_resources(w, 0); - assertions() - }); - } - - #[test] - fn truth_value_update_poc_works() { - let fm = Multiplier::saturating_from_rational(1, 2); - let test_set = vec![ - (0, fm), - (100, fm), - (1000, fm), - (target().ref_time(), fm), - (max_normal().ref_time() / 2, fm), - (max_normal().ref_time(), fm), - ]; - test_set.into_iter().for_each(|(w, fm)| { - run_with_system_weight(Weight::from_ref_time(w), || { - assert_eq_error_rate!( - truth_value_update(Weight::from_ref_time(w), fm), - runtime_multiplier_update(fm), - // Error is only 1 in 100^18 - Multiplier::from_inner(100), - ); - }) - }) - } - - #[test] - fn multiplier_can_grow_from_zero() { - // if the min is too small, then this will not change, and we are doomed forever. - // the weight is 1/100th bigger than target. - run_with_system_weight(target() * 101 / 100, || { - let next = runtime_multiplier_update(min_multiplier()); - assert!(next > min_multiplier(), "{:?} !>= {:?}", next, min_multiplier()); - }) - } - - #[test] - fn multiplier_cannot_go_below_limit() { - // will not go any further below even if block is empty. - run_with_system_weight(Weight::from_ref_time(0), || { - let next = runtime_multiplier_update(min_multiplier()); - assert_eq!(next, min_multiplier()); - }) - } - - #[test] - fn time_to_reach_zero() { - // blocks per 24h in substrate-node: 28,800 (k) - // s* = 0.1875 - // The bound from the research in an empty chain is: - // v <~ (p / k(0 - s*)) - // p > v * k * -0.1875 - // to get p == -1 we'd need - // -1 > 0.00001 * k * -0.1875 - // 1 < 0.00001 * k * 0.1875 - // 10^9 / 1875 < k - // k > 533_333 ~ 18,5 days. - run_with_system_weight(Weight::from_ref_time(0), || { - // start from 1, the default. - let mut fm = Multiplier::one(); - let mut iterations: u64 = 0; - loop { - let next = runtime_multiplier_update(fm); - fm = next; - if fm == min_multiplier() { - break - } - iterations += 1; - } - assert!(iterations > 533_333); - }) - } - - #[test] - fn min_change_per_day() { - run_with_system_weight(max_normal(), || { - let mut fm = Multiplier::one(); - // See the example in the doc of `TargetedFeeAdjustment`. are at least 0.234, hence - // `fm > 1.234`. - for _ in 0..DAYS { - let next = runtime_multiplier_update(fm); - fm = next; - } - assert!(fm > Multiplier::saturating_from_rational(1114, 1000)); - }) - } - - #[test] - #[ignore] - fn congested_chain_simulation() { - // `cargo test congested_chain_simulation -- --nocapture` to get some insight. - - // almost full. The entire quota of normal transactions is taken. - let block_weight = BlockWeights::get().get(DispatchClass::Normal).max_total.unwrap() - - Weight::from_ref_time(100); - - // Default substrate weight. - let tx_weight = frame_support::weights::constants::ExtrinsicBaseWeight::get(); - - run_with_system_weight(block_weight, || { - // initial value configured on module - let mut fm = Multiplier::one(); - assert_eq!(fm, TransactionPayment::next_fee_multiplier()); - - let mut iterations: u64 = 0; - loop { - let next = runtime_multiplier_update(fm); - // if no change, panic. This should never happen in this case. - if fm == next { - panic!("The fee should ever increase"); - } - fm = next; - iterations += 1; - let fee = - ::WeightToFee::weight_to_fee( - &tx_weight, - ); - let adjusted_fee = fm.saturating_mul_acc_int(fee); - println!( - "iteration {}, new fm = {:?}. Fee at this point is: {} units / {} millicents, \ - {} cents, {} dollars", - iterations, - fm, - adjusted_fee, - adjusted_fee / MILLICENTS, - adjusted_fee / CENTS, - adjusted_fee / DOLLARS, - ); - } - }); - } - - #[test] - fn stateless_weight_mul() { - let fm = Multiplier::saturating_from_rational(1, 2); - run_with_system_weight(target() / 4, || { - let next = runtime_multiplier_update(fm); - assert_eq_error_rate!( - next, - truth_value_update(target() / 4, fm), - Multiplier::from_inner(100), - ); - - // Light block. Multiplier is reduced a little. - assert!(next < fm); - }); - - run_with_system_weight(target() / 2, || { - let next = runtime_multiplier_update(fm); - assert_eq_error_rate!( - next, - truth_value_update(target() / 2, fm), - Multiplier::from_inner(100), - ); - // Light block. Multiplier is reduced a little. - assert!(next < fm); - }); - run_with_system_weight(target(), || { - let next = runtime_multiplier_update(fm); - assert_eq_error_rate!( - next, - truth_value_update(target(), fm), - Multiplier::from_inner(100), - ); - // ideal. No changes. - assert_eq!(next, fm) - }); - run_with_system_weight(target() * 2, || { - // More than ideal. Fee is increased. - let next = runtime_multiplier_update(fm); - assert_eq_error_rate!( - next, - truth_value_update(target() * 2, fm), - Multiplier::from_inner(100), - ); - - // Heavy block. Fee is increased a little. - assert!(next > fm); - }); - } - - #[test] - fn weight_mul_grow_on_big_block() { - run_with_system_weight(target() * 2, || { - let mut original = Multiplier::zero(); - let mut next = Multiplier::default(); - - (0..1_000).for_each(|_| { - next = runtime_multiplier_update(original); - assert_eq_error_rate!( - next, - truth_value_update(target() * 2, original), - Multiplier::from_inner(100), - ); - // must always increase - assert!(next > original, "{:?} !>= {:?}", next, original); - original = next; - }); - }); - } - - #[test] - fn weight_mul_decrease_on_small_block() { - run_with_system_weight(target() / 2, || { - let mut original = Multiplier::saturating_from_rational(1, 2); - let mut next; - - for _ in 0..100 { - // decreases - next = runtime_multiplier_update(original); - assert!(next < original, "{:?} !<= {:?}", next, original); - original = next; - } - }) - } - - #[test] - fn weight_to_fee_should_not_overflow_on_large_weights() { - let kb = 1024_u64; - let mb = kb * kb; - let max_fm = Multiplier::saturating_from_integer(i128::MAX); - - // check that for all values it can compute, correctly. - vec![ - 0, - 1, - 10, - 1000, - kb, - 10 * kb, - 100 * kb, - mb, - 10 * mb, - 2147483647, - 4294967295, - BlockWeights::get().max_block.ref_time() / 2, - BlockWeights::get().max_block.ref_time(), - u64::MAX / 2, - u64::MAX, - ] - .into_iter() - .for_each(|i| { - run_with_system_weight(Weight::from_ref_time(i), || { - let next = runtime_multiplier_update(Multiplier::one()); - let truth = truth_value_update(Weight::from_ref_time(i), Multiplier::one()); - assert_eq_error_rate!(truth, next, Multiplier::from_inner(50_000_000)); - }); - }); - - // Some values that are all above the target and will cause an increase. - let t = target().ref_time(); - vec![t + 100, t * 2, t * 4].into_iter().for_each(|i| { - run_with_system_weight(Weight::from_ref_time(i), || { - let fm = runtime_multiplier_update(max_fm); - // won't grow. The convert saturates everything. - assert_eq!(fm, max_fm); - }) - }); - } -} diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 40fbf4fd3..7d008b3c6 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -51,9 +51,7 @@ pub use node_primitives::{AccountId, Signature}; use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; #[cfg(any(feature = "std", test))] pub use pallet_balances::Call as BalancesCall; -pub use pallet_cere_ddc; pub use pallet_chainbridge; -pub use pallet_ddc_metrics_offchain_worker; use pallet_election_provider_multi_phase::SolutionAccuracyOf; use pallet_grandpa::{ fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList, @@ -1209,21 +1207,6 @@ impl pallet_vesting::Config for Runtime { const MAX_VESTING_SCHEDULES: u32 = 28; } -parameter_types! { - // Minimum bounds on storage are important to secure your chain. - pub const MinDataLength: usize = 1; - // Maximum bounds on storage are important to secure your chain. - pub const MaxDataLength: usize = usize::MAX; -} - -/// Configure the send data pallet -impl pallet_cere_ddc::Config for Runtime { - type MinLength = MinDataLength; - type MaxLength = MaxDataLength; - // The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; -} - parameter_types! { pub const ChainId: u8 = 1; pub const ProposalLifetime: BlockNumber = 1000; @@ -1260,10 +1243,6 @@ impl pallet_erc20::Config for Runtime { type Erc721Id = NFTTokenId; } -parameter_types! { - pub const OcwBlockInterval: u32 = pallet_ddc_metrics_offchain_worker::BLOCK_INTERVAL; -} - parameter_types! { pub const PoolsPalletId: PalletId = PalletId(*b"py/nopls"); // Allow pools that got slashed up to 90% to remain operational. @@ -1309,15 +1288,6 @@ impl frame_support::traits::OnRuntimeUpgrade for InitiateNominationPools { } } -impl pallet_ddc_metrics_offchain_worker::Config for Runtime { - type BlockInterval = OcwBlockInterval; - - type AuthorityId = pallet_ddc_metrics_offchain_worker::crypto::TestAuthId; - - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; -} - parameter_types! { pub const DdcCustomersPalletId: PalletId = PalletId(*b"accounts"); // DDC maintainer's stake pub const UnlockingDelay: BlockNumber = 100800_u32; // 1 hour * 24 * 7 = 7 days; (1 hour is 600 blocks) @@ -1429,11 +1399,9 @@ construct_runtime!( ChildBounties: pallet_child_bounties, NominationPools: pallet_nomination_pools, FastUnstake: pallet_fast_unstake, - CereDDCModule: pallet_cere_ddc::{Pallet, Call, Storage, Event}, ChainBridge: pallet_chainbridge::{Pallet, Call, Storage, Event}, Erc721: pallet_erc721::{Pallet, Call, Storage, Event}, Erc20: pallet_erc20::{Pallet, Call, Storage, Event}, - DdcMetricsOffchainWorker: pallet_ddc_metrics_offchain_worker::{Pallet, Call, Storage, Event}, DdcStaking: pallet_ddc_staking, DdcCustomers: pallet_ddc_customers, DdcNodes: pallet_ddc_nodes, diff --git a/rustfmt.toml b/rustfmt.toml index 2797c252b..0e86d10d6 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -24,8 +24,6 @@ use_field_init_shorthand = true ignore = [ "pallets/chainbridge", - "pallets/ddc-metrics-offchain-worker", - "pallets/ddc", "pallets/erc20", "pallets/erc721", ] diff --git a/zombienet/0001-ddc-validation/ddc-validation.toml b/zombienet/0001-ddc-validation/ddc-validation.toml index e5d7ae40a..77b82c4ea 100644 --- a/zombienet/0001-ddc-validation/ddc-validation.toml +++ b/zombienet/0001-ddc-validation/ddc-validation.toml @@ -1,6 +1,6 @@ [relaychain] default_command = "./target/release/cere" -default_args = ["--enable-ddc-validation --dac-url {{DAC_URL}}"] +default_args = [""] chain = "local" [[relaychain.nodes]] From 226c50034665da456102a7670098a4397068b63c Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Wed, 3 Jan 2024 14:52:21 +0400 Subject: [PATCH 573/583] Configure chain properties for dev runtime (#217) Fix the issue @yahortsaryk reported in [Slack](https://cere-network.slack.com/archives/C04S79C3A11/p1703786484555029). The issue was caused by misconfiguration of `dev` chain spec --- node/service/src/chain_spec.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index 45f26873e..83dfe40af 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -4,6 +4,7 @@ use cere_dev_runtime as cere_dev; use cere_dev_runtime_constants::currency::DOLLARS as TEST_UNITS; #[cfg(feature = "cere-native")] use cere_runtime as cere; +use jsonrpsee::core::__reexports::serde_json; pub use node_primitives::{AccountId, Balance, Block, Signature}; use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use sc_chain_spec::ChainSpecExtension; @@ -239,6 +240,18 @@ pub fn cere_dev_genesis( } } +/// Returns the properties for the [`cere-dev-native`]. +pub fn cere_dev_native_chain_spec_properties() -> serde_json::map::Map { + serde_json::json!({ + "tokenDecimals": 10, + "tokenSymbol": "CERE", + "ss58Format": 54, + }) + .as_object() + .expect("Map given; qed") + .clone() +} + /// Helper function to create Cere `GenesisConfig` for testing #[cfg(feature = "cere-dev-native")] fn cere_dev_config_genesis(wasm_binary: &[u8]) -> cere_dev::GenesisConfig { @@ -273,7 +286,7 @@ pub fn cere_dev_development_config() -> Result { None, Some(DEFAULT_PROTOCOL_ID), None, - None, + Some(cere_dev_native_chain_spec_properties()), Default::default(), )) } From ebb6824431bb3e5541e30a5129eface99348685d Mon Sep 17 00:00:00 2001 From: aie0 <149175774+aie0@users.noreply.github.com> Date: Fri, 5 Jan 2024 11:39:47 +0200 Subject: [PATCH 574/583] Payout 0.9.30 (#219) Co-authored-by: rakanalh --- Cargo.lock | 4 +- pallets/ddc-clusters/Cargo.toml | 4 +- pallets/ddc-clusters/src/benchmarking.rs | 14 +- pallets/ddc-clusters/src/mock.rs | 8 +- pallets/ddc-clusters/src/testing_utils.rs | 14 +- pallets/ddc-clusters/src/tests.rs | 50 +- pallets/ddc-customers/Cargo.toml | 5 +- pallets/ddc-customers/src/benchmarking.rs | 9 +- pallets/ddc-customers/src/lib.rs | 169 +-- pallets/ddc-customers/src/mock.rs | 20 +- pallets/ddc-customers/src/tests.rs | 28 +- pallets/ddc-customers/src/weights.rs | 36 +- pallets/ddc-nodes/Cargo.toml | 4 +- pallets/ddc-payouts/Cargo.toml | 4 +- pallets/ddc-payouts/src/benchmarking.rs | 11 +- pallets/ddc-payouts/src/lib.rs | 265 ++-- pallets/ddc-payouts/src/mock.rs | 155 ++- pallets/ddc-payouts/src/tests.rs | 1433 ++++++++++++++++++--- pallets/ddc-payouts/src/weights.rs | 78 +- pallets/ddc-staking/Cargo.toml | 4 +- pallets/ddc-staking/src/mock.rs | 8 +- pallets/ddc-staking/src/testing_utils.rs | 8 +- primitives/Cargo.toml | 3 +- primitives/src/lib.rs | 20 +- runtime/cere-dev/Cargo.toml | 2 +- runtime/cere-dev/src/lib.rs | 7 +- runtime/cere/Cargo.toml | 2 +- runtime/cere/src/lib.rs | 7 +- traits/Cargo.toml | 4 +- 29 files changed, 1860 insertions(+), 516 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1d8eec70e..c1460848c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1583,7 +1583,7 @@ dependencies = [ [[package]] name = "ddc-primitives" -version = "0.1.0" +version = "4.8.2" dependencies = [ "parity-scale-codec", "scale-info", @@ -1594,7 +1594,7 @@ dependencies = [ [[package]] name = "ddc-traits" -version = "0.1.0" +version = "4.8.2" dependencies = [ "ddc-primitives", "frame-support", diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index 5630b420b..def75665d 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -5,8 +5,8 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } -ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } +ddc-primitives = { version = "4.8.2", default-features = false, path = "../../primitives" } +ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/pallets/ddc-clusters/src/benchmarking.rs b/pallets/ddc-clusters/src/benchmarking.rs index cb9b47397..2405330d7 100644 --- a/pallets/ddc-clusters/src/benchmarking.rs +++ b/pallets/ddc-clusters/src/benchmarking.rs @@ -7,7 +7,7 @@ pub use frame_benchmarking::{ }; use frame_system::RawOrigin; use pallet_contracts::chain_extension::UncheckedFrom; -use sp_runtime::{AccountId32, Perbill}; +use sp_runtime::{AccountId32, Perquintill}; use sp_std::prelude::*; use testing_utils::*; @@ -26,9 +26,9 @@ benchmarks! { let user = account::("user", USER_SEED, 0u32); let cluster_params = ClusterParams { node_provider_auth_contract: Some(user.clone()) }; let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { - treasury_share: Perbill::default(), - validators_share: Perbill::default(), - cluster_reserve_share: Perbill::default(), + treasury_share: Perquintill::default(), + validators_share: Perquintill::default(), + cluster_reserve_share: Perquintill::default(), storage_bond_size: 100u32.into(), storage_chill_delay: 50u32.into(), storage_unbonding_delay: 50u32.into(), @@ -89,9 +89,9 @@ benchmarks! { let user = account::("user", USER_SEED, 0u32); let _ = config_cluster::(user, cluster_id); let new_cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { - treasury_share: Perbill::default(), - validators_share: Perbill::default(), - cluster_reserve_share: Perbill::default(), + treasury_share: Perquintill::default(), + validators_share: Perquintill::default(), + cluster_reserve_share: Perquintill::default(), storage_bond_size: 10u32.into(), storage_chill_delay: 5u32.into(), storage_unbonding_delay: 5u32.into(), diff --git a/pallets/ddc-clusters/src/mock.rs b/pallets/ddc-clusters/src/mock.rs index d06aa1837..911d4ce84 100644 --- a/pallets/ddc-clusters/src/mock.rs +++ b/pallets/ddc-clusters/src/mock.rs @@ -18,7 +18,7 @@ use sp_runtime::{ traits::{ BlakeTwo256, Convert, Extrinsic as ExtrinsicT, IdentifyAccount, IdentityLookup, Verify, }, - MultiSignature, Perbill, + MultiSignature, Perquintill, }; use crate::{self as pallet_ddc_clusters, *}; @@ -244,9 +244,9 @@ impl ExtBuilder { .assimilate_storage(&mut storage); let cluster_gov_params = ClusterGovParams { - treasury_share: Perbill::from_float(0.05), - validators_share: Perbill::from_float(0.01), - cluster_reserve_share: Perbill::from_float(0.02), + treasury_share: Perquintill::from_float(0.05), + validators_share: Perquintill::from_float(0.01), + cluster_reserve_share: Perquintill::from_float(0.02), storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, diff --git a/pallets/ddc-clusters/src/testing_utils.rs b/pallets/ddc-clusters/src/testing_utils.rs index efba60338..5acb0dc42 100644 --- a/pallets/ddc-clusters/src/testing_utils.rs +++ b/pallets/ddc-clusters/src/testing_utils.rs @@ -11,7 +11,7 @@ pub use frame_benchmarking::{ use frame_system::RawOrigin; use pallet_contracts::chain_extension::UncheckedFrom; use pallet_ddc_nodes::Node; -use sp_runtime::Perbill; +use sp_runtime::Perquintill; use sp_std::prelude::*; use crate::{Pallet as DdcClusters, *}; @@ -22,9 +22,9 @@ where { let cluster_params = ClusterParams { node_provider_auth_contract: Some(user.clone()) }; let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { - treasury_share: Perbill::default(), - validators_share: Perbill::default(), - cluster_reserve_share: Perbill::default(), + treasury_share: Perquintill::default(), + validators_share: Perquintill::default(), + cluster_reserve_share: Perquintill::default(), storage_bond_size: 100u32.into(), storage_chill_delay: 50u32.into(), storage_unbonding_delay: 50u32.into(), @@ -64,9 +64,9 @@ where }; let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { - treasury_share: Perbill::default(), - validators_share: Perbill::default(), - cluster_reserve_share: Perbill::default(), + treasury_share: Perquintill::default(), + validators_share: Perquintill::default(), + cluster_reserve_share: Perquintill::default(), storage_bond_size: 100u32.into(), storage_chill_delay: 50u32.into(), storage_unbonding_delay: 50u32.into(), diff --git a/pallets/ddc-clusters/src/tests.rs b/pallets/ddc-clusters/src/tests.rs index 5f33a4b8f..734e4f465 100644 --- a/pallets/ddc-clusters/src/tests.rs +++ b/pallets/ddc-clusters/src/tests.rs @@ -8,7 +8,7 @@ use ddc_traits::cluster::ClusterManager; use frame_support::{assert_noop, assert_ok, error::BadOrigin}; use frame_system::Config; use hex_literal::hex; -use sp_runtime::{traits::Hash, Perbill}; +use sp_runtime::{traits::Hash, Perquintill}; use super::{mock::*, *}; @@ -23,9 +23,9 @@ fn create_cluster_works() { let auth_contract = AccountId::from([3; 32]); let cluster_gov_params = ClusterGovParams { - treasury_share: Perbill::from_float(0.05), - validators_share: Perbill::from_float(0.01), - cluster_reserve_share: Perbill::from_float(0.02), + treasury_share: Perquintill::from_float(0.05), + validators_share: Perquintill::from_float(0.01), + cluster_reserve_share: Perquintill::from_float(0.02), storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, @@ -154,9 +154,9 @@ fn add_and_delete_node_works() { cluster_reserve_id.clone(), ClusterParams { node_provider_auth_contract: Some(cluster_manager_id.clone()) }, ClusterGovParams { - treasury_share: Perbill::from_float(0.05), - validators_share: Perbill::from_float(0.01), - cluster_reserve_share: Perbill::from_float(0.02), + treasury_share: Perquintill::from_float(0.05), + validators_share: Perquintill::from_float(0.01), + cluster_reserve_share: Perquintill::from_float(0.02), storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, @@ -374,9 +374,9 @@ fn set_cluster_params_works() { cluster_reserve_id.clone(), ClusterParams { node_provider_auth_contract: Some(auth_contract_1) }, ClusterGovParams { - treasury_share: Perbill::from_float(0.05), - validators_share: Perbill::from_float(0.01), - cluster_reserve_share: Perbill::from_float(0.02), + treasury_share: Perquintill::from_float(0.05), + validators_share: Perquintill::from_float(0.01), + cluster_reserve_share: Perquintill::from_float(0.02), storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, @@ -422,9 +422,9 @@ fn set_cluster_gov_params_works() { let auth_contract = AccountId::from([3; 32]); let cluster_gov_params = ClusterGovParams { - treasury_share: Perbill::from_float(0.05), - validators_share: Perbill::from_float(0.01), - cluster_reserve_share: Perbill::from_float(0.02), + treasury_share: Perquintill::from_float(0.05), + validators_share: Perquintill::from_float(0.01), + cluster_reserve_share: Perquintill::from_float(0.02), storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, @@ -463,9 +463,9 @@ fn set_cluster_gov_params_works() { ); let updated_gov_params = ClusterGovParams { - treasury_share: Perbill::from_float(0.06), - validators_share: Perbill::from_float(0.02), - cluster_reserve_share: Perbill::from_float(0.03), + treasury_share: Perquintill::from_float(0.06), + validators_share: Perquintill::from_float(0.02), + cluster_reserve_share: Perquintill::from_float(0.03), storage_bond_size: 1000, storage_chill_delay: 500, storage_unbonding_delay: 500, @@ -537,9 +537,9 @@ fn cluster_visitor_works() { let auth_contract = AccountId::from([3; 32]); let cluster_gov_params = ClusterGovParams { - treasury_share: Perbill::from_float(0.05), - validators_share: Perbill::from_float(0.01), - cluster_reserve_share: Perbill::from_float(0.02), + treasury_share: Perquintill::from_float(0.05), + validators_share: Perquintill::from_float(0.01), + cluster_reserve_share: Perquintill::from_float(0.02), storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, @@ -585,9 +585,9 @@ fn cluster_visitor_works() { assert_eq!( >::get_fees_params(&cluster_id).unwrap(), ClusterFeesParams { - treasury_share: Perbill::from_float(0.05), - validators_share: Perbill::from_float(0.01), - cluster_reserve_share: Perbill::from_float(0.02) + treasury_share: Perquintill::from_float(0.05), + validators_share: Perquintill::from_float(0.01), + cluster_reserve_share: Perquintill::from_float(0.02) } ); @@ -646,9 +646,9 @@ fn cluster_creator_works() { let auth_contract = AccountId::from([3; 32]); let cluster_gov_params = ClusterGovParams { - treasury_share: Perbill::from_float(0.05), - validators_share: Perbill::from_float(0.01), - cluster_reserve_share: Perbill::from_float(0.02), + treasury_share: Perquintill::from_float(0.05), + validators_share: Perquintill::from_float(0.01), + cluster_reserve_share: Perquintill::from_float(0.02), storage_bond_size: 100, storage_chill_delay: 50, storage_unbonding_delay: 50, diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index 25bbd10c6..a723c3c66 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } @@ -17,8 +18,8 @@ rand_chacha = { version = "0.2", default-features = false, optional = true } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } # Cere -ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } -ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } +ddc-primitives = { version = "4.8.2", default-features = false, path = "../../primitives" } +ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } [dev-dependencies] frame-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/pallets/ddc-customers/src/benchmarking.rs b/pallets/ddc-customers/src/benchmarking.rs index 87da166fb..b7794cc13 100644 --- a/pallets/ddc-customers/src/benchmarking.rs +++ b/pallets/ddc-customers/src/benchmarking.rs @@ -4,7 +4,7 @@ use ddc_primitives::{ClusterGovParams, ClusterId, ClusterParams}; use frame_benchmarking::{account, benchmarks, whitelist_account}; use frame_support::traits::Currency; -use sp_runtime::Perbill; +use sp_runtime::Perquintill; use sp_std::prelude::*; use super::*; @@ -21,11 +21,10 @@ benchmarks! { create_bucket { let cluster_id = ClusterId::from([1; 20]); let user = account::("user", USER_SEED, 0u32); - let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { - treasury_share: Perbill::default(), - validators_share: Perbill::default(), - cluster_reserve_share: Perbill::default(), + treasury_share: Perquintill::default(), + validators_share: Perquintill::default(), + cluster_reserve_share: Perquintill::default(), storage_bond_size: 100u32.into(), storage_chill_delay: 50u32.into(), storage_unbonding_delay: 50u32.into(), diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 181821ea5..482f9465b 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -12,9 +12,7 @@ pub(crate) mod mock; #[cfg(test)] mod tests; -use core::fmt::Debug; - -use codec::{Decode, Encode, HasCompact}; +use codec::{Decode, Encode}; use ddc_primitives::{BucketId, ClusterId}; use ddc_traits::{ cluster::{ClusterCreator, ClusterVisitor}, @@ -27,8 +25,9 @@ use frame_support::{ }; pub use pallet::*; use scale_info::TypeInfo; +use sp_io::hashing::blake2_128; use sp_runtime::{ - traits::{AccountIdConversion, AtLeast32BitUnsigned, CheckedAdd, CheckedSub, Saturating, Zero}, + traits::{AccountIdConversion, CheckedAdd, CheckedSub, Saturating, Zero}, RuntimeDebug, SaturatedConversion, }; use sp_std::prelude::*; @@ -45,17 +44,13 @@ parameter_types! { /// Just a Balance/BlockNumber tuple to encode when a chunk of funds will be unlocked. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] #[scale_info(skip_type_params(T))] -pub struct UnlockChunk -where - Balance: HasCompact, - BlockNumber: Clone, -{ +pub struct UnlockChunk { /// Amount of funds to be unlocked. #[codec(compact)] - value: Balance, + value: BalanceOf, /// Block number at which point it'll be unlocked. #[codec(compact)] - block: BlockNumber, + block: T::BlockNumber, } #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] @@ -73,33 +68,28 @@ pub struct BucketParams { #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] #[scale_info(skip_type_params(T))] -pub struct AccountsLedger { +pub struct AccountsLedger { /// The owner account whose balance is actually locked and can be used to pay for DDC network /// usage. - pub owner: AccountId, + pub owner: T::AccountId, /// The total amount of the owner's balance that we are currently accounting for. /// It's just `active` plus all the `unlocking` balances. #[codec(compact)] - pub total: Balance, + pub total: BalanceOf, /// The total amount of the owner's balance that will be accessible for DDC network payouts in /// any forthcoming rounds. #[codec(compact)] - pub active: Balance, + pub active: BalanceOf, /// Any balance that is becoming free, which may eventually be transferred out of the owner /// (assuming that the content owner has to pay for network usage). It is assumed that this /// will be treated as a first in, first out queue where the new (higher value) eras get pushed /// on the back. - pub unlocking: BoundedVec, MaxUnlockingChunks>, + pub unlocking: BoundedVec, MaxUnlockingChunks>, } -impl< - AccountId, - Balance: HasCompact + Copy + Saturating + AtLeast32BitUnsigned + Zero + Debug, - T: Config, - > AccountsLedger -{ +impl AccountsLedger { /// Initializes the default object using the given owner. - pub fn default_from(owner: AccountId) -> Self { + pub fn default_from(owner: T::AccountId) -> Self { Self { owner, total: Zero::zero(), active: Zero::zero(), unlocking: Default::default() } } @@ -107,11 +97,10 @@ impl< /// total by the sum of their balances. fn consolidate_unlocked(self, current_block: T::BlockNumber) -> Self { let mut total = self.total; - let unlocking: BoundedVec<_, _> = self + let unlocking_result: Result, _> = self .unlocking .into_iter() .filter(|chunk| { - log::debug!("Chunk era: {:?}", chunk.block); if chunk.block > current_block { true } else { @@ -120,43 +109,13 @@ impl< } }) .collect::>() - .try_into() - .expect( - "filtering items from a bounded vec always leaves length less than bounds. qed", - ); - - Self { owner: self.owner, total, active: self.active, unlocking } - } - - /// Charge funds that were scheduled for unlocking. - /// - /// Returns the updated ledger, and the amount actually charged. - fn charge_unlocking(mut self, value: Balance) -> Result<(Self, Balance), Error> { - let mut unlocking_balance = Balance::zero(); - - while let Some(last) = self.unlocking.last_mut() { - let temp = unlocking_balance - .checked_add(&last.value) - .ok_or(Error::::ArithmeticOverflow)?; - if temp <= value { - unlocking_balance = temp; - self.unlocking.pop(); - } else { - let diff = - value.checked_sub(&unlocking_balance).ok_or(Error::::ArithmeticUnderflow)?; - - unlocking_balance = - unlocking_balance.checked_add(&diff).ok_or(Error::::ArithmeticOverflow)?; - last.value = - last.value.checked_sub(&diff).ok_or(Error::::ArithmeticUnderflow)?; - } + .try_into(); - if unlocking_balance >= value { - break - } + if let Ok(unlocking) = unlocking_result { + Self { owner: self.owner, total, active: self.active, unlocking } + } else { + panic!("Failed to filter unlocking"); } - - Ok((self, unlocking_balance)) } } @@ -190,12 +149,7 @@ pub mod pallet { /// Map from all (unlocked) "owner" accounts to the info regarding the staking. #[pallet::storage] #[pallet::getter(fn ledger)] - pub type Ledger = StorageMap< - _, - Blake2_128Concat, - T::AccountId, - AccountsLedger, T>, - >; + pub type Ledger = StorageMap<_, Blake2_128Concat, T::AccountId, AccountsLedger>; #[pallet::type_value] pub fn DefaultBucketCount() -> BucketId { @@ -266,13 +220,14 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { + pub feeder_account: Option, pub buckets: Vec<(ClusterId, T::AccountId, BalanceOf, bool)>, } #[cfg(feature = "std")] impl Default for GenesisConfig { fn default() -> Self { - GenesisConfig { buckets: Default::default() } + GenesisConfig { feeder_account: None, buckets: Default::default() } } } @@ -281,8 +236,19 @@ pub mod pallet { fn build(&self) { let account_id = >::account_id(); let min = ::Currency::minimum_balance(); - if ::Currency::free_balance(&account_id) < min { - let _ = ::Currency::make_free_balance_be(&account_id, min); + + let balance = ::Currency::free_balance(&account_id); + if balance < min { + if let Some(vault) = &self.feeder_account { + let _ = ::Currency::transfer( + vault, + &account_id, + min - balance, + ExistenceRequirement::AllowDeath, + ); + } else { + let _ = ::Currency::make_free_balance_be(&account_id, min); + } } for &(ref cluster_id, ref owner_id, ref deposit, ref is_public) in &self.buckets { @@ -300,7 +266,7 @@ pub mod pallet { }; >::insert(cur_bucket_id, bucket); - let ledger = AccountsLedger::, T> { + let ledger = AccountsLedger:: { owner: owner_id.clone(), total: *deposit, active: *deposit, @@ -481,7 +447,6 @@ pub mod pallet { // This was the consequence of a partial deposit unlock. just update the ledger and // move on. >::insert(&owner, &ledger); - // This is only an update, so we use less overall weight. Some(::WeightInfo::withdraw_unlocked_deposit_update()) }; @@ -497,13 +462,11 @@ pub mod pallet { let value = old_total.checked_sub(&ledger.total).ok_or(Error::::ArithmeticUnderflow)?; - let account_id = Self::account_id(); - ::Currency::transfer( - &account_id, + &Self::account_id(), &owner, value, - ExistenceRequirement::KeepAlive, + ExistenceRequirement::AllowDeath, )?; Self::deposit_event(Event::::Withdrawn(owner, value)); } @@ -538,18 +501,26 @@ pub mod pallet { pub fn account_id() -> T::AccountId { T::PalletId::get().into_account_truncating() } + + pub fn sub_account_id(account_id: &T::AccountId) -> T::AccountId { + let hash = blake2_128(&account_id.encode()); + + // hash is 28 bytes + T::PalletId::get().into_sub_account_truncating(hash) + } + /// Update the ledger for a owner. /// /// This will also deposit the funds to pallet. fn update_ledger_and_deposit( owner: &T::AccountId, - ledger: &AccountsLedger, T>, + ledger: &AccountsLedger, ) -> DispatchResult { ::Currency::transfer( owner, &Self::account_id(), ledger.total, - ExistenceRequirement::KeepAlive, + ExistenceRequirement::AllowDeath, )?; >::insert(owner, ledger); @@ -569,6 +540,42 @@ pub mod pallet { Ok(()) } + + /// Charge funds that were scheduled for unlocking. + /// + /// Returns the updated ledger, and the amount actually charged. + fn charge_unlocking( + mut ledger: AccountsLedger, + value: BalanceOf, + ) -> Result<(AccountsLedger, BalanceOf), Error> { + let mut unlocking_balance = BalanceOf::::zero(); + + while let Some(last) = ledger.unlocking.last_mut() { + let temp = unlocking_balance + .checked_add(&last.value) + .ok_or(Error::::ArithmeticOverflow)?; + if temp <= value { + unlocking_balance = temp; + ledger.unlocking.pop(); + } else { + let diff = value + .checked_sub(&unlocking_balance) + .ok_or(Error::::ArithmeticUnderflow)?; + + unlocking_balance = unlocking_balance + .checked_add(&diff) + .ok_or(Error::::ArithmeticOverflow)?; + last.value = + last.value.checked_sub(&diff).ok_or(Error::::ArithmeticUnderflow)?; + } + + if unlocking_balance >= value { + break + } + } + + Ok((ledger, unlocking_balance)) + } } impl CustomerCharger for Pallet { @@ -591,8 +598,6 @@ pub mod pallet { .total .checked_sub(&amount_to_deduct) .ok_or(Error::::ArithmeticUnderflow)?; - - >::insert(&content_owner, &ledger); } else { let diff = amount_to_deduct .checked_sub(&ledger.active) @@ -605,11 +610,10 @@ pub mod pallet { .ok_or(Error::::ArithmeticUnderflow)?; ledger.active = BalanceOf::::zero(); - let (ledger, charged) = ledger.charge_unlocking(diff)?; + let (_ledger, charged) = Self::charge_unlocking(ledger, diff)?; + ledger = _ledger; actually_charged.checked_add(&charged).ok_or(Error::::ArithmeticUnderflow)?; - - >::insert(&content_owner, &ledger); } ::Currency::transfer( @@ -619,6 +623,7 @@ pub mod pallet { ExistenceRequirement::AllowDeath, )?; + >::insert(&content_owner, &ledger); // update state after successful transfer Self::deposit_event(Event::::Charged(content_owner, amount_to_deduct)); Ok(actually_charged.saturated_into::()) diff --git a/pallets/ddc-customers/src/mock.rs b/pallets/ddc-customers/src/mock.rs index 3e779f06c..7b07b6b06 100644 --- a/pallets/ddc-customers/src/mock.rs +++ b/pallets/ddc-customers/src/mock.rs @@ -9,7 +9,7 @@ use ddc_traits::cluster::{ }; use frame_support::{ construct_runtime, parameter_types, - traits::{ConstU32, ConstU64, Everything}, + traits::{ConstU32, ConstU64, Everything, GenesisBuild}, weights::constants::RocksDbWeight, }; use frame_system::mocking::{MockBlock, MockUncheckedExtrinsic}; @@ -18,13 +18,13 @@ use sp_io::TestExternalities; use sp_runtime::{ testing::Header, traits::{BlakeTwo256, IdentityLookup}, - DispatchResult, Perbill, + DispatchResult, Perquintill, }; use crate::{self as pallet_ddc_customers, *}; /// The AccountId alias in this test module. -pub(crate) type AccountId = u64; +pub(crate) type AccountId = u128; pub(crate) type AccountIndex = u64; pub(crate) type BlockNumber = u64; pub(crate) type Balance = u128; @@ -147,9 +147,9 @@ impl ClusterVisitor for TestClusterVisitor { fn get_fees_params(_cluster_id: &ClusterId) -> Result { Ok(ClusterFeesParams { - treasury_share: Perbill::from_percent(1), - validators_share: Perbill::from_percent(10), - cluster_reserve_share: Perbill::from_percent(2), + treasury_share: Perquintill::from_percent(1), + validators_share: Perquintill::from_percent(10), + cluster_reserve_share: Perquintill::from_percent(2), }) } @@ -223,11 +223,17 @@ impl ExtBuilder { sp_tracing::try_init_simple(); let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); - let _ = pallet_balances::GenesisConfig:: { + let _balance_genesis = pallet_balances::GenesisConfig:: { balances: vec![(1, 100), (2, 100), (3, 1000)], } .assimilate_storage(&mut storage); + let _customer_genesis = pallet_ddc_customers::GenesisConfig:: { + feeder_account: None, + buckets: Default::default(), + } + .assimilate_storage(&mut storage); + TestExternalities::new(storage) } pub fn build_and_execute(self, test: impl FnOnce()) { diff --git a/pallets/ddc-customers/src/tests.rs b/pallets/ddc-customers/src/tests.rs index e88846a5c..9a7738ca5 100644 --- a/pallets/ddc-customers/src/tests.rs +++ b/pallets/ddc-customers/src/tests.rs @@ -2,7 +2,6 @@ use ddc_primitives::ClusterId; use frame_support::{assert_noop, assert_ok}; -use frame_system::Config; use super::{mock::*, *}; @@ -164,8 +163,8 @@ fn charge_content_owner_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); - let account_3 = 3; - let vault = 4; + let account_3: u128 = 3; + let vault: u128 = 4; let deposit = 100_u128; let balance_before_deposit = Balances::free_balance(account_3); @@ -175,7 +174,7 @@ fn charge_content_owner_works() { assert_eq!(balance_before_deposit - deposit, balance_after_deposit); let pallet_balance = Balances::free_balance(DdcCustomers::account_id()); - assert_eq!(deposit, pallet_balance); + assert_eq!(deposit, pallet_balance - Balances::minimum_balance()); // Check storage assert_eq!( @@ -229,7 +228,10 @@ fn charge_content_owner_works() { }) ); - assert_eq!(0, Balances::free_balance(DdcCustomers::account_id())); + assert_eq!( + 0, + Balances::free_balance(DdcCustomers::account_id()) - Balances::minimum_balance() + ); assert_eq!(charge_result, deposit - charge1); assert_ok!(DdcCustomers::deposit_extra(RuntimeOrigin::signed(account_3), deposit)); @@ -243,7 +245,10 @@ fn charge_content_owner_works() { }) ); - assert_eq!(deposit, Balances::free_balance(DdcCustomers::account_id())); + assert_eq!( + deposit, + Balances::free_balance(DdcCustomers::account_id()) - Balances::minimum_balance() + ); }) } @@ -264,14 +269,7 @@ fn unlock_and_withdraw_deposit_works() { assert_ok!(DdcCustomers::unlock_deposit(RuntimeOrigin::signed(account_1), 1_u128)); System::set_block_number(2); - let mut unlocking_chunks: BoundedVec< - UnlockChunk::BlockNumber>, - MaxUnlockingChunks, - > = Default::default(); - match unlocking_chunks.try_push(UnlockChunk { value: 1, block: 11 }) { - Ok(_) => (), - Err(_) => println!("No more chunks"), - }; + let unlocking_chunks = vec![UnlockChunk { value: 1, block: 11 }]; // Check storage assert_eq!( DdcCustomers::ledger(&1), @@ -279,7 +277,7 @@ fn unlock_and_withdraw_deposit_works() { owner: account_1, total: 35_u128, active: 34_u128, - unlocking: unlocking_chunks.clone(), + unlocking: BoundedVec::try_from(unlocking_chunks).unwrap(), }) ); diff --git a/pallets/ddc-customers/src/weights.rs b/pallets/ddc-customers/src/weights.rs index 09351dbe1..0a3c999dc 100644 --- a/pallets/ddc-customers/src/weights.rs +++ b/pallets/ddc-customers/src/weights.rs @@ -1,9 +1,9 @@ //! Autogenerated weights for pallet_ddc_customers //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-15, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! HOSTNAME: `Yahors-MacBook-Pro.local`, CPU: `` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! DATE: 2023-12-20, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `bench`, CPU: `DO-Premium-AMD` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Interpreted, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: // ./target/release/cere @@ -43,47 +43,47 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcClusters Clusters (r:1 w:0) // Storage: DdcCustomers Buckets (r:0 w:1) fn create_bucket() -> Weight { - Weight::from_ref_time(17_000_000_u64) + Weight::from_ref_time(156_518_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn deposit() -> Weight { - Weight::from_ref_time(28_000_000_u64) + Weight::from_ref_time(439_562_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn deposit_extra() -> Weight { - Weight::from_ref_time(29_000_000_u64) + Weight::from_ref_time(582_699_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) fn unlock_deposit() -> Weight { - Weight::from_ref_time(16_000_000_u64) + Weight::from_ref_time(208_316_000_u64) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unlocked_deposit_update() -> Weight { - Weight::from_ref_time(30_000_000_u64) + Weight::from_ref_time(451_983_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unlocked_deposit_kill() -> Weight { - Weight::from_ref_time(32_000_000_u64) + Weight::from_ref_time(599_908_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Buckets (r:1 w:1) fn set_bucket_params() -> Weight { - Weight::from_ref_time(14_000_000_u64) + Weight::from_ref_time(155_437_000_u64) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -95,48 +95,48 @@ impl WeightInfo for () { // Storage: DdcClusters Clusters (r:1 w:0) // Storage: DdcCustomers Buckets (r:0 w:1) fn create_bucket() -> Weight { - Weight::from_ref_time(17_000_000_u64) + Weight::from_ref_time(156_518_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn deposit() -> Weight { - Weight::from_ref_time(28_000_000_u64) + Weight::from_ref_time(439_562_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn deposit_extra() -> Weight { - Weight::from_ref_time(29_000_000_u64) + Weight::from_ref_time(582_699_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) fn unlock_deposit() -> Weight { - Weight::from_ref_time(16_000_000_u64) + Weight::from_ref_time(208_316_000_u64) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unlocked_deposit_update() -> Weight { - Weight::from_ref_time(30_000_000_u64) + Weight::from_ref_time(451_983_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Ledger (r:1 w:1) // Storage: System Account (r:1 w:1) fn withdraw_unlocked_deposit_kill() -> Weight { - Weight::from_ref_time(32_000_000_u64) + Weight::from_ref_time(599_908_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } // Storage: DdcCustomers Buckets (r:1 w:1) fn set_bucket_params() -> Weight { - Weight::from_ref_time(14_000_000_u64) + Weight::from_ref_time(155_437_000_u64) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } -} +} \ No newline at end of file diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index 9369fd55e..e2a615823 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -5,8 +5,8 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } -ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } +ddc-primitives = { version = "4.8.2", default-features = false, path = "../../primitives" } +ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/pallets/ddc-payouts/Cargo.toml b/pallets/ddc-payouts/Cargo.toml index f7f7e28be..6122a256c 100644 --- a/pallets/ddc-payouts/Cargo.toml +++ b/pallets/ddc-payouts/Cargo.toml @@ -6,8 +6,8 @@ edition = "2021" [dependencies] byte-unit = { version = "4.0.19", default-features = false, features = ["u128"] } codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } -ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } +ddc-primitives = { version = "4.8.2", default-features = false, path = "../../primitives" } +ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/pallets/ddc-payouts/src/benchmarking.rs b/pallets/ddc-payouts/src/benchmarking.rs index 4690b29ac..3967a85cd 100644 --- a/pallets/ddc-payouts/src/benchmarking.rs +++ b/pallets/ddc-payouts/src/benchmarking.rs @@ -3,6 +3,7 @@ use ddc_primitives::{ClusterGovParams, ClusterId, ClusterParams}; pub use frame_benchmarking::{account, benchmarks, whitelist_account}; use frame_system::RawOrigin; +use sp_runtime::Perquintill; use sp_std::prelude::*; use super::*; @@ -61,9 +62,9 @@ fn create_default_cluster(cluster_id: ClusterId) { let cluster_reserve = create_account::("cr", 0, 0); let cluster_params = ClusterParams { node_provider_auth_contract: Default::default() }; let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { - treasury_share: Perbill::from_percent(5), - validators_share: Perbill::from_percent(10), - cluster_reserve_share: Perbill::from_percent(15), + treasury_share: Perquintill::from_percent(5), + validators_share: Perquintill::from_percent(10), + cluster_reserve_share: Perquintill::from_percent(15), unit_per_mb_stored: CERE, unit_per_mb_streamed: CERE, unit_per_put_request: CERE, @@ -349,8 +350,8 @@ benchmarks! { let total_node_usage = NodeUsage { transferred_bytes: 200000000u64.saturating_mul(b.into()), // 200 mb per provider stored_bytes: 100000000u64.saturating_mul(b.into()), // 100 mb per provider - number_of_gets: 10u128.saturating_mul(b.into()), // 10 gets per provider - number_of_puts: 5u128.saturating_mul(b.into()), // 5 puts per provider + number_of_gets: 10u64.saturating_mul(b.into()), // 10 gets per provider + number_of_puts: 10u64.saturating_mul(b.into()), // 5 puts per provider }; let charging_max_batch_index = 0; let mut charging_processed_batches : BoundedBTreeSet = BoundedBTreeSet::default(); diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index 51eb7bc15..8dbd206d5 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -25,7 +25,7 @@ pub(crate) mod mock; #[cfg(test)] mod tests; -use ddc_primitives::{ClusterId, DdcEra}; +use ddc_primitives::{ClusterId, DdcEra, MILLICENTS}; use ddc_traits::{ cluster::{ClusterCreator as ClusterCreatorType, ClusterVisitor as ClusterVisitorType}, customer::{ @@ -43,7 +43,7 @@ use frame_support::{ }; use frame_system::pallet_prelude::*; pub use pallet::*; -use sp_runtime::{PerThing, Perbill}; +use sp_runtime::{traits::Convert, PerThing, Perquintill}; use sp_std::prelude::*; type BatchIndex = u16; @@ -53,8 +53,8 @@ type BatchIndex = u16; pub struct CustomerUsage { pub transferred_bytes: u64, pub stored_bytes: u64, - pub number_of_puts: u128, - pub number_of_gets: u128, + pub number_of_puts: u64, + pub number_of_gets: u64, } /// Stores usage of node provider @@ -62,8 +62,8 @@ pub struct CustomerUsage { pub struct NodeUsage { pub transferred_bytes: u64, pub stored_bytes: u64, - pub number_of_puts: u128, - pub number_of_gets: u128, + pub number_of_puts: u64, + pub number_of_gets: u64, } /// Stores reward in tokens(units) of node provider as per NodeUsage @@ -96,8 +96,14 @@ pub struct CustomerCharge { pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +pub type VoteScoreOf = + <::NominatorsAndValidatorsList as frame_election_provider_support::SortedListProvider< + ::AccountId, + >>::Score; + parameter_types! { pub MaxBatchesCount: u16 = 1000; + pub MaxDust: u128 = MILLICENTS; pub MaxBatchSize: u16 = 1000; } @@ -124,9 +130,10 @@ pub mod pallet { type CustomerDepositor: CustomerDepositorType; type TreasuryVisitor: PalletVisitorType; type ClusterVisitor: ClusterVisitorType; - type ValidatorList: SortedListProvider; + type NominatorsAndValidatorsList: SortedListProvider; type ClusterCreator: ClusterCreatorType>; type WeightInfo: WeightInfo; + type VoteScoreToU64: Convert, u64>; } #[pallet::event] @@ -190,6 +197,19 @@ pub mod pallet { node_provider_id: T::AccountId, amount: u128, }, + NotDistributedReward { + cluster_id: ClusterId, + era: DdcEra, + node_provider_id: T::AccountId, + expected_reward: u128, + distributed_reward: BalanceOf, + }, + NotDistributedOverallReward { + cluster_id: ClusterId, + era: DdcEra, + expected_reward: u128, + total_distributed_reward: u128, + }, RewardingFinished { cluster_id: ClusterId, era: DdcEra, @@ -212,12 +232,12 @@ pub mod pallet { BatchIndexAlreadyProcessed, BatchIndexIsOutOfRange, BatchesMissed, - NotDistributedBalance, BatchIndexOverflow, BoundedVecOverflow, ArithmeticOverflow, NotExpectedClusterState, BatchSizeIsOutOfBounds, + ScoreRetrievalError, } #[pallet::storage] @@ -240,6 +260,11 @@ pub mod pallet { pub type DebtorCustomers = StorageDoubleMap<_, Blake2_128Concat, ClusterId, Blake2_128Concat, T::AccountId, u128>; + #[pallet::storage] + #[pallet::getter(fn owing_providers)] + pub type OwingProviders = + StorageDoubleMap<_, Blake2_128Concat, ClusterId, Blake2_128Concat, T::AccountId, u128>; + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] #[scale_info(skip_type_params(T))] pub struct BillingReport { @@ -286,33 +311,6 @@ pub mod pallet { Finalized = 7, } - #[pallet::genesis_config] - pub struct GenesisConfig { - pub authorised_caller: Option, - pub debtor_customers: Vec<(ClusterId, T::AccountId, u128)>, - } - - #[cfg(feature = "std")] - impl Default for GenesisConfig { - fn default() -> Self { - GenesisConfig { - authorised_caller: Default::default(), - debtor_customers: Default::default(), - } - } - } - - #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { - fn build(&self) { - AuthorisedCaller::::set(self.authorised_caller.clone()); - - for (cluster_id, customer_id, debt) in &self.debtor_customers { - DebtorCustomers::::insert(cluster_id, customer_id, debt); - } - } - } - #[pallet::call] impl Pallet { #[pallet::weight(T::WeightInfo::set_authorised_caller())] @@ -343,13 +341,11 @@ pub mod pallet { Error::::NotExpectedState ); - let mut billing_report = BillingReport:: { - vault: Self::sub_account_id(cluster_id, era), + let billing_report = BillingReport:: { + vault: Self::account_id(), state: State::Initialized, ..Default::default() }; - billing_report.vault = Self::sub_account_id(cluster_id, era); - billing_report.state = State::Initialized; ActiveBillingReports::::insert(cluster_id, era, billing_report); Self::deposit_event(Event::::BillingReportInitialized { cluster_id, era }); @@ -468,8 +464,10 @@ pub mod pallet { if amount_actually_charged > 0 { // something was charged and should be added // calculate ratio - let ratio = - Perbill::from_rational(amount_actually_charged, total_customer_charge); + let ratio = Perquintill::from_rational( + amount_actually_charged, + total_customer_charge, + ); customer_charge.storage = ratio * customer_charge.storage; customer_charge.transfer = ratio * customer_charge.transfer; @@ -682,6 +680,7 @@ pub mod pallet { Error::::BatchIndexAlreadyProcessed ); + let max_dust = MaxDust::get().saturated_into::>(); let mut updated_billing_report = billing_report.clone(); for payee in payees { let node_reward = get_node_reward::( @@ -700,19 +699,40 @@ pub mod pallet { .ok_or(Error::::ArithmeticOverflow)?; let node_provider_id = payee.0; - let reward: BalanceOf = amount_to_reward.saturated_into::>(); + if amount_to_reward > 0 { + let mut reward: BalanceOf = + amount_to_reward.saturated_into::>(); + + let vault_balance = ::Currency::free_balance( + &updated_billing_report.vault, + ) - ::Currency::minimum_balance(); + + if reward > vault_balance { + if reward - vault_balance > max_dust { + Self::deposit_event(Event::::NotDistributedReward { + cluster_id, + era, + node_provider_id: node_provider_id.clone(), + expected_reward: amount_to_reward, + distributed_reward: vault_balance, + }); + } + + reward = vault_balance; + } - ::Currency::transfer( - &updated_billing_report.vault, - &node_provider_id, - reward, - ExistenceRequirement::AllowDeath, - )?; + ::Currency::transfer( + &updated_billing_report.vault, + &node_provider_id, + reward, + ExistenceRequirement::AllowDeath, + )?; - updated_billing_report - .total_distributed_reward - .checked_add(amount_to_reward) - .ok_or(Error::::ArithmeticOverflow)?; + updated_billing_report.total_distributed_reward = updated_billing_report + .total_distributed_reward + .checked_add(amount_to_reward) + .ok_or(Error::::ArithmeticOverflow)?; + } Self::deposit_event(Event::::Rewarded { cluster_id, @@ -754,6 +774,26 @@ pub mod pallet { &billing_report.rewarding_max_batch_index, )?; + let expected_amount_to_reward = (|| -> Option { + billing_report + .total_customer_charge + .transfer + .checked_add(billing_report.total_customer_charge.storage)? + .checked_add(billing_report.total_customer_charge.puts)? + .checked_add(billing_report.total_customer_charge.gets) + })() + .ok_or(Error::::ArithmeticOverflow)?; + + if expected_amount_to_reward - billing_report.total_distributed_reward > MaxDust::get() + { + Self::deposit_event(Event::::NotDistributedOverallReward { + cluster_id, + era, + expected_reward: expected_amount_to_reward, + total_distributed_reward: billing_report.total_distributed_reward, + }); + } + billing_report.state = State::ProvidersRewarded; ActiveBillingReports::::insert(cluster_id, era, billing_report); @@ -775,20 +815,6 @@ pub mod pallet { .map_err(|_| Error::::BillingReportDoesNotExist)?; ensure!(billing_report.state == State::ProvidersRewarded, Error::::NotExpectedState); - let expected_amount_to_reward = (|| -> Option { - billing_report - .total_customer_charge - .transfer - .checked_add(billing_report.total_customer_charge.storage)? - .checked_add(billing_report.total_customer_charge.puts)? - .checked_add(billing_report.total_customer_charge.gets) - })() - .ok_or(Error::::ArithmeticOverflow)?; - - ensure!( - expected_amount_to_reward == billing_report.total_distributed_reward, - Error::::NotDistributedBalance - ); billing_report.charging_processed_batches.clear(); billing_report.rewarding_processed_batches.clear(); @@ -829,20 +855,41 @@ pub mod pallet { ) } + fn get_current_exposure_ratios( + ) -> Result, DispatchError> { + let mut total_score = 0; + let mut individual_scores: Vec<(T::AccountId, u64)> = Vec::new(); + for staker_id in T::NominatorsAndValidatorsList::iter() { + let s = T::NominatorsAndValidatorsList::get_score(&staker_id) + .map_err(|_| Error::::ScoreRetrievalError)?; + let score = T::VoteScoreToU64::convert(s); + total_score += score; + + individual_scores.push((staker_id, score)); + } + + let mut result = Vec::new(); + for (staker_id, score) in individual_scores { + let ratio = Perquintill::from_rational(score, total_score); + result.push((staker_id, ratio)); + } + + Ok(result) + } + fn charge_validator_fees( validators_fee: u128, vault: &T::AccountId, ) -> DispatchResult { - let amount_to_deduct = validators_fee - .checked_div(T::ValidatorList::count().try_into().unwrap()) - .ok_or(Error::::ArithmeticOverflow)? - .saturated_into::>(); + let stakers = get_current_exposure_ratios::()?; + + for (staker_id, ratio) in stakers.iter() { + let amount_to_deduct = *ratio * validators_fee; - for validator_account_id in T::ValidatorList::iter() { ::Currency::transfer( vault, - &validator_account_id, - amount_to_deduct, + staker_id, + amount_to_deduct.saturated_into::>(), ExistenceRequirement::AllowDeath, )?; } @@ -857,20 +904,26 @@ pub mod pallet { ) -> Option { let mut node_reward = NodeReward::default(); - let mut ratio = Perbill::from_rational( - node_usage.transferred_bytes, - total_nodes_usage.transferred_bytes, + let mut ratio = Perquintill::from_rational( + node_usage.transferred_bytes as u128, + total_nodes_usage.transferred_bytes as u128, ); + // ratio multiplied by X will be > 0, < X no overflow node_reward.transfer = ratio * total_customer_charge.transfer; - ratio = Perbill::from_rational(node_usage.stored_bytes, total_nodes_usage.stored_bytes); + ratio = Perquintill::from_rational( + node_usage.stored_bytes as u128, + total_nodes_usage.stored_bytes as u128, + ); node_reward.storage = ratio * total_customer_charge.storage; - ratio = Perbill::from_rational(node_usage.number_of_puts, total_nodes_usage.number_of_puts); + ratio = + Perquintill::from_rational(node_usage.number_of_puts, total_nodes_usage.number_of_puts); node_reward.puts = ratio * total_customer_charge.puts; - ratio = Perbill::from_rational(node_usage.number_of_gets, total_nodes_usage.number_of_gets); + ratio = + Perquintill::from_rational(node_usage.number_of_gets, total_nodes_usage.number_of_gets); node_reward.gets = ratio * total_customer_charge.gets; Some(node_reward) @@ -899,13 +952,11 @@ pub mod pallet { })() .ok_or(Error::::ArithmeticOverflow)?; - total.gets = usage - .number_of_gets + total.gets = (usage.number_of_gets as u128) .checked_mul(pricing.unit_per_get_request) .ok_or(Error::::ArithmeticOverflow)?; - total.puts = usage - .number_of_puts + total.puts = (usage.number_of_puts as u128) .checked_mul(pricing.unit_per_put_request) .ok_or(Error::::ArithmeticOverflow)?; @@ -928,7 +979,55 @@ pub mod pallet { Ok(()) } + #[pallet::genesis_config] + pub struct GenesisConfig { + pub feeder_account: Option, + pub authorised_caller: Option, + pub debtor_customers: Vec<(ClusterId, T::AccountId, u128)>, + } + + #[cfg(feature = "std")] + impl Default for GenesisConfig { + fn default() -> Self { + GenesisConfig { + feeder_account: None, + authorised_caller: Default::default(), + debtor_customers: Default::default(), + } + } + } + + #[pallet::genesis_build] + impl GenesisBuild for GenesisConfig { + fn build(&self) { + let account_id = >::account_id(); + let min = ::Currency::minimum_balance(); + let balance = ::Currency::free_balance(&account_id); + if balance < min { + if let Some(vault) = &self.feeder_account { + let _ = ::Currency::transfer( + vault, + &account_id, + min - balance, + ExistenceRequirement::AllowDeath, + ); + } else { + let _ = ::Currency::make_free_balance_be(&account_id, min); + } + } + + AuthorisedCaller::::set(self.authorised_caller.clone()); + for (cluster_id, customer_id, debt) in &self.debtor_customers { + DebtorCustomers::::insert(cluster_id, customer_id, debt); + } + } + } + impl Pallet { + pub fn account_id() -> T::AccountId { + T::PalletId::get().into_account_truncating() + } + pub fn sub_account_id(cluster_id: ClusterId, era: DdcEra) -> T::AccountId { let mut bytes = Vec::new(); bytes.extend_from_slice(&cluster_id[..]); diff --git a/pallets/ddc-payouts/src/mock.rs b/pallets/ddc-payouts/src/mock.rs index 3ef864f9a..9b01f98a4 100644 --- a/pallets/ddc-payouts/src/mock.rs +++ b/pallets/ddc-payouts/src/mock.rs @@ -4,7 +4,7 @@ use ddc_primitives::{ ClusterBondingParams, ClusterFeesParams, ClusterGovParams, ClusterParams, ClusterPricingParams, - NodeType, + NodeType, DOLLARS, }; use ddc_traits::{ cluster::{ClusterCreator, ClusterVisitor, ClusterVisitorError}, @@ -13,10 +13,8 @@ use ddc_traits::{ }; use frame_election_provider_support::SortedListProvider; use frame_support::{ - construct_runtime, - dispatch::DispatchError, - parameter_types, - traits::{ConstU32, ConstU64, Everything}, + construct_runtime, parameter_types, + traits::{ConstU32, ConstU64, Everything, Randomness}, weights::constants::RocksDbWeight, PalletId, }; @@ -25,14 +23,15 @@ use sp_core::H256; use sp_io::TestExternalities; use sp_runtime::{ testing::Header, - traits::{BlakeTwo256, IdentityLookup}, + traits::{BlakeTwo256, Identity, IdentityLookup}, + DispatchError, Perquintill, }; use sp_std::prelude::*; use crate::{self as pallet_ddc_payouts, *}; /// The AccountId alias in this test module. -pub type AccountId = u64; +pub type AccountId = u128; pub(crate) type AccountIndex = u64; pub(crate) type BlockNumber = u64; pub(crate) type Balance = u128; @@ -50,14 +49,31 @@ construct_runtime!( { System: frame_system::{Pallet, Call, Config, Storage, Event}, Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - DdcPayouts: pallet_ddc_payouts::{Pallet, Call, Storage, Event}, + DdcPayouts: pallet_ddc_payouts::{Pallet, Call, Storage, Config, Event}, } ); +pub static MAX_DUST: u16 = 100; + parameter_types! { pub static ExistentialDeposit: Balance = 1; } +#[derive(Default, Clone)] +pub struct MockRandomness(H256); + +impl Randomness for MockRandomness { + fn random(subject: &[u8]) -> (H256, BlockNumber) { + let (mut r, b) = Self::random_seed(); + r.as_mut()[0..subject.len()].copy_from_slice(subject); + (r, b) + } + + fn random_seed() -> (H256, BlockNumber) { + (H256::default(), BlockNumber::default()) + } +} + impl frame_system::Config for Test { type BaseCallFilter = Everything; type BlockWeights = (); @@ -109,8 +125,10 @@ impl crate::pallet::Config for Test { type CustomerDepositor = TestCustomerDepositor; type ClusterVisitor = TestClusterVisitor; type TreasuryVisitor = TestTreasuryVisitor; - type ValidatorList = TestValidatorVisitor; + type NominatorsAndValidatorsList = TestValidatorVisitor; type ClusterCreator = TestClusterCreator; + + type VoteScoreToU64 = Identity; type WeightInfo = (); } @@ -121,10 +139,28 @@ impl CustomerCharger for TestCustomerCharger { billing_vault: T::AccountId, amount: u128, ) -> Result { - ensure!(amount > 1_000_000, DispatchError::BadOrigin); // any error will do - let mut amount_to_charge = amount; - if amount_to_charge < 50_000_000 { + let mut temp = ACCOUNT_ID_1.to_ne_bytes(); + let account_1 = T::AccountId::decode(&mut &temp[..]).unwrap(); + temp = ACCOUNT_ID_2.to_ne_bytes(); + let account_2 = T::AccountId::decode(&mut &temp[..]).unwrap(); + temp = ACCOUNT_ID_3.to_ne_bytes(); + let account_3 = T::AccountId::decode(&mut &temp[..]).unwrap(); + temp = ACCOUNT_ID_4.to_ne_bytes(); + let account_4 = T::AccountId::decode(&mut &temp[..]).unwrap(); + temp = ACCOUNT_ID_5.to_ne_bytes(); + let account_5 = T::AccountId::decode(&mut &temp[..]).unwrap(); + + if content_owner == account_1 || + content_owner == account_2 || + content_owner == account_3 || + content_owner == account_4 || + content_owner == account_5 + { + ensure!(amount > 1_000_000, DispatchError::BadOrigin); // any error will do + } + + if amount_to_charge < 50_000_000 && content_owner == account_3 { amount_to_charge = PARTIAL_CHARGE; // for user 3 } @@ -140,6 +176,11 @@ impl CustomerCharger for TestCustomerCharger { } } +pub const ACCOUNT_ID_1: AccountId = 1; +pub const ACCOUNT_ID_2: AccountId = 2; +pub const ACCOUNT_ID_3: AccountId = 3; +pub const ACCOUNT_ID_4: AccountId = 4; +pub const ACCOUNT_ID_5: AccountId = 5; pub struct TestClusterCreator; impl ClusterCreator for TestClusterCreator { fn create_new_cluster( @@ -168,10 +209,17 @@ pub const TREASURY_ACCOUNT_ID: AccountId = 888; pub const VALIDATOR1_ACCOUNT_ID: AccountId = 111; pub const VALIDATOR2_ACCOUNT_ID: AccountId = 222; pub const VALIDATOR3_ACCOUNT_ID: AccountId = 333; + +pub const VALIDATOR1_SCORE: u64 = 30; +pub const VALIDATOR2_SCORE: u64 = 45; +pub const VALIDATOR3_SCORE: u64 = 25; + pub const PARTIAL_CHARGE: u128 = 100; pub const USER3_BALANCE: u128 = 1000; pub const FREE_CLUSTER_ID: ClusterId = ClusterId::zero(); +pub const ONE_CLUSTER_ID: ClusterId = ClusterId::repeat_byte(5u8); +pub const CERE_CLUSTER_ID: ClusterId = ClusterId::repeat_byte(10u8); pub const PRICING_PARAMS: ClusterPricingParams = ClusterPricingParams { unit_per_mb_streamed: 2_000_000, @@ -180,16 +228,30 @@ pub const PRICING_PARAMS: ClusterPricingParams = ClusterPricingParams { unit_per_get_request: 5_000_000, }; +pub const PRICING_PARAMS_ONE: ClusterPricingParams = ClusterPricingParams { + unit_per_mb_streamed: 10_000_000_000, + unit_per_mb_stored: 10_000_000_000, + unit_per_put_request: 10_000_000_000, + unit_per_get_request: 10_000_000_000, +}; + +pub const PRICING_PARAMS_CERE: ClusterPricingParams = ClusterPricingParams { + unit_per_mb_streamed: DOLLARS, + unit_per_mb_stored: DOLLARS, + unit_per_put_request: DOLLARS, + unit_per_get_request: DOLLARS, +}; + pub const PRICING_FEES: ClusterFeesParams = ClusterFeesParams { - treasury_share: Perbill::from_percent(1), - validators_share: Perbill::from_percent(10), - cluster_reserve_share: Perbill::from_percent(2), + treasury_share: Perquintill::from_percent(1), + validators_share: Perquintill::from_percent(10), + cluster_reserve_share: Perquintill::from_percent(2), }; pub const PRICING_FEES_ZERO: ClusterFeesParams = ClusterFeesParams { - treasury_share: Perbill::from_percent(0), - validators_share: Perbill::from_percent(0), - cluster_reserve_share: Perbill::from_percent(0), + treasury_share: Perquintill::from_percent(0), + validators_share: Perquintill::from_percent(0), + cluster_reserve_share: Perquintill::from_percent(0), }; pub struct TestTreasuryVisitor; @@ -200,7 +262,7 @@ impl PalletVisitor for TestTreasuryVisitor { } } -fn create_account_id_from_u64(id: u64) -> T::AccountId { +fn create_account_id_from_u128(id: u128) -> T::AccountId { let bytes = id.to_ne_bytes(); T::AccountId::decode(&mut &bytes[..]).unwrap() } @@ -214,9 +276,9 @@ impl SortedListProvider for TestValidator fn iter() -> Box> { Box::new( vec![ - create_account_id_from_u64::(VALIDATOR1_ACCOUNT_ID), - create_account_id_from_u64::(VALIDATOR2_ACCOUNT_ID), - create_account_id_from_u64::(VALIDATOR3_ACCOUNT_ID), + create_account_id_from_u128::(VALIDATOR1_ACCOUNT_ID), + create_account_id_from_u128::(VALIDATOR2_ACCOUNT_ID), + create_account_id_from_u128::(VALIDATOR3_ACCOUNT_ID), ] .into_iter(), ) @@ -236,8 +298,14 @@ impl SortedListProvider for TestValidator // nothing to do on insert. Ok(()) } - fn get_score(_id: &T::AccountId) -> Result { - unimplemented!() + fn get_score(validator_id: &T::AccountId) -> Result { + if *validator_id == create_account_id_from_u128::(VALIDATOR1_ACCOUNT_ID) { + Ok(VALIDATOR1_SCORE) + } else if *validator_id == create_account_id_from_u128::(VALIDATOR2_ACCOUNT_ID) { + Ok(VALIDATOR2_SCORE) + } else { + Ok(VALIDATOR3_SCORE) + } } fn on_update(_: &T::AccountId, _weight: Self::Score) -> Result<(), Self::Error> { // nothing to do on update. @@ -269,11 +337,24 @@ impl SortedListProvider for TestValidator } } -pub fn get_fees(cluster_id: &ClusterId) -> Result { - if *cluster_id == FREE_CLUSTER_ID { - Ok(PRICING_FEES_ZERO) +pub fn get_fees(cluster_id: &ClusterId) -> ClusterFeesParams { + if *cluster_id == FREE_CLUSTER_ID || + *cluster_id == ONE_CLUSTER_ID || + *cluster_id == CERE_CLUSTER_ID + { + PRICING_FEES_ZERO + } else { + PRICING_FEES + } +} + +pub fn get_pricing(cluster_id: &ClusterId) -> ClusterPricingParams { + if *cluster_id == FREE_CLUSTER_ID || *cluster_id == ONE_CLUSTER_ID { + PRICING_PARAMS_ONE + } else if *cluster_id == CERE_CLUSTER_ID { + PRICING_PARAMS_CERE } else { - Ok(PRICING_FEES) + PRICING_PARAMS } } @@ -302,13 +383,13 @@ impl ClusterVisitor for TestClusterVisitor { } fn get_pricing_params( - _cluster_id: &ClusterId, + cluster_id: &ClusterId, ) -> Result { - Ok(PRICING_PARAMS) + Ok(get_pricing(cluster_id)) } fn get_fees_params(cluster_id: &ClusterId) -> Result { - get_fees(cluster_id) + Ok(get_fees(cluster_id)) } fn get_reserve_account_id( @@ -334,16 +415,24 @@ impl ExtBuilder { sp_tracing::try_init_simple(); let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); - let _ = pallet_balances::GenesisConfig:: { + let _balance_genesis = pallet_balances::GenesisConfig:: { balances: vec![ - (1, 1000000000000000000000000), + (1, 10000000000000000000000000000), (2, 10), // < PARTIAL_CHARGE (3, USER3_BALANCE), // > PARTIAL_CHARGE (4, 1000000000000000000000000), + (5, 1000000000000000000000000), ], } .assimilate_storage(&mut storage); + let _payout_genesis = pallet_ddc_payouts::GenesisConfig:: { + feeder_account: None, + debtor_customers: Default::default(), + authorised_caller: None, + } + .assimilate_storage(&mut storage); + TestExternalities::new(storage) } pub fn build_and_execute(self, test: impl FnOnce()) { diff --git a/pallets/ddc-payouts/src/tests.rs b/pallets/ddc-payouts/src/tests.rs index 6cd8d2552..2b4c9a1d9 100644 --- a/pallets/ddc-payouts/src/tests.rs +++ b/pallets/ddc-payouts/src/tests.rs @@ -1,7 +1,9 @@ //! Tests for the module. use ddc_primitives::ClusterId; -use frame_support::{assert_noop, assert_ok, error::BadOrigin}; +use frame_support::{assert_noop, assert_ok, error::BadOrigin, traits::Randomness}; +use sp_core::H256; +use sp_runtime::Perquintill; use super::{mock::*, *}; @@ -10,8 +12,8 @@ fn set_authorised_caller_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); - let root_account = 1u64; - let dac_account = 2u64; + let root_account = 1u128; + let dac_account = 2u128; assert_noop!( DdcPayouts::set_authorised_caller(RuntimeOrigin::signed(root_account), dac_account), @@ -31,8 +33,8 @@ fn set_authorised_caller_works() { #[test] fn begin_billing_report_fails_for_unauthorised() { ExtBuilder.build_and_execute(|| { - let root_account = 1u64; - let dac_account = 2u64; + let root_account = 1u128; + let dac_account = 2u128; let cluster_id = ClusterId::from([1; 20]); let era = 100; @@ -59,7 +61,7 @@ fn begin_billing_report_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); - let dac_account = 2u64; + let dac_account = 2u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; @@ -81,7 +83,7 @@ fn begin_billing_report_works() { #[test] fn begin_charging_customers_fails_uninitialised() { ExtBuilder.build_and_execute(|| { - let dac_account = 2u64; + let dac_account = 2u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 2; @@ -125,7 +127,7 @@ fn begin_charging_customers_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); - let dac_account = 2u64; + let dac_account = 2u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 2; @@ -156,10 +158,10 @@ fn begin_charging_customers_works() { #[test] fn send_charging_customers_batch_fails_uninitialised() { ExtBuilder.build_and_execute(|| { - let root_account = 1u64; - let dac_account = 2u64; - let user1 = 3u64; - let user2 = 4u64; + let root_account = 1u128; + let dac_account = 2u128; + let user1 = 3u128; + let user2 = 4u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 2; @@ -258,32 +260,34 @@ fn send_charging_customers_batch_fails_uninitialised() { }) } -fn calculate_charge_parts(usage: CustomerUsage) -> CustomerCharge { +fn calculate_charge_parts(cluster_id: ClusterId, usage: CustomerUsage) -> CustomerCharge { + let pricing_params = get_pricing(&cluster_id); + CustomerCharge { - transfer: PRICING_PARAMS.unit_per_mb_streamed * (usage.transferred_bytes as u128) / + transfer: pricing_params.unit_per_mb_streamed * (usage.transferred_bytes as u128) / byte_unit::MEBIBYTE, - storage: (PRICING_PARAMS.unit_per_mb_stored * usage.stored_bytes as u128) / + storage: (pricing_params.unit_per_mb_stored * usage.stored_bytes as u128) / byte_unit::MEBIBYTE, - puts: PRICING_PARAMS.unit_per_put_request * usage.number_of_puts, - gets: PRICING_PARAMS.unit_per_get_request * usage.number_of_gets, + puts: pricing_params.unit_per_put_request * (usage.number_of_puts as u128), + gets: pricing_params.unit_per_get_request * (usage.number_of_gets as u128), } } -fn calculate_charge(usage: CustomerUsage) -> u128 { - let charge = calculate_charge_parts(usage); +fn calculate_charge(cluster_id: ClusterId, usage: CustomerUsage) -> u128 { + let charge = calculate_charge_parts(cluster_id, usage); charge.transfer + charge.storage + charge.puts + charge.gets } #[test] -fn send_charging_customers_batch_works() { +fn send_charging_customers_batch_works1() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); - let dac_account = 123u64; - let user1 = 1u64; - let user2_debtor = 2u64; - let user3_debtor = 3u64; - let user4 = 4u64; + let dac_account = 123u128; + let user1 = 1u128; + let user2_debtor = 2u128; + let user3_debtor = 3u128; + let user4 = 4u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 3; @@ -344,17 +348,17 @@ fn send_charging_customers_batch_works() { payers1, )); - let usage4_charge = calculate_charge(usage4.clone()); - let mut balance = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); - assert_eq!(balance, usage4_charge); + let usage4_charge = calculate_charge(cluster_id, usage4.clone()); + let mut balance = Balances::free_balance(DdcPayouts::account_id()); + assert_eq!(balance - Balances::minimum_balance(), usage4_charge); let user2_debt = DdcPayouts::debtor_customers(cluster_id, user2_debtor).unwrap(); - let mut debt = calculate_charge(usage2.clone()); + let mut debt = calculate_charge(cluster_id, usage2.clone()); assert_eq!(user2_debt, debt); let mut report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); - let charge2 = calculate_charge_parts(usage2); - let charge4 = calculate_charge_parts(usage4); + let charge2 = calculate_charge_parts(cluster_id, usage2); + let charge4 = calculate_charge_parts(cluster_id, usage4); assert_eq!(charge2.puts + charge4.puts, report.total_customer_charge.puts); assert_eq!(charge2.gets + charge4.gets, report.total_customer_charge.gets); assert_eq!(charge2.storage + charge4.storage, report.total_customer_charge.storage); @@ -392,7 +396,7 @@ fn send_charging_customers_batch_works() { .into(), ); - assert_eq!(System::events().len(), 5 + 3 + 1); // 3 for Currency::transfer + assert_eq!(System::events().len(), 5 + 1 + 1); // 1 for Currency::transfer // batch 2 let mut before_total_customer_charge = report.total_customer_charge.clone(); @@ -411,13 +415,13 @@ fn send_charging_customers_batch_works() { era, batch_index, customer_id: user1, - amount: calculate_charge(usage1.clone()), + amount: calculate_charge(cluster_id, usage1.clone()), } .into(), ); report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); - let charge1 = calculate_charge_parts(usage1); + let charge1 = calculate_charge_parts(cluster_id, usage1); assert_eq!( charge1.puts + before_total_customer_charge.puts, report.total_customer_charge.puts @@ -439,10 +443,10 @@ fn send_charging_customers_batch_works() { let user1_debt = DdcPayouts::debtor_customers(cluster_id, user1); assert_eq!(user1_debt, None); - let balance_before = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); + let balance_before = Balances::free_balance(DdcPayouts::account_id()); // batch 3 - batch_index += 2; + batch_index += 1; before_total_customer_charge = report.total_customer_charge.clone(); assert_ok!(DdcPayouts::send_charging_customers_batch( RuntimeOrigin::signed(dac_account), @@ -452,9 +456,9 @@ fn send_charging_customers_batch_works() { payers3, )); - let user3_charge = calculate_charge(usage3.clone()); - let charge3 = calculate_charge_parts(usage3); - let ratio = Perbill::from_rational(PARTIAL_CHARGE, user3_charge); + let user3_charge = calculate_charge(cluster_id, usage3.clone()); + let charge3 = calculate_charge_parts(cluster_id, usage3); + let ratio = Perquintill::from_rational(PARTIAL_CHARGE, user3_charge); report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); assert_eq!( ratio * charge3.puts + before_total_customer_charge.puts, @@ -473,7 +477,7 @@ fn send_charging_customers_batch_works() { report.total_customer_charge.transfer ); - balance = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); + balance = Balances::free_balance(DdcPayouts::account_id()); assert_eq!(balance, balance_before + PARTIAL_CHARGE); let user3_debt = DdcPayouts::debtor_customers(cluster_id, user3_debtor).unwrap(); @@ -504,12 +508,83 @@ fn send_charging_customers_batch_works() { }) } +#[test] +fn send_charging_customers_batch_works2() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let dac_account = 123u128; + let user5 = 5u128; + let cluster_id = ONE_CLUSTER_ID; + let era = 100; + let max_batch_index = 0; + let batch_index = 0; + let usage5 = CustomerUsage { + // should pass without debt + transferred_bytes: 1024, + stored_bytes: 1024, + number_of_puts: 1, + number_of_gets: 1, + }; + let payers5 = vec![(user5, usage5.clone())]; + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + max_batch_index, + )); + assert_eq!(System::events().len(), 3); + + // batch 1 + let mut report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let before_total_customer_charge = report.total_customer_charge.clone(); + let balance_before = Balances::free_balance(DdcPayouts::account_id()); + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_index, + payers5, + )); + + let usage5_charge = calculate_charge(cluster_id, usage5.clone()); + let charge5 = calculate_charge_parts(cluster_id, usage5); + let balance = Balances::free_balance(DdcPayouts::account_id()); + report = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + assert_eq!(balance, usage5_charge + balance_before); + assert_eq!( + charge5.puts + before_total_customer_charge.puts, + report.total_customer_charge.puts + ); + assert_eq!( + charge5.gets + before_total_customer_charge.gets, + report.total_customer_charge.gets + ); + assert_eq!( + charge5.storage + before_total_customer_charge.storage, + report.total_customer_charge.storage + ); + assert_eq!( + charge5.transfer + before_total_customer_charge.transfer, + report.total_customer_charge.transfer + ); + }) +} + #[test] fn end_charging_customers_fails_uninitialised() { ExtBuilder.build_and_execute(|| { - let root_account = 100u64; - let dac_account = 123u64; - let user1 = 1u64; + let root_account = 100u128; + let dac_account = 123u128; + let user1 = 1u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 2; @@ -580,8 +655,8 @@ fn end_charging_customers_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); - let dac_account = 123u64; - let user1 = 1u64; + let dac_account = 123u128; + let user1 = 1u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 0; @@ -618,15 +693,15 @@ fn end_charging_customers_works() { )); let report_before = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); - let charge = calculate_charge(usage1); + let charge = calculate_charge(cluster_id, usage1); System::assert_last_event( Event::Charged { cluster_id, era, batch_index, customer_id: user1, amount: charge } .into(), ); - let mut balance = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); - assert_eq!(balance, charge); - assert_eq!(System::events().len(), 4 + 3); // 3 for Currency::transfer + let mut balance = Balances::free_balance(DdcPayouts::account_id()); + assert_eq!(balance - Balances::minimum_balance(), charge); + assert_eq!(System::events().len(), 4 + 1); // 1 for Currency::transfer assert_ok!(DdcPayouts::end_charging_customers( RuntimeOrigin::signed(dac_account), @@ -636,9 +711,9 @@ fn end_charging_customers_works() { System::assert_has_event(Event::ChargingFinished { cluster_id, era }.into()); - let treasury_fee = PRICING_FEES.treasury_share * charge; - let reserve_fee = PRICING_FEES.cluster_reserve_share * charge; - let validator_fee = PRICING_FEES.validators_share * charge; + let treasury_fee = get_fees(&cluster_id).treasury_share * charge; + let reserve_fee = get_fees(&cluster_id).cluster_reserve_share * charge; + let validator_fee = get_fees(&cluster_id).validators_share * charge; System::assert_has_event( Event::TreasuryFeesCollected { cluster_id, era, amount: treasury_fee }.into(), @@ -653,30 +728,42 @@ fn end_charging_customers_works() { ); let transfers = 3 + 3 + 3 * 3; // for Currency::transfer - assert_eq!(System::events().len(), 7 + 1 + 3 + transfers); + assert_eq!(System::events().len(), 5 + 1 + 3 + transfers); let report_after = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); assert_eq!(report_after.state, State::CustomersChargedWithFees); - let total_left_from_one = (PRICING_FEES.treasury_share + - PRICING_FEES.validators_share + - PRICING_FEES.cluster_reserve_share) + let total_left_from_one = (get_fees(&cluster_id).treasury_share + + get_fees(&cluster_id).validators_share + + get_fees(&cluster_id).cluster_reserve_share) .left_from_one(); balance = Balances::free_balance(TREASURY_ACCOUNT_ID); - assert_eq!(balance, PRICING_FEES.treasury_share * charge); + assert_eq!(balance, get_fees(&cluster_id).treasury_share * charge); balance = Balances::free_balance(RESERVE_ACCOUNT_ID); - assert_eq!(balance, PRICING_FEES.cluster_reserve_share * charge); + assert_eq!(balance, get_fees(&cluster_id).cluster_reserve_share * charge); balance = Balances::free_balance(VALIDATOR1_ACCOUNT_ID); - assert_eq!(balance, PRICING_FEES.validators_share * charge / 3); + let mut ratio = Perquintill::from_rational( + VALIDATOR1_SCORE, + VALIDATOR1_SCORE + VALIDATOR2_SCORE + VALIDATOR3_SCORE, + ); + assert_eq!(balance, get_fees(&cluster_id).validators_share * ratio * charge); balance = Balances::free_balance(VALIDATOR2_ACCOUNT_ID); - assert_eq!(balance, PRICING_FEES.validators_share * charge / 3); + ratio = Perquintill::from_rational( + VALIDATOR2_SCORE, + VALIDATOR1_SCORE + VALIDATOR2_SCORE + VALIDATOR3_SCORE, + ); + assert_eq!(balance, get_fees(&cluster_id).validators_share * ratio * charge); balance = Balances::free_balance(VALIDATOR3_ACCOUNT_ID); - assert_eq!(balance, PRICING_FEES.validators_share * charge / 3); + ratio = Perquintill::from_rational( + VALIDATOR3_SCORE, + VALIDATOR1_SCORE + VALIDATOR2_SCORE + VALIDATOR3_SCORE, + ); + assert_eq!(balance, get_fees(&cluster_id).validators_share * ratio * charge); assert_eq!( report_after.total_customer_charge.transfer, @@ -702,8 +789,8 @@ fn end_charging_customers_works_zero_fees() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); - let dac_account = 123u64; - let user1 = 1u64; + let dac_account = 123u128; + let user1 = 1u128; let cluster_id = ClusterId::zero(); let era = 100; let max_batch_index = 0; @@ -711,8 +798,8 @@ fn end_charging_customers_works_zero_fees() { let usage1 = CustomerUsage { transferred_bytes: 23452345, stored_bytes: 3345234523, - number_of_puts: 4456456345234523, - number_of_gets: 523423, + number_of_puts: 1, + number_of_gets: 1, }; let payers = vec![(user1, usage1.clone())]; @@ -740,15 +827,15 @@ fn end_charging_customers_works_zero_fees() { )); let report_before = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); - let charge = calculate_charge(usage1); + let charge = calculate_charge(cluster_id, usage1); System::assert_last_event( Event::Charged { cluster_id, era, customer_id: user1, batch_index, amount: charge } .into(), ); - let mut balance = Balances::free_balance(DdcPayouts::sub_account_id(cluster_id, era)); - assert_eq!(balance, charge); - assert_eq!(System::events().len(), 4 + 3); // 3 for Currency::transfer + let mut balance = Balances::free_balance(DdcPayouts::account_id()); + assert_eq!(balance - Balances::minimum_balance(), charge); + assert_eq!(System::events().len(), 4 + 1); // 1 for Currency::transfer assert_ok!(DdcPayouts::end_charging_customers( RuntimeOrigin::signed(dac_account), @@ -757,22 +844,22 @@ fn end_charging_customers_works_zero_fees() { )); System::assert_has_event(Event::ChargingFinished { cluster_id, era }.into()); - assert_eq!(System::events().len(), 7 + 1); + assert_eq!(System::events().len(), 5 + 1); let report_after = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); assert_eq!(report_after.state, State::CustomersChargedWithFees); - let fees = get_fees(&cluster_id).unwrap(); + let fees = get_fees(&cluster_id); let total_left_from_one = (fees.treasury_share + fees.validators_share + fees.cluster_reserve_share) .left_from_one(); - assert_eq!(total_left_from_one, Perbill::one()); + assert_eq!(total_left_from_one, Perquintill::one()); - assert_eq!(fees.treasury_share, Perbill::zero()); - assert_eq!(fees.validators_share, Perbill::zero()); - assert_eq!(fees.cluster_reserve_share, Perbill::zero()); + assert_eq!(fees.treasury_share, Perquintill::zero()); + assert_eq!(fees.validators_share, Perquintill::zero()); + assert_eq!(fees.cluster_reserve_share, Perquintill::zero()); balance = Balances::free_balance(TREASURY_ACCOUNT_ID); assert_eq!(balance, 0); @@ -811,9 +898,9 @@ fn end_charging_customers_works_zero_fees() { #[test] fn begin_rewarding_providers_fails_uninitialised() { ExtBuilder.build_and_execute(|| { - let root_account = 1u64; - let dac_account = 2u64; - let user1 = 3u64; + let root_account = 1u128; + let dac_account = 2u128; + let user1 = 3u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 2; @@ -936,8 +1023,8 @@ fn begin_rewarding_providers_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); - let dac_account = 123u64; - let user1 = 1u64; + let dac_account = 123u128; + let user1 = 1u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 0; @@ -995,11 +1082,11 @@ fn begin_rewarding_providers_works() { #[test] fn send_rewarding_providers_batch_fails_uninitialised() { ExtBuilder.build_and_execute(|| { - let root_account = 1u64; - let dac_account = 2u64; - let user1 = 3u64; - let user2 = 4u64; - let node1 = 33u64; + let root_account = 1u128; + let dac_account = 2u128; + let user1 = 3u128; + let user2 = 4u128; + let node1 = 33u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 1; @@ -1140,11 +1227,11 @@ fn send_rewarding_providers_batch_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); - let dac_account = 123u64; - let user1 = 1u64; - let node1 = 10u64; - let node2 = 11u64; - let node3 = 12u64; + let dac_account = 123u128; + let user1 = 1u128; + let node1 = 10u128; + let node2 = 11u128; + let node3 = 12u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 0; @@ -1232,9 +1319,9 @@ fn send_rewarding_providers_batch_works() { )); let report_after = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); - let total_left_from_one = (PRICING_FEES.treasury_share + - PRICING_FEES.validators_share + - PRICING_FEES.cluster_reserve_share) + let total_left_from_one = (get_fees(&cluster_id).treasury_share + + get_fees(&cluster_id).validators_share + + get_fees(&cluster_id).cluster_reserve_share) .left_from_one(); assert_eq!( @@ -1270,46 +1357,59 @@ fn send_rewarding_providers_batch_works() { payees1, )); - let mut ratio = Perbill::from_rational( + let ratio1_transfer = Perquintill::from_rational( node_usage1.transferred_bytes, total_nodes_usage.transferred_bytes, ); - let mut transfer_charge = ratio * report_after.total_customer_charge.transfer; + let mut transfer_charge = ratio1_transfer * report_after.total_customer_charge.transfer; - ratio = Perbill::from_rational(node_usage1.stored_bytes, total_nodes_usage.stored_bytes); - let mut storage_charge = ratio * report_after.total_customer_charge.storage; + let ratio1_storage = + Perquintill::from_rational(node_usage1.stored_bytes, total_nodes_usage.stored_bytes); + let mut storage_charge = ratio1_storage * report_after.total_customer_charge.storage; - ratio = - Perbill::from_rational(node_usage1.number_of_puts, total_nodes_usage.number_of_puts); - let mut puts_charge = ratio * report_after.total_customer_charge.puts; + let ratio1_puts = Perquintill::from_rational( + node_usage1.number_of_puts, + total_nodes_usage.number_of_puts, + ); + let mut puts_charge = ratio1_puts * report_after.total_customer_charge.puts; - ratio = - Perbill::from_rational(node_usage1.number_of_gets, total_nodes_usage.number_of_gets); - let mut gets_charge = ratio * report_after.total_customer_charge.gets; + let ratio1_gets = Perquintill::from_rational( + node_usage1.number_of_gets, + total_nodes_usage.number_of_gets, + ); + let mut gets_charge = ratio1_gets * report_after.total_customer_charge.gets; - let mut balance = Balances::free_balance(node1); - assert_eq!(balance, transfer_charge + storage_charge + puts_charge + gets_charge); + let balance_node1 = Balances::free_balance(node1); + assert_eq!(balance_node1, transfer_charge + storage_charge + puts_charge + gets_charge); + let mut report_reward = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); - ratio = Perbill::from_rational( + let ratio2_transfer = Perquintill::from_rational( node_usage2.transferred_bytes, total_nodes_usage.transferred_bytes, ); - transfer_charge = ratio * report_after.total_customer_charge.transfer; + transfer_charge = ratio2_transfer * report_after.total_customer_charge.transfer; - ratio = Perbill::from_rational(node_usage2.stored_bytes, total_nodes_usage.stored_bytes); - storage_charge = ratio * report_after.total_customer_charge.storage; + let ratio2_storage = + Perquintill::from_rational(node_usage2.stored_bytes, total_nodes_usage.stored_bytes); + storage_charge = ratio2_storage * report_after.total_customer_charge.storage; - ratio = - Perbill::from_rational(node_usage2.number_of_puts, total_nodes_usage.number_of_puts); - puts_charge = ratio * report_after.total_customer_charge.puts; + let ratio2_puts = Perquintill::from_rational( + node_usage2.number_of_puts, + total_nodes_usage.number_of_puts, + ); + puts_charge = ratio2_puts * report_after.total_customer_charge.puts; - ratio = - Perbill::from_rational(node_usage2.number_of_gets, total_nodes_usage.number_of_gets); - gets_charge = ratio * report_after.total_customer_charge.gets; + let ratio2_gets = Perquintill::from_rational( + node_usage2.number_of_gets, + total_nodes_usage.number_of_gets, + ); + gets_charge = ratio2_gets * report_after.total_customer_charge.gets; - balance = Balances::free_balance(node2); - assert_eq!(balance, transfer_charge + storage_charge + puts_charge + gets_charge); + let balance_node2 = Balances::free_balance(node2); + assert_eq!(balance_node2, transfer_charge + storage_charge + puts_charge + gets_charge); + assert_eq!(report_reward.total_distributed_reward, balance_node1 + balance_node2); + // batch 2 assert_ok!(DdcPayouts::send_rewarding_providers_batch( RuntimeOrigin::signed(dac_account), cluster_id, @@ -1318,25 +1418,42 @@ fn send_rewarding_providers_batch_works() { payees2, )); - ratio = Perbill::from_rational( + let ratio3_transfer = Perquintill::from_rational( node_usage3.transferred_bytes, total_nodes_usage.transferred_bytes, ); - transfer_charge = ratio * report_after.total_customer_charge.transfer; + transfer_charge = ratio3_transfer * report_after.total_customer_charge.transfer; + + let ratio3_storage = + Perquintill::from_rational(node_usage3.stored_bytes, total_nodes_usage.stored_bytes); + storage_charge = ratio3_storage * report_after.total_customer_charge.storage; - ratio = Perbill::from_rational(node_usage3.stored_bytes, total_nodes_usage.stored_bytes); - storage_charge = ratio * report_after.total_customer_charge.storage; + let ratio3_puts = Perquintill::from_rational( + node_usage3.number_of_puts, + total_nodes_usage.number_of_puts, + ); + puts_charge = ratio3_puts * report_after.total_customer_charge.puts; - ratio = - Perbill::from_rational(node_usage3.number_of_puts, total_nodes_usage.number_of_puts); - puts_charge = ratio * report_after.total_customer_charge.puts; + let ratio3_gets = Perquintill::from_rational( + node_usage3.number_of_gets, + total_nodes_usage.number_of_gets, + ); + gets_charge = ratio3_gets * report_after.total_customer_charge.gets; + + report_reward = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let balance_node3 = Balances::free_balance(node3); + assert_eq!(balance_node3, transfer_charge + storage_charge + puts_charge + gets_charge); + assert_eq!( + report_reward.total_distributed_reward, + balance_node1 + balance_node2 + balance_node3 + ); - ratio = - Perbill::from_rational(node_usage3.number_of_gets, total_nodes_usage.number_of_gets); - gets_charge = ratio * report_after.total_customer_charge.gets; + let expected_amount_to_reward = report_reward.total_customer_charge.transfer + + report_reward.total_customer_charge.storage + + report_reward.total_customer_charge.puts + + report_reward.total_customer_charge.gets; - balance = Balances::free_balance(node3); - assert_eq!(balance, transfer_charge + storage_charge + puts_charge + gets_charge); + assert!(expected_amount_to_reward - report_reward.total_distributed_reward <= 20000); assert_ok!(DdcPayouts::end_rewarding_providers( RuntimeOrigin::signed(dac_account), @@ -1346,14 +1463,1020 @@ fn send_rewarding_providers_batch_works() { }) } +#[test] +fn send_rewarding_providers_batch_100_nodes_small_usage_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let num_nodes = 100; + let num_users = 5; + let dac_account = 123u128; + let bank = 1u128; + let cluster_id = ONE_CLUSTER_ID; + let era = 100; + let user_batch_size = 10; + let node_batch_size = 10; + let mut batch_user_index = 0; + let mut batch_node_index = 0; + let usage1 = CustomerUsage { + transferred_bytes: 1024, + stored_bytes: 1024, + number_of_puts: 1, + number_of_gets: 1, + }; + + let node_usage1 = NodeUsage { + // CDN + transferred_bytes: Perquintill::from_float(0.75) * usage1.transferred_bytes, + stored_bytes: 0, + number_of_puts: Perquintill::from_float(0.75) * usage1.number_of_puts, + number_of_gets: Perquintill::from_float(0.75) * usage1.number_of_gets, + }; + + let node_usage2 = NodeUsage { + // Storage + transferred_bytes: 0, + stored_bytes: usage1.stored_bytes * 2, + number_of_puts: 0, + number_of_gets: 0, + }; + + let node_usage3 = NodeUsage { + // CDN + Storage + transferred_bytes: usage1.transferred_bytes * 2, + stored_bytes: usage1.stored_bytes * 3, + number_of_puts: usage1.number_of_puts * 2, + number_of_gets: usage1.number_of_gets * 2, + }; + + let mut payees: Vec> = Vec::new(); + let mut node_batch: Vec<(u128, NodeUsage)> = Vec::new(); + let mut total_nodes_usage = NodeUsage::default(); + for i in 10..10 + num_nodes { + let node_usage = match i % 3 { + 0 => node_usage1.clone(), + 1 => node_usage2.clone(), + 2 => node_usage3.clone(), + _ => unreachable!(), + }; + total_nodes_usage.transferred_bytes += node_usage.transferred_bytes; + total_nodes_usage.stored_bytes += node_usage.stored_bytes; + total_nodes_usage.number_of_puts += node_usage.number_of_puts; + total_nodes_usage.number_of_gets += node_usage.number_of_gets; + + node_batch.push((i, node_usage)); + if node_batch.len() == node_batch_size { + payees.push(node_batch.clone()); + node_batch.clear(); + } + } + if !node_batch.is_empty() { + payees.push(node_batch.clone()); + } + + let mut total_charge = 0u128; + let mut payers: Vec> = Vec::new(); + let mut user_batch: Vec<(u128, CustomerUsage)> = Vec::new(); + for user_id in 1000..1000 + num_users { + let ratio = match user_id % 5 { + 0 => Perquintill::one(), + 1 => Perquintill::from_float(0.5), + 2 => Perquintill::from_float(2f64), + 3 => Perquintill::from_float(0.25), + 4 => Perquintill::from_float(0.001), + _ => unreachable!(), + }; + + let mut user_usage = usage1.clone(); + user_usage.transferred_bytes = ratio * user_usage.transferred_bytes; + user_usage.stored_bytes = ratio * user_usage.stored_bytes; + user_usage.number_of_puts = ratio * user_usage.number_of_puts; + user_usage.number_of_gets = ratio * user_usage.number_of_gets; + + let expected_charge = calculate_charge(cluster_id, user_usage.clone()); + Balances::transfer( + RuntimeOrigin::signed(bank), + user_id, + (expected_charge * 2).max(Balances::minimum_balance()), + ) + .unwrap(); + total_charge += expected_charge; + + user_batch.push((user_id, user_usage)); + if user_batch.len() == user_batch_size { + payers.push(user_batch.clone()); + user_batch.clear(); + } + } + if !user_batch.is_empty() { + payers.push(user_batch.clone()); + } + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + (payers.len() - 1) as u16, + )); + + for batch in payers.iter() { + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_user_index, + batch.to_vec(), + )); + + for (customer_id, usage) in batch.iter() { + let charge = calculate_charge(cluster_id, usage.clone()); + + System::assert_has_event( + Event::Charged { + cluster_id, + era, + customer_id: *customer_id, + batch_index: batch_user_index, + amount: charge, + } + .into(), + ); + } + batch_user_index += 1; + } + + let report_before = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let balance1 = Balances::free_balance(report_before.vault); + let balance2 = Balances::free_balance(DdcPayouts::account_id()); + assert_eq!(balance1, balance2); + assert_eq!(report_before.vault, DdcPayouts::account_id()); + assert_eq!(balance1 - Balances::minimum_balance(), total_charge); + + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + let report_after = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let total_left_from_one = (get_fees(&cluster_id).treasury_share + + get_fees(&cluster_id).validators_share + + get_fees(&cluster_id).cluster_reserve_share) + .left_from_one(); + + let total_charge = report_after.total_customer_charge.transfer + + report_before.total_customer_charge.storage + + report_before.total_customer_charge.puts + + report_before.total_customer_charge.gets; + let balance_after = Balances::free_balance(DdcPayouts::account_id()); + assert_eq!(total_charge, balance_after - Balances::minimum_balance()); + + assert_eq!( + report_after.total_customer_charge.transfer, + total_left_from_one * report_before.total_customer_charge.transfer + ); + assert_eq!( + report_after.total_customer_charge.storage, + total_left_from_one * report_before.total_customer_charge.storage + ); + assert_eq!( + report_after.total_customer_charge.puts, + total_left_from_one * report_before.total_customer_charge.puts + ); + assert_eq!( + report_after.total_customer_charge.gets, + total_left_from_one * report_before.total_customer_charge.gets + ); + + assert_ok!(DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + (payees.len() - 1) as u16, + total_nodes_usage.clone(), + )); + + for batch in payees.iter() { + let before_batch = Balances::free_balance(DdcPayouts::account_id()); + assert_ok!(DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_node_index, + batch.to_vec(), + )); + + let mut batch_charge = 0; + for (node1, node_usage1) in batch.iter() { + let ratio1_transfer = Perquintill::from_rational( + node_usage1.transferred_bytes, + total_nodes_usage.transferred_bytes, + ); + let transfer_charge = ratio1_transfer * report_after.total_customer_charge.transfer; + + let ratio1_storage = Perquintill::from_rational( + node_usage1.stored_bytes, + total_nodes_usage.stored_bytes, + ); + let storage_charge = ratio1_storage * report_after.total_customer_charge.storage; + + let ratio1_puts = Perquintill::from_rational( + node_usage1.number_of_puts, + total_nodes_usage.number_of_puts, + ); + let puts_charge = ratio1_puts * report_after.total_customer_charge.puts; + + let ratio1_gets = Perquintill::from_rational( + node_usage1.number_of_gets, + total_nodes_usage.number_of_gets, + ); + let gets_charge = ratio1_gets * report_after.total_customer_charge.gets; + + let balance_node1 = Balances::free_balance(node1); + assert!( + (transfer_charge + storage_charge + puts_charge + gets_charge) - balance_node1 < + MAX_DUST.into() + ); + + batch_charge += transfer_charge + storage_charge + puts_charge + gets_charge; + } + let after_batch = Balances::free_balance(DdcPayouts::account_id()); + assert!(batch_charge + after_batch - before_batch < MAX_DUST.into()); + + batch_node_index += 1; + } + assert!(Balances::free_balance(DdcPayouts::account_id()) < MAX_DUST.into()); + }) +} + +#[test] +fn send_rewarding_providers_batch_100_nodes_large_usage_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let num_nodes = 100; + let num_users = 5; + let dac_account = 123u128; + let bank = 1u128; + let cluster_id = ONE_CLUSTER_ID; + let era = 100; + let user_batch_size = 10; + let node_batch_size = 10; + let mut batch_user_index = 0; + let mut batch_node_index = 0; + let usage1 = CustomerUsage { + transferred_bytes: 1024, + stored_bytes: 1024, + number_of_puts: 1, + number_of_gets: 1, + }; + + let node_usage1 = NodeUsage { + // CDN + transferred_bytes: Perquintill::from_float(0.75) * usage1.transferred_bytes, + stored_bytes: 0, + number_of_puts: Perquintill::from_float(0.75) * usage1.number_of_puts, + number_of_gets: Perquintill::from_float(0.75) * usage1.number_of_gets, + }; + + let node_usage2 = NodeUsage { + // Storage + transferred_bytes: 0, + stored_bytes: usage1.stored_bytes * 2, + number_of_puts: 0, + number_of_gets: 0, + }; + + let node_usage3 = NodeUsage { + // CDN + Storage + transferred_bytes: usage1.transferred_bytes * 2, + stored_bytes: usage1.stored_bytes * 3, + number_of_puts: usage1.number_of_puts * 2, + number_of_gets: usage1.number_of_gets * 2, + }; + + let mut payees: Vec> = Vec::new(); + let mut node_batch: Vec<(u128, NodeUsage)> = Vec::new(); + let mut total_nodes_usage = NodeUsage::default(); + for i in 10..10 + num_nodes { + let ratio = match i % 5 { + 0 => Perquintill::from_float(1_000_000.0), + 1 => Perquintill::from_float(10_000_000.0), + 2 => Perquintill::from_float(100_000_000.0), + 3 => Perquintill::from_float(1_000_000_000.0), + 4 => Perquintill::from_float(10_000_000_000.0), + _ => unreachable!(), + }; + let mut node_usage = match i % 3 { + 0 => node_usage1.clone(), + 1 => node_usage2.clone(), + 2 => node_usage3.clone(), + _ => unreachable!(), + }; + node_usage.transferred_bytes = ratio * node_usage.transferred_bytes; + node_usage.stored_bytes = ratio * node_usage.stored_bytes; + node_usage.number_of_puts = ratio * node_usage.number_of_puts; + node_usage.number_of_gets = ratio * node_usage.number_of_gets; + + total_nodes_usage.transferred_bytes += node_usage.transferred_bytes; + total_nodes_usage.stored_bytes += node_usage.stored_bytes; + total_nodes_usage.number_of_puts += node_usage.number_of_puts; + total_nodes_usage.number_of_gets += node_usage.number_of_gets; + + node_batch.push((i, node_usage)); + if node_batch.len() == node_batch_size { + payees.push(node_batch.clone()); + node_batch.clear(); + } + } + if !node_batch.is_empty() { + payees.push(node_batch.clone()); + } + + let mut total_charge = 0u128; + let mut payers: Vec> = Vec::new(); + let mut user_batch: Vec<(u128, CustomerUsage)> = Vec::new(); + for user_id in 1000..1000 + num_users { + let ratio = match user_id % 5 { + 0 => Perquintill::from_float(1_000_000.0), + 1 => Perquintill::from_float(10_000_000.0), + 2 => Perquintill::from_float(100_000_000.0), + 3 => Perquintill::from_float(1_000_000_000.0), + 4 => Perquintill::from_float(10_000_000_000.0), + _ => unreachable!(), + }; + + let mut user_usage = usage1.clone(); + user_usage.transferred_bytes = ratio * user_usage.transferred_bytes; + user_usage.stored_bytes = ratio * user_usage.stored_bytes; + user_usage.number_of_puts = ratio * user_usage.number_of_puts; + user_usage.number_of_gets = ratio * user_usage.number_of_gets; + + let expected_charge = calculate_charge(cluster_id, user_usage.clone()); + Balances::transfer( + RuntimeOrigin::signed(bank), + user_id, + (expected_charge * 2).max(Balances::minimum_balance()), + ) + .unwrap(); + total_charge += expected_charge; + + user_batch.push((user_id, user_usage)); + if user_batch.len() == user_batch_size { + payers.push(user_batch.clone()); + user_batch.clear(); + } + } + if !user_batch.is_empty() { + payers.push(user_batch.clone()); + } + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + (payers.len() - 1) as u16, + )); + + for batch in payers.iter() { + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_user_index, + batch.to_vec(), + )); + + for (customer_id, usage) in batch.iter() { + let charge = calculate_charge(cluster_id, usage.clone()); + + System::assert_has_event( + Event::Charged { + cluster_id, + era, + customer_id: *customer_id, + batch_index: batch_user_index, + amount: charge, + } + .into(), + ); + } + batch_user_index += 1; + } + + let report_before = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let balance1 = Balances::free_balance(report_before.vault); + let balance2 = Balances::free_balance(DdcPayouts::account_id()); + assert_eq!(balance1, balance2); + assert_eq!(report_before.vault, DdcPayouts::account_id()); + assert_eq!(balance1 - Balances::minimum_balance(), total_charge); + + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + let report_after = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let total_left_from_one = (get_fees(&cluster_id).treasury_share + + get_fees(&cluster_id).validators_share + + get_fees(&cluster_id).cluster_reserve_share) + .left_from_one(); + + let total_charge = report_after.total_customer_charge.transfer + + report_before.total_customer_charge.storage + + report_before.total_customer_charge.puts + + report_before.total_customer_charge.gets; + let balance_after = Balances::free_balance(DdcPayouts::account_id()); + assert_eq!(total_charge, balance_after - Balances::minimum_balance()); + + assert_eq!( + report_after.total_customer_charge.transfer, + total_left_from_one * report_before.total_customer_charge.transfer + ); + assert_eq!( + report_after.total_customer_charge.storage, + total_left_from_one * report_before.total_customer_charge.storage + ); + assert_eq!( + report_after.total_customer_charge.puts, + total_left_from_one * report_before.total_customer_charge.puts + ); + assert_eq!( + report_after.total_customer_charge.gets, + total_left_from_one * report_before.total_customer_charge.gets + ); + + assert_ok!(DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + (payees.len() - 1) as u16, + total_nodes_usage.clone(), + )); + + for batch in payees.iter() { + let before_batch = Balances::free_balance(DdcPayouts::account_id()); + assert_ok!(DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_node_index, + batch.to_vec(), + )); + + let mut batch_charge = 0; + for (node1, node_usage1) in batch.iter() { + let ratio1_transfer = Perquintill::from_rational( + node_usage1.transferred_bytes, + total_nodes_usage.transferred_bytes, + ); + let transfer_charge = ratio1_transfer * report_after.total_customer_charge.transfer; + + let ratio1_storage = Perquintill::from_rational( + node_usage1.stored_bytes, + total_nodes_usage.stored_bytes, + ); + let storage_charge = ratio1_storage * report_after.total_customer_charge.storage; + + let ratio1_puts = Perquintill::from_rational( + node_usage1.number_of_puts, + total_nodes_usage.number_of_puts, + ); + let puts_charge = ratio1_puts * report_after.total_customer_charge.puts; + + let ratio1_gets = Perquintill::from_rational( + node_usage1.number_of_gets, + total_nodes_usage.number_of_gets, + ); + let gets_charge = ratio1_gets * report_after.total_customer_charge.gets; + + let balance_node1 = Balances::free_balance(node1); + assert!( + (transfer_charge + storage_charge + puts_charge + gets_charge) - balance_node1 < + MAX_DUST.into() + ); + + batch_charge += transfer_charge + storage_charge + puts_charge + gets_charge; + } + let after_batch = Balances::free_balance(DdcPayouts::account_id()); + assert!(batch_charge + after_batch - before_batch < MAX_DUST.into()); + + batch_node_index += 1; + } + assert!(Balances::free_balance(DdcPayouts::account_id()) < MAX_DUST.into()); + }) +} + +#[test] +fn send_rewarding_providers_batch_100_nodes_small_large_usage_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let num_nodes = 100; + let num_users = 5; + let dac_account = 123u128; + let bank = 1u128; + let cluster_id = ONE_CLUSTER_ID; + let era = 100; + let user_batch_size = 10; + let node_batch_size = 10; + let mut batch_user_index = 0; + let mut batch_node_index = 0; + let usage1 = CustomerUsage { + transferred_bytes: 1024, + stored_bytes: 1024, + number_of_puts: 1, + number_of_gets: 1, + }; + + let node_usage1 = NodeUsage { + // CDN + transferred_bytes: Perquintill::from_float(0.75) * usage1.transferred_bytes, + stored_bytes: 0, + number_of_puts: Perquintill::from_float(0.75) * usage1.number_of_puts, + number_of_gets: Perquintill::from_float(0.75) * usage1.number_of_gets, + }; + + let node_usage2 = NodeUsage { + // Storage + transferred_bytes: 0, + stored_bytes: usage1.stored_bytes * 2, + number_of_puts: 0, + number_of_gets: 0, + }; + + let node_usage3 = NodeUsage { + // CDN + Storage + transferred_bytes: usage1.transferred_bytes * 2, + stored_bytes: usage1.stored_bytes * 3, + number_of_puts: usage1.number_of_puts * 2, + number_of_gets: usage1.number_of_gets * 2, + }; + + let mut payees: Vec> = Vec::new(); + let mut node_batch: Vec<(u128, NodeUsage)> = Vec::new(); + let mut total_nodes_usage = NodeUsage::default(); + for i in 10..10 + num_nodes { + let ratio = match i % 5 { + 0 => Perquintill::from_float(1_000_000.0), + 1 => Perquintill::from_float(0.5), + 2 => Perquintill::from_float(100_000_000.0), + 3 => Perquintill::from_float(0.25), + 4 => Perquintill::from_float(10_000_000_000.0), + _ => unreachable!(), + }; + let mut node_usage = match i % 3 { + 0 => node_usage1.clone(), + 1 => node_usage2.clone(), + 2 => node_usage3.clone(), + _ => unreachable!(), + }; + node_usage.transferred_bytes = ratio * node_usage.transferred_bytes; + node_usage.stored_bytes = ratio * node_usage.stored_bytes; + node_usage.number_of_puts = ratio * node_usage.number_of_puts; + node_usage.number_of_gets = ratio * node_usage.number_of_gets; + + total_nodes_usage.transferred_bytes += node_usage.transferred_bytes; + total_nodes_usage.stored_bytes += node_usage.stored_bytes; + total_nodes_usage.number_of_puts += node_usage.number_of_puts; + total_nodes_usage.number_of_gets += node_usage.number_of_gets; + + node_batch.push((i, node_usage)); + if node_batch.len() == node_batch_size { + payees.push(node_batch.clone()); + node_batch.clear(); + } + } + if !node_batch.is_empty() { + payees.push(node_batch.clone()); + } + + let mut total_charge = 0u128; + let mut payers: Vec> = Vec::new(); + let mut user_batch: Vec<(u128, CustomerUsage)> = Vec::new(); + for user_id in 1000..1000 + num_users { + let ratio = match user_id % 5 { + 0 => Perquintill::from_float(1_000_000.0), + 1 => Perquintill::from_float(10_000_000.0), + 2 => Perquintill::from_float(100_000_000.0), + 3 => Perquintill::from_float(1_000_000_000.0), + 4 => Perquintill::from_float(10_000_000_000.0), + _ => unreachable!(), + }; + + let mut user_usage = usage1.clone(); + user_usage.transferred_bytes = ratio * user_usage.transferred_bytes; + user_usage.stored_bytes = ratio * user_usage.stored_bytes; + user_usage.number_of_puts = ratio * user_usage.number_of_puts; + user_usage.number_of_gets = ratio * user_usage.number_of_gets; + + let expected_charge = calculate_charge(cluster_id, user_usage.clone()); + Balances::transfer( + RuntimeOrigin::signed(bank), + user_id, + (expected_charge * 2).max(Balances::minimum_balance()), + ) + .unwrap(); + total_charge += expected_charge; + + user_batch.push((user_id, user_usage)); + if user_batch.len() == user_batch_size { + payers.push(user_batch.clone()); + user_batch.clear(); + } + } + if !user_batch.is_empty() { + payers.push(user_batch.clone()); + } + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + (payers.len() - 1) as u16, + )); + + for batch in payers.iter() { + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_user_index, + batch.to_vec(), + )); + + for (customer_id, usage) in batch.iter() { + let charge = calculate_charge(cluster_id, usage.clone()); + + System::assert_has_event( + Event::Charged { + cluster_id, + era, + customer_id: *customer_id, + batch_index: batch_user_index, + amount: charge, + } + .into(), + ); + } + batch_user_index += 1; + } + + let report_before = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let balance1 = Balances::free_balance(report_before.vault); + let balance2 = Balances::free_balance(DdcPayouts::account_id()); + assert_eq!(balance1, balance2); + assert_eq!(report_before.vault, DdcPayouts::account_id()); + assert_eq!(balance1 - Balances::minimum_balance(), total_charge); + + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + let report_after = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let total_left_from_one = (get_fees(&cluster_id).treasury_share + + get_fees(&cluster_id).validators_share + + get_fees(&cluster_id).cluster_reserve_share) + .left_from_one(); + + let total_charge = report_after.total_customer_charge.transfer + + report_before.total_customer_charge.storage + + report_before.total_customer_charge.puts + + report_before.total_customer_charge.gets; + let balance_after = Balances::free_balance(DdcPayouts::account_id()); + assert_eq!(total_charge, balance_after - Balances::minimum_balance()); + + assert_eq!( + report_after.total_customer_charge.transfer, + total_left_from_one * report_before.total_customer_charge.transfer + ); + assert_eq!( + report_after.total_customer_charge.storage, + total_left_from_one * report_before.total_customer_charge.storage + ); + assert_eq!( + report_after.total_customer_charge.puts, + total_left_from_one * report_before.total_customer_charge.puts + ); + assert_eq!( + report_after.total_customer_charge.gets, + total_left_from_one * report_before.total_customer_charge.gets + ); + + assert_ok!(DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + (payees.len() - 1) as u16, + total_nodes_usage.clone(), + )); + + for batch in payees.iter() { + let before_batch = Balances::free_balance(DdcPayouts::account_id()); + assert_ok!(DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_node_index, + batch.to_vec(), + )); + + let mut batch_charge = 0; + for (node1, node_usage1) in batch.iter() { + let ratio1_transfer = Perquintill::from_rational( + node_usage1.transferred_bytes, + total_nodes_usage.transferred_bytes, + ); + let transfer_charge = ratio1_transfer * report_after.total_customer_charge.transfer; + + let ratio1_storage = Perquintill::from_rational( + node_usage1.stored_bytes, + total_nodes_usage.stored_bytes, + ); + let storage_charge = ratio1_storage * report_after.total_customer_charge.storage; + + let ratio1_puts = Perquintill::from_rational( + node_usage1.number_of_puts, + total_nodes_usage.number_of_puts, + ); + let puts_charge = ratio1_puts * report_after.total_customer_charge.puts; + + let ratio1_gets = Perquintill::from_rational( + node_usage1.number_of_gets, + total_nodes_usage.number_of_gets, + ); + let gets_charge = ratio1_gets * report_after.total_customer_charge.gets; + + let balance_node1 = Balances::free_balance(node1); + assert!( + (transfer_charge + storage_charge + puts_charge + gets_charge) - balance_node1 < + MAX_DUST.into() + ); + + batch_charge += transfer_charge + storage_charge + puts_charge + gets_charge; + } + let after_batch = Balances::free_balance(DdcPayouts::account_id()); + assert!(batch_charge + after_batch - before_batch < MAX_DUST.into()); + + batch_node_index += 1; + } + assert!(Balances::free_balance(DdcPayouts::account_id()) < MAX_DUST.into()); + }) +} + +fn generate_random_u64>(_: &T, min: u64, max: u64) -> u64 { + let (random_seed, _) = T::random_seed(); + let random_raw = u64::from_be_bytes(random_seed.as_bytes()[0..8].try_into().unwrap()); + + min.saturating_add(random_raw % (max.saturating_sub(min).saturating_add(1))) +} + +#[test] +fn send_rewarding_providers_batch_100_nodes_random_usage_works() { + ExtBuilder.build_and_execute(|| { + System::set_block_number(1); + + let mock_randomness = MockRandomness::default(); + let min: u64 = 1024; + let max: u64 = 1024 * 1024; + let num_nodes = 100; + let num_users = 100; + let dac_account = 123u128; + let bank = 1u128; + let cluster_id = CERE_CLUSTER_ID; + let era = 100; + let user_batch_size = 10; + let node_batch_size = 10; + let mut batch_user_index = 0; + let mut batch_node_index = 0; + let mut payees: Vec> = Vec::new(); + let mut node_batch: Vec<(u128, NodeUsage)> = Vec::new(); + let mut total_nodes_usage = NodeUsage::default(); + for i in 10..10 + num_nodes { + let node_usage = NodeUsage { + transferred_bytes: generate_random_u64(&mock_randomness, min, max), + stored_bytes: generate_random_u64(&mock_randomness, min, max), + number_of_puts: generate_random_u64(&mock_randomness, min, max), + number_of_gets: generate_random_u64(&mock_randomness, min, max), + }; + + total_nodes_usage.transferred_bytes += node_usage.transferred_bytes; + total_nodes_usage.stored_bytes += node_usage.stored_bytes; + total_nodes_usage.number_of_puts += node_usage.number_of_puts; + total_nodes_usage.number_of_gets += node_usage.number_of_gets; + + node_batch.push((i, node_usage)); + if node_batch.len() == node_batch_size { + payees.push(node_batch.clone()); + node_batch.clear(); + } + } + if !node_batch.is_empty() { + payees.push(node_batch.clone()); + } + + let mut total_charge = 0u128; + let mut payers: Vec> = Vec::new(); + let mut user_batch: Vec<(u128, CustomerUsage)> = Vec::new(); + for user_id in 1000..1000 + num_users { + let user_usage = CustomerUsage { + transferred_bytes: generate_random_u64(&mock_randomness, min, max), + stored_bytes: generate_random_u64(&mock_randomness, min, max), + number_of_puts: generate_random_u64(&mock_randomness, min, max), + number_of_gets: generate_random_u64(&mock_randomness, min, max), + }; + + let expected_charge = calculate_charge(cluster_id, user_usage.clone()); + Balances::transfer( + RuntimeOrigin::signed(bank), + user_id, + (expected_charge * 2).max(Balances::minimum_balance()), + ) + .unwrap(); + total_charge += expected_charge; + + user_batch.push((user_id, user_usage)); + if user_batch.len() == user_batch_size { + payers.push(user_batch.clone()); + user_batch.clear(); + } + } + if !user_batch.is_empty() { + payers.push(user_batch.clone()); + } + + assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); + assert_ok!(DdcPayouts::begin_billing_report( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + assert_ok!(DdcPayouts::begin_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + (payers.len() - 1) as u16, + )); + + for batch in payers.iter() { + assert_ok!(DdcPayouts::send_charging_customers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_user_index, + batch.to_vec(), + )); + + for (customer_id, usage) in batch.iter() { + let charge = calculate_charge(cluster_id, usage.clone()); + + System::assert_has_event( + Event::Charged { + cluster_id, + era, + customer_id: *customer_id, + batch_index: batch_user_index, + amount: charge, + } + .into(), + ); + } + batch_user_index += 1; + } + + let report_before = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let balance1 = Balances::free_balance(report_before.vault); + let balance2 = Balances::free_balance(DdcPayouts::account_id()); + assert_eq!(balance1, balance2); + assert_eq!(report_before.vault, DdcPayouts::account_id()); + assert_eq!(balance1 - Balances::minimum_balance(), total_charge); + + assert_ok!(DdcPayouts::end_charging_customers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + )); + + let report_after = DdcPayouts::active_billing_reports(cluster_id, era).unwrap(); + let total_left_from_one = (get_fees(&cluster_id).treasury_share + + get_fees(&cluster_id).validators_share + + get_fees(&cluster_id).cluster_reserve_share) + .left_from_one(); + + let total_charge = report_after.total_customer_charge.transfer + + report_before.total_customer_charge.storage + + report_before.total_customer_charge.puts + + report_before.total_customer_charge.gets; + let balance_after = Balances::free_balance(DdcPayouts::account_id()); + assert_eq!(total_charge, balance_after - Balances::minimum_balance()); + + assert_eq!( + report_after.total_customer_charge.transfer, + total_left_from_one * report_before.total_customer_charge.transfer + ); + assert_eq!( + report_after.total_customer_charge.storage, + total_left_from_one * report_before.total_customer_charge.storage + ); + assert_eq!( + report_after.total_customer_charge.puts, + total_left_from_one * report_before.total_customer_charge.puts + ); + assert_eq!( + report_after.total_customer_charge.gets, + total_left_from_one * report_before.total_customer_charge.gets + ); + + assert_ok!(DdcPayouts::begin_rewarding_providers( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + (payees.len() - 1) as u16, + total_nodes_usage.clone(), + )); + + for batch in payees.iter() { + let before_batch = Balances::free_balance(DdcPayouts::account_id()); + assert_ok!(DdcPayouts::send_rewarding_providers_batch( + RuntimeOrigin::signed(dac_account), + cluster_id, + era, + batch_node_index, + batch.to_vec(), + )); + + let mut batch_charge = 0; + for (node1, node_usage1) in batch.iter() { + let ratio1_transfer = Perquintill::from_rational( + node_usage1.transferred_bytes, + total_nodes_usage.transferred_bytes, + ); + let transfer_charge = ratio1_transfer * report_after.total_customer_charge.transfer; + + let ratio1_storage = Perquintill::from_rational( + node_usage1.stored_bytes, + total_nodes_usage.stored_bytes, + ); + let storage_charge = ratio1_storage * report_after.total_customer_charge.storage; + + let ratio1_puts = Perquintill::from_rational( + node_usage1.number_of_puts, + total_nodes_usage.number_of_puts, + ); + let puts_charge = ratio1_puts * report_after.total_customer_charge.puts; + + let ratio1_gets = Perquintill::from_rational( + node_usage1.number_of_gets, + total_nodes_usage.number_of_gets, + ); + let gets_charge = ratio1_gets * report_after.total_customer_charge.gets; + + let balance_node1 = Balances::free_balance(node1); + assert!( + (transfer_charge + storage_charge + puts_charge + gets_charge) - balance_node1 < + MAX_DUST.into() + ); + + batch_charge += transfer_charge + storage_charge + puts_charge + gets_charge; + } + let after_batch = Balances::free_balance(DdcPayouts::account_id()); + assert!(batch_charge + after_batch - before_batch < MAX_DUST.into()); + + batch_node_index += 1; + } + assert!(Balances::free_balance(DdcPayouts::account_id()) < MAX_DUST.into()); + }) +} + #[test] fn end_rewarding_providers_fails_uninitialised() { ExtBuilder.build_and_execute(|| { - let root_account = 1u64; - let dac_account = 2u64; - let user1 = 3u64; - let user2 = 4u64; - let node1 = 33u64; + let root_account = 1u128; + let dac_account = 2u128; + let user1 = 3u128; + let user2 = 4u128; + let node1 = 33u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 1; @@ -1509,16 +2632,30 @@ fn end_rewarding_providers_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); - let dac_account = 2u64; - let user1 = 3u64; - let node1 = 33u64; + let dac_account = 2u128; + let user1 = 1u128; + let node1 = 33u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 0; let batch_index = 0; - let total_node_usage = NodeUsage::default(); - let payers = vec![(user1, CustomerUsage::default())]; - let payees = vec![(node1, NodeUsage::default())]; + let usage1 = CustomerUsage { + transferred_bytes: 23452345, + stored_bytes: 3345234523, + number_of_puts: 4456456345234523, + number_of_gets: 523423, + }; + + let node_usage1 = NodeUsage { + // CDN + Storage + transferred_bytes: usage1.transferred_bytes * 2 / 3, + stored_bytes: usage1.stored_bytes * 2 / 3, + number_of_puts: usage1.number_of_puts * 2 / 3, + number_of_gets: usage1.number_of_gets * 2 / 3, + }; + let total_node_usage = node_usage1.clone(); + let payers = vec![(user1, usage1)]; + let payees = vec![(node1, node_usage1)]; assert_ok!(DdcPayouts::set_authorised_caller(RuntimeOrigin::root(), dac_account)); @@ -1584,11 +2721,11 @@ fn end_rewarding_providers_works() { #[test] fn end_billing_report_fails_uninitialised() { ExtBuilder.build_and_execute(|| { - let root_account = 1u64; - let dac_account = 2u64; - let user1 = 3u64; - let user2 = 4u64; - let node1 = 33u64; + let root_account = 1u128; + let dac_account = 2u128; + let user1 = 3u128; + let user2 = 4u128; + let node1 = 33u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 1; @@ -1721,9 +2858,9 @@ fn end_billing_report_works() { ExtBuilder.build_and_execute(|| { System::set_block_number(1); - let dac_account = 2u64; - let user1 = 3u64; - let node1 = 33u64; + let dac_account = 2u128; + let user1 = 3u128; + let node1 = 33u128; let cluster_id = ClusterId::from([12; 20]); let era = 100; let max_batch_index = 0; diff --git a/pallets/ddc-payouts/src/weights.rs b/pallets/ddc-payouts/src/weights.rs index 5f0578c31..a8ba246c7 100644 --- a/pallets/ddc-payouts/src/weights.rs +++ b/pallets/ddc-payouts/src/weights.rs @@ -1,9 +1,9 @@ //! Autogenerated weights for pallet_ddc_payouts //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-14, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! HOSTNAME: `Yahors-MacBook-Pro.local`, CPU: `` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! DATE: 2023-12-20, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `bench`, CPU: `DO-Premium-AMD` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Interpreted, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: // ./target/release/cere @@ -43,20 +43,20 @@ pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { // Storage: DdcPayouts AuthorisedCaller (r:0 w:1) fn set_authorised_caller() -> Weight { - Weight::from_ref_time(11_000_000_u64) + Weight::from_ref_time(90_258_000_u64) .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn begin_billing_report() -> Weight { - Weight::from_ref_time(19_000_000_u64) + Weight::from_ref_time(214_646_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn begin_charging_customers() -> Weight { - Weight::from_ref_time(19_000_000_u64) + Weight::from_ref_time(228_676_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -68,9 +68,9 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcPayouts DebtorCustomers (r:1 w:1) /// The range of component `b` is `[1, 1000]`. fn send_charging_customers_batch(b: u32, ) -> Weight { - Weight::from_ref_time(12_333_820_u64) - // Standard Error: 298_759 - .saturating_add(Weight::from_ref_time(24_367_120_u64).saturating_mul(b as u64)) + Weight::from_ref_time(891_324_000_u64) + // Standard Error: 3_864_375 + .saturating_add(Weight::from_ref_time(558_679_506_u64).saturating_mul(b as u64)) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(b as u64))) .saturating_add(T::DbWeight::get().writes(5_u64)) @@ -81,17 +81,19 @@ impl WeightInfo for SubstrateWeight { // Storage: DdcClusters ClustersGovParams (r:1 w:0) // Storage: System Account (r:3 w:3) // Storage: DdcClusters Clusters (r:1 w:0) - // Storage: Staking CounterForValidators (r:1 w:0) // Storage: Staking Validators (r:2 w:0) + // Storage: Staking Bonded (r:1 w:0) + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking Nominators (r:1 w:0) fn end_charging_customers() -> Weight { - Weight::from_ref_time(89_000_000_u64) - .saturating_add(T::DbWeight::get().reads(10_u64)) + Weight::from_ref_time(1_691_550_000_u64) + .saturating_add(T::DbWeight::get().reads(12_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn begin_rewarding_providers() -> Weight { - Weight::from_ref_time(18_000_000_u64) + Weight::from_ref_time(234_686_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -100,25 +102,25 @@ impl WeightInfo for SubstrateWeight { // Storage: System Account (r:2 w:2) /// The range of component `b` is `[1, 1000]`. fn send_rewarding_providers_batch(b: u32, ) -> Weight { - Weight::from_ref_time(32_000_000_u64) - // Standard Error: 5_087 - .saturating_add(Weight::from_ref_time(14_402_776_u64).saturating_mul(b as u64)) - .saturating_add(T::DbWeight::get().reads(3_u64)) + Weight::from_ref_time(565_710_000_u64) + // Standard Error: 854_032 + .saturating_add(Weight::from_ref_time(408_429_599_u64).saturating_mul(b as u64)) + .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b as u64))) - .saturating_add(T::DbWeight::get().writes(2_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(b as u64))) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn end_rewarding_providers() -> Weight { - Weight::from_ref_time(18_000_000_u64) + Weight::from_ref_time(274_535_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn end_billing_report() -> Weight { - Weight::from_ref_time(18_000_000_u64) + Weight::from_ref_time(232_626_000_u64) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -128,20 +130,20 @@ impl WeightInfo for SubstrateWeight { impl WeightInfo for () { // Storage: DdcPayouts AuthorisedCaller (r:0 w:1) fn set_authorised_caller() -> Weight { - Weight::from_ref_time(11_000_000_u64) + Weight::from_ref_time(90_258_000_u64) .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn begin_billing_report() -> Weight { - Weight::from_ref_time(19_000_000_u64) + Weight::from_ref_time(214_646_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn begin_charging_customers() -> Weight { - Weight::from_ref_time(19_000_000_u64) + Weight::from_ref_time(228_676_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -153,9 +155,9 @@ impl WeightInfo for () { // Storage: DdcPayouts DebtorCustomers (r:1 w:1) /// The range of component `b` is `[1, 1000]`. fn send_charging_customers_batch(b: u32, ) -> Weight { - Weight::from_ref_time(12_333_820_u64) - // Standard Error: 298_759 - .saturating_add(Weight::from_ref_time(24_367_120_u64).saturating_mul(b as u64)) + Weight::from_ref_time(891_324_000_u64) + // Standard Error: 3_864_375 + .saturating_add(Weight::from_ref_time(558_679_506_u64).saturating_mul(b as u64)) .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().reads((2_u64).saturating_mul(b as u64))) .saturating_add(RocksDbWeight::get().writes(5_u64)) @@ -166,17 +168,19 @@ impl WeightInfo for () { // Storage: DdcClusters ClustersGovParams (r:1 w:0) // Storage: System Account (r:3 w:3) // Storage: DdcClusters Clusters (r:1 w:0) - // Storage: Staking CounterForValidators (r:1 w:0) // Storage: Staking Validators (r:2 w:0) + // Storage: Staking Bonded (r:1 w:0) + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking Nominators (r:1 w:0) fn end_charging_customers() -> Weight { - Weight::from_ref_time(89_000_000_u64) - .saturating_add(RocksDbWeight::get().reads(10_u64)) + Weight::from_ref_time(1_691_550_000_u64) + .saturating_add(RocksDbWeight::get().reads(12_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn begin_rewarding_providers() -> Weight { - Weight::from_ref_time(18_000_000_u64) + Weight::from_ref_time(234_686_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -185,25 +189,25 @@ impl WeightInfo for () { // Storage: System Account (r:2 w:2) /// The range of component `b` is `[1, 1000]`. fn send_rewarding_providers_batch(b: u32, ) -> Weight { - Weight::from_ref_time(32_000_000_u64) - // Standard Error: 5_087 - .saturating_add(Weight::from_ref_time(14_402_776_u64).saturating_mul(b as u64)) - .saturating_add(RocksDbWeight::get().reads(3_u64)) + Weight::from_ref_time(565_710_000_u64) + // Standard Error: 854_032 + .saturating_add(Weight::from_ref_time(408_429_599_u64).saturating_mul(b as u64)) + .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(b as u64))) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(b as u64))) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn end_rewarding_providers() -> Weight { - Weight::from_ref_time(18_000_000_u64) + Weight::from_ref_time(274_535_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } // Storage: DdcPayouts AuthorisedCaller (r:1 w:0) // Storage: DdcPayouts ActiveBillingReports (r:1 w:1) fn end_billing_report() -> Weight { - Weight::from_ref_time(18_000_000_u64) + Weight::from_ref_time(232_626_000_u64) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/pallets/ddc-staking/Cargo.toml b/pallets/ddc-staking/Cargo.toml index 9dcad54c5..27608aa03 100644 --- a/pallets/ddc-staking/Cargo.toml +++ b/pallets/ddc-staking/Cargo.toml @@ -5,8 +5,8 @@ edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -ddc-primitives = { version = "0.1.0", default-features = false, path = "../../primitives" } -ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } +ddc-primitives = { version = "4.8.2", default-features = false, path = "../../primitives" } +ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/pallets/ddc-staking/src/mock.rs b/pallets/ddc-staking/src/mock.rs index 7ff3fbd1e..9017e9ef5 100644 --- a/pallets/ddc-staking/src/mock.rs +++ b/pallets/ddc-staking/src/mock.rs @@ -26,7 +26,7 @@ use sp_io::TestExternalities; use sp_runtime::{ testing::Header, traits::{BlakeTwo256, IdentityLookup}, - Perbill, + Perquintill, }; use sp_std::collections::btree_map::BTreeMap; @@ -179,9 +179,9 @@ impl ClusterVisitor for TestClusterVisitor { fn get_fees_params(_cluster_id: &ClusterId) -> Result { Ok(ClusterFeesParams { - treasury_share: Perbill::from_percent(1), - validators_share: Perbill::from_percent(10), - cluster_reserve_share: Perbill::from_percent(2), + treasury_share: Perquintill::from_percent(1), + validators_share: Perquintill::from_percent(10), + cluster_reserve_share: Perquintill::from_percent(2), }) } diff --git a/pallets/ddc-staking/src/testing_utils.rs b/pallets/ddc-staking/src/testing_utils.rs index 21b35ffe1..c106e0bce 100644 --- a/pallets/ddc-staking/src/testing_utils.rs +++ b/pallets/ddc-staking/src/testing_utils.rs @@ -7,7 +7,7 @@ use ddc_primitives::{ use frame_benchmarking::account; use frame_support::traits::Currency; use frame_system::RawOrigin; -use sp_runtime::{traits::StaticLookup, Perbill}; +use sp_runtime::{traits::StaticLookup, Perquintill}; use sp_std::prelude::*; use crate::{Pallet as DdcStaking, *}; @@ -113,9 +113,9 @@ pub fn create_stash_controller_node_with_balance( let cluster_id = ClusterId::from([1; 20]); let cluster_params = ClusterParams { node_provider_auth_contract: Some(stash.clone()) }; let cluster_gov_params: ClusterGovParams, T::BlockNumber> = ClusterGovParams { - treasury_share: Perbill::default(), - validators_share: Perbill::default(), - cluster_reserve_share: Perbill::default(), + treasury_share: Perquintill::default(), + validators_share: Perquintill::default(), + cluster_reserve_share: Perquintill::default(), storage_bond_size: 10u32.into(), storage_chill_delay: 50u32.into(), storage_unbonding_delay: 50u32.into(), diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index eb7345653..2f579998f 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,13 +1,12 @@ [package] name = "ddc-primitives" -version = "0.1.0" +version = "4.8.2" edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } serde = { version = "1.0.136", default-features = false, features = ["derive"], optional = true } - sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 164f0338b..06a5dcfde 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -5,7 +5,11 @@ use scale_info::{prelude::vec::Vec, TypeInfo}; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; use sp_core::hash::H160; -use sp_runtime::{AccountId32, Perbill, RuntimeDebug}; +use sp_runtime::{AccountId32, Perquintill, RuntimeDebug}; + +pub const MILLICENTS: u128 = 100_000; +pub const CENTS: u128 = 1_000 * MILLICENTS; // assume this is worth about a cent. +pub const DOLLARS: u128 = 100 * CENTS; pub type ClusterId = H160; pub type DdcEra = u32; pub type BucketId = u64; @@ -22,9 +26,9 @@ pub struct ClusterParams { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq, Default)] #[scale_info(skip_type_params(Balance, BlockNumber, T))] pub struct ClusterGovParams { - pub treasury_share: Perbill, - pub validators_share: Perbill, - pub cluster_reserve_share: Perbill, + pub treasury_share: Perquintill, + pub validators_share: Perquintill, + pub cluster_reserve_share: Perquintill, pub storage_bond_size: Balance, pub storage_chill_delay: BlockNumber, pub storage_unbonding_delay: BlockNumber, @@ -44,12 +48,12 @@ pub struct ClusterPricingParams { #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct ClusterFeesParams { - pub treasury_share: Perbill, - pub validators_share: Perbill, - pub cluster_reserve_share: Perbill, + pub treasury_share: Perquintill, + pub validators_share: Perquintill, + pub cluster_reserve_share: Perquintill, } -#[derive(Debug, PartialEq)] +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub struct ClusterBondingParams { pub storage_bond_size: u128, pub storage_chill_delay: BlockNumber, diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 6e8abc597..138115725 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -93,7 +93,7 @@ pallet-vesting = { default-features = false, git = "https://github.com/paritytec # cere dependencies cere-dev-runtime-constants = { path = "./constants", default-features = false } cere-runtime-common = { path = "../common", default-features = false } -ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } +ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } pallet-ddc-clusters = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-clusters" } pallet-ddc-customers = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-customers" } pallet-ddc-nodes = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-nodes" } diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 66389b9f4..73eecafbc 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -81,8 +81,8 @@ use sp_runtime::{ curve::PiecewiseLinear, generic, impl_opaque_keys, traits::{ - self, AccountIdConversion, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, NumberFor, - OpaqueKeys, SaturatedConversion, StaticLookup, + self, AccountIdConversion, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, + Identity as IdentityConvert, NumberFor, OpaqueKeys, SaturatedConversion, StaticLookup, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedPointNumber, FixedU128, Perbill, Percent, Permill, Perquintill, @@ -1352,9 +1352,10 @@ impl pallet_ddc_payouts::Config for Runtime { type CustomerDepositor = DdcCustomers; type ClusterVisitor = DdcClusters; type TreasuryVisitor = TreasuryWrapper; - type ValidatorList = pallet_staking::UseValidatorsMap; + type NominatorsAndValidatorsList = pallet_staking::UseNominatorsAndValidatorsMap; type ClusterCreator = DdcClusters; type WeightInfo = pallet_ddc_payouts::weights::SubstrateWeight; + type VoteScoreToU64 = IdentityConvert; // used for UseNominatorsAndValidatorsMap } construct_runtime!( diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index f14f04142..e2fbb9b0f 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -93,7 +93,7 @@ pallet-vesting = { default-features = false, git = "https://github.com/paritytec # cere dependencies cere-runtime-common = { path = "../common", default-features = false } cere-runtime-constants = { path = "./constants", default-features = false } -ddc-traits = { version = "0.1.0", default-features = false, path = "../../traits" } +ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } pallet-ddc-clusters = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-clusters" } pallet-ddc-customers = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-customers" } pallet-ddc-nodes = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-nodes" } diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 7d008b3c6..18ad72ca1 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -76,8 +76,8 @@ use sp_runtime::{ curve::PiecewiseLinear, generic, impl_opaque_keys, traits::{ - self, AccountIdConversion, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, NumberFor, - OpaqueKeys, SaturatedConversion, StaticLookup, + self, AccountIdConversion, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, + Identity as IdentityConvert, NumberFor, OpaqueKeys, SaturatedConversion, StaticLookup, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedPointNumber, FixedU128, Perbill, Percent, Permill, Perquintill, @@ -1337,9 +1337,10 @@ impl pallet_ddc_payouts::Config for Runtime { type CustomerDepositor = DdcCustomers; type ClusterVisitor = DdcClusters; type TreasuryVisitor = TreasuryWrapper; - type ValidatorList = pallet_staking::UseValidatorsMap; + type NominatorsAndValidatorsList = pallet_staking::UseNominatorsAndValidatorsMap; type ClusterCreator = DdcClusters; type WeightInfo = pallet_ddc_payouts::weights::SubstrateWeight; + type VoteScoreToU64 = IdentityConvert; // used for UseNominatorsAndValidatorsMap } impl pallet_ddc_staking::Config for Runtime { diff --git a/traits/Cargo.toml b/traits/Cargo.toml index e37e4d659..ffc5bdd7b 100644 --- a/traits/Cargo.toml +++ b/traits/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "ddc-traits" -version = "0.1.0" +version = "4.8.2" edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -ddc-primitives = { version = "0.1.0", default-features = false, path = "../primitives" } +ddc-primitives = { version = "4.8.2", default-features = false, path = "../primitives" } frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } From 50bf515dbd17a5af75db184c5ba50fa6a5391db0 Mon Sep 17 00:00:00 2001 From: Rakan Al-Huneiti Date: Fri, 5 Jan 2024 19:31:27 +0300 Subject: [PATCH 575/583] Fix versions on dev to 4.8.2 (#221) --- Cargo.lock | 2 +- Cargo.toml | 2 +- runtime/cere-dev/src/lib.rs | 2 +- runtime/cere/src/lib.rs | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1460848c..d5f67c4de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -752,7 +752,7 @@ dependencies = [ [[package]] name = "cere" -version = "4.8.1" +version = "4.8.2" dependencies = [ "cere-cli", "sc-cli", diff --git a/Cargo.toml b/Cargo.toml index 8de02d305..70c30a749 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "cere" -version = "4.8.1" +version = "4.8.2" build = "build.rs" edition = "2021" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index 73eecafbc..a30a1ca8e 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -127,7 +127,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: 48017, + spec_version: 48202, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 8, diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 18ad72ca1..9f01bb4b2 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -122,10 +122,10 @@ 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: 48010, + spec_version: 48202, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 7, + transaction_version: 8, state_version: 0, }; From c3981ba8b20b86a158134d4b32159a5385fc0cbe Mon Sep 17 00:00:00 2001 From: Rakan Al-Huneiti Date: Sat, 6 Jan 2024 01:47:52 +0300 Subject: [PATCH 576/583] Update Substrate deps to 0.9.33 (#146) Changes include: - [x] Update cere and cere-dev spec & transaction versions - [x] Upgrade substrate deps to 0.9.33 - [x] Fix issues related to upgrade - [x] Increment node version to 4.8.4 - [x] Updated changelog ~~MERGE https://github.com/Cerebellum-Network/blockchain-node/pull/173 BEFORE THIS ONE.~~ --- .github/workflows/ci.yaml | 8 +- CHANGELOG.md | 27 +- Cargo.lock | 855 ++++++++++-------- Cargo.toml | 6 +- cli/Cargo.toml | 12 +- node/client/Cargo.toml | 48 +- node/client/src/lib.rs | 37 +- node/service/Cargo.toml | 64 +- node/service/src/chain_spec.rs | 1 - pallets/chainbridge/Cargo.toml | 16 +- pallets/ddc-clusters/Cargo.toml | 35 +- pallets/ddc-clusters/src/lib.rs | 1 - .../ddc-clusters/src/node_provider_auth.rs | 2 + pallets/ddc-customers/Cargo.toml | 33 +- pallets/ddc-customers/src/lib.rs | 2 +- pallets/ddc-customers/src/tests.rs | 18 +- pallets/ddc-nodes/Cargo.toml | 28 +- pallets/ddc-payouts/Cargo.toml | 32 +- pallets/ddc-payouts/src/lib.rs | 4 +- pallets/ddc-staking/Cargo.toml | 28 +- pallets/ddc-staking/src/lib.rs | 4 +- pallets/ddc-staking/src/tests.rs | 26 +- pallets/erc20/Cargo.toml | 18 +- pallets/erc721/Cargo.toml | 16 +- primitives/Cargo.toml | 7 +- rpc/Cargo.toml | 46 +- runtime/cere-dev/Cargo.toml | 155 ++-- runtime/cere-dev/constants/Cargo.toml | 6 +- runtime/cere-dev/src/lib.rs | 71 +- runtime/cere/Cargo.toml | 154 ++-- runtime/cere/constants/Cargo.toml | 4 +- runtime/cere/src/lib.rs | 73 +- runtime/common/Cargo.toml | 10 +- rust-toolchain.toml | 2 +- shell.nix | 2 +- traits/Cargo.toml | 12 +- 36 files changed, 1003 insertions(+), 860 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1fd160065..de4909900 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -24,7 +24,7 @@ jobs: - name: Install nightly toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-10-09 + toolchain: nightly-2023-10-22 override: true components: rustfmt - name: Check TOML @@ -44,7 +44,7 @@ jobs: - name: Install nightly toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-10-09 + toolchain: nightly-2023-10-22 override: true target: wasm32-unknown-unknown - name: Rust Cache @@ -69,7 +69,7 @@ jobs: - name: Install nightly toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-10-09 + toolchain: nightly-2023-10-22 override: true target: wasm32-unknown-unknown components: clippy @@ -92,7 +92,7 @@ jobs: - name: Install nightly toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-10-09 + toolchain: nightly-2023-10-22 override: true target: wasm32-unknown-unknown - name: Rust Cache diff --git a/CHANGELOG.md b/CHANGELOG.md index 26416a2fc..3cea79319 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,20 +13,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - ... +## [4.8.4] + +### Changed + +- [C,D] Updated Substrate to polkadot-v0.9.33 + +## [4.8.3] + +## Changed + +- [C,D] Updated Substrate to polkadot-v0.9.31 + ## [4.8.2] ### Added -- [D] New `pallet-ddc-validator` which implements DDC CDN nodes validation and rewarding. You can enable DDC validation providing `--enable-ddc-validation` argument and `--dac-url` argument to specify DAC endpoint. It will only work on the nodes with validation and offchain workers enabled as well. -- [D] Several calls for `pallet-ddc-staking` to distribute rewards. -- [D] Third kind of account in DDC Staking for DDC nodes (along with stash and controller). -- [D] DDC cluster managers access control list in `pallet-ddc-staking` managed by governance. -- [Zombienet](https://github.com/paritytech/zombienet) configurations to test block building and spawn a network for DDC validation debugging. -- New `ddc-primitives` crate with DDC common types definition +- [C,D] New `pallet-ddc-nodes` is added which allows registering a DDC node within the network with specific settings. +- [C,D] New `pallet-ddc-clusters` is added which allows launching a DDC cluster in the network and managing it. +- [C,D] New `pallet-ddc-staking` is added which allows making bonds for DDC nodes before joining a DDC cluster. +- [C,D] New `pallet-ddc-customers` is added which allows depositing tokens and creating buckets for DDC customers. +- [C,D] New `pallet-ddc-payouts` is added which allows processing payouts to DDC nodes providers based on DAC validation results. +- New `ddc-primitives` crate with DDC common types definition. +- New `ddc-traits` crate with DDC common traits definition. ### Changed -- [C,D] Updated Substrate to polkadot-v0.9.31 +- [C] Fixed governance parameters ## [4.8.1] diff --git a/Cargo.lock b/Cargo.lock index d5f67c4de..cfeddbd8d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -115,6 +115,54 @@ dependencies = [ "winapi", ] +[[package]] +name = "anstream" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "anstyle-parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +dependencies = [ + "anstyle", + "windows-sys 0.48.0", +] + [[package]] name = "anyhow" version = "1.0.75" @@ -142,15 +190,6 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" -[[package]] -name = "arrayvec" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" -dependencies = [ - "nodrop", -] - [[package]] name = "arrayvec" version = "0.5.2" @@ -195,15 +234,15 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.7.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5ea910c42e5ab19012bab31f53cb4d63d54c3a27730f9a833a88efcf4bb52d" +checksum = "4b0c4a4f319e45986f347ee47fef8bf5e81c9abc3f6f58dc2391439f30df65f0" dependencies = [ - "async-lock 3.1.1", + "async-lock 2.8.0", "async-task", "concurrent-queue", "fastrand 2.0.1", - "futures-lite 2.0.1", + "futures-lite 1.13.0", "slab", ] @@ -248,14 +287,14 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41ed9d5715c2d329bf1b4da8d60455b99b187f27ba726df2883799af9af60997" dependencies = [ - "async-lock 3.1.1", + "async-lock 3.1.0", "cfg-if", "concurrent-queue", "futures-io", "futures-lite 2.0.1", "parking", "polling 3.3.0", - "rustix 0.38.25", + "rustix 0.38.24", "slab", "tracing", "waker-fn", @@ -273,9 +312,9 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.1.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655b9c7fe787d3b25cc0f804a1a8401790f0c5bc395beb5a64dc77d8de079105" +checksum = "deb2ab2aa8a746e221ab826c73f48bc6ba41be6763f0855cb249eb6d154cf1d7" dependencies = [ "event-listener 3.1.0", "event-listener-strategy", @@ -295,7 +334,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.25", + "rustix 0.38.24", "windows-sys 0.48.0", ] @@ -311,7 +350,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.25", + "rustix 0.38.24", "signal-hook-registry", "slab", "windows-sys 0.48.0", @@ -534,16 +573,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "blake2-rfc" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" -dependencies = [ - "arrayvec 0.4.12", - "constant_time_eq 0.1.5", -] - [[package]] name = "blake2b_simd" version = "1.0.2" @@ -552,7 +581,7 @@ checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", "arrayvec 0.7.4", - "constant_time_eq 0.3.0", + "constant_time_eq", ] [[package]] @@ -563,7 +592,7 @@ checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae" dependencies = [ "arrayref", "arrayvec 0.7.4", - "constant_time_eq 0.3.0", + "constant_time_eq", ] [[package]] @@ -576,7 +605,7 @@ dependencies = [ "arrayvec 0.7.4", "cc", "cfg-if", - "constant_time_eq 0.3.0", + "constant_time_eq", ] [[package]] @@ -625,7 +654,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ "async-channel 2.1.0", - "async-lock 3.1.1", + "async-lock 3.1.0", "async-task", "fastrand 2.0.1", "futures-io", @@ -720,9 +749,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" +checksum = "12024c4645c97566567129c204f65d5815a8c9aecf30fcbe682b2fe034996d36" dependencies = [ "serde", ] @@ -752,7 +781,7 @@ dependencies = [ [[package]] name = "cere" -version = "4.8.2" +version = "4.8.4" dependencies = [ "cere-cli", "sc-cli", @@ -761,7 +790,7 @@ dependencies = [ [[package]] name = "cere-cli" -version = "4.8.2" +version = "4.8.4" dependencies = [ "cere-client", "cere-service", @@ -776,7 +805,7 @@ dependencies = [ [[package]] name = "cere-client" -version = "4.8.2" +version = "4.8.4" dependencies = [ "cere-dev-runtime", "cere-runtime", @@ -807,7 +836,7 @@ dependencies = [ [[package]] name = "cere-dev-runtime" -version = "4.8.2" +version = "4.8.4" dependencies = [ "cere-dev-runtime-constants", "cere-runtime-common", @@ -896,7 +925,7 @@ dependencies = [ [[package]] name = "cere-dev-runtime-constants" -version = "4.8.2" +version = "4.8.4" dependencies = [ "node-primitives", "sp-runtime", @@ -904,7 +933,7 @@ dependencies = [ [[package]] name = "cere-rpc" -version = "4.8.2" +version = "4.8.4" dependencies = [ "jsonrpsee", "node-primitives", @@ -933,7 +962,7 @@ dependencies = [ [[package]] name = "cere-runtime" -version = "4.8.2" +version = "4.8.4" dependencies = [ "cere-runtime-common", "cere-runtime-constants", @@ -1022,7 +1051,7 @@ dependencies = [ [[package]] name = "cere-runtime-common" -version = "4.8.2" +version = "4.8.4" dependencies = [ "frame-support", "node-primitives", @@ -1032,14 +1061,14 @@ dependencies = [ [[package]] name = "cere-runtime-constants" -version = "4.8.2" +version = "4.8.4" dependencies = [ "node-primitives", ] [[package]] name = "cere-service" -version = "4.8.2" +version = "4.8.4" dependencies = [ "cere-client", "cere-dev-runtime", @@ -1188,41 +1217,60 @@ dependencies = [ [[package]] name = "clap" -version = "4.0.9" +version = "4.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30607dd93c420c6f1f80b544be522a0238a7db35e6a12968d28910983fee0df0" +checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" dependencies = [ - "atty", - "bitflags 1.3.2", + "clap_builder", "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" +dependencies = [ + "anstream", + "anstyle", "clap_lex", - "once_cell", "strsim", - "termcolor", ] [[package]] name = "clap_derive" -version = "4.0.9" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a307492e1a34939f79d3b6b9650bd2b971513cd775436bf2b78defeb5af00b" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", - "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.39", ] [[package]] name = "clap_lex" -version = "0.3.3" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + +[[package]] +name = "codespan-reporting" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "033f6b7a4acb1f358c742aaca805c939ee73b4c6209ae4318ec7aca81c42e646" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ - "os_str_bytes", + "termcolor", + "unicode-width", ] +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "comfy-table" version = "6.2.0" @@ -1245,15 +1293,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" - -[[package]] -name = "constant_time_eq" -version = "0.1.5" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" [[package]] name = "constant_time_eq" @@ -1452,9 +1494,9 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.3.2" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4", @@ -1555,6 +1597,50 @@ dependencies = [ "syn 2.0.39", ] +[[package]] +name = "cxx" +version = "1.0.110" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7129e341034ecb940c9072817cd9007974ea696844fc4dd582dc1653a7fbe2e8" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.110" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a24f3f5f8eed71936f21e570436f024f5c2e25628f7496aa7ccd03b90109d5" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn 2.0.39", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.110" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06fdd177fc61050d63f67f5bd6351fac6ab5526694ea8e359cd9cd3b75857f44" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.110" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "587663dd5fb3d10932c8aecfe7c844db1bcf0aee93eeab08fac13dc1212c2e7f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + [[package]] name = "data-encoding" version = "2.4.0" @@ -1583,7 +1669,7 @@ dependencies = [ [[package]] name = "ddc-primitives" -version = "4.8.2" +version = "4.8.4" dependencies = [ "parity-scale-codec", "scale-info", @@ -1594,7 +1680,7 @@ dependencies = [ [[package]] name = "ddc-traits" -version = "4.8.2" +version = "4.8.4" dependencies = [ "ddc-primitives", "frame-support", @@ -1607,11 +1693,12 @@ dependencies = [ [[package]] name = "der" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" dependencies = [ "const-oid", + "zeroize", ] [[package]] @@ -1758,9 +1845,9 @@ checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "ecdsa" -version = "0.13.4" +version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d69ae62e0ce582d56380743515fefaf1a8c70cec685d9677636d7e30ae9dc9" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" dependencies = [ "der", "elliptic-curve", @@ -1813,13 +1900,14 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" -version = "0.11.12" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b477563c2bfed38a3b7a60964c49e058b2510ad3f12ba3483fd8f62c2306d6" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" dependencies = [ "base16ct", "crypto-bigint", "der", + "digest 0.10.7", "ff", "generic-array 0.14.7", "group", @@ -2004,9 +2092,9 @@ dependencies = [ [[package]] name = "ff" -version = "0.11.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "131655483be284720a17d74ff97592b8e76576dc25563148601df2d7c9080924" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" dependencies = [ "rand_core 0.6.4", "subtle", @@ -2014,9 +2102,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.5" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" +checksum = "53a56f0780318174bad1c127063fd0c5fdfb35398e3cd79ffaab931a6c79df80" [[package]] name = "file-per-thread-logger" @@ -2103,7 +2191,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", ] @@ -2126,7 +2214,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "frame-system", @@ -2149,7 +2237,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "Inflector", "array-bytes", @@ -2190,6 +2278,7 @@ dependencies = [ "sp-keystore", "sp-runtime", "sp-state-machine", + "sp-std", "sp-storage", "sp-trie", "tempfile", @@ -2200,7 +2289,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2211,7 +2300,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -2227,7 +2316,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "frame-system", @@ -2256,7 +2345,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "bitflags 1.3.2", "frame-metadata", @@ -2288,7 +2377,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "Inflector", "cfg-expr", @@ -2302,7 +2391,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2314,7 +2403,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "proc-macro2", "quote", @@ -2324,7 +2413,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "log", @@ -2342,7 +2431,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -2357,7 +2446,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "sp-api", @@ -2366,7 +2455,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "parity-scale-codec", @@ -2461,11 +2550,7 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb" dependencies = [ - "fastrand 2.0.1", "futures-core", - "futures-io", - "memchr", - "parking", "pin-project-lite 0.2.13", ] @@ -2649,9 +2734,9 @@ dependencies = [ [[package]] name = "group" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5ac374b108929de78460075f3dc439fa66df9d8fc77e8f12caa5165fcf0c89" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ "ff", "rand_core 0.6.4", @@ -2774,6 +2859,15 @@ dependencies = [ "digest 0.9.0", ] +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "hmac-drbg" version = "0.3.0" @@ -3081,7 +3175,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi 0.3.3", - "rustix 0.38.25", + "rustix 0.38.24", "windows-sys 0.48.0", ] @@ -3264,14 +3358,14 @@ dependencies = [ [[package]] name = "k256" -version = "0.10.4" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19c3a5e0a0b8450278feda242592512e09f61c72e018b8cd5c859482802daf2d" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sec1", + "sha2 0.10.8", ] [[package]] @@ -3457,7 +3551,7 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log", - "lru 0.8.1", + "lru", "prost", "prost-build", "prost-codec", @@ -3781,6 +3875,15 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "link-cplusplus" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" +dependencies = [ + "cc", +] + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -3843,15 +3946,6 @@ dependencies = [ "value-bag", ] -[[package]] -name = "lru" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" -dependencies = [ - "hashbrown 0.12.3", -] - [[package]] name = "lru" version = "0.8.1" @@ -3942,7 +4036,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix 0.38.25", + "rustix 0.38.24", ] [[package]] @@ -4144,7 +4238,7 @@ dependencies = [ "matrixmultiply", "nalgebra-macros", "num-complex", - "num-rational 0.4.1", + "num-rational", "num-traits", "rand 0.8.5", "rand_distr", @@ -4252,7 +4346,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-system", "parity-scale-codec", @@ -4262,12 +4356,6 @@ dependencies = [ "sp-runtime", ] -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - [[package]] name = "nohash-hasher" version = "0.2.0" @@ -4290,17 +4378,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" -[[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-bigint" version = "0.4.4" @@ -4341,18 +4418,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" -dependencies = [ - "autocfg", - "num-bigint 0.2.6", - "num-integer", - "num-traits", -] - [[package]] name = "num-rational" version = "0.4.1" @@ -4360,7 +4425,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", - "num-bigint 0.4.4", + "num-bigint", "num-integer", "num-traits", ] @@ -4430,16 +4495,10 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" -[[package]] -name = "os_str_bytes" -version = "6.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" - [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "frame-system", @@ -4455,7 +4514,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "frame-system", @@ -4470,7 +4529,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -4494,7 +4553,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4514,7 +4573,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -4529,7 +4588,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -4546,7 +4605,7 @@ dependencies = [ [[package]] name = "pallet-chainbridge" -version = "4.8.2" +version = "4.8.4" dependencies = [ "frame-support", "frame-system", @@ -4562,7 +4621,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -4581,7 +4640,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -4598,7 +4657,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "bitflags 1.3.2", "frame-benchmarking", @@ -4627,7 +4686,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -4639,7 +4698,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "proc-macro2", "quote", @@ -4648,7 +4707,7 @@ dependencies = [ [[package]] name = "pallet-ddc-clusters" -version = "4.8.2" +version = "4.8.4" dependencies = [ "ddc-primitives", "ddc-traits", @@ -4674,7 +4733,7 @@ dependencies = [ [[package]] name = "pallet-ddc-customers" -version = "4.8.2" +version = "4.8.4" dependencies = [ "ddc-primitives", "ddc-traits", @@ -4697,7 +4756,7 @@ dependencies = [ [[package]] name = "pallet-ddc-nodes" -version = "4.8.2" +version = "4.8.4" dependencies = [ "ddc-primitives", "ddc-traits", @@ -4719,7 +4778,7 @@ dependencies = [ [[package]] name = "pallet-ddc-payouts" -version = "4.8.2" +version = "4.8.4" dependencies = [ "byte-unit", "ddc-primitives", @@ -4743,7 +4802,7 @@ dependencies = [ [[package]] name = "pallet-ddc-staking" -version = "4.8.2" +version = "4.8.4" dependencies = [ "ddc-primitives", "ddc-traits", @@ -4767,7 +4826,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -4785,7 +4844,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4809,7 +4868,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4822,7 +4881,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -4839,7 +4898,7 @@ dependencies = [ [[package]] name = "pallet-erc20" -version = "4.8.2" +version = "4.8.4" dependencies = [ "frame-support", "frame-system", @@ -4857,7 +4916,7 @@ dependencies = [ [[package]] name = "pallet-erc721" -version = "4.8.2" +version = "4.8.4" dependencies = [ "frame-support", "frame-system", @@ -4874,16 +4933,13 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-election-provider-support", "frame-support", "frame-system", "log", - "pallet-balances", - "pallet-staking", - "pallet-timestamp", "parity-scale-codec", "scale-info", "sp-io", @@ -4895,7 +4951,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -4918,7 +4974,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4934,7 +4990,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -4954,7 +5010,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -4971,7 +5027,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -4988,7 +5044,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -5004,7 +5060,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "frame-system", @@ -5021,7 +5077,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5041,7 +5097,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "sp-api", @@ -5051,7 +5107,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "frame-system", @@ -5068,7 +5124,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5091,7 +5147,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -5106,7 +5162,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "frame-system", @@ -5120,7 +5176,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -5135,7 +5191,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -5151,7 +5207,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "frame-system", @@ -5172,7 +5228,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -5188,7 +5244,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "frame-system", @@ -5202,7 +5258,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5225,7 +5281,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5236,7 +5292,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "frame-system", @@ -5250,7 +5306,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -5268,7 +5324,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -5287,7 +5343,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support", "frame-system", @@ -5303,7 +5359,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -5313,23 +5369,25 @@ dependencies = [ "sp-core", "sp-rpc", "sp-runtime", + "sp-weights", ] [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", "sp-api", "sp-runtime", + "sp-weights", ] [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -5346,7 +5404,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -5362,7 +5420,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-benchmarking", "frame-support", @@ -5376,11 +5434,11 @@ dependencies = [ [[package]] name = "parity-db" -version = "0.3.17" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8fdb726a43661fa54b43e7114e6b88b2289cae388eb3ad766d9d1754d83fce" +checksum = "59e9ab494af9e6e813c72170f0d3c1de1500990d62c97cc05cc7576f91aa402f" dependencies = [ - "blake2-rfc", + "blake2", "crc32fast", "fs2", "hex", @@ -5390,6 +5448,7 @@ dependencies = [ "memmap2", "parking_lot 0.12.1", "rand 0.8.5", + "siphasher", "snap", ] @@ -5453,15 +5512,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "parity-wasm" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" -dependencies = [ - "byteorder", -] - [[package]] name = "parity-wasm" version = "0.45.0" @@ -5664,13 +5714,12 @@ dependencies = [ [[package]] name = "pkcs8" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" dependencies = [ "der", "spki", - "zeroize", ] [[package]] @@ -5716,7 +5765,7 @@ dependencies = [ "cfg-if", "concurrent-queue", "pin-project-lite 0.2.13", - "rustix 0.38.25", + "rustix 0.38.24", "tracing", "windows-sys 0.48.0", ] @@ -6234,7 +6283,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "env_logger 0.9.3", "log", @@ -6260,12 +6309,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.1.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ef608575f6392792f9ecf7890c00086591d29a83910939d430753f7c050525" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" dependencies = [ "crypto-bigint", - "hmac 0.11.0", + "hmac 0.12.1", "zeroize", ] @@ -6410,9 +6459,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.25" +version = "0.38.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" +checksum = "9ad981d6c340a49cdc40a1028d9c6084ec7e9fa33fcb839cab656a267071e234" dependencies = [ "bitflags 2.4.1", "errno 0.3.7", @@ -6498,7 +6547,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "log", "sp-core", @@ -6509,7 +6558,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "futures", @@ -6536,7 +6585,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "futures", "futures-timer", @@ -6559,7 +6608,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6575,7 +6624,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "impl-trait-for-tuples", "memmap2", @@ -6592,7 +6641,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6603,7 +6652,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "array-bytes", "chrono", @@ -6643,7 +6692,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "fnv", "futures", @@ -6671,7 +6720,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "hash-db", "kvdb", @@ -6696,7 +6745,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "futures", @@ -6720,19 +6769,18 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "fork-tree", "futures", "log", "merlin", - "num-bigint 0.2.6", - "num-rational 0.2.4", + "num-bigint", + "num-rational", "num-traits", "parity-scale-codec", "parking_lot 0.12.1", - "rand 0.7.3", "sc-client-api", "sc-consensus", "sc-consensus-epochs", @@ -6762,7 +6810,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "futures", "jsonrpsee", @@ -6784,7 +6832,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6797,7 +6845,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "futures", @@ -6821,7 +6869,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "sc-client-api", "sp-authorship", @@ -6832,10 +6880,10 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "lazy_static", - "lru 0.7.8", + "lru", "parity-scale-codec", "parking_lot 0.12.1", "sc-executor-common", @@ -6848,7 +6896,6 @@ dependencies = [ "sp-io", "sp-panic-handler", "sp-runtime-interface", - "sp-tasks", "sp-trie", "sp-version", "sp-wasm-interface", @@ -6859,7 +6906,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "environmental", "parity-scale-codec", @@ -6875,7 +6922,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "log", "parity-scale-codec", @@ -6890,14 +6937,14 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "cfg-if", "libc", "log", "once_cell", "parity-scale-codec", - "parity-wasm 0.45.0", + "parity-wasm", "rustix 0.35.16", "sc-allocator", "sc-executor-common", @@ -6910,7 +6957,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "ahash", "array-bytes", @@ -6951,7 +6998,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "finality-grandpa", "futures", @@ -6972,7 +7019,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "ansi_term", "futures", @@ -6989,7 +7036,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "array-bytes", "async-trait", @@ -7004,7 +7051,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "array-bytes", "async-trait", @@ -7022,7 +7069,7 @@ dependencies = [ "linked-hash-map", "linked_hash_set", "log", - "lru 0.7.8", + "lru", "parity-scale-codec", "parking_lot 0.12.1", "pin-project", @@ -7051,7 +7098,7 @@ dependencies = [ [[package]] name = "sc-network-bitswap" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "cid", "futures", @@ -7071,7 +7118,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -7097,14 +7144,14 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "ahash", "futures", "futures-timer", "libp2p", "log", - "lru 0.7.8", + "lru", "sc-network-common", "sc-peerset", "sp-runtime", @@ -7115,7 +7162,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "array-bytes", "futures", @@ -7136,14 +7183,14 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "array-bytes", "fork-tree", "futures", "libp2p", "log", - "lru 0.7.8", + "lru", "mockall", "parity-scale-codec", "prost", @@ -7166,7 +7213,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "array-bytes", "futures", @@ -7185,7 +7232,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "array-bytes", "bytes", @@ -7215,7 +7262,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "futures", "libp2p", @@ -7228,7 +7275,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -7237,7 +7284,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "futures", "hash-db", @@ -7267,7 +7314,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "futures", "jsonrpsee", @@ -7290,7 +7337,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "futures", "jsonrpsee", @@ -7303,7 +7350,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "futures", "hex", @@ -7322,7 +7369,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "directories", @@ -7393,7 +7440,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "log", "parity-scale-codec", @@ -7407,7 +7454,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -7426,7 +7473,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "futures", "libc", @@ -7445,7 +7492,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "chrono", "futures", @@ -7463,7 +7510,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "ansi_term", "atty", @@ -7494,7 +7541,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7505,7 +7552,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "futures", @@ -7532,7 +7579,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "futures", @@ -7546,7 +7593,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "futures", "futures-timer", @@ -7615,6 +7662,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scratch" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" + [[package]] name = "sct" version = "0.7.1" @@ -7627,10 +7680,11 @@ dependencies = [ [[package]] name = "sec1" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" dependencies = [ + "base16ct", "der", "generic-array 0.14.7", "pkcs8", @@ -7846,11 +7900,11 @@ dependencies = [ [[package]] name = "signature" -version = "1.4.0" +version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02658e48d89f2bec991f9a78e69cfa4c316f8d6a6c4ec12fae1aeb263d486788" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ - "digest 0.9.0", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -7866,6 +7920,12 @@ dependencies = [ "paste", ] +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "slab" version = "0.4.9" @@ -7949,7 +8009,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "hash-db", "log", @@ -7967,7 +8027,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "blake2", "proc-macro-crate", @@ -7979,7 +8039,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "scale-info", @@ -7992,7 +8052,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "integer-sqrt", "num-traits", @@ -8007,7 +8067,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "scale-info", @@ -8020,7 +8080,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "parity-scale-codec", @@ -8032,7 +8092,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "sp-api", @@ -8044,11 +8104,11 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "futures", "log", - "lru 0.7.8", + "lru", "parity-scale-codec", "parking_lot 0.12.1", "sp-api", @@ -8062,7 +8122,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "futures", @@ -8081,7 +8141,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "merlin", @@ -8104,7 +8164,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "scale-info", @@ -8118,7 +8178,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "scale-info", @@ -8131,7 +8191,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "array-bytes", "base58", @@ -8150,7 +8210,6 @@ dependencies = [ "merlin", "num-traits", "parity-scale-codec", - "parity-util-mem", "parking_lot 0.12.1", "primitive-types", "rand 0.7.3", @@ -8177,7 +8236,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "blake2", "byteorder", @@ -8191,7 +8250,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "proc-macro2", "quote", @@ -8202,7 +8261,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -8211,7 +8270,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "proc-macro2", "quote", @@ -8221,7 +8280,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "environmental", "parity-scale-codec", @@ -8232,7 +8291,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "finality-grandpa", "log", @@ -8250,7 +8309,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -8264,7 +8323,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "bytes", "futures", @@ -8290,7 +8349,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "lazy_static", "sp-core", @@ -8301,7 +8360,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "futures", @@ -8318,7 +8377,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "thiserror", "zstd", @@ -8327,7 +8386,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "scale-info", @@ -8341,7 +8400,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "sp-api", "sp-core", @@ -8351,7 +8410,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "backtrace", "lazy_static", @@ -8361,7 +8420,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "rustc-hash", "serde", @@ -8371,7 +8430,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "either", "hash256-std-hasher", @@ -8394,7 +8453,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -8412,7 +8471,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "Inflector", "proc-macro-crate", @@ -8424,7 +8483,7 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "log", "parity-scale-codec", @@ -8438,7 +8497,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "scale-info", @@ -8452,7 +8511,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "scale-info", @@ -8463,7 +8522,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "hash-db", "log", @@ -8485,12 +8544,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8500,23 +8559,10 @@ dependencies = [ "sp-std", ] -[[package]] -name = "sp-tasks" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" -dependencies = [ - "log", - "sp-core", - "sp-externalities", - "sp-io", - "sp-runtime-interface", - "sp-std", -] - [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "futures-timer", @@ -8532,7 +8578,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "sp-std", @@ -8544,7 +8590,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "sp-api", "sp-runtime", @@ -8553,7 +8599,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "log", @@ -8569,13 +8615,13 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "ahash", "hash-db", "hashbrown 0.12.3", "lazy_static", - "lru 0.7.8", + "lru", "memory-db", "nohash-hasher", "parity-scale-codec", @@ -8592,11 +8638,11 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "impl-serde", "parity-scale-codec", - "parity-wasm 0.45.0", + "parity-wasm", "scale-info", "serde", "sp-core-hashing-proc-macro", @@ -8609,7 +8655,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -8620,7 +8666,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "impl-trait-for-tuples", "log", @@ -8633,7 +8679,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8660,9 +8706,9 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "spki" -version = "0.5.4" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" dependencies = [ "base64ct", "der", @@ -8780,7 +8826,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "platforms 2.0.0", ] @@ -8788,7 +8834,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-system-rpc-runtime-api", "futures", @@ -8809,7 +8855,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "futures-util", "hyper", @@ -8822,7 +8868,7 @@ dependencies = [ [[package]] name = "substrate-rpc-client" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "async-trait", "jsonrpsee", @@ -8835,7 +8881,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "jsonrpsee", "log", @@ -8856,7 +8902,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "futures", "substrate-test-utils-derive", @@ -8866,7 +8912,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8877,7 +8923,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "ansi_term", "build-helper", @@ -8888,7 +8934,7 @@ dependencies = [ "tempfile", "toml", "walkdir", - "wasm-gc-api", + "wasm-opt", ] [[package]] @@ -8973,7 +9019,7 @@ dependencies = [ "cfg-if", "fastrand 2.0.1", "redox_syscall 0.4.1", - "rustix 0.38.25", + "rustix 0.38.24", "windows-sys 0.48.0", ] @@ -9323,10 +9369,9 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.31#7a4e5163091384c4c10b6d76f5cb80dac0834f38" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "clap", - "frame-try-runtime", "log", "parity-scale-codec", "remote-externalities", @@ -9478,9 +9523,15 @@ dependencies = [ [[package]] name = "utf8-width" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "valuable" @@ -9616,23 +9667,53 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] -name = "wasm-gc-api" -version = "0.1.11" +name = "wasm-instrument" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c32691b6c7e6c14e7f8fd55361a9088b507aa49620fcd06c09b3a1082186b9" +checksum = "aa1dafb3e60065305741e83db35c6c2584bb3725b692b5b66148a38d72ace6cd" dependencies = [ - "log", - "parity-wasm 0.32.0", - "rustc-demangle", + "parity-wasm", ] [[package]] -name = "wasm-instrument" -version = "0.3.0" +name = "wasm-opt" +version = "0.110.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa1dafb3e60065305741e83db35c6c2584bb3725b692b5b66148a38d72ace6cd" +checksum = "b68e8037b4daf711393f4be2056246d12d975651b14d581520ad5d1f19219cec" +dependencies = [ + "anyhow", + "libc", + "strum", + "strum_macros", + "tempfile", + "thiserror", + "wasm-opt-cxx-sys", + "wasm-opt-sys", +] + +[[package]] +name = "wasm-opt-cxx-sys" +version = "0.110.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91adbad477e97bba3fbd21dd7bfb594e7ad5ceb9169ab1c93ab9cb0ada636b6f" +dependencies = [ + "anyhow", + "cxx", + "cxx-build", + "wasm-opt-sys", +] + +[[package]] +name = "wasm-opt-sys" +version = "0.110.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec4fa5a322a4e6ac22fd141f498d56afbdbf9df5debeac32380d2dcaa3e06941" dependencies = [ - "parity-wasm 0.45.0", + "anyhow", + "cc", + "cxx", + "cxx-build", + "regex", ] [[package]] @@ -9656,7 +9737,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06c326c93fbf86419608361a2c925a31754cf109da1b8b55737070b4d6669422" dependencies = [ - "parity-wasm 0.45.0", + "parity-wasm", "wasmi-validation", "wasmi_core", ] @@ -9667,7 +9748,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ff416ad1ff0c42e5a926ed5d5fab74c0f098749aa0ad8b2a34b982ce0e867b" dependencies = [ - "parity-wasm 0.45.0", + "parity-wasm", ] [[package]] @@ -9679,7 +9760,7 @@ dependencies = [ "downcast-rs", "libm", "memory_units", - "num-rational 0.4.1", + "num-rational", "num-traits", ] @@ -9900,7 +9981,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.25", + "rustix 0.38.24", ] [[package]] @@ -10204,9 +10285,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.7.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "12a3946ecfc929b583800f4629b6c25b88ac6e92a40ea5670f77112a85d40a8b" dependencies = [ "zeroize_derive", ] diff --git a/Cargo.toml b/Cargo.toml index 70c30a749..4726737f0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,17 +4,17 @@ path = "src/main.rs" [package] name = "cere" -version = "4.8.2" +version = "4.8.4" build = "build.rs" edition = "2021" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] cere-cli = { path = "cli", features = ["cere-dev-native"] } -sc-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +sc-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } [build-dependencies] -substrate-build-script-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +substrate-build-script-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [workspace] members = [ diff --git a/cli/Cargo.toml b/cli/Cargo.toml index ef0f24d90..faaece826 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-cli" -version = "4.8.2" +version = "4.8.4" edition = "2021" [package.metadata.wasm-pack.profile.release] @@ -13,10 +13,10 @@ crate-type = ["cdylib", "rlib"] [dependencies] clap = { version = "4.0.9", features = ["derive"], optional = true } -frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.31" } -sc-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.31" } -sc-service = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.31" } -try-runtime-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.31" } +frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.33" } +sc-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.33" } +sc-service = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.33" } +try-runtime-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.33" } url = "2.4.1" # Local @@ -24,7 +24,7 @@ cere-client = { path = "../node/client", optional = true } cere-service = { path = "../node/service", default-features = false, optional = true } [build-dependencies] -substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } [features] default = ["cli", "cere-native"] diff --git a/node/client/Cargo.toml b/node/client/Cargo.toml index 94eeea9ab..99c3ca651 100644 --- a/node/client/Cargo.toml +++ b/node/client/Cargo.toml @@ -1,32 +1,32 @@ [package] name = "cere-client" -version = "4.8.2" +version = "4.8.4" edition = "2021" [dependencies] -frame-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -node-primitives = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-transaction-payment = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-client-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-executor = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sc-service = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } -sp-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-authority-discovery = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sp-blockchain = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-consensus = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-inherents = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-offchain = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-session = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-storage = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sp-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +node-primitives = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-transaction-payment = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-client-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-executor = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sc-service = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.33" } +sp-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-authority-discovery = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sp-blockchain = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-consensus = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-inherents = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-offchain = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-runtime = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-session = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-storage = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sp-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-transaction-pool = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } # Local cere-dev-runtime = { path = "../../runtime/cere-dev", optional = true } diff --git a/node/client/src/lib.rs b/node/client/src/lib.rs index 240894e91..0bb9ab21a 100644 --- a/node/client/src/lib.rs +++ b/node/client/src/lib.rs @@ -164,13 +164,13 @@ impl UsageProvider for Client { impl sc_client_api::BlockBackend for Client { fn block_body( &self, - id: &BlockId, + hash: ::Hash, ) -> sp_blockchain::Result::Extrinsic>>> { with_client! { self, client, { - client.block_body(id) + client.block_body(hash) } } } @@ -195,12 +195,15 @@ impl sc_client_api::BlockBackend for Client { } } - fn justifications(&self, id: &BlockId) -> sp_blockchain::Result> { + fn justifications( + &self, + hash: ::Hash, + ) -> sp_blockchain::Result> { with_client! { self, client, { - client.justifications(id) + client.justifications(hash) } } } @@ -220,26 +223,26 @@ impl sc_client_api::BlockBackend for Client { fn indexed_transaction( &self, - id: &::Hash, + hash: ::Hash, ) -> sp_blockchain::Result>> { with_client! { self, client, { - client.indexed_transaction(id) + client.indexed_transaction(hash) } } } fn block_indexed_body( &self, - id: &BlockId, + hash: ::Hash, ) -> sp_blockchain::Result>>> { with_client! { self, client, { - client.block_indexed_body(id) + client.block_indexed_body(hash) } } } @@ -258,7 +261,7 @@ impl sc_client_api::BlockBackend for Client { impl sc_client_api::StorageProvider for Client { fn storage( &self, - hash: &::Hash, + hash: ::Hash, key: &StorageKey, ) -> sp_blockchain::Result> { with_client! { @@ -272,7 +275,7 @@ impl sc_client_api::StorageProvider for Client { fn storage_keys( &self, - hash: &::Hash, + hash: ::Hash, key_prefix: &StorageKey, ) -> sp_blockchain::Result> { with_client! { @@ -286,7 +289,7 @@ impl sc_client_api::StorageProvider for Client { fn storage_hash( &self, - hash: &::Hash, + hash: ::Hash, key: &StorageKey, ) -> sp_blockchain::Result::Hash>> { with_client! { @@ -300,7 +303,7 @@ impl sc_client_api::StorageProvider for Client { fn storage_pairs( &self, - hash: &::Hash, + hash: ::Hash, key_prefix: &StorageKey, ) -> sp_blockchain::Result> { with_client! { @@ -314,7 +317,7 @@ impl sc_client_api::StorageProvider for Client { fn storage_keys_iter<'a>( &self, - hash: &::Hash, + hash: ::Hash, prefix: Option<&'a StorageKey>, start_key: Option<&StorageKey>, ) -> sp_blockchain::Result< @@ -331,7 +334,7 @@ impl sc_client_api::StorageProvider for Client { fn child_storage( &self, - hash: &::Hash, + hash: ::Hash, child_info: &ChildInfo, key: &StorageKey, ) -> sp_blockchain::Result> { @@ -346,7 +349,7 @@ impl sc_client_api::StorageProvider for Client { fn child_storage_keys( &self, - hash: &::Hash, + hash: ::Hash, child_info: &ChildInfo, key_prefix: &StorageKey, ) -> sp_blockchain::Result> { @@ -361,7 +364,7 @@ impl sc_client_api::StorageProvider for Client { fn child_storage_keys_iter<'a>( &self, - hash: &::Hash, + hash: ::Hash, child_info: ChildInfo, prefix: Option<&'a StorageKey>, start_key: Option<&StorageKey>, @@ -379,7 +382,7 @@ impl sc_client_api::StorageProvider for Client { fn child_storage_hash( &self, - hash: &::Hash, + hash: ::Hash, child_info: &ChildInfo, key: &StorageKey, ) -> sp_blockchain::Result::Hash>> { diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index c28d6fc1b..33e672b72 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-service" -version = "4.8.2" +version = "4.8.4" edition = "2021" [dependencies] @@ -9,37 +9,37 @@ jsonrpsee = { version = "0.15.1", features = ["server"] } rand = "0.8" serde = { version = "1.0.136", features = ["derive"] } -node-primitives = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-authority-discovery = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-basic-authorship = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-chain-spec = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-client-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-consensus = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-consensus-slots = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-consensus-uncles = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-executor = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", features = ["wasmtime"] } -sc-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-network = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-network-common = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sc-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-service = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", features = ["wasmtime"] } -sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-sysinfo = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-telemetry = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-transaction-pool = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-authority-discovery = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-authorship = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-blockchain = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-transaction-storage-proof = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +node-primitives = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-authority-discovery = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-basic-authorship = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-chain-spec = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-client-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-consensus = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-consensus-slots = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-consensus-uncles = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-executor = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-network = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-network-common = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sc-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-service = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-sysinfo = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-telemetry = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-transaction-pool = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-authority-discovery = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-authorship = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-blockchain = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-consensus-babe = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-runtime = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-transaction-storage-proof = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } # Local cere-client = { path = "../client", default-features = false, optional = true } diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index 83dfe40af..f428baa4e 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -150,7 +150,6 @@ pub fn cere_dev_genesis( let nominations = initial_authorities .as_slice() .choose_multiple(&mut rng, count) - .into_iter() .map(|choice| choice.0.clone()) .collect::>(); (x.clone(), x.clone(), STASH, cere_dev::StakerStatus::Nominator(nominations)) diff --git a/pallets/chainbridge/Cargo.toml b/pallets/chainbridge/Cargo.toml index 0f99454b1..ddc017445 100644 --- a/pallets/chainbridge/Cargo.toml +++ b/pallets/chainbridge/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-chainbridge" -version = "4.8.2" +version = "4.8.4" authors = ["Parity Technologies "] edition = "2021" homepage = "https://substrate.io" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [features] default = ["std"] diff --git a/pallets/ddc-clusters/Cargo.toml b/pallets/ddc-clusters/Cargo.toml index def75665d..fa9afccdf 100644 --- a/pallets/ddc-clusters/Cargo.toml +++ b/pallets/ddc-clusters/Cargo.toml @@ -1,32 +1,33 @@ [package] name = "pallet-ddc-clusters" -version = "4.8.2" +version = "4.8.4" edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -ddc-primitives = { version = "4.8.2", default-features = false, path = "../../primitives" } -ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } -frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +ddc-primitives = { version = "4.8.4", default-features = false, path = "../../primitives" } +ddc-traits = { version = "4.8.4", default-features = false, path = "../../traits" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } hex-literal = "^0.3.1" -pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } pallet-ddc-nodes = { version = "4.7.0", default-features = false, path = "../ddc-nodes" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } serde = { version = "1.0.136", default-features = false, features = ["derive"], optional = true } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [dev-dependencies] -frame-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-io = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +hex-literal = "^0.3.1" +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-io = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [features] default = ["std"] diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index e10ce6aac..6bd94e01d 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -13,7 +13,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] -#![feature(is_some_and)] // ToDo: delete at rustc > 1.70 pub mod weights; use crate::weights::WeightInfo; diff --git a/pallets/ddc-clusters/src/node_provider_auth.rs b/pallets/ddc-clusters/src/node_provider_auth.rs index 183df979b..6708d732c 100644 --- a/pallets/ddc-clusters/src/node_provider_auth.rs +++ b/pallets/ddc-clusters/src/node_provider_auth.rs @@ -53,6 +53,7 @@ where None, call_data, false, + pallet_contracts::Determinism::Deterministic, ) .result .map_err(|_| NodeProviderAuthContractError::ContractCallFailed)? @@ -122,6 +123,7 @@ where None, call_data, false, + pallet_contracts::Determinism::Deterministic, ) .result .map_err(|_| NodeProviderAuthContractError::NodeAuthorizationNotSuccessful)?; diff --git a/pallets/ddc-customers/Cargo.toml b/pallets/ddc-customers/Cargo.toml index a723c3c66..7c4408029 100644 --- a/pallets/ddc-customers/Cargo.toml +++ b/pallets/ddc-customers/Cargo.toml @@ -1,15 +1,16 @@ [package] name = "pallet-ddc-customers" -version = "4.8.2" +version = "4.8.4" edition = "2021" [dependencies] -frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +# Substrate +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } # 3rd Party codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } @@ -18,17 +19,17 @@ rand_chacha = { version = "0.2", default-features = false, optional = true } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } # Cere -ddc-primitives = { version = "4.8.2", default-features = false, path = "../../primitives" } -ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } +ddc-primitives = { version = "4.8.4", default-features = false, path = "../../primitives" } +ddc-traits = { version = "4.8.4", default-features = false, path = "../../traits" } [dev-dependencies] -frame-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [features] default = ["std"] diff --git a/pallets/ddc-customers/src/lib.rs b/pallets/ddc-customers/src/lib.rs index 482f9465b..a1bff9acd 100644 --- a/pallets/ddc-customers/src/lib.rs +++ b/pallets/ddc-customers/src/lib.rs @@ -251,7 +251,7 @@ pub mod pallet { } } - for &(ref cluster_id, ref owner_id, ref deposit, ref is_public) in &self.buckets { + for (cluster_id, owner_id, deposit, is_public) in &self.buckets { let cur_bucket_id = >::get() .checked_add(1) .ok_or(Error::::ArithmeticOverflow) diff --git a/pallets/ddc-customers/src/tests.rs b/pallets/ddc-customers/src/tests.rs index 9a7738ca5..834d8b476 100644 --- a/pallets/ddc-customers/src/tests.rs +++ b/pallets/ddc-customers/src/tests.rs @@ -114,7 +114,7 @@ fn deposit_and_deposit_extra_works() { // Check storage assert_eq!( - DdcCustomers::ledger(&account_1), + DdcCustomers::ledger(account_1), Some(AccountsLedger { owner: account_1, total: amount1, @@ -144,7 +144,7 @@ fn deposit_and_deposit_extra_works() { // Check storage assert_eq!( - DdcCustomers::ledger(&account_1), + DdcCustomers::ledger(account_1), Some(AccountsLedger { owner: account_1, total: amount1 + amount2, @@ -178,7 +178,7 @@ fn charge_content_owner_works() { // Check storage assert_eq!( - DdcCustomers::ledger(&account_3), + DdcCustomers::ledger(account_3), Some(AccountsLedger { owner: account_3, total: deposit, @@ -206,7 +206,7 @@ fn charge_content_owner_works() { // Check storage assert_eq!( - DdcCustomers::ledger(&account_3), + DdcCustomers::ledger(account_3), Some(AccountsLedger { owner: account_3, total: deposit - charge1, @@ -219,7 +219,7 @@ fn charge_content_owner_works() { let charge2 = 100u128; let charge_result = DdcCustomers::charge_content_owner(account_3, vault, charge2).unwrap(); assert_eq!( - DdcCustomers::ledger(&account_3), + DdcCustomers::ledger(account_3), Some(AccountsLedger { owner: account_3, total: 0, @@ -236,7 +236,7 @@ fn charge_content_owner_works() { assert_ok!(DdcCustomers::deposit_extra(RuntimeOrigin::signed(account_3), deposit)); assert_eq!( - DdcCustomers::ledger(&account_3), + DdcCustomers::ledger(account_3), Some(AccountsLedger { owner: account_3, total: deposit, @@ -272,7 +272,7 @@ fn unlock_and_withdraw_deposit_works() { let unlocking_chunks = vec![UnlockChunk { value: 1, block: 11 }]; // Check storage assert_eq!( - DdcCustomers::ledger(&1), + DdcCustomers::ledger(1), Some(AccountsLedger { owner: account_1, total: 35_u128, @@ -299,7 +299,7 @@ fn unlock_and_withdraw_deposit_works() { assert_ok!(DdcCustomers::withdraw_unlocked_deposit(RuntimeOrigin::signed(account_1))); // Check storage assert_eq!( - DdcCustomers::ledger(&1), + DdcCustomers::ledger(1), Some(AccountsLedger { owner: account_1, total: 3_u128, @@ -314,7 +314,7 @@ fn unlock_and_withdraw_deposit_works() { assert_ok!(DdcCustomers::withdraw_unlocked_deposit(RuntimeOrigin::signed(account_1))); // Check storage - assert_eq!(DdcCustomers::ledger(&account_1), None); + assert_eq!(DdcCustomers::ledger(account_1), None); }) } diff --git a/pallets/ddc-nodes/Cargo.toml b/pallets/ddc-nodes/Cargo.toml index e2a615823..c8836da53 100644 --- a/pallets/ddc-nodes/Cargo.toml +++ b/pallets/ddc-nodes/Cargo.toml @@ -1,27 +1,27 @@ [package] name = "pallet-ddc-nodes" -version = "4.8.2" +version = "4.8.4" edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -ddc-primitives = { version = "4.8.2", default-features = false, path = "../../primitives" } -ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } -frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +ddc-primitives = { version = "4.8.4", default-features = false, path = "../../primitives" } +ddc-traits = { version = "4.8.4", default-features = false, path = "../../traits" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } serde = { version = "1.0.136", default-features = false, features = ["derive"], optional = true } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [dev-dependencies] -pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-io = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-io = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [features] default = ["std"] diff --git a/pallets/ddc-payouts/Cargo.toml b/pallets/ddc-payouts/Cargo.toml index 6122a256c..c7a8c0ff1 100644 --- a/pallets/ddc-payouts/Cargo.toml +++ b/pallets/ddc-payouts/Cargo.toml @@ -1,30 +1,30 @@ [package] name = "pallet-ddc-payouts" -version = "4.8.2" +version = "4.8.4" edition = "2021" [dependencies] byte-unit = { version = "4.0.19", default-features = false, features = ["u128"] } codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -ddc-primitives = { version = "4.8.2", default-features = false, path = "../../primitives" } -ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } -frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +ddc-primitives = { version = "4.8.4", default-features = false, path = "../../primitives" } +ddc-traits = { version = "4.8.4", default-features = false, path = "../../traits" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", default-features = false } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [dev-dependencies] -pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [features] default = ["std"] diff --git a/pallets/ddc-payouts/src/lib.rs b/pallets/ddc-payouts/src/lib.rs index 8dbd206d5..8feb9e2fe 100644 --- a/pallets/ddc-payouts/src/lib.rs +++ b/pallets/ddc-payouts/src/lib.rs @@ -683,7 +683,7 @@ pub mod pallet { let max_dust = MaxDust::get().saturated_into::>(); let mut updated_billing_report = billing_report.clone(); for payee in payees { - let node_reward = get_node_reward::( + let node_reward = get_node_reward( &payee.1, &billing_report.total_node_usage, &billing_report.total_customer_charge, @@ -897,7 +897,7 @@ pub mod pallet { Ok(()) } - fn get_node_reward( + fn get_node_reward( node_usage: &NodeUsage, total_nodes_usage: &NodeUsage, total_customer_charge: &CustomerCharge, diff --git a/pallets/ddc-staking/Cargo.toml b/pallets/ddc-staking/Cargo.toml index 27608aa03..913259c31 100644 --- a/pallets/ddc-staking/Cargo.toml +++ b/pallets/ddc-staking/Cargo.toml @@ -1,28 +1,28 @@ [package] name = "pallet-ddc-staking" -version = "4.8.2" +version = "4.8.4" edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -ddc-primitives = { version = "4.8.2", default-features = false, path = "../../primitives" } -ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } -frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +ddc-primitives = { version = "4.8.4", default-features = false, path = "../../primitives" } +ddc-traits = { version = "4.8.4", default-features = false, path = "../../traits" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [dev-dependencies] lazy_static = "1.4.0" -pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +pallet-balances = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } parking_lot = "0.12.1" -sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-tracing = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +substrate-test-utils = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [features] default = ["std"] diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 10a7feb56..57b4e2ff9 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -13,7 +13,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] -#![feature(is_some_and)] // ToDo: delete at rustc > 1.70 #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; @@ -35,8 +34,9 @@ use ddc_traits::{ node::{NodeCreator, NodeVisitor}, staking::{StakerCreator, StakingVisitor, StakingVisitorError}, }; +#[cfg(feature = "std")] +use frame_support::assert_ok; use frame_support::{ - assert_ok, pallet_prelude::*, parameter_types, traits::{Currency, DefensiveSaturating, LockIdentifier, LockableCurrency, WithdrawReasons}, diff --git a/pallets/ddc-staking/src/tests.rs b/pallets/ddc-staking/src/tests.rs index 5442803e3..a3e236905 100644 --- a/pallets/ddc-staking/src/tests.rs +++ b/pallets/ddc-staking/src/tests.rs @@ -29,15 +29,15 @@ fn basic_setup_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!(DdcStaking::bonded(&11), Some(10)); + assert_eq!(DdcStaking::bonded(11), Some(10)); // Account 21 is stashed and locked, and account 20 is the controller - assert_eq!(DdcStaking::bonded(&21), Some(20)); + assert_eq!(DdcStaking::bonded(21), Some(20)); // Account 1 is not a stashed - assert_eq!(DdcStaking::bonded(&1), None); + assert_eq!(DdcStaking::bonded(1), None); // Account 10 controls the stash from account 11, which is 100 units assert_eq!( - DdcStaking::ledger(&10), + DdcStaking::ledger(10), Some(StakingLedger { stash: 11, total: 100, @@ -48,7 +48,7 @@ fn basic_setup_works() { ); // Account 20 controls the stash from account 21, which is 100 units assert_eq!( - DdcStaking::ledger(&20), + DdcStaking::ledger(20), Some(StakingLedger { stash: 21, total: 100, @@ -58,7 +58,7 @@ fn basic_setup_works() { }) ); // Account 1 does not control any stash - assert_eq!(DdcStaking::ledger(&1), None); + assert_eq!(DdcStaking::ledger(1), None); }); } @@ -66,7 +66,7 @@ fn basic_setup_works() { fn change_controller_works() { ExtBuilder::default().build_and_execute(|| { // 10 and 11 are bonded as stash controller. - assert_eq!(DdcStaking::bonded(&11), Some(10)); + assert_eq!(DdcStaking::bonded(11), Some(10)); // 10 can control 11 who is initially a validator. assert_ok!(DdcStaking::withdraw_unbonded(RuntimeOrigin::signed(10))); @@ -77,7 +77,7 @@ fn change_controller_works() { DdcStaking::set_controller(RuntimeOrigin::signed(11), 3), Error::::AlreadyPaired ); - assert_eq!(DdcStaking::bonded(&11), Some(3)); + assert_eq!(DdcStaking::bonded(11), Some(3)); // 10 is no longer in control. assert_noop!( @@ -185,7 +185,7 @@ fn set_node_works() { ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); // 10 and 11 are bonded as stash controller. - assert_eq!(DdcStaking::bonded(&11), Some(10)); + assert_eq!(DdcStaking::bonded(11), Some(10)); // Node is already paired assert_noop!( @@ -314,9 +314,9 @@ fn staking_should_work() { // Account 4 controls the stash from account 3, which is 1500 units, 3 is a Storage // participant, 5 is a DDC node. - assert_eq!(DdcStaking::bonded(&3), Some(4)); + assert_eq!(DdcStaking::bonded(3), Some(4)); assert_eq!( - DdcStaking::ledger(&4), + DdcStaking::ledger(4), Some(StakingLedger { stash: 3, total: 1500, @@ -343,7 +343,7 @@ fn staking_should_work() { // TestClusterVisitor::get_chill_delay(&ClusterId::from([1; 20]), NodeType::Storage) // .unwrap_or(10_u64); assert_eq!( - DdcStaking::ledger(&4), + DdcStaking::ledger(4), Some(StakingLedger { stash: 3, total: 1500, @@ -373,7 +373,7 @@ fn staking_should_work() { // Ledger is not changed until we make another call to `chill`. assert_eq!( - DdcStaking::ledger(&4), + DdcStaking::ledger(4), Some(StakingLedger { stash: 3, total: 1500, diff --git a/pallets/erc20/Cargo.toml b/pallets/erc20/Cargo.toml index e9516a297..fe671cb87 100644 --- a/pallets/erc20/Cargo.toml +++ b/pallets/erc20/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-erc20" -version = "4.8.2" +version = "4.8.4" authors = ["Parity Technologies "] edition = "2021" homepage = "https://substrate.dev" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } pallet-chainbridge = { version = "4.2.0", default-features = false, path = "../chainbridge" } pallet-erc721 = { version = "4.2.0", default-features = false, path = "../erc721" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-arithmetic = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-arithmetic = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", default-features = false } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [features] default = ["std"] diff --git a/pallets/erc721/Cargo.toml b/pallets/erc721/Cargo.toml index 775e59b14..cf2012922 100644 --- a/pallets/erc721/Cargo.toml +++ b/pallets/erc721/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-erc721" -version = "4.8.2" +version = "4.8.4" authors = ["Parity Technologies "] edition = "2021" homepage = "https://substrate.dev" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } pallet-chainbridge = { version = "4.2.0", default-features = false, path = "../chainbridge" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", default-features = false } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [features] default = ["std"] diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 2f579998f..8a4202751 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,14 +1,15 @@ [package] name = "ddc-primitives" -version = "4.8.2" +version = "4.8.4" edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } serde = { version = "1.0.136", default-features = false, features = ["derive"], optional = true } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } + +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [features] default = ["std"] diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index ed320a242..03391ffa8 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,29 +1,29 @@ [package] name = "cere-rpc" -version = "4.8.2" +version = "4.8.4" edition = "2021" [dependencies] jsonrpsee = { version = "0.15.1", features = ["server"] } -node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sc-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sc-consensus-babe-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sc-consensus-epochs = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sc-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sc-finality-grandpa-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sc-rpc-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sp-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } -substrate-state-trie-migration-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.31" } +node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sc-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sc-consensus-babe-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sc-consensus-epochs = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sc-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sc-finality-grandpa-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sc-rpc-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sp-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } +substrate-state-trie-migration-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.33" } diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index 138115725..dfc8912bc 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-dev-runtime" -version = "4.8.2" +version = "4.8.4" authors = ["Parity Technologies "] build = "build.rs" edition = "2021" @@ -20,90 +20,90 @@ scale-info = { version = "2.1.2", default-features = false, features = ["derive" static_assertions = "1.1.0" # primitives -node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false, version = "4.0.0-dev" } -sp-consensus-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-inherents = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-offchain = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-session = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-transaction-pool = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-version = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", default-features = false, version = "4.0.0-dev" } +sp-consensus-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-inherents = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-offchain = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-session = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-transaction-pool = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-version = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } # frame dependencies -frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-executive = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -frame-system-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-try-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -pallet-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-authorship = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-bags-list = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-chainbridge = { version = "4.8.2", default-features = false, path = "../../pallets/chainbridge" } -pallet-child-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-collective = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-contracts-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-democracy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-election-provider-multi-phase = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-election-provider-support-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -pallet-elections-phragmen = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } -pallet-grandpa = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-identity = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-indices = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-membership = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-multisig = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } -pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "polkadot-v0.9.31" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } -pallet-offences = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false, optional = true } -pallet-proxy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-randomness-collective-flip = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-recovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-scheduler = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-session = { features = ["historical"], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false } -pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false, optional = true } -pallet-society = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-staking-reward-curve = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-sudo = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-timestamp = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-tips = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-transaction-payment = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-treasury = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-utility = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-vesting = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-executive = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +frame-system-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-try-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +pallet-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-authorship = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-bags-list = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-chainbridge = { version = "4.8.4", default-features = false, path = "../../pallets/chainbridge" } +pallet-child-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-collective = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-contracts-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-democracy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-election-provider-multi-phase = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-election-provider-support-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +pallet-elections-phragmen = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.33" } +pallet-grandpa = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-identity = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-indices = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-membership = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-multisig = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.33" } +pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "polkadot-v0.9.33" } +pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.33" } +pallet-offences = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", default-features = false, optional = true } +pallet-proxy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-randomness-collective-flip = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-recovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-scheduler = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-session = { features = ["historical"], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", default-features = false } +pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", default-features = false, optional = true } +pallet-society = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-staking-reward-curve = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-sudo = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-timestamp = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-tips = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-transaction-payment = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-treasury = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-utility = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-vesting = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } # cere dependencies cere-dev-runtime-constants = { path = "./constants", default-features = false } cere-runtime-common = { path = "../common", default-features = false } -ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } -pallet-ddc-clusters = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-clusters" } -pallet-ddc-customers = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-customers" } -pallet-ddc-nodes = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-nodes" } -pallet-ddc-payouts = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-payouts" } -pallet-ddc-staking = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-staking" } -pallet-erc20 = { version = "4.8.2", default-features = false, path = "../../pallets/erc20" } -pallet-erc721 = { version = "4.8.2", default-features = false, path = "../../pallets/erc721" } +ddc-traits = { version = "4.8.4", default-features = false, path = "../../traits" } +pallet-ddc-clusters = { version = "4.8.4", default-features = false, path = "../../pallets/ddc-clusters" } +pallet-ddc-customers = { version = "4.8.4", default-features = false, path = "../../pallets/ddc-customers" } +pallet-ddc-nodes = { version = "4.8.4", default-features = false, path = "../../pallets/ddc-nodes" } +pallet-ddc-payouts = { version = "4.8.4", default-features = false, path = "../../pallets/ddc-payouts" } +pallet-ddc-staking = { version = "4.8.4", default-features = false, path = "../../pallets/ddc-staking" } +pallet-erc20 = { version = "4.8.4", default-features = false, path = "../../pallets/erc20" } +pallet-erc721 = { version = "4.8.4", default-features = false, path = "../../pallets/erc721" } [build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [features] default = ["std"] @@ -180,6 +180,7 @@ std = [ "cere-dev-runtime-constants/std", "pallet-ddc-customers/std", "pallet-ddc-clusters/std", + "pallet-ddc-payouts/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/runtime/cere-dev/constants/Cargo.toml b/runtime/cere-dev/constants/Cargo.toml index 8c8b0f96a..ca686e257 100644 --- a/runtime/cere-dev/constants/Cargo.toml +++ b/runtime/cere-dev/constants/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "cere-dev-runtime-constants" -version = "4.8.2" +version = "4.8.4" authors = ["Parity Technologies "] edition = "2021" [dependencies] -node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } +node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.33" } [features] default = ["std"] diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index a30a1ca8e..4e3ea2f50 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -52,6 +52,7 @@ use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; #[cfg(any(feature = "std", test))] pub use pallet_balances::Call as BalancesCall; pub use pallet_chainbridge; +use pallet_contracts::Determinism; pub use pallet_ddc_clusters; pub use pallet_ddc_customers; pub use pallet_ddc_nodes; @@ -127,10 +128,10 @@ 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: 48202, + spec_version: 48400, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 8, + transaction_version: 9, state_version: 0, }; @@ -242,6 +243,7 @@ parameter_types! { pub const DepositBase: Balance = deposit(1, 88); // Additional storage item size of 32 bytes. pub const DepositFactor: Balance = deposit(0, 32); + pub const MaxSignatories: u32 = 100; } impl pallet_multisig::Config for Runtime { @@ -250,7 +252,7 @@ impl pallet_multisig::Config for Runtime { type Currency = Balances; type DepositBase = DepositBase; type DepositFactor = DepositFactor; - type MaxSignatories = ConstU16<100>; + type MaxSignatories = MaxSignatories; type WeightInfo = pallet_multisig::weights::SubstrateWeight; } @@ -544,7 +546,7 @@ impl pallet_staking::Config for Runtime { type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type ElectionProvider = ElectionProviderMultiPhase; - type GenesisElectionProvider = onchain::UnboundedExecution; + type GenesisElectionProvider = onchain::OnChainExecution; type VoterList = VoterList; type TargetList = pallet_staking::UseValidatorsMap; type MaxUnlockingChunks = ConstU32<32>; @@ -558,7 +560,9 @@ impl pallet_fast_unstake::Config for Runtime { type RuntimeEvent = RuntimeEvent; type ControlOrigin = frame_system::EnsureRoot; type Deposit = ConstU128<{ DOLLARS }>; - type DepositCurrency = Balances; + type Currency = Balances; + type BatchSize = frame_support::traits::ConstU32<64>; + type Staking = Staking; type WeightInfo = (); } @@ -585,6 +589,15 @@ parameter_types! { *RuntimeBlockLength::get() .max .get(DispatchClass::Normal); + /// We take the top 10000 nominators as electing voters.. + pub const MaxElectingVoters: u32 = 10_000; + /// ... and all of the validators as electable targets. Whilst this is the case, we cannot and + /// shall not increase the size of the validator intentions. + pub const MaxElectableTargets: u16 = u16::MAX; + /// Setup election pallet to support maximum winners upto 1200. This will mean Staking Pallet + /// cannot have active validators higher than this count. + pub const MaxActiveValidators: u32 = 1200; + pub MaxNominations: u32 = ::LIMIT as u32; } frame_election_provider_support::generate_solution_type!( @@ -597,11 +610,6 @@ frame_election_provider_support::generate_solution_type!( >(16) ); -parameter_types! { - pub MaxNominations: u32 = ::LIMIT as u32; - pub MaxElectingVoters: u32 = 10_000; -} - /// The numbers configured here could always be more than the the maximum limits of staking pallet /// to ensure election snapshot will not run out of memory. For now, we set them to smaller values /// since the staking is bounded and the weight pipeline takes hours for this single pallet. @@ -649,12 +657,10 @@ impl onchain::Config for OnChainSeqPhragmen { pallet_election_provider_multi_phase::SolutionAccuracyOf, >; type DataProvider = ::DataProvider; - type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; -} - -impl onchain::BoundedConfig for OnChainSeqPhragmen { + type MaxWinners = MaxActiveValidators; type VotersBound = MaxElectingVoters; - type TargetsBound = ConstU32<2_000>; + type TargetsBound = MaxElectableTargets; + type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; } impl pallet_election_provider_multi_phase::MinerConfig for Runtime { @@ -701,13 +707,14 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type SlashHandler = (); // burn slashes type RewardHandler = (); // nothing to do upon rewards type DataProvider = Staking; - type Fallback = onchain::BoundedExecution; - type GovernanceFallback = onchain::BoundedExecution; + type Fallback = onchain::OnChainExecution; + type GovernanceFallback = onchain::OnChainExecution; type Solver = SequentialPhragmen, OffchainRandomBalancing>; type ForceOrigin = EnsureRootOrHalfCouncil; type MaxElectableTargets = ConstU16<{ u16::MAX }>; type MaxElectingVoters = MaxElectingVoters; type BenchmarkingConfig = ElectionProviderBenchmarkConfig; + type MaxWinners = MaxActiveValidators; type WeightInfo = pallet_election_provider_multi_phase::weights::SubstrateWeight; } @@ -1256,11 +1263,10 @@ parameter_types! { impl pallet_nomination_pools::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; - type CurrencyBalance = Balance; type RewardCounter = FixedU128; type BalanceToU256 = cere_runtime_common::BalanceToU256; type U256ToBalance = cere_runtime_common::U256ToBalance; - type StakingInterface = Staking; + type Staking = Staking; type PostUnbondingPoolsWindow = frame_support::traits::ConstU32<4>; type MaxMetadataLen = frame_support::traits::ConstU32<256>; // we use the same number of allowed unlocking chunks as with staking. @@ -1455,6 +1461,12 @@ pub type UncheckedExtrinsic = pub type SignedPayload = generic::SignedPayload; /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Runtime migrations +type Migrations = ( + pallet_election_provider_multi_phase::migrations::v1::MigrateToV1, + pallet_fast_unstake::migrations::v1::MigrateToV1, +); + /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, @@ -1462,12 +1474,7 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, - ( - pallet_scheduler::migration::v3::MigrateToV4, - pallet_democracy::migrations::v1::Migration, - pallet_multisig::migrations::v1::MigrateToV1, - pallet_contracts::Migration, - ), + Migrations, >; mod custom_migration { @@ -1693,7 +1700,16 @@ impl_runtime_apis! { input_data: Vec, ) -> pallet_contracts_primitives::ContractExecResult { let gas_limit = gas_limit.unwrap_or(RuntimeBlockWeights::get().max_block); - Contracts::bare_call(origin, dest, value, gas_limit, storage_deposit_limit, input_data, true) + Contracts::bare_call( + origin, + dest, + value, + gas_limit, + storage_deposit_limit, + input_data, + true, + pallet_contracts::Determinism::Deterministic, + ) } fn instantiate( @@ -1714,9 +1730,10 @@ impl_runtime_apis! { origin: AccountId, code: Vec, storage_deposit_limit: Option, + determinism: Determinism ) -> pallet_contracts_primitives::CodeUploadResult { - Contracts::bare_upload_code(origin, code, storage_deposit_limit) + Contracts::bare_upload_code(origin, code, storage_deposit_limit, determinism) } fn get_storage( diff --git a/runtime/cere/Cargo.toml b/runtime/cere/Cargo.toml index e2fbb9b0f..8638ce17e 100644 --- a/runtime/cere/Cargo.toml +++ b/runtime/cere/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-runtime" -version = "4.8.2" +version = "4.8.4" authors = ["Parity Technologies "] build = "build.rs" edition = "2021" @@ -20,90 +20,90 @@ scale-info = { version = "2.1.2", default-features = false, features = ["derive" static_assertions = "1.1.0" # primitives -node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false, version = "4.0.0-dev" } -sp-consensus-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-inherents = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-offchain = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-session = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-transaction-pool = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-version = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-block-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", default-features = false, version = "4.0.0-dev" } +sp-consensus-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-inherents = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-offchain = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-session = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-transaction-pool = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-version = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } # frame dependencies -frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-executive = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -frame-system-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-try-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -pallet-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-authorship = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-bags-list = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-chainbridge = { version = "4.8.2", default-features = false, path = "../../pallets/chainbridge" } -pallet-child-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-collective = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-contracts-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-democracy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-election-provider-multi-phase = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-election-provider-support-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", optional = true } -pallet-elections-phragmen = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } -pallet-grandpa = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-identity = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-indices = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-membership = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-multisig = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } -pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "polkadot-v0.9.31" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } -pallet-offences = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false, optional = true } -pallet-proxy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-randomness-collective-flip = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-recovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-scheduler = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-session = { features = ["historical"], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false } -pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31", default-features = false, optional = true } -pallet-society = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-staking-reward-curve = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-sudo = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-timestamp = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-tips = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-transaction-payment = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-treasury = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-utility = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -pallet-vesting = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +frame-election-provider-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-executive = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +frame-system-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-try-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +pallet-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-authorship = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-babe = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-bags-list = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-chainbridge = { version = "4.8.4", default-features = false, path = "../../pallets/chainbridge" } +pallet-child-bounties = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-collective = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-contracts = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-contracts-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-democracy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-election-provider-multi-phase = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-election-provider-support-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", optional = true } +pallet-elections-phragmen = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-fast-unstake = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.33" } +pallet-grandpa = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-identity = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-indices = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-membership = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-multisig = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-nomination-pools = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.33" } +pallet-nomination-pools-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "polkadot-v0.9.33" } +pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.33" } +pallet-offences = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", default-features = false, optional = true } +pallet-proxy = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-randomness-collective-flip = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-recovery = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-scheduler = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-session = { features = ["historical"], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", default-features = false } +pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33", default-features = false, optional = true } +pallet-society = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-staking = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-staking-reward-curve = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-sudo = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-timestamp = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-tips = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-transaction-payment = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-treasury = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-utility = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +pallet-vesting = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } # cere dependencies cere-runtime-common = { path = "../common", default-features = false } cere-runtime-constants = { path = "./constants", default-features = false } -ddc-traits = { version = "4.8.2", default-features = false, path = "../../traits" } -pallet-ddc-clusters = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-clusters" } -pallet-ddc-customers = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-customers" } -pallet-ddc-nodes = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-nodes" } -pallet-ddc-payouts = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-payouts" } -pallet-ddc-staking = { version = "4.8.2", default-features = false, path = "../../pallets/ddc-staking" } -pallet-erc20 = { version = "4.8.2", default-features = false, path = "../../pallets/erc20" } -pallet-erc721 = { version = "4.8.2", default-features = false, path = "../../pallets/erc721" } +ddc-traits = { version = "4.8.4", default-features = false, path = "../../traits" } +pallet-ddc-clusters = { version = "4.8.4", default-features = false, path = "../../pallets/ddc-clusters" } +pallet-ddc-customers = { version = "4.8.4", default-features = false, path = "../../pallets/ddc-customers" } +pallet-ddc-nodes = { version = "4.8.4", default-features = false, path = "../../pallets/ddc-nodes" } +pallet-ddc-payouts = { version = "4.8.4", default-features = false, path = "../../pallets/ddc-payouts" } +pallet-ddc-staking = { version = "4.8.4", default-features = false, path = "../../pallets/ddc-staking" } +pallet-erc20 = { version = "4.8.4", default-features = false, path = "../../pallets/erc20" } +pallet-erc721 = { version = "4.8.4", default-features = false, path = "../../pallets/erc721" } [build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [features] default = ["std"] diff --git a/runtime/cere/constants/Cargo.toml b/runtime/cere/constants/Cargo.toml index 492524a30..c70315108 100644 --- a/runtime/cere/constants/Cargo.toml +++ b/runtime/cere/constants/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "cere-runtime-constants" -version = "4.8.2" +version = "4.8.4" authors = ["Parity Technologies "] edition = "2021" [dependencies] -node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +node-primitives = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } [features] default = ["std"] diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index 9f01bb4b2..f43d0cf55 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -52,6 +52,7 @@ use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; #[cfg(any(feature = "std", test))] pub use pallet_balances::Call as BalancesCall; pub use pallet_chainbridge; +use pallet_contracts::Determinism; use pallet_election_provider_multi_phase::SolutionAccuracyOf; use pallet_grandpa::{ fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList, @@ -122,10 +123,10 @@ 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: 48202, + spec_version: 48400, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 8, + transaction_version: 9, state_version: 0, }; @@ -237,6 +238,7 @@ parameter_types! { pub const DepositBase: Balance = deposit(1, 88); // Additional storage item size of 32 bytes. pub const DepositFactor: Balance = deposit(0, 32); + pub const MaxSignatories: u32 = 100; } impl pallet_multisig::Config for Runtime { @@ -245,7 +247,7 @@ impl pallet_multisig::Config for Runtime { type Currency = Balances; type DepositBase = DepositBase; type DepositFactor = DepositFactor; - type MaxSignatories = ConstU16<100>; + type MaxSignatories = MaxSignatories; type WeightInfo = pallet_multisig::weights::SubstrateWeight; } @@ -540,7 +542,7 @@ impl pallet_staking::Config for Runtime { type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type ElectionProvider = ElectionProviderMultiPhase; - type GenesisElectionProvider = onchain::UnboundedExecution; + type GenesisElectionProvider = onchain::OnChainExecution; type VoterList = VoterList; type TargetList = pallet_staking::UseValidatorsMap; type MaxUnlockingChunks = ConstU32<32>; @@ -554,7 +556,9 @@ impl pallet_fast_unstake::Config for Runtime { type RuntimeEvent = RuntimeEvent; type ControlOrigin = frame_system::EnsureRoot; type Deposit = ConstU128<{ DOLLARS }>; - type DepositCurrency = Balances; + type Currency = Balances; + type BatchSize = frame_support::traits::ConstU32<64>; + type Staking = Staking; type WeightInfo = (); } @@ -581,6 +585,15 @@ parameter_types! { *RuntimeBlockLength::get() .max .get(DispatchClass::Normal); + + /// We take the top 10000 nominators as electing voters.. + pub const MaxElectingVoters: u32 = 10_000; + /// ... and all of the validators as electable targets. Whilst this is the case, we cannot and + /// shall not increase the size of the validator intentions. + pub const MaxElectableTargets: u16 = u16::MAX; + /// Setup election pallet to support maximum winners upto 1200. This will mean Staking Pallet + /// cannot have active validators higher than this count. + pub const MaxActiveValidators: u32 = 1200; } frame_election_provider_support::generate_solution_type!( @@ -595,7 +608,6 @@ frame_election_provider_support::generate_solution_type!( parameter_types! { pub MaxNominations: u32 = ::LIMIT as u32; - pub MaxElectingVoters: u32 = 10_000; } /// The numbers configured here could always be more than the the maximum limits of staking pallet @@ -636,7 +648,6 @@ impl Get> for OffchainRandomBalancing { Some(config) } } - pub struct OnChainSeqPhragmen; impl onchain::Config for OnChainSeqPhragmen { type System = Runtime; @@ -645,12 +656,10 @@ impl onchain::Config for OnChainSeqPhragmen { pallet_election_provider_multi_phase::SolutionAccuracyOf, >; type DataProvider = ::DataProvider; - type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; -} - -impl onchain::BoundedConfig for OnChainSeqPhragmen { + type MaxWinners = MaxActiveValidators; type VotersBound = MaxElectingVoters; - type TargetsBound = ConstU32<2_000>; + type TargetsBound = MaxElectableTargets; + type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; } impl pallet_election_provider_multi_phase::MinerConfig for Runtime { @@ -697,14 +706,20 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type SlashHandler = (); // burn slashes type RewardHandler = (); // nothing to do upon rewards type DataProvider = Staking; - type Fallback = onchain::BoundedExecution; - type GovernanceFallback = onchain::BoundedExecution; + type Fallback = frame_election_provider_support::NoElection<( + AccountId, + BlockNumber, + Staking, + MaxActiveValidators, + )>; + type GovernanceFallback = onchain::OnChainExecution; type Solver = SequentialPhragmen, OffchainRandomBalancing>; type ForceOrigin = EnsureRootOrHalfCouncil; type MaxElectableTargets = ConstU16<{ u16::MAX }>; type MaxElectingVoters = MaxElectingVoters; type BenchmarkingConfig = ElectionProviderBenchmarkConfig; type WeightInfo = pallet_election_provider_multi_phase::weights::SubstrateWeight; + type MaxWinners = MaxActiveValidators; } parameter_types! { @@ -971,6 +986,7 @@ parameter_types! { .unwrap_or(RuntimeBlockWeights::get().max_block); pub DeletionQueueDepth: u32 = 128; pub Schedule: pallet_contracts::Schedule = Default::default(); + pub UnsafeUnstableInterface: bool = false; } impl pallet_contracts::Config for Runtime { @@ -1252,11 +1268,10 @@ parameter_types! { impl pallet_nomination_pools::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; - type CurrencyBalance = Balance; type RewardCounter = FixedU128; type BalanceToU256 = cere_runtime_common::BalanceToU256; type U256ToBalance = cere_runtime_common::U256ToBalance; - type StakingInterface = Staking; + type Staking = Staking; type PostUnbondingPoolsWindow = frame_support::traits::ConstU32<4>; type MaxMetadataLen = frame_support::traits::ConstU32<256>; // we use the same number of allowed unlocking chunks as with staking. @@ -1451,6 +1466,11 @@ pub type UncheckedExtrinsic = pub type SignedPayload = generic::SignedPayload; /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Runtime migrations +type Migrations = ( + pallet_election_provider_multi_phase::migrations::v1::MigrateToV1, + pallet_fast_unstake::migrations::v1::MigrateToV1, +); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, @@ -1458,12 +1478,7 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPalletsWithSystem, - ( - pallet_scheduler::migration::v3::MigrateToV4, - pallet_democracy::migrations::v1::Migration, - pallet_multisig::migrations::v1::MigrateToV1, - pallet_contracts::Migration, - ), + Migrations, >; #[cfg(feature = "runtime-benchmarks")] @@ -1675,7 +1690,16 @@ impl_runtime_apis! { input_data: Vec, ) -> pallet_contracts_primitives::ContractExecResult { let gas_limit = gas_limit.unwrap_or(RuntimeBlockWeights::get().max_block); - Contracts::bare_call(origin, dest, value, gas_limit, storage_deposit_limit, input_data, true) + Contracts::bare_call( + origin, + dest, + value, + gas_limit, + storage_deposit_limit, + input_data, + true, + pallet_contracts::Determinism::Deterministic, + ) } fn instantiate( @@ -1696,9 +1720,10 @@ impl_runtime_apis! { origin: AccountId, code: Vec, storage_deposit_limit: Option, + determinism: Determinism ) -> pallet_contracts_primitives::CodeUploadResult { - Contracts::bare_upload_code(origin, code, storage_deposit_limit) + Contracts::bare_upload_code(origin, code, storage_deposit_limit, determinism) } fn get_storage( diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index e8c7950d8..2064abed7 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cere-runtime-common" -version = "4.8.2" +version = "4.8.4" authors = ["Parity Technologies "] edition = "2021" @@ -10,7 +10,7 @@ no_std = [] std = [] [dependencies] -frame-support = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.31" } -node-primitives = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.31" } -sp-core = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.31" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.31" } +frame-support = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.33" } +node-primitives = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.33" } +sp-core = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.33" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.33" } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 7e60322a9..91a93357e 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "nightly-2022-10-09" +channel = "nightly-2023-10-22" components = ["clippy", "rustfmt"] targets = ["wasm32-unknown-unknown"] diff --git a/shell.nix b/shell.nix index 7444776a7..d3b0c4566 100644 --- a/shell.nix +++ b/shell.nix @@ -13,7 +13,7 @@ let rev = "1fe6ed37fd9beb92afe90671c0c2a662a03463dd"; }; nixpkgs = import pinned { overlays = [ mozillaOverlay ]; }; - toolchain = with nixpkgs; (rustChannelOf { date = "2022-10-09"; channel = "nightly"; }); + toolchain = with nixpkgs; (rustChannelOf { date = "2023-10-22"; channel = "nightly"; }); rust-wasm = toolchain.rust.override { targets = [ "wasm32-unknown-unknown" ]; }; diff --git a/traits/Cargo.toml b/traits/Cargo.toml index ffc5bdd7b..d36062845 100644 --- a/traits/Cargo.toml +++ b/traits/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "ddc-traits" -version = "4.8.2" +version = "4.8.4" edition = "2021" [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -ddc-primitives = { version = "4.8.2", default-features = false, path = "../primitives" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +ddc-primitives = { version = "4.8.4", default-features = false, path = "../primitives" } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } scale-info = { version = "2.1.2", default-features = false, features = ["derive"] } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.31" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.33" } From 84110c9bdcce185c7af33a3c7655375d7ecf7aeb Mon Sep 17 00:00:00 2001 From: Rakan Al-Huneiti Date: Mon, 8 Jan 2024 14:33:34 +0300 Subject: [PATCH 577/583] Minor fixes (#223) --- runtime/cere-dev/Cargo.toml | 1 + scripts/init.sh | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/runtime/cere-dev/Cargo.toml b/runtime/cere-dev/Cargo.toml index dfc8912bc..db465766e 100644 --- a/runtime/cere-dev/Cargo.toml +++ b/runtime/cere-dev/Cargo.toml @@ -148,6 +148,7 @@ std = [ "sp-std/std", "pallet-session/std", "sp-api/std", + "sp-offchain/std", "sp-runtime/std", "sp-staking/std", "pallet-staking/std", diff --git a/scripts/init.sh b/scripts/init.sh index 1472424dc..7a354c11d 100755 --- a/scripts/init.sh +++ b/scripts/init.sh @@ -4,9 +4,9 @@ set -e echo "*** Initializing WASM build environment" -rustup install nightly-2022-10-09 +rustup install nightly-2023-10-22 -rustup target add wasm32-unknown-unknown --toolchain nightly-2022-10-09 +rustup target add wasm32-unknown-unknown --toolchain nightly-2023-10-22 ln -sf $PWD/scripts/pre-commit.sh $PWD/.git/hooks/pre-commit || true ln -sf $PWD/scripts/pre-push.sh $PWD/.git/hooks/pre-push || true From 2de36a85e43d9a237d0bb0e489681ec5fa5db49c Mon Sep 17 00:00:00 2001 From: Rakan Al-Huneiti Date: Tue, 9 Jan 2024 16:14:08 +0300 Subject: [PATCH 578/583] Fix deserialization issue (#224) --- .github/workflows/ci.yaml | 13 +- Cargo.lock | 841 +++++++++++++++++--------------- cli/Cargo.toml | 2 +- pallets/ddc-clusters/src/lib.rs | 2 +- pallets/ddc-staking/src/lib.rs | 2 +- rust-toolchain.toml | 2 +- scripts/init.sh | 4 +- shell.nix | 3 +- 8 files changed, 453 insertions(+), 416 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index de4909900..d7e5c74ca 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -24,7 +24,7 @@ jobs: - name: Install nightly toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2023-10-22 + toolchain: nightly-2022-10-09 override: true components: rustfmt - name: Check TOML @@ -44,14 +44,17 @@ jobs: - name: Install nightly toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2023-10-22 + toolchain: nightly-2022-10-09 override: true target: wasm32-unknown-unknown - name: Rust Cache uses: Swatinem/rust-cache@v2 - name: Check Build run: | - SKIP_WASM_BUILD=1 cargo check --release + cargo build --release + - name: Run dev chain + run: | + timeout --preserve-status 30s ./target/release/cere --dev - name: Check Build for Benchmarking run: > pushd node && @@ -69,7 +72,7 @@ jobs: - name: Install nightly toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2023-10-22 + toolchain: nightly-2022-10-09 override: true target: wasm32-unknown-unknown components: clippy @@ -92,7 +95,7 @@ jobs: - name: Install nightly toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2023-10-22 + toolchain: nightly-2022-10-09 override: true target: wasm32-unknown-unknown - name: Rust Cache diff --git a/Cargo.lock b/Cargo.lock index cfeddbd8d..1096e2858 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,7 +27,7 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli 0.28.0", + "gimli 0.28.1", ] [[package]] @@ -77,7 +77,7 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", "once_cell", "version_check", ] @@ -115,59 +115,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "anstream" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" - -[[package]] -name = "anstyle-parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" -dependencies = [ - "anstyle", - "windows-sys 0.48.0", -] - [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "approx" @@ -221,12 +173,12 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37875bd9915b7d67c2f117ea2c30a0989874d0b2cb694fe25403c85763c0c9e" +checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" dependencies = [ "concurrent-queue", - "event-listener 3.1.0", + "event-listener 4.0.3", "event-listener-strategy", "futures-core", "pin-project-lite 0.2.13", @@ -234,30 +186,30 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0c4a4f319e45986f347ee47fef8bf5e81c9abc3f6f58dc2391439f30df65f0" +checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" dependencies = [ - "async-lock 2.8.0", + "async-lock 3.2.0", "async-task", "concurrent-queue", "fastrand 2.0.1", - "futures-lite 1.13.0", + "futures-lite 2.2.0", "slab", ] [[package]] name = "async-global-executor" -version = "2.3.1" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ - "async-channel 1.9.0", + "async-channel 2.1.1", "async-executor", - "async-io 1.13.0", - "async-lock 2.8.0", + "async-io 2.2.2", + "async-lock 3.2.0", "blocking", - "futures-lite 1.13.0", + "futures-lite 2.2.0", "once_cell", ] @@ -283,22 +235,21 @@ dependencies = [ [[package]] name = "async-io" -version = "2.2.0" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9d5715c2d329bf1b4da8d60455b99b187f27ba726df2883799af9af60997" +checksum = "6afaa937395a620e33dc6a742c593c01aced20aa376ffb0f628121198578ccc7" dependencies = [ - "async-lock 3.1.0", + "async-lock 3.2.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.0.1", + "futures-lite 2.2.0", "parking", - "polling 3.3.0", - "rustix 0.38.24", + "polling 3.3.1", + "rustix 0.38.28", "slab", "tracing", - "waker-fn", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -312,11 +263,11 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb2ab2aa8a746e221ab826c73f48bc6ba41be6763f0855cb249eb6d154cf1d7" +checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" dependencies = [ - "event-listener 3.1.0", + "event-listener 4.0.3", "event-listener-strategy", "pin-project-lite 0.2.13", ] @@ -334,7 +285,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.24", + "rustix 0.38.28", "windows-sys 0.48.0", ] @@ -344,13 +295,13 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" dependencies = [ - "async-io 2.2.0", + "async-io 2.2.2", "async-lock 2.8.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.24", + "rustix 0.38.28", "signal-hook-registry", "slab", "windows-sys 0.48.0", @@ -400,19 +351,19 @@ dependencies = [ [[package]] name = "async-task" -version = "4.5.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -462,7 +413,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.32.1", + "object 0.32.2", "rustc-demangle", ] @@ -492,9 +443,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "c79fed4cdb43e993fcdadc7e58a09fd0e3e649c4436fa11da71c9f1f3ee7feb9" [[package]] name = "base64ct" @@ -653,12 +604,12 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ - "async-channel 2.1.0", - "async-lock 3.1.0", + "async-channel 2.1.1", + "async-lock 3.2.0", "async-task", "fastrand 2.0.1", "futures-io", - "futures-lite 2.0.1", + "futures-lite 2.2.0", "piper", "tracing", ] @@ -671,9 +622,9 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bstr" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c" +checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" dependencies = [ "memchr", "serde", @@ -749,9 +700,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12024c4645c97566567129c204f65d5815a8c9aecf30fcbe682b2fe034996d36" +checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" dependencies = [ "serde", ] @@ -764,7 +715,7 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", - "semver 1.0.20", + "semver 1.0.21", "serde", "serde_json", ] @@ -1177,7 +1128,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -1206,9 +1157,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" dependencies = [ "glob", "libc", @@ -1217,43 +1168,40 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.8" +version = "4.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" +checksum = "6bf8832993da70a4c6d13c581f4463c2bdda27b9bf1c5498dc4365543abe6d6f" dependencies = [ - "clap_builder", + "atty", + "bitflags 1.3.2", "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" -dependencies = [ - "anstream", - "anstyle", "clap_lex", + "once_cell", "strsim", + "termcolor", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "c42f169caba89a7d512b5418b09864543eeb4d497416c917d7137863bd2076ad" dependencies = [ "heck", + "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.39", + "syn 1.0.109", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "033f6b7a4acb1f358c742aaca805c939ee73b4c6209ae4318ec7aca81c42e646" +dependencies = [ + "os_str_bytes", +] [[package]] name = "codespan-reporting" @@ -1265,12 +1213,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - [[package]] name = "comfy-table" version = "6.2.0" @@ -1284,18 +1226,18 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ "crossbeam-utils", ] [[package]] name = "const-oid" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "constant_time_eq" @@ -1305,9 +1247,9 @@ checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -1315,9 +1257,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core2" @@ -1339,9 +1281,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -1455,36 +1397,28 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset 0.9.0", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" @@ -1580,7 +1514,7 @@ dependencies = [ "cpufeatures", "curve25519-dalek-derive", "fiat-crypto", - "platforms 3.2.0", + "platforms 3.3.0", "rustc_version 0.4.0", "subtle", "zeroize", @@ -1594,14 +1528,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "cxx" -version = "1.0.110" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7129e341034ecb940c9072817cd9007974ea696844fc4dd582dc1653a7fbe2e8" +checksum = "8de00f15a6fa069c99b88c5c78c4541d0e7899a33b86f7480e23df2431fce0bc" dependencies = [ "cc", "cxxbridge-flags", @@ -1611,9 +1545,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.110" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a24f3f5f8eed71936f21e570436f024f5c2e25628f7496aa7ccd03b90109d5" +checksum = "0a71e1e631fa2f2f5f92e8b0d860a00c198c6771623a6cefcc863e3554f0d8d6" dependencies = [ "cc", "codespan-reporting", @@ -1621,37 +1555,37 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "cxxbridge-flags" -version = "1.0.110" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06fdd177fc61050d63f67f5bd6351fac6ab5526694ea8e359cd9cd3b75857f44" +checksum = "6f3fed61d56ba497c4efef9144dfdbaa25aa58f2f6b3a7cf441d4591c583745c" [[package]] name = "cxxbridge-macro" -version = "1.0.110" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "587663dd5fb3d10932c8aecfe7c844db1bcf0aee93eeab08fac13dc1212c2e7f" +checksum = "8908e380a8efd42150c017b0cfa31509fc49b6d47f7cb6b33e93ffb8f4e3661e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "data-encoding" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" [[package]] name = "data-encoding-macro" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c904b33cc60130e1aeea4956ab803d08a3f4a0ca82d64ed757afac3891f2bb99" +checksum = "20c01c06f5f429efdf2bae21eb67c28b3df3cf85b7dd2d8ef09c0838dac5d33e" dependencies = [ "data-encoding", "data-encoding-macro-internal", @@ -1659,9 +1593,9 @@ dependencies = [ [[package]] name = "data-encoding-macro-internal" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fdf3fce3ce863539ec1d7fd1b6dcc3c645663376b43ed376bbf887733e4f772" +checksum = "0047d07f2c89b17dd631c80450d69841a6b5d7fb17278cbc43d7e4cfcf2576f3" dependencies = [ "data-encoding", "syn 1.0.109", @@ -1946,7 +1880,7 @@ checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -2000,12 +1934,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2035,13 +1969,24 @@ dependencies = [ "pin-project-lite 0.2.13", ] +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite 0.2.13", +] + [[package]] name = "event-listener-strategy" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96b852f1345da36d551b9473fa1e2b1eb5c5195585c6c018118bc92a8d91160" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" dependencies = [ - "event-listener 3.1.0", + "event-listener 4.0.3", "pin-project-lite 0.2.13", ] @@ -2102,9 +2047,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a56f0780318174bad1c127063fd0c5fdfb35398e3cd79ffaab931a6c79df80" +checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" [[package]] name = "file-per-thread-logger" @@ -2118,14 +2063,14 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", - "windows-sys 0.48.0", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", ] [[package]] @@ -2198,9 +2143,9 @@ dependencies = [ [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -2291,7 +2236,7 @@ name = "frame-election-provider-solution-type" version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -2394,7 +2339,7 @@ version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "frame-support-procedural-tools-derive", - "proc-macro-crate", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -2482,9 +2427,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -2497,9 +2442,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -2507,15 +2452,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -2525,9 +2470,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" @@ -2546,23 +2491,26 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb" +checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" dependencies = [ + "fastrand 2.0.1", "futures-core", + "futures-io", + "parking", "pin-project-lite 0.2.13", ] [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -2578,15 +2526,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" @@ -2596,9 +2544,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -2665,9 +2613,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -2697,9 +2645,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "glob" @@ -2709,15 +2657,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" dependencies = [ "aho-corasick", "bstr", - "fnv", "log", - "regex", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -2802,9 +2750,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "heck" @@ -2912,9 +2860,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -2941,9 +2889,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -2956,7 +2904,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite 0.2.13", - "socket2 0.4.10", + "socket2 0.5.5", "tokio", "tower-service", "tracing", @@ -2980,9 +2928,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -3014,9 +2962,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -3097,7 +3045,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.3", ] [[package]] @@ -3170,13 +3118,13 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ "hermit-abi 0.3.3", - "rustix 0.38.24", - "windows-sys 0.48.0", + "rustix 0.38.28", + "windows-sys 0.52.0", ] [[package]] @@ -3190,9 +3138,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jobserver" @@ -3205,9 +3153,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -3304,7 +3252,7 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd67957d4280217247588ac86614ead007b301ca2fa9f19c19f880a536f029e3" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -3437,18 +3385,18 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "libloading" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" dependencies = [ "cfg-if", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -3466,7 +3414,7 @@ dependencies = [ "bytes", "futures", "futures-timer", - "getrandom 0.2.11", + "getrandom 0.2.12", "instant", "lazy_static", "libp2p-core", @@ -3866,9 +3814,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.12" +version = "1.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" +checksum = "295c17e837573c8c821dbaeb3cceb3d745ad082f7572191409e69cbc1b3fd050" dependencies = [ "cc", "pkg-config", @@ -3923,9 +3871,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" @@ -4026,9 +3974,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memfd" @@ -4036,7 +3984,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix 0.38.24", + "rustix 0.38.28", ] [[package]] @@ -4057,15 +4005,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - [[package]] name = "memory-db" version = "0.30.0" @@ -4112,9 +4051,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -4200,7 +4139,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.1.3", "proc-macro-error", "proc-macro2", "quote", @@ -4464,18 +4403,18 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -4495,6 +4434,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" @@ -5283,7 +5228,7 @@ name = "pallet-staking-reward-curve" version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -5434,9 +5379,9 @@ dependencies = [ [[package]] name = "parity-db" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e9ab494af9e6e813c72170f0d3c1de1500990d62c97cc05cc7576f91aa402f" +checksum = "592a28a24b09c9dc20ac8afaa6839abc417c720afe42c12e1e4a9d6aa2508d2e" dependencies = [ "blake2", "crc32fast", @@ -5450,13 +5395,14 @@ dependencies = [ "rand 0.8.5", "siphasher", "snap", + "winapi", ] [[package]] name = "parity-scale-codec" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ "arrayvec 0.7.4", "bitvec", @@ -5469,11 +5415,11 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 2.0.1", "proc-macro2", "quote", "syn 1.0.109", @@ -5569,7 +5515,7 @@ dependencies = [ "libc", "redox_syscall 0.4.1", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -5604,15 +5550,15 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" +checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" dependencies = [ "memchr", "thiserror", @@ -5621,9 +5567,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" +checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde" dependencies = [ "pest", "pest_generator", @@ -5631,22 +5577,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" +checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "pest_meta" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" +checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d" dependencies = [ "once_cell", "pest", @@ -5680,7 +5626,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -5724,9 +5670,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" [[package]] name = "platforms" @@ -5736,9 +5682,9 @@ checksum = "e8d0eef3571242013a0d5dc84861c3ae4a652e56e12adf8bdc26ff5f8cb34c94" [[package]] name = "platforms" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14e6ab3f592e6fb464fc9712d8d6e6912de6473954635fd76a589d832cffcbb0" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] name = "polling" @@ -5758,16 +5704,16 @@ dependencies = [ [[package]] name = "polling" -version = "3.3.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53b6af1f60f36f8c2ac2aad5459d75a5a9b4be1e8cdd40264f315d78193e531" +checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" dependencies = [ "cfg-if", "concurrent-queue", "pin-project-lite 0.2.13", - "rustix 0.38.24", + "rustix 0.38.28", "tracing", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5862,6 +5808,16 @@ dependencies = [ "toml", ] +[[package]] +name = "proc-macro-crate" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a" +dependencies = [ + "toml_datetime", + "toml_edit", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -5888,9 +5844,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" dependencies = [ "unicode-ident", ] @@ -6027,9 +5983,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -6100,7 +6056,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", ] [[package]] @@ -6175,15 +6131,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -6199,29 +6146,29 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", "libredox", "thiserror", ] [[package]] name = "ref-cast" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acde58d073e9c79da00f2b5b84eed919c8326832648a5b109b3fce1bb1175280" +checksum = "c4846d4c50d1721b1a3bef8af76924eef20d5e723647333798c1b519b3a9473f" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" +checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -6335,12 +6282,12 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.5" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", - "getrandom 0.2.11", + "getrandom 0.2.12", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -6426,7 +6373,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.20", + "semver 1.0.21", ] [[package]] @@ -6450,7 +6397,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" dependencies = [ "bitflags 1.3.2", - "errno 0.3.7", + "errno 0.3.8", "io-lifetimes 1.0.11", "libc", "linux-raw-sys 0.3.8", @@ -6459,15 +6406,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.24" +version = "0.38.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ad981d6c340a49cdc40a1028d9c6084ec7e9fa33fcb839cab656a267071e234" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" dependencies = [ "bitflags 2.4.1", - "errno 0.3.7", + "errno 0.3.8", "libc", - "linux-raw-sys 0.4.11", - "windows-sys 0.48.0", + "linux-raw-sys 0.4.12", + "windows-sys 0.52.0", ] [[package]] @@ -6500,7 +6447,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.5", + "base64 0.21.6", ] [[package]] @@ -6522,9 +6469,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "safe-mix" @@ -6643,7 +6590,7 @@ name = "sc-chain-spec-derive" version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -7543,7 +7490,7 @@ name = "sc-tracing-proc-macro" version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -7623,7 +7570,7 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -7631,11 +7578,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -7674,7 +7621,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.5", + "ring 0.17.7", "untrusted 0.9.0", ] @@ -7762,9 +7709,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" dependencies = [ "serde", ] @@ -7777,29 +7724,29 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.192" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" dependencies = [ "itoa", "ryu", @@ -7949,9 +7896,9 @@ checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "snap" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9f0ab6ef7eb7353d9119c170a436d1bf248eea575ac42d19d12f4e34130831" +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "snow" @@ -7964,7 +7911,7 @@ dependencies = [ "chacha20poly1305", "curve25519-dalek 4.1.1", "rand_core 0.6.4", - "ring 0.17.5", + "ring 0.17.7", "rustc_version 0.4.0", "sha2 0.10.8", "subtle", @@ -8030,7 +7977,7 @@ version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "blake2", - "proc-macro-crate", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -8474,7 +8421,7 @@ version = "5.0.0" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ "Inflector", - "proc-macro-crate", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -8716,9 +8663,9 @@ dependencies = [ [[package]] name = "ss58-registry" -version = "1.44.0" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35935738370302d5e33963665b77541e4b990a3e919ec904c837a56cfc891de1" +checksum = "3c0c74081753a8ce1c8eb10b9f262ab6f7017e5ad3317c17a54c7ab65fcb3c6e" dependencies = [ "Inflector", "num-format", @@ -8914,7 +8861,7 @@ name = "substrate-test-utils-derive" version = "0.10.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.33#2dff067e9f7f6f3cc4dbfdaaa97753eccc407689" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -8956,9 +8903,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -9006,21 +8953,21 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.12.12" +version = "0.12.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" +checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" [[package]] name = "tempfile" -version = "3.8.1" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if", "fastrand 2.0.1", "redox_syscall 0.4.1", - "rustix 0.38.24", - "windows-sys 0.48.0", + "rustix 0.38.28", + "windows-sys 0.52.0", ] [[package]] @@ -9040,22 +8987,22 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -9129,9 +9076,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" dependencies = [ "backtrace", "bytes", @@ -9154,7 +9101,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -9203,6 +9150,23 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + [[package]] name = "tower-service" version = "0.3.2" @@ -9228,7 +9192,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -9362,9 +9326,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "try-runtime-cli" @@ -9445,9 +9409,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" @@ -9512,12 +9476,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", - "idna 0.4.0", + "idna 0.5.0", "percent-encoding", ] @@ -9527,12 +9491,6 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - [[package]] name = "valuable" version = "0.1.0" @@ -9541,9 +9499,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.4.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe" +checksum = "7cdbaf5e132e593e9fc1de6a15bbec912395b11fb9719e061cf64f804524c503" [[package]] name = "vcpkg" @@ -9602,9 +9560,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -9612,24 +9570,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if", "js-sys", @@ -9639,9 +9597,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9649,22 +9607,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-instrument" @@ -9920,7 +9878,7 @@ dependencies = [ "log", "mach", "memfd", - "memoffset 0.6.5", + "memoffset", "paste", "rand 0.8.5", "rustix 0.35.16", @@ -9945,9 +9903,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", @@ -9959,7 +9917,7 @@ version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring 0.17.5", + "ring 0.17.7", "untrusted 0.9.0", ] @@ -9981,7 +9939,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.24", + "rustix 0.38.28", ] [[package]] @@ -10036,11 +9994,11 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.51.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets", + "windows-targets 0.52.0", ] [[package]] @@ -10077,7 +10035,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -10095,6 +10062,21 @@ dependencies = [ "windows_x86_64_msvc 0.48.5", ] +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -10107,6 +10089,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.34.0" @@ -10131,6 +10119,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.34.0" @@ -10155,6 +10149,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.34.0" @@ -10179,6 +10179,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.34.0" @@ -10203,6 +10209,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -10215,6 +10227,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.34.0" @@ -10239,6 +10257,21 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "winnow" +version = "0.5.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7520bbdec7211caa7c4e682eb1fbe07abe20cee6756b6e00f537c82c11816aa" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" @@ -10285,9 +10318,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12a3946ecfc929b583800f4629b6c25b88ac6e92a40ea5670f77112a85d40a8b" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] @@ -10300,7 +10333,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] diff --git a/cli/Cargo.toml b/cli/Cargo.toml index faaece826..d66489723 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -12,7 +12,7 @@ wasm-opt = false crate-type = ["cdylib", "rlib"] [dependencies] -clap = { version = "4.0.9", features = ["derive"], optional = true } +clap = { version = "4.0.15", features = ["derive"], optional = true } frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.33" } sc-cli = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.33" } sc-service = { git = "https://github.com/paritytech/substrate", optional = true, branch = "polkadot-v0.9.33" } diff --git a/pallets/ddc-clusters/src/lib.rs b/pallets/ddc-clusters/src/lib.rs index 6bd94e01d..3292f34fd 100644 --- a/pallets/ddc-clusters/src/lib.rs +++ b/pallets/ddc-clusters/src/lib.rs @@ -10,7 +10,7 @@ //! //! The DDC Clusters pallet depends on the [`GenesisConfig`]. The //! `GenesisConfig` is optional and allow to set some initial nodes in DDC. - +#![feature(is_some_and)] #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] diff --git a/pallets/ddc-staking/src/lib.rs b/pallets/ddc-staking/src/lib.rs index 57b4e2ff9..aa32fdae5 100644 --- a/pallets/ddc-staking/src/lib.rs +++ b/pallets/ddc-staking/src/lib.rs @@ -10,7 +10,7 @@ //! //! The DDC Staking pallet depends on the [`GenesisConfig`]. The //! `GenesisConfig` is optional and allow to set some initial stakers in DDC. - +#![feature(is_some_and)] #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 91a93357e..7e60322a9 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "nightly-2023-10-22" +channel = "nightly-2022-10-09" components = ["clippy", "rustfmt"] targets = ["wasm32-unknown-unknown"] diff --git a/scripts/init.sh b/scripts/init.sh index 7a354c11d..1472424dc 100755 --- a/scripts/init.sh +++ b/scripts/init.sh @@ -4,9 +4,9 @@ set -e echo "*** Initializing WASM build environment" -rustup install nightly-2023-10-22 +rustup install nightly-2022-10-09 -rustup target add wasm32-unknown-unknown --toolchain nightly-2023-10-22 +rustup target add wasm32-unknown-unknown --toolchain nightly-2022-10-09 ln -sf $PWD/scripts/pre-commit.sh $PWD/.git/hooks/pre-commit || true ln -sf $PWD/scripts/pre-push.sh $PWD/.git/hooks/pre-push || true diff --git a/shell.nix b/shell.nix index d3b0c4566..d5a72b802 100644 --- a/shell.nix +++ b/shell.nix @@ -13,7 +13,7 @@ let rev = "1fe6ed37fd9beb92afe90671c0c2a662a03463dd"; }; nixpkgs = import pinned { overlays = [ mozillaOverlay ]; }; - toolchain = with nixpkgs; (rustChannelOf { date = "2023-10-22"; channel = "nightly"; }); + toolchain = with nixpkgs; (rustChannelOf { date = "2022-10-09"; channel = "nightly"; }); rust-wasm = toolchain.rust.override { targets = [ "wasm32-unknown-unknown" ]; }; @@ -23,6 +23,7 @@ with nixpkgs; pkgs.mkShell { clang pkg-config rust-wasm + openssl ]; LIBCLANG_PATH = "${llvmPackages.libclang}/lib"; From 094e5eca6429bcf49a6c4c9eb6e4a6cda5b62756 Mon Sep 17 00:00:00 2001 From: Maksim Ramanenkau Date: Tue, 9 Jan 2024 18:29:33 +0400 Subject: [PATCH 579/583] Update AWS credentials (#225) --- .github/workflows/publish-docker-image-to-dockerhub.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-docker-image-to-dockerhub.yaml b/.github/workflows/publish-docker-image-to-dockerhub.yaml index 0cd1f1339..7260d3174 100644 --- a/.github/workflows/publish-docker-image-to-dockerhub.yaml +++ b/.github/workflows/publish-docker-image-to-dockerhub.yaml @@ -15,8 +15,8 @@ jobs: - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: - aws-access-key-id: ${{ secrets.ORG_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.ORG_AWS_SECRET_ACCESS_KEY }} + aws-access-key-id: ${{ secrets.DEV_NETWORK_AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.DEV_NETWORK_AWS_SECRET_ACCESS_KEY }} aws-region: us-west-2 - name: Login to Amazon ECR id: login-ecr From 240ed73161b3f23093e88bf918516be5ba434e4b Mon Sep 17 00:00:00 2001 From: Rakan Al-Huneiti Date: Wed, 10 Jan 2024 11:47:36 +0300 Subject: [PATCH 580/583] Add PR template (#227) This PR template is for team members to fill required details on PR to ease the process of PR review & provide a checklist for important items not to be forgotten. --- .github/pull_request_template.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..73f7d2b72 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,21 @@ +### Description + + +### Types of Changes + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to change) +- [ ] Dependency upgrade (A change in substrate or any 3rd party crate version) + +### Migrations and Hooks + +- [ ] This change requires a runtime migration. +- [ ] Modifies `on_initialize` +- [ ] Modifies `on_finalize` + +### Checklist + +- [ ] Change has been tested locally. +- [ ] Change adds / updates tests. +- [ ] Changelog doc updated. From 3b8cd9b48dd369d02cf487048d2eaa1e06dc696d Mon Sep 17 00:00:00 2001 From: Rakan Al-Huneiti Date: Wed, 10 Jan 2024 11:59:10 +0300 Subject: [PATCH 581/583] Build an image with the full github SHA (#228) ### Description This PR fixes the docker build push by tagging the staging image with the full github commit SHA. ### Types of Changes - [x] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Dependency upgrade (A change in substrate or any 3rd party crate version) ### Migrations and Hooks - [ ] This change requires a runtime migration. - [ ] Modifies `on_initialize` - [ ] Modifies `on_finalize` ### Checklist - [ ] Change has been tested locally. - [ ] Change adds / updates tests. - [ ] Changelog doc updated. --- .github/workflows/stage.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/stage.yaml b/.github/workflows/stage.yaml index 02959cc64..e619626a8 100644 --- a/.github/workflows/stage.yaml +++ b/.github/workflows/stage.yaml @@ -68,6 +68,7 @@ jobs: "SCCACHE_BUCKET=cere-blockchain-sccache" tags: | + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ GITHUB_SHA }} ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest From 9857a322a6020b152aa7b933980c3ba484cab32d Mon Sep 17 00:00:00 2001 From: rakanalh Date: Wed, 10 Jan 2024 12:02:54 +0300 Subject: [PATCH 582/583] Fix github sha --- .github/workflows/stage.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stage.yaml b/.github/workflows/stage.yaml index e619626a8..700d7d937 100644 --- a/.github/workflows/stage.yaml +++ b/.github/workflows/stage.yaml @@ -68,7 +68,7 @@ jobs: "SCCACHE_BUCKET=cere-blockchain-sccache" tags: | - ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ GITHUB_SHA }} + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ github.sha }} ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest From 6ad1d91a0e271f8806ad0ab5fac1e176f22d7d23 Mon Sep 17 00:00:00 2001 From: rakanalh Date: Thu, 11 Jan 2024 10:56:55 +0300 Subject: [PATCH 583/583] Push staging image --- .github/workflows/stage.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/stage.yaml b/.github/workflows/stage.yaml index 700d7d937..383b4792a 100644 --- a/.github/workflows/stage.yaml +++ b/.github/workflows/stage.yaml @@ -5,6 +5,7 @@ on: - 'release/**' - 'hotfix/**' - 'master' + - 'staging' env: PROFILE: release @@ -70,7 +71,7 @@ jobs: tags: | ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ github.sha }} ${{ steps.login-ecr.outputs.registry }}/pos-network-node:${{ env.GITHUB_SHA }} - ${{ steps.login-ecr.outputs.registry }}/pos-network-node:dev-latest + ${{ steps.login-ecr.outputs.registry }}/pos-network-node:staging-latest - name: Copy wasm artifacts from the image run: |