Browse Source

Remove members mod from the membership

- move all the code from the members mod to the lib.rs
- update all dependencies
Shamil Gadelshin 4 years ago
parent
commit
8e01197676

+ 1 - 1
node/src/chain_spec.rs

@@ -251,7 +251,7 @@ pub fn testnet_genesis(
                 min_voting_stake: 1 * DOLLARS,
             },
         }),
-        members: Some(MembersConfig {
+        membership: Some(MembersConfig {
             default_paid_membership_fee: 100u128,
             members: crate::members_config::initial_members(),
         }),

+ 29 - 30
runtime-modules/content-working-group/src/lib.rs

@@ -19,9 +19,8 @@ pub mod genesis;
 #[cfg(feature = "std")]
 use serde::{Deserialize, Serialize};
 
-use codec::{Decode, Encode}; // Codec
-                             //use rstd::collections::btree_map::BTreeMap;
-use membership::{members, role_types};
+use codec::{Decode, Encode};
+use membership::role_types;
 use rstd::borrow::ToOwned;
 use rstd::collections::btree_map::BTreeMap;
 use rstd::collections::btree_set::BTreeSet;
@@ -50,7 +49,7 @@ pub trait Trait:
     + stake::Trait
     + hiring::Trait
     + versioned_store_permissions::Trait
-    + members::Trait
+    + membership::Trait
 {
     // + Sized
 
@@ -59,7 +58,7 @@ pub trait Trait:
 }
 
 /// Type constraint for identifer used for actors in members module in this runtime.
-pub type ActorIdInMembersModule<T> = <T as members::Trait>::ActorId;
+pub type ActorIdInMembersModule<T> = <T as membership::Trait>::ActorId;
 
 /// Type for identifier for channels.
 /// The ChannelId must be capable of behaving like an actor id for membership module,
@@ -928,13 +927,13 @@ impl rstd::convert::From<WrappedError<hiring::DeactivateApplicationError>> for &
     }
 }
 
-impl rstd::convert::From<WrappedError<members::ControllerAccountForMemberCheckFailed>> for &str {
-    fn from(wrapper: WrappedError<members::ControllerAccountForMemberCheckFailed>) -> Self {
+impl rstd::convert::From<WrappedError<membership::ControllerAccountForMemberCheckFailed>> for &str {
+    fn from(wrapper: WrappedError<membership::ControllerAccountForMemberCheckFailed>) -> Self {
         match wrapper.error {
-            members::ControllerAccountForMemberCheckFailed::NotMember => {
+            membership::ControllerAccountForMemberCheckFailed::NotMember => {
                 MSG_CREATE_CHANNEL_IS_NOT_MEMBER
             }
-            members::ControllerAccountForMemberCheckFailed::NotControllerAccount => {
+            membership::ControllerAccountForMemberCheckFailed::NotControllerAccount => {
                 MSG_CREATE_CHANNEL_NOT_CONTROLLER_ACCOUNT
             }
         }
@@ -966,16 +965,16 @@ impl rstd::convert::From<WrappedError<hiring::AddApplicationError>> for &str {
     }
 }
 
-impl rstd::convert::From<WrappedError<members::MemberControllerAccountDidNotSign>> for &str {
-    fn from(wrapper: WrappedError<members::MemberControllerAccountDidNotSign>) -> Self {
+impl rstd::convert::From<WrappedError<membership::MemberControllerAccountDidNotSign>> for &str {
+    fn from(wrapper: WrappedError<membership::MemberControllerAccountDidNotSign>) -> Self {
         match wrapper.error {
-            members::MemberControllerAccountDidNotSign::UnsignedOrigin => {
+            membership::MemberControllerAccountDidNotSign::UnsignedOrigin => {
                 MSG_APPLY_ON_CURATOR_OPENING_UNSIGNED_ORIGIN
             }
-            members::MemberControllerAccountDidNotSign::MemberIdInvalid => {
+            membership::MemberControllerAccountDidNotSign::MemberIdInvalid => {
                 MSG_APPLY_ON_CURATOR_OPENING_MEMBER_ID_INVALID
             }
-            members::MemberControllerAccountDidNotSign::SignerControllerAccountMismatch => {
+            membership::MemberControllerAccountDidNotSign::SignerControllerAccountMismatch => {
                 MSG_APPLY_ON_CURATOR_OPENING_SIGNER_NOT_CONTROLLER_ACCOUNT
             }
         }
@@ -1143,7 +1142,7 @@ decl_module! {
 
             // Ensure that owner member can authenticate with signer account
             ensure_on_wrapped_error!(
-                members::Module::<T>::ensure_is_controller_account_for_member(&owner, &signer_account)
+                membership::Module::<T>::ensure_is_controller_account_for_member(&owner, &signer_account)
             )?;
 
             // Ensure it is currently possible to create channels (ChannelCreationEnabled).
@@ -1206,7 +1205,7 @@ decl_module! {
             // CREDENTIAL STUFF //
 
             // Dial out to membership module and inform about new role as channe owner.
-            let registered_role = <members::Module<T>>::register_role_on_member(owner, &member_in_role).is_ok();
+            let registered_role = <membership::Module<T>>::register_role_on_member(owner, &member_in_role).is_ok();
 
             assert!(registered_role);
 
@@ -1252,14 +1251,14 @@ decl_module! {
             );
 
             // Remove
-            let unregistered_role = <members::Module<T>>::unregister_role(
+            let unregistered_role = <membership::Module<T>>::unregister_role(
                 role
             ).is_ok();
 
             assert!(unregistered_role);
 
             // Dial out to membership module and inform about new role as channel owner.
-            let registered_role = <members::Module<T>>::register_role_on_member(
+            let registered_role = <membership::Module<T>>::register_role_on_member(
                 new_owner,
                 &role
             ).is_ok();
@@ -1556,7 +1555,7 @@ decl_module! {
                     let recipient = <recurringrewards::Module<T>>::add_recipient();
 
                     // member must exist, since it was checked that it can enter the role
-                    let member_profile = <members::Module<T>>::member_profile(successful_curator_application.member_id).unwrap();
+                    let member_profile = <membership::Module<T>>::member_profile(successful_curator_application.member_id).unwrap();
 
                     // rewards are deposited in the member's root account
                     let reward_destination_account = member_profile.root_account;
@@ -1615,7 +1614,7 @@ decl_module! {
                 CuratorById::<T>::insert(new_curator_id, curator);
 
                 // Register role on member
-                let registered_role = members::Module::<T>::register_role_on_member(
+                let registered_role = membership::Module::<T>::register_role_on_member(
                     successful_curator_application.member_id,
                     &role_types::ActorInRole::new(role_types::Role::Curator, new_curator_id)
                 ).is_ok();
@@ -1730,8 +1729,8 @@ decl_module! {
             // and cannot specify another arbitrary account as the source account.
             // Ensure the source_account is either the controller or root account of member with given id
             ensure!(
-                members::Module::<T>::ensure_member_controller_account(&source_account, &member_id).is_ok() ||
-                members::Module::<T>::ensure_member_root_account(&source_account, &member_id).is_ok(),
+                membership::Module::<T>::ensure_member_controller_account(&source_account, &member_id).is_ok() ||
+                membership::Module::<T>::ensure_member_root_account(&source_account, &member_id).is_ok(),
                 MSG_ORIGIN_IS_NIETHER_MEMBER_CONTROLLER_OR_ROOT
             );
 
@@ -1812,14 +1811,14 @@ decl_module! {
         ) {
             // Ensure that origin is signed by member with given id.
             ensure_on_wrapped_error!(
-                members::Module::<T>::ensure_member_controller_account_signed(origin, &member_id)
+                membership::Module::<T>::ensure_member_controller_account_signed(origin, &member_id)
             )?;
 
             // Ensure that member is this curator
             let actor_in_role = role_types::ActorInRole::new(role_types::Role::Curator, curator_id);
 
             ensure!(
-                members::MembershipIdByActorInRole::<T>::get(actor_in_role) == member_id,
+                membership::MembershipIdByActorInRole::<T>::get(actor_in_role) == member_id,
                 MSG_CURATOR_NOT_CONTROLLED_BY_MEMBER
             );
 
@@ -2067,7 +2066,7 @@ impl<T: Trait> Module<T> {
         //
 
         // Register in role - will fail if member cannot become lead
-        members::Module::<T>::register_role_on_member(member, &new_lead_role)?;
+        membership::Module::<T>::register_role_on_member(member, &new_lead_role)?;
 
         // Construct lead
         let new_lead = Lead {
@@ -2107,7 +2106,7 @@ impl<T: Trait> Module<T> {
             actor_id: lead_id,
         };
 
-        <members::Module<T>>::unregister_role(current_lead_role)?;
+        <membership::Module<T>>::unregister_role(current_lead_role)?;
 
         // Update lead stage as exited
         let current_block = <system::Module<T>>::block_number();
@@ -2155,10 +2154,10 @@ impl<T: Trait> Module<T> {
         member_id: &T::MemberId,
         role: role_types::Role,
         actor_id: &ActorIdInMembersModule<T>,
-    ) -> Result<members::ActorInRole<ActorIdInMembersModule<T>>, &'static str> {
+    ) -> Result<membership::ActorInRole<ActorIdInMembersModule<T>>, &'static str> {
         let new_actor_in_role = role_types::ActorInRole::new(role, *actor_id);
 
-        <members::Module<T>>::can_register_role_on_member(member_id, &new_actor_in_role)
+        <membership::Module<T>>::can_register_role_on_member(member_id, &new_actor_in_role)
             .map(|_| new_actor_in_role)
     }
 
@@ -2166,7 +2165,7 @@ impl<T: Trait> Module<T> {
         member_id: &T::MemberId,
     ) -> Result<
         (
-            members::ActorInRole<ActorIdInMembersModule<T>>,
+            membership::ActorInRole<ActorIdInMembersModule<T>>,
             CuratorId<T>,
         ),
         &'static str,
@@ -2182,7 +2181,7 @@ impl<T: Trait> Module<T> {
         opt_channel_id: Option<ChannelId<T>>,
     ) -> Result<
         (
-            members::ActorInRole<ActorIdInMembersModule<T>>,
+            membership::ActorInRole<ActorIdInMembersModule<T>>,
             ChannelId<T>,
         ),
         &'static str,

+ 6 - 6
runtime-modules/content-working-group/src/mock.rs

@@ -16,7 +16,7 @@ use srml_support::{impl_outer_event, impl_outer_origin, parameter_types};
 
 pub use common::currency::GovernanceCurrency;
 pub use hiring;
-pub use membership::members;
+pub use membership;
 pub use minting;
 pub use recurringrewards;
 pub use stake;
@@ -55,7 +55,7 @@ mod lib {
 impl_outer_event! {
     pub enum TestEvent for Test {
         versioned_store<T>,
-        members<T>,
+        membership<T>,
         balances<T>,
         lib<T>,
     }
@@ -183,7 +183,7 @@ impl versioned_store_permissions::Trait for Test {
 }
 
 type TestMemberId = u64;
-impl members::Trait for Test {
+impl membership::Trait for Test {
     type Event = TestEvent;
     type MemberId = TestMemberId;
     type PaidTermId = u64;
@@ -198,7 +198,7 @@ impl Trait for Test {
 
 pub struct TestExternalitiesBuilder<T: Trait> {
     system_config: Option<system::GenesisConfig>,
-    membership_config: Option<members::GenesisConfig<T>>,
+    membership_config: Option<membership::GenesisConfig<T>>,
     content_wg_config: Option<GenesisConfig<T>>,
 }
 
@@ -218,7 +218,7 @@ impl<T: Trait> TestExternalitiesBuilder<T> {
         self.system_config = Some(system_config);
         self
     }
-    pub fn set_membership_config(mut self, membership_config: members::GenesisConfig<T>) -> Self {
+    pub fn set_membership_config(mut self, membership_config: membership::GenesisConfig<T>) -> Self {
         self.membership_config = Some(membership_config);
         self
     }
@@ -239,7 +239,7 @@ impl<T: Trait> TestExternalitiesBuilder<T> {
 
         // Add membership
         self.membership_config
-            .unwrap_or(members::GenesisConfig::default())
+            .unwrap_or(membership::GenesisConfig::default())
             .assimilate_storage(&mut t)
             .unwrap();
 

+ 16 - 17
runtime-modules/content-working-group/src/tests.rs

@@ -2,7 +2,6 @@
 
 use super::genesis;
 use super::mock::{self, *};
-//use crate::membership;
 use hiring;
 use rstd::collections::btree_map::BTreeMap;
 use rstd::collections::btree_set::BTreeSet;
@@ -49,7 +48,7 @@ fn create_channel_is_not_a_member() {
 
             // Change to invalid member id, i.e. != channel_creator_member_id
             fixture.channel_creator_member_id = fixture.channel_creator_member_id
-                + <<Test as members::Trait>::MemberId as One>::one();
+                + <<Test as membership::Trait>::MemberId as One>::one();
 
             fixture.call_and_assert_error(MSG_CREATE_CHANNEL_IS_NOT_MEMBER);
         });
@@ -864,7 +863,7 @@ fn multiple_applications_by_same_member_to_opening_fails() {
 
 struct UpdateCuratorRoleAccountFixture {
     pub origin: Origin,
-    pub member_id: <Test as members::Trait>::MemberId,
+    pub member_id: <Test as membership::Trait>::MemberId,
     pub curator_id: CuratorId<Test>,
     pub new_role_account: <Test as system::Trait>::AccountId,
 }
@@ -1154,7 +1153,7 @@ fn terminate_curator_role_success() {
 
 struct SetLeadFixture {
     pub origin: Origin,
-    pub member_id: <Test as members::Trait>::MemberId,
+    pub member_id: <Test as membership::Trait>::MemberId,
     pub new_role_account: <Test as system::Trait>::AccountId,
 }
 
@@ -1502,7 +1501,7 @@ fn add_members_and_apply_on_opening(
 
 #[derive(Clone)]
 struct NewMemberAppliedResult {
-    pub member_id: <Test as members::Trait>::MemberId,
+    pub member_id: <Test as membership::Trait>::MemberId,
     pub curator_application_id: crate::CuratorApplicationId<Test>,
 }
 
@@ -1901,7 +1900,7 @@ impl SetupLeadAndHireCuratorResult {
         }
     }
 
-    pub fn curator_member_id(&self) -> <Test as members::Trait>::MemberId {
+    pub fn curator_member_id(&self) -> <Test as membership::Trait>::MemberId {
         self.setup_and_fill_opening_result
             .setup_opening_in_review
             .added_members_application_result[0]
@@ -1926,7 +1925,7 @@ fn setup_lead_and_hire_curator() -> SetupLeadAndHireCuratorResult {
 }
 
 struct CreateChannelFixture {
-    pub channel_creator_member_id: <Test as members::Trait>::MemberId,
+    pub channel_creator_member_id: <Test as membership::Trait>::MemberId,
     pub controller_account: <Test as system::Trait>::AccountId,
     pub channel_creator_role_account: <Test as system::Trait>::AccountId,
     pub channel_handle: Vec<u8>,
@@ -1940,13 +1939,13 @@ struct CreateChannelFixture {
 
 impl CreateChannelFixture {
     pub fn make_valid_unpulished_video_channel_for(
-        channel_creator_member_id: <Test as members::Trait>::MemberId,
+        channel_creator_member_id: <Test as membership::Trait>::MemberId,
         override_controller_account: Option<<Test as system::Trait>::AccountId>,
     ) -> Self {
         let controller_account = if let Some(account) = override_controller_account {
             account
         } else {
-            members::Module::<Test>::ensure_profile(channel_creator_member_id)
+            membership::Module::<Test>::ensure_profile(channel_creator_member_id)
                 .unwrap()
                 .controller_account
         };
@@ -2064,7 +2063,7 @@ impl CreateChannelFixture {
 }
 
 struct NewMemberAsLead {
-    pub member_id: <Test as members::Trait>::MemberId,
+    pub member_id: <Test as membership::Trait>::MemberId,
     pub lead_id: LeadId<Test>,
 }
 
@@ -2081,7 +2080,7 @@ pub fn set_channel_creation_enabled(enabled: bool) {
         .unwrap()
 }
 
-pub fn add_channel_creator_member() -> <Test as members::Trait>::MemberId {
+pub fn add_channel_creator_member() -> <Test as membership::Trait>::MemberId {
     let channel_creator_member_id = add_member(
         CHANNEL_CREATOR_ROOT_AND_CONTROLLER_ACCOUNT,
         to_vec(CHANNEL_CREATOR_HANDLE),
@@ -2093,14 +2092,14 @@ pub fn add_channel_creator_member() -> <Test as members::Trait>::MemberId {
 pub fn add_member(
     root_and_controller_account: <Test as system::Trait>::AccountId,
     handle: Vec<u8>,
-) -> <Test as members::Trait>::MemberId {
-    let next_member_id = members::NextMemberId::<Test>::get();
+) -> <Test as membership::Trait>::MemberId {
+    let next_member_id = membership::NextMemberId::<Test>::get();
 
     assert_eq!(
-        members::Module::<Test>::buy_membership(
+        membership::Module::<Test>::buy_membership(
             Origin::signed(root_and_controller_account),
             0,
-            members::UserInfo {
+            membership::UserInfo {
                 handle: Some(handle),
                 avatar_uri: None,
                 about: None,
@@ -2114,11 +2113,11 @@ pub fn add_member(
 }
 
 pub fn set_lead(
-    member_id: <Test as members::Trait>::MemberId,
+    member_id: <Test as membership::Trait>::MemberId,
     new_role_account: <Test as system::Trait>::AccountId,
 ) -> LeadId<Test> {
     // Get controller account
-    //let lead_member_controller_account = members::Module::<Test>::ensure_profile(member_id).unwrap().controller_account;
+    //let lead_member_controller_account = membership::Module::<Test>::ensure_profile(member_id).unwrap().controller_account;
 
     let expected_lead_id = NextLeadId::<Test>::get();
 

+ 2 - 4
runtime-modules/governance/src/election.rs

@@ -48,9 +48,7 @@ use super::council;
 use crate::election_params::ElectionParameters;
 pub use common::currency::{BalanceOf, GovernanceCurrency};
 
-pub trait Trait:
-    system::Trait + council::Trait + GovernanceCurrency + membership::members::Trait
-{
+pub trait Trait: system::Trait + council::Trait + GovernanceCurrency + membership::Trait {
     type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
 
     type CouncilElected: CouncilElected<Seats<Self::AccountId, BalanceOf<Self>>, Self::BlockNumber>;
@@ -213,7 +211,7 @@ impl<T: Trait> Module<T> {
 
     fn can_participate(sender: &T::AccountId) -> bool {
         !<T as GovernanceCurrency>::Currency::free_balance(sender).is_zero()
-            && <membership::members::Module<T>>::is_member_account(sender)
+            && <membership::Module<T>>::is_member_account(sender)
     }
 
     // PUBLIC IMMUTABLES

+ 2 - 2
runtime-modules/governance/src/mock.rs

@@ -62,7 +62,7 @@ impl election::Trait for Test {
 
     type CouncilElected = (Council,);
 }
-impl membership::members::Trait for Test {
+impl membership::Trait for Test {
     type Event = ();
     type MemberId = u32;
     type SubscriptionId = u32;
@@ -118,7 +118,7 @@ pub fn initial_test_ext() -> runtime_io::TestExternalities {
         .build_storage::<Test>()
         .unwrap();
 
-    membership::members::GenesisConfig::<Test> {
+    membership::GenesisConfig::<Test> {
         default_paid_membership_fee: 0,
         members: vec![
             (1, "member1".into(), "".into(), "".into()),

+ 3 - 4
runtime-modules/membership/src/genesis.rs

@@ -2,9 +2,8 @@
 
 use common::currency::BalanceOf;
 use rstd::prelude::*;
-//pub use super::members::{GenesisConfig, Trait};
 
-use super::members::{self, Trait};
+use crate::{GenesisConfig, Trait};
 
 /// Builder fo membership module genesis configuration.
 pub struct GenesisConfigBuilder<T: Trait> {
@@ -34,8 +33,8 @@ impl<T: Trait> GenesisConfigBuilder<T> {
         self
     }
 
-    pub fn build(&self) -> members::GenesisConfig<T> {
-        members::GenesisConfig::<T> {
+    pub fn build(&self) -> GenesisConfig<T> {
+        GenesisConfig::<T> {
             default_paid_membership_fee: self.default_paid_membership_fee,
             members: self
                 .members

+ 725 - 3
runtime-modules/membership/src/lib.rs

@@ -1,9 +1,731 @@
 // Ensure we're `no_std` when compiling for Wasm.
 #![cfg_attr(not(feature = "std"), no_std)]
+// Clippy linter requirement
+#![allow(clippy::redundant_closure_call)] // disable it because of the substrate lib design
+                                          // example:  pub PaidMembershipTermsById get(paid_membership_terms_by_id) build(|config: &GenesisConfig<T>| {}
 
 pub mod genesis;
-pub mod members;
-pub mod role_types;
-
 pub(crate) mod mock;
+pub mod role_types;
 mod tests;
+
+use codec::{Codec, Decode, Encode};
+use rstd::borrow::ToOwned;
+use rstd::prelude::*;
+use sr_primitives::traits::{MaybeSerialize, Member, One, SimpleArithmetic};
+use srml_support::traits::{Currency, Get};
+use srml_support::{decl_event, decl_module, decl_storage, dispatch, ensure, Parameter};
+use system::{self, ensure_root, ensure_signed};
+
+use common::currency::{BalanceOf, GovernanceCurrency};
+
+pub use role_types::*;
+
+pub trait Trait: system::Trait + GovernanceCurrency + timestamp::Trait {
+    type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
+
+    type MemberId: Parameter
+        + Member
+        + SimpleArithmetic
+        + Codec
+        + Default
+        + Copy
+        + MaybeSerialize
+        + PartialEq;
+
+    type PaidTermId: Parameter
+        + Member
+        + SimpleArithmetic
+        + Codec
+        + Default
+        + Copy
+        + MaybeSerialize
+        + PartialEq;
+
+    type SubscriptionId: Parameter
+        + Member
+        + SimpleArithmetic
+        + Codec
+        + Default
+        + Copy
+        + MaybeSerialize
+        + PartialEq;
+
+    type ActorId: Parameter
+        + Member
+        + SimpleArithmetic
+        + Codec
+        + Default
+        + Copy
+        + MaybeSerialize
+        + PartialEq
+        + Ord;
+
+    /// Initial balance of members created at genesis
+    type InitialMembersBalance: Get<BalanceOf<Self>>;
+}
+
+const FIRST_PAID_TERMS_ID: u32 = 1;
+
+// Default paid membership terms
+pub const DEFAULT_PAID_TERM_ID: u32 = 0;
+
+// Default user info constraints
+const DEFAULT_MIN_HANDLE_LENGTH: u32 = 5;
+const DEFAULT_MAX_HANDLE_LENGTH: u32 = 40;
+const DEFAULT_MAX_AVATAR_URI_LENGTH: u32 = 1024;
+const DEFAULT_MAX_ABOUT_TEXT_LENGTH: u32 = 2048;
+
+//#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
+#[derive(Encode, Decode)]
+/// Stored information about a registered user
+pub struct Profile<T: Trait> {
+    /// The unique handle chosen by member
+    pub handle: Vec<u8>,
+
+    /// A Url to member's Avatar image
+    pub avatar_uri: Vec<u8>,
+
+    /// Short text chosen by member to share information about themselves
+    pub about: Vec<u8>,
+
+    /// Blocknumber when member was registered
+    pub registered_at_block: T::BlockNumber,
+
+    /// Timestamp when member was registered
+    pub registered_at_time: T::Moment,
+
+    /// How the member was registered
+    pub entry: EntryMethod<T>,
+
+    /// Wether the member is suspended or not.
+    pub suspended: bool,
+
+    /// The type of subsction the member has purchased if any.
+    pub subscription: Option<T::SubscriptionId>,
+
+    /// Member's root account id. Only the root account is permitted to set a new root account
+    /// and update the controller account. Other modules may only allow certain actions if
+    /// signed with root account. It is intended to be an account that can remain offline and
+    /// potentially hold a member's funds, and be a source for staking roles.
+    pub root_account: T::AccountId,
+
+    /// Member's controller account id. This account is intended to be used by
+    /// a member to act under their identity in other modules. It will usually be used more
+    /// online and will have less funds in its balance.
+    pub controller_account: T::AccountId,
+
+    /// The set of registered roles the member has enrolled in.
+    pub roles: ActorInRoleSet<T::ActorId>,
+}
+
+#[derive(Clone, Debug, Encode, Decode, PartialEq)]
+/// A "Partial" struct used to batch user configurable profile information when registering or updating info
+pub struct UserInfo {
+    pub handle: Option<Vec<u8>>,
+    pub avatar_uri: Option<Vec<u8>>,
+    pub about: Option<Vec<u8>>,
+}
+
+struct CheckedUserInfo {
+    handle: Vec<u8>,
+    avatar_uri: Vec<u8>,
+    about: Vec<u8>,
+}
+
+//#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
+#[derive(Encode, Decode, Debug, PartialEq)]
+pub enum EntryMethod<T: Trait> {
+    Paid(T::PaidTermId),
+    Screening(T::AccountId),
+    Genesis,
+}
+
+//#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
+#[derive(Encode, Decode, Eq, PartialEq)]
+pub struct PaidMembershipTerms<T: Trait> {
+    /// Quantity of native tokens which must be provably burned
+    pub fee: BalanceOf<T>,
+    /// String of capped length describing human readable conditions which are being agreed upon
+    pub text: Vec<u8>,
+}
+
+decl_storage! {
+    trait Store for Module<T: Trait> as Membership {
+        /// MemberId to assign to next member that is added to the registry, and is also the
+        /// total number of members created. MemberIds start at Zero.
+        pub NextMemberId get(members_created) : T::MemberId;
+
+        /// Mapping of member's id to their membership profile
+        pub MemberProfile get(member_profile) : map T::MemberId => Option<Profile<T>>;
+
+        /// Mapping of a root account id to vector of member ids it controls
+        pub MemberIdsByRootAccountId get(member_ids_by_root_account_id) : map T::AccountId => Vec<T::MemberId>;
+
+        /// Mapping of a controller account id to vector of member ids it controls
+        pub MemberIdsByControllerAccountId get(member_ids_by_controller_account_id) : map T::AccountId => Vec<T::MemberId>;
+
+        /// Registered unique handles and their mapping to their owner
+        pub Handles get(handles) : map Vec<u8> => T::MemberId;
+
+        /// Next paid membership terms id
+        pub NextPaidMembershipTermsId get(next_paid_membership_terms_id) : T::PaidTermId = T::PaidTermId::from(FIRST_PAID_TERMS_ID);
+
+        /// Paid membership terms record
+        // Remember to add _genesis_phantom_data: std::marker::PhantomData{} to membership
+        // genesis config if not providing config() or extra_genesis
+        pub PaidMembershipTermsById get(paid_membership_terms_by_id) build(|config: &GenesisConfig<T>| {
+            // This method only gets called when initializing storage, and is
+            // compiled as native code. (Will be called when building `raw` chainspec)
+            // So it can't be relied upon to initialize storage for runtimes updates.
+            // Initialization for updated runtime is done in run_migration()
+            let terms = PaidMembershipTerms {
+                fee:  config.default_paid_membership_fee,
+                text: Vec::default(),
+            };
+            vec![(T::PaidTermId::from(DEFAULT_PAID_TERM_ID), terms)]
+        }) : map T::PaidTermId => Option<PaidMembershipTerms<T>>;
+
+        /// Active Paid membership terms
+        pub ActivePaidMembershipTerms get(active_paid_membership_terms) : Vec<T::PaidTermId> = vec![T::PaidTermId::from(DEFAULT_PAID_TERM_ID)];
+
+        /// Is the platform is accepting new members or not
+        pub NewMembershipsAllowed get(new_memberships_allowed) : bool = true;
+
+        pub ScreeningAuthority get(screening_authority) : Option<T::AccountId>;
+
+        // User Input Validation parameters - do these really need to be state variables
+        // I don't see a need to adjust these in future?
+        pub MinHandleLength get(min_handle_length) : u32 = DEFAULT_MIN_HANDLE_LENGTH;
+        pub MaxHandleLength get(max_handle_length) : u32 = DEFAULT_MAX_HANDLE_LENGTH;
+        pub MaxAvatarUriLength get(max_avatar_uri_length) : u32 = DEFAULT_MAX_AVATAR_URI_LENGTH;
+        pub MaxAboutTextLength get(max_about_text_length) : u32 = DEFAULT_MAX_ABOUT_TEXT_LENGTH;
+
+        pub MembershipIdByActorInRole get(membership_id_by_actor_in_role): map ActorInRole<T::ActorId> => T::MemberId;
+    }
+    add_extra_genesis {
+        config(default_paid_membership_fee): BalanceOf<T>;
+        config(members) : Vec<(T::AccountId, String, String, String)>;
+        build(|config: &GenesisConfig<T>| {
+            for (who, handle, avatar_uri, about) in &config.members {
+                let user_info = CheckedUserInfo {
+                    handle: handle.clone().into_bytes(), avatar_uri: avatar_uri.clone().into_bytes(), about: about.clone().into_bytes()
+                };
+
+                <Module<T>>::insert_member(&who, &user_info, EntryMethod::Genesis);
+
+                // Give member starting balance
+                T::Currency::deposit_creating(&who, T::InitialMembersBalance::get());
+            }
+        });
+    }
+}
+
+decl_event! {
+    pub enum Event<T> where
+      <T as system::Trait>::AccountId,
+      <T as Trait>::MemberId,
+      <T as Trait>::ActorId, {
+        MemberRegistered(MemberId, AccountId),
+        MemberUpdatedAboutText(MemberId),
+        MemberUpdatedAvatar(MemberId),
+        MemberUpdatedHandle(MemberId),
+        MemberSetRootAccount(MemberId, AccountId),
+        MemberSetControllerAccount(MemberId, AccountId),
+        MemberRegisteredRole(MemberId, ActorInRole<ActorId>),
+        MemberUnregisteredRole(MemberId, ActorInRole<ActorId>),
+    }
+}
+
+decl_module! {
+    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
+        fn deposit_event() = default;
+
+        /// Non-members can buy membership
+        pub fn buy_membership(origin, paid_terms_id: T::PaidTermId, user_info: UserInfo) {
+            let who = ensure_signed(origin)?;
+
+            // make sure we are accepting new memberships
+            ensure!(Self::new_memberships_allowed(), "new members not allowed");
+
+            // ensure paid_terms_id is active
+            let terms = Self::ensure_active_terms_id(paid_terms_id)?;
+
+            // ensure enough free balance to cover terms fees
+            ensure!(T::Currency::can_slash(&who, terms.fee), "not enough balance to buy membership");
+
+            let user_info = Self::check_user_registration_info(user_info)?;
+
+            // ensure handle is not already registered
+            Self::ensure_unique_handle(&user_info.handle)?;
+
+            let _ = T::Currency::slash(&who, terms.fee);
+            let member_id = Self::insert_member(&who, &user_info, EntryMethod::Paid(paid_terms_id));
+
+            Self::deposit_event(RawEvent::MemberRegistered(member_id, who));
+        }
+
+        /// Change member's about text
+        pub fn change_member_about_text(origin, member_id: T::MemberId, text: Vec<u8>) {
+            let sender = ensure_signed(origin)?;
+
+            let profile = Self::ensure_profile(member_id)?;
+
+            ensure!(profile.controller_account == sender, "only controller account can update member about text");
+
+            Self::_change_member_about_text(member_id, &text)?;
+        }
+
+        /// Change member's avatar
+        pub fn change_member_avatar(origin, member_id: T::MemberId, uri: Vec<u8>) {
+            let sender = ensure_signed(origin)?;
+
+            let profile = Self::ensure_profile(member_id)?;
+
+            ensure!(profile.controller_account == sender, "only controller account can update member avatar");
+
+            Self::_change_member_avatar(member_id, &uri)?;
+        }
+
+        /// Change member's handle. Will ensure new handle is unique and old one will be available
+        /// for other members to use.
+        pub fn change_member_handle(origin, member_id: T::MemberId, handle: Vec<u8>) {
+            let sender = ensure_signed(origin)?;
+
+            let profile = Self::ensure_profile(member_id)?;
+
+            ensure!(profile.controller_account == sender, "only controller account can update member handle");
+
+            Self::_change_member_handle(member_id, handle)?;
+        }
+
+        /// Update member's all or some of handle, avatar and about text.
+        pub fn update_profile(origin, member_id: T::MemberId, user_info: UserInfo) {
+            let sender = ensure_signed(origin)?;
+
+            let profile = Self::ensure_profile(member_id)?;
+
+            ensure!(profile.controller_account == sender, "only controller account can update member info");
+
+            if let Some(uri) = user_info.avatar_uri {
+                Self::_change_member_avatar(member_id, &uri)?;
+            }
+            if let Some(about) = user_info.about {
+                Self::_change_member_about_text(member_id, &about)?;
+            }
+            if let Some(handle) = user_info.handle {
+                Self::_change_member_handle(member_id, handle)?;
+            }
+        }
+
+        pub fn set_controller_account(origin, member_id: T::MemberId, new_controller_account: T::AccountId) {
+            let sender = ensure_signed(origin)?;
+
+            let mut profile = Self::ensure_profile(member_id)?;
+
+            ensure!(profile.root_account == sender, "only root account can set new controller account");
+
+            // only update if new_controller_account is different than current one
+            if profile.controller_account != new_controller_account {
+                <MemberIdsByControllerAccountId<T>>::mutate(&profile.controller_account, |ids| {
+                    ids.retain(|id| *id != member_id);
+                });
+
+                <MemberIdsByControllerAccountId<T>>::mutate(&new_controller_account, |ids| {
+                    ids.push(member_id);
+                });
+
+                profile.controller_account = new_controller_account.clone();
+                <MemberProfile<T>>::insert(member_id, profile);
+                Self::deposit_event(RawEvent::MemberSetControllerAccount(member_id, new_controller_account));
+            }
+        }
+
+        pub fn set_root_account(origin, member_id: T::MemberId, new_root_account: T::AccountId) {
+            let sender = ensure_signed(origin)?;
+
+            let mut profile = Self::ensure_profile(member_id)?;
+
+            ensure!(profile.root_account == sender, "only root account can set new root account");
+
+            // only update if new root account is different than current one
+            if profile.root_account != new_root_account {
+                <MemberIdsByRootAccountId<T>>::mutate(&profile.root_account, |ids| {
+                    ids.retain(|id| *id != member_id);
+                });
+
+                <MemberIdsByRootAccountId<T>>::mutate(&new_root_account, |ids| {
+                    ids.push(member_id);
+                });
+
+                profile.root_account = new_root_account.clone();
+                Self::deposit_event(RawEvent::MemberSetRootAccount(member_id, new_root_account));
+            }
+        }
+
+        pub fn add_screened_member(origin, new_member_account: T::AccountId, user_info: UserInfo) {
+            // ensure sender is screening authority
+            let sender = ensure_signed(origin)?;
+
+            if let Some(screening_authority) = Self::screening_authority() {
+                ensure!(sender == screening_authority, "not screener");
+            } else {
+                // no screening authority defined. Cannot accept this request
+                return Err("no screening authority defined");
+            }
+
+            // make sure we are accepting new memberships
+            ensure!(Self::new_memberships_allowed(), "new members not allowed");
+
+            let user_info = Self::check_user_registration_info(user_info)?;
+
+            // ensure handle is not already registered
+            Self::ensure_unique_handle(&user_info.handle)?;
+
+            let member_id = Self::insert_member(&new_member_account, &user_info, EntryMethod::Screening(sender));
+
+            Self::deposit_event(RawEvent::MemberRegistered(member_id, new_member_account));
+        }
+
+        pub fn set_screening_authority(origin, authority: T::AccountId) {
+            ensure_root(origin)?;
+            <ScreeningAuthority<T>>::put(authority);
+        }
+    }
+}
+
+/// Reason why a given member id does not have a given account as the controller account.
+pub enum ControllerAccountForMemberCheckFailed {
+    NotMember,
+    NotControllerAccount,
+}
+
+pub enum MemberControllerAccountDidNotSign {
+    UnsignedOrigin,
+    MemberIdInvalid,
+    SignerControllerAccountMismatch,
+}
+
+pub enum MemberControllerAccountMismatch {
+    MemberIdInvalid,
+    SignerControllerAccountMismatch,
+}
+pub enum MemberRootAccountMismatch {
+    MemberIdInvalid,
+    SignerRootAccountMismatch,
+}
+
+impl<T: Trait> Module<T> {
+    /// Provided that the memberid exists return its profile. Returns error otherwise.
+    pub fn ensure_profile(id: T::MemberId) -> Result<Profile<T>, &'static str> {
+        Self::member_profile(&id).ok_or("member profile not found")
+    }
+
+    /// Ensure that given member has given account as the controller account
+    pub fn ensure_is_controller_account_for_member(
+        member_id: &T::MemberId,
+        account: &T::AccountId,
+    ) -> Result<Profile<T>, ControllerAccountForMemberCheckFailed> {
+        if MemberProfile::<T>::exists(member_id) {
+            let profile = MemberProfile::<T>::get(member_id).unwrap();
+
+            if profile.controller_account == *account {
+                Ok(profile)
+            } else {
+                Err(ControllerAccountForMemberCheckFailed::NotControllerAccount)
+            }
+        } else {
+            Err(ControllerAccountForMemberCheckFailed::NotMember)
+        }
+    }
+
+    /// Returns true if account is either a member's root or controller account
+    pub fn is_member_account(who: &T::AccountId) -> bool {
+        <MemberIdsByRootAccountId<T>>::exists(who)
+            || <MemberIdsByControllerAccountId<T>>::exists(who)
+    }
+
+    fn ensure_active_terms_id(
+        terms_id: T::PaidTermId,
+    ) -> Result<PaidMembershipTerms<T>, &'static str> {
+        let active_terms = Self::active_paid_membership_terms();
+        ensure!(
+            active_terms.iter().any(|&id| id == terms_id),
+            "paid terms id not active"
+        );
+        let terms = Self::paid_membership_terms_by_id(terms_id)
+            .ok_or("paid membership term id does not exist")?;
+        Ok(terms)
+    }
+
+    #[allow(clippy::ptr_arg)] // cannot change to the "&[u8]" suggested by clippy
+    fn ensure_unique_handle(handle: &Vec<u8>) -> dispatch::Result {
+        ensure!(!<Handles<T>>::exists(handle), "handle already registered");
+        Ok(())
+    }
+
+    fn validate_handle(handle: &[u8]) -> dispatch::Result {
+        ensure!(
+            handle.len() >= Self::min_handle_length() as usize,
+            "handle too short"
+        );
+        ensure!(
+            handle.len() <= Self::max_handle_length() as usize,
+            "handle too long"
+        );
+        Ok(())
+    }
+
+    fn validate_text(text: &[u8]) -> Vec<u8> {
+        let mut text = text.to_owned();
+        text.truncate(Self::max_about_text_length() as usize);
+        text
+    }
+
+    fn validate_avatar(uri: &[u8]) -> dispatch::Result {
+        ensure!(
+            uri.len() <= Self::max_avatar_uri_length() as usize,
+            "avatar uri too long"
+        );
+        Ok(())
+    }
+
+    /// Basic user input validation
+    fn check_user_registration_info(user_info: UserInfo) -> Result<CheckedUserInfo, &'static str> {
+        // Handle is required during registration
+        let handle = user_info
+            .handle
+            .ok_or("handle must be provided during registration")?;
+        Self::validate_handle(&handle)?;
+
+        let about = Self::validate_text(&user_info.about.unwrap_or_default());
+        let avatar_uri = user_info.avatar_uri.unwrap_or_default();
+        Self::validate_avatar(&avatar_uri)?;
+
+        Ok(CheckedUserInfo {
+            handle,
+            avatar_uri,
+            about,
+        })
+    }
+
+    fn insert_member(
+        who: &T::AccountId,
+        user_info: &CheckedUserInfo,
+        entry_method: EntryMethod<T>,
+    ) -> T::MemberId {
+        let new_member_id = Self::members_created();
+
+        let profile: Profile<T> = Profile {
+            handle: user_info.handle.clone(),
+            avatar_uri: user_info.avatar_uri.clone(),
+            about: user_info.about.clone(),
+            registered_at_block: <system::Module<T>>::block_number(),
+            registered_at_time: <timestamp::Module<T>>::now(),
+            entry: entry_method,
+            suspended: false,
+            subscription: None,
+            root_account: who.clone(),
+            controller_account: who.clone(),
+            roles: ActorInRoleSet::new(),
+        };
+
+        <MemberIdsByRootAccountId<T>>::mutate(who, |ids| {
+            ids.push(new_member_id);
+        });
+        <MemberIdsByControllerAccountId<T>>::mutate(who, |ids| {
+            ids.push(new_member_id);
+        });
+
+        <MemberProfile<T>>::insert(new_member_id, profile);
+        <Handles<T>>::insert(user_info.handle.clone(), new_member_id);
+        <NextMemberId<T>>::put(new_member_id + One::one());
+
+        new_member_id
+    }
+
+    fn _change_member_about_text(id: T::MemberId, text: &[u8]) -> dispatch::Result {
+        let mut profile = Self::ensure_profile(id)?;
+        let text = Self::validate_text(text);
+        profile.about = text;
+        Self::deposit_event(RawEvent::MemberUpdatedAboutText(id));
+        <MemberProfile<T>>::insert(id, profile);
+        Ok(())
+    }
+
+    fn _change_member_avatar(id: T::MemberId, uri: &[u8]) -> dispatch::Result {
+        let mut profile = Self::ensure_profile(id)?;
+        Self::validate_avatar(uri)?;
+        profile.avatar_uri = uri.to_owned();
+        Self::deposit_event(RawEvent::MemberUpdatedAvatar(id));
+        <MemberProfile<T>>::insert(id, profile);
+        Ok(())
+    }
+
+    fn _change_member_handle(id: T::MemberId, handle: Vec<u8>) -> dispatch::Result {
+        let mut profile = Self::ensure_profile(id)?;
+        Self::validate_handle(&handle)?;
+        Self::ensure_unique_handle(&handle)?;
+        <Handles<T>>::remove(&profile.handle);
+        <Handles<T>>::insert(handle.clone(), id);
+        profile.handle = handle;
+        Self::deposit_event(RawEvent::MemberUpdatedHandle(id));
+        <MemberProfile<T>>::insert(id, profile);
+        Ok(())
+    }
+
+    /// Determines if the signing account is a controller account of a member that has the registered
+    /// actor_in_role.
+    pub fn key_can_sign_for_role(
+        signing_account: &T::AccountId,
+        actor_in_role: ActorInRole<T::ActorId>,
+    ) -> bool {
+        Self::member_ids_by_controller_account_id(signing_account)
+            .iter()
+            .any(|member_id| {
+                let profile = Self::member_profile(member_id).unwrap(); // must exist
+                profile.roles.has_registered_role(&actor_in_role)
+            })
+    }
+
+    /// Returns true if member identified by their member id occupies a Role at least once
+    pub fn member_is_in_role(member_id: T::MemberId, role: Role) -> bool {
+        Self::ensure_profile(member_id)
+            .ok()
+            .map_or(false, |profile| profile.roles.occupies_role(role))
+    }
+
+    pub fn ensure_member_controller_account_signed(
+        origin: T::Origin,
+        member_id: &T::MemberId,
+    ) -> Result<T::AccountId, MemberControllerAccountDidNotSign> {
+        // Ensure transaction is signed.
+        let signer_account =
+            ensure_signed(origin).map_err(|_| MemberControllerAccountDidNotSign::UnsignedOrigin)?;
+
+        // Ensure member exists
+        let profile = Self::ensure_profile(*member_id)
+            .map_err(|_| MemberControllerAccountDidNotSign::MemberIdInvalid)?;
+
+        ensure!(
+            profile.controller_account == signer_account,
+            MemberControllerAccountDidNotSign::SignerControllerAccountMismatch
+        );
+
+        Ok(signer_account)
+    }
+
+    pub fn ensure_member_controller_account(
+        signer_account: &T::AccountId,
+        member_id: &T::MemberId,
+    ) -> Result<(), MemberControllerAccountMismatch> {
+        // Ensure member exists
+        let profile = Self::ensure_profile(*member_id)
+            .map_err(|_| MemberControllerAccountMismatch::MemberIdInvalid)?;
+
+        ensure!(
+            profile.controller_account == *signer_account,
+            MemberControllerAccountMismatch::SignerControllerAccountMismatch
+        );
+
+        Ok(())
+    }
+
+    pub fn ensure_member_root_account(
+        signer_account: &T::AccountId,
+        member_id: &T::MemberId,
+    ) -> Result<(), MemberRootAccountMismatch> {
+        // Ensure member exists
+        let profile = Self::ensure_profile(*member_id)
+            .map_err(|_| MemberRootAccountMismatch::MemberIdInvalid)?;
+
+        ensure!(
+            profile.root_account == *signer_account,
+            MemberRootAccountMismatch::SignerRootAccountMismatch
+        );
+
+        Ok(())
+    }
+
+    // policy across all roles is:
+    // members can only occupy a role at most once at a time
+    // members can enter any role
+    // no limit on total number of roles a member can enter
+    // ** Note ** Role specific policies should be enforced by the client modules
+    // this method should handle higher level policies
+    pub fn can_register_role_on_member(
+        member_id: &T::MemberId,
+        actor_in_role: &ActorInRole<T::ActorId>,
+    ) -> Result<Profile<T>, &'static str> {
+        // Ensure member exists
+        let profile = Self::ensure_profile(*member_id)?;
+
+        // ensure is active member
+        ensure!(!profile.suspended, "SuspendedMemberCannotEnterRole");
+
+        // guard against duplicate ActorInRole
+        ensure!(
+            !<MembershipIdByActorInRole<T>>::exists(actor_in_role),
+            "ActorInRoleAlreadyExists"
+        );
+
+        /*
+        Disabling this temporarily for Rome, later we will drop all this
+        integration with Membership module anyway:
+        https://github.com/Joystream/substrate-runtime-joystream/issues/115
+        ensure!(
+            !profile.roles.occupies_role(actor_in_role.role),
+            "MemberAlreadyInRole"
+        );
+        */
+
+        // Other possible checks:
+        // How long the member has been registered
+        // Minimum balance
+        // EntryMethod
+
+        Ok(profile)
+    }
+
+    pub fn register_role_on_member(
+        member_id: T::MemberId,
+        actor_in_role: &ActorInRole<T::ActorId>,
+    ) -> Result<(), &'static str> {
+        // Policy check
+        let mut profile = Self::can_register_role_on_member(&member_id, actor_in_role)?;
+
+        assert!(profile.roles.register_role(actor_in_role));
+
+        <MemberProfile<T>>::insert(member_id, profile);
+        <MembershipIdByActorInRole<T>>::insert(actor_in_role, member_id);
+        Self::deposit_event(RawEvent::MemberRegisteredRole(member_id, *actor_in_role));
+        Ok(())
+    }
+
+    pub fn can_unregister_role(actor_in_role: ActorInRole<T::ActorId>) -> Result<(), &'static str> {
+        ensure!(
+            <MembershipIdByActorInRole<T>>::exists(&actor_in_role),
+            "ActorInRoleNotFound"
+        );
+
+        Ok(())
+    }
+
+    pub fn unregister_role(actor_in_role: ActorInRole<T::ActorId>) -> Result<(), &'static str> {
+        Self::can_unregister_role(actor_in_role)?;
+
+        let member_id = <MembershipIdByActorInRole<T>>::get(actor_in_role);
+
+        let mut profile = Self::ensure_profile(member_id)?; // .expect().. ?
+
+        assert!(profile.roles.unregister_role(&actor_in_role));
+
+        <MembershipIdByActorInRole<T>>::remove(actor_in_role);
+
+        <MemberProfile<T>>::insert(member_id, profile);
+
+        Self::deposit_event(RawEvent::MemberUnregisteredRole(member_id, actor_in_role));
+
+        Ok(())
+    }
+}

+ 0 - 725
runtime-modules/membership/src/members.rs

@@ -1,725 +0,0 @@
-// Clippy linter requirement
-#![allow(clippy::redundant_closure_call)] // disable it because of the substrate lib design
-                                          // example:  pub PaidMembershipTermsById get(paid_membership_terms_by_id) build(|config: &GenesisConfig<T>| {}
-
-use codec::{Codec, Decode, Encode};
-use common::currency::{BalanceOf, GovernanceCurrency};
-
-use rstd::borrow::ToOwned;
-use rstd::prelude::*;
-use sr_primitives::traits::{MaybeSerialize, Member, One, SimpleArithmetic};
-use srml_support::traits::{Currency, Get};
-use srml_support::{decl_event, decl_module, decl_storage, dispatch, ensure, Parameter};
-
-use system::{self, ensure_root, ensure_signed};
-
-pub use super::role_types::*;
-
-pub trait Trait: system::Trait + GovernanceCurrency + timestamp::Trait {
-    type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
-
-    type MemberId: Parameter
-        + Member
-        + SimpleArithmetic
-        + Codec
-        + Default
-        + Copy
-        + MaybeSerialize
-        + PartialEq;
-
-    type PaidTermId: Parameter
-        + Member
-        + SimpleArithmetic
-        + Codec
-        + Default
-        + Copy
-        + MaybeSerialize
-        + PartialEq;
-
-    type SubscriptionId: Parameter
-        + Member
-        + SimpleArithmetic
-        + Codec
-        + Default
-        + Copy
-        + MaybeSerialize
-        + PartialEq;
-
-    type ActorId: Parameter
-        + Member
-        + SimpleArithmetic
-        + Codec
-        + Default
-        + Copy
-        + MaybeSerialize
-        + PartialEq
-        + Ord;
-
-    /// Initial balance of members created at genesis
-    type InitialMembersBalance: Get<BalanceOf<Self>>;
-}
-
-const FIRST_PAID_TERMS_ID: u32 = 1;
-
-// Default paid membership terms
-pub const DEFAULT_PAID_TERM_ID: u32 = 0;
-
-// Default user info constraints
-const DEFAULT_MIN_HANDLE_LENGTH: u32 = 5;
-const DEFAULT_MAX_HANDLE_LENGTH: u32 = 40;
-const DEFAULT_MAX_AVATAR_URI_LENGTH: u32 = 1024;
-const DEFAULT_MAX_ABOUT_TEXT_LENGTH: u32 = 2048;
-
-//#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode)]
-/// Stored information about a registered user
-pub struct Profile<T: Trait> {
-    /// The unique handle chosen by member
-    pub handle: Vec<u8>,
-
-    /// A Url to member's Avatar image
-    pub avatar_uri: Vec<u8>,
-
-    /// Short text chosen by member to share information about themselves
-    pub about: Vec<u8>,
-
-    /// Blocknumber when member was registered
-    pub registered_at_block: T::BlockNumber,
-
-    /// Timestamp when member was registered
-    pub registered_at_time: T::Moment,
-
-    /// How the member was registered
-    pub entry: EntryMethod<T>,
-
-    /// Wether the member is suspended or not.
-    pub suspended: bool,
-
-    /// The type of subsction the member has purchased if any.
-    pub subscription: Option<T::SubscriptionId>,
-
-    /// Member's root account id. Only the root account is permitted to set a new root account
-    /// and update the controller account. Other modules may only allow certain actions if
-    /// signed with root account. It is intended to be an account that can remain offline and
-    /// potentially hold a member's funds, and be a source for staking roles.
-    pub root_account: T::AccountId,
-
-    /// Member's controller account id. This account is intended to be used by
-    /// a member to act under their identity in other modules. It will usually be used more
-    /// online and will have less funds in its balance.
-    pub controller_account: T::AccountId,
-
-    /// The set of registered roles the member has enrolled in.
-    pub roles: ActorInRoleSet<T::ActorId>,
-}
-
-#[derive(Clone, Debug, Encode, Decode, PartialEq)]
-/// A "Partial" struct used to batch user configurable profile information when registering or updating info
-pub struct UserInfo {
-    pub handle: Option<Vec<u8>>,
-    pub avatar_uri: Option<Vec<u8>>,
-    pub about: Option<Vec<u8>>,
-}
-
-struct CheckedUserInfo {
-    handle: Vec<u8>,
-    avatar_uri: Vec<u8>,
-    about: Vec<u8>,
-}
-
-//#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Debug, PartialEq)]
-pub enum EntryMethod<T: Trait> {
-    Paid(T::PaidTermId),
-    Screening(T::AccountId),
-    Genesis,
-}
-
-//#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Eq, PartialEq)]
-pub struct PaidMembershipTerms<T: Trait> {
-    /// Quantity of native tokens which must be provably burned
-    pub fee: BalanceOf<T>,
-    /// String of capped length describing human readable conditions which are being agreed upon
-    pub text: Vec<u8>,
-}
-
-decl_storage! {
-    trait Store for Module<T: Trait> as Membership {
-        /// MemberId to assign to next member that is added to the registry, and is also the
-        /// total number of members created. MemberIds start at Zero.
-        pub NextMemberId get(members_created) : T::MemberId;
-
-        /// Mapping of member's id to their membership profile
-        pub MemberProfile get(member_profile) : map T::MemberId => Option<Profile<T>>;
-
-        /// Mapping of a root account id to vector of member ids it controls
-        pub MemberIdsByRootAccountId get(member_ids_by_root_account_id) : map T::AccountId => Vec<T::MemberId>;
-
-        /// Mapping of a controller account id to vector of member ids it controls
-        pub MemberIdsByControllerAccountId get(member_ids_by_controller_account_id) : map T::AccountId => Vec<T::MemberId>;
-
-        /// Registered unique handles and their mapping to their owner
-        pub Handles get(handles) : map Vec<u8> => T::MemberId;
-
-        /// Next paid membership terms id
-        pub NextPaidMembershipTermsId get(next_paid_membership_terms_id) : T::PaidTermId = T::PaidTermId::from(FIRST_PAID_TERMS_ID);
-
-        /// Paid membership terms record
-        // Remember to add _genesis_phantom_data: std::marker::PhantomData{} to membership
-        // genesis config if not providing config() or extra_genesis
-        pub PaidMembershipTermsById get(paid_membership_terms_by_id) build(|config: &GenesisConfig<T>| {
-            // This method only gets called when initializing storage, and is
-            // compiled as native code. (Will be called when building `raw` chainspec)
-            // So it can't be relied upon to initialize storage for runtimes updates.
-            // Initialization for updated runtime is done in run_migration()
-            let terms = PaidMembershipTerms {
-                fee:  config.default_paid_membership_fee,
-                text: Vec::default(),
-            };
-            vec![(T::PaidTermId::from(DEFAULT_PAID_TERM_ID), terms)]
-        }) : map T::PaidTermId => Option<PaidMembershipTerms<T>>;
-
-        /// Active Paid membership terms
-        pub ActivePaidMembershipTerms get(active_paid_membership_terms) : Vec<T::PaidTermId> = vec![T::PaidTermId::from(DEFAULT_PAID_TERM_ID)];
-
-        /// Is the platform is accepting new members or not
-        pub NewMembershipsAllowed get(new_memberships_allowed) : bool = true;
-
-        pub ScreeningAuthority get(screening_authority) : Option<T::AccountId>;
-
-        // User Input Validation parameters - do these really need to be state variables
-        // I don't see a need to adjust these in future?
-        pub MinHandleLength get(min_handle_length) : u32 = DEFAULT_MIN_HANDLE_LENGTH;
-        pub MaxHandleLength get(max_handle_length) : u32 = DEFAULT_MAX_HANDLE_LENGTH;
-        pub MaxAvatarUriLength get(max_avatar_uri_length) : u32 = DEFAULT_MAX_AVATAR_URI_LENGTH;
-        pub MaxAboutTextLength get(max_about_text_length) : u32 = DEFAULT_MAX_ABOUT_TEXT_LENGTH;
-
-        pub MembershipIdByActorInRole get(membership_id_by_actor_in_role): map ActorInRole<T::ActorId> => T::MemberId;
-    }
-    add_extra_genesis {
-        config(default_paid_membership_fee): BalanceOf<T>;
-        config(members) : Vec<(T::AccountId, String, String, String)>;
-        build(|config: &GenesisConfig<T>| {
-            for (who, handle, avatar_uri, about) in &config.members {
-                let user_info = CheckedUserInfo {
-                    handle: handle.clone().into_bytes(), avatar_uri: avatar_uri.clone().into_bytes(), about: about.clone().into_bytes()
-                };
-
-                <Module<T>>::insert_member(&who, &user_info, EntryMethod::Genesis);
-
-                // Give member starting balance
-                T::Currency::deposit_creating(&who, T::InitialMembersBalance::get());
-            }
-        });
-    }
-}
-
-decl_event! {
-    pub enum Event<T> where
-      <T as system::Trait>::AccountId,
-      <T as Trait>::MemberId,
-      <T as Trait>::ActorId, {
-        MemberRegistered(MemberId, AccountId),
-        MemberUpdatedAboutText(MemberId),
-        MemberUpdatedAvatar(MemberId),
-        MemberUpdatedHandle(MemberId),
-        MemberSetRootAccount(MemberId, AccountId),
-        MemberSetControllerAccount(MemberId, AccountId),
-        MemberRegisteredRole(MemberId, ActorInRole<ActorId>),
-        MemberUnregisteredRole(MemberId, ActorInRole<ActorId>),
-    }
-}
-
-decl_module! {
-    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
-        fn deposit_event() = default;
-
-        /// Non-members can buy membership
-        pub fn buy_membership(origin, paid_terms_id: T::PaidTermId, user_info: UserInfo) {
-            let who = ensure_signed(origin)?;
-
-            // make sure we are accepting new memberships
-            ensure!(Self::new_memberships_allowed(), "new members not allowed");
-
-            // ensure paid_terms_id is active
-            let terms = Self::ensure_active_terms_id(paid_terms_id)?;
-
-            // ensure enough free balance to cover terms fees
-            ensure!(T::Currency::can_slash(&who, terms.fee), "not enough balance to buy membership");
-
-            let user_info = Self::check_user_registration_info(user_info)?;
-
-            // ensure handle is not already registered
-            Self::ensure_unique_handle(&user_info.handle)?;
-
-            let _ = T::Currency::slash(&who, terms.fee);
-            let member_id = Self::insert_member(&who, &user_info, EntryMethod::Paid(paid_terms_id));
-
-            Self::deposit_event(RawEvent::MemberRegistered(member_id, who));
-        }
-
-        /// Change member's about text
-        pub fn change_member_about_text(origin, member_id: T::MemberId, text: Vec<u8>) {
-            let sender = ensure_signed(origin)?;
-
-            let profile = Self::ensure_profile(member_id)?;
-
-            ensure!(profile.controller_account == sender, "only controller account can update member about text");
-
-            Self::_change_member_about_text(member_id, &text)?;
-        }
-
-        /// Change member's avatar
-        pub fn change_member_avatar(origin, member_id: T::MemberId, uri: Vec<u8>) {
-            let sender = ensure_signed(origin)?;
-
-            let profile = Self::ensure_profile(member_id)?;
-
-            ensure!(profile.controller_account == sender, "only controller account can update member avatar");
-
-            Self::_change_member_avatar(member_id, &uri)?;
-        }
-
-        /// Change member's handle. Will ensure new handle is unique and old one will be available
-        /// for other members to use.
-        pub fn change_member_handle(origin, member_id: T::MemberId, handle: Vec<u8>) {
-            let sender = ensure_signed(origin)?;
-
-            let profile = Self::ensure_profile(member_id)?;
-
-            ensure!(profile.controller_account == sender, "only controller account can update member handle");
-
-            Self::_change_member_handle(member_id, handle)?;
-        }
-
-        /// Update member's all or some of handle, avatar and about text.
-        pub fn update_profile(origin, member_id: T::MemberId, user_info: UserInfo) {
-            let sender = ensure_signed(origin)?;
-
-            let profile = Self::ensure_profile(member_id)?;
-
-            ensure!(profile.controller_account == sender, "only controller account can update member info");
-
-            if let Some(uri) = user_info.avatar_uri {
-                Self::_change_member_avatar(member_id, &uri)?;
-            }
-            if let Some(about) = user_info.about {
-                Self::_change_member_about_text(member_id, &about)?;
-            }
-            if let Some(handle) = user_info.handle {
-                Self::_change_member_handle(member_id, handle)?;
-            }
-        }
-
-        pub fn set_controller_account(origin, member_id: T::MemberId, new_controller_account: T::AccountId) {
-            let sender = ensure_signed(origin)?;
-
-            let mut profile = Self::ensure_profile(member_id)?;
-
-            ensure!(profile.root_account == sender, "only root account can set new controller account");
-
-            // only update if new_controller_account is different than current one
-            if profile.controller_account != new_controller_account {
-                <MemberIdsByControllerAccountId<T>>::mutate(&profile.controller_account, |ids| {
-                    ids.retain(|id| *id != member_id);
-                });
-
-                <MemberIdsByControllerAccountId<T>>::mutate(&new_controller_account, |ids| {
-                    ids.push(member_id);
-                });
-
-                profile.controller_account = new_controller_account.clone();
-                <MemberProfile<T>>::insert(member_id, profile);
-                Self::deposit_event(RawEvent::MemberSetControllerAccount(member_id, new_controller_account));
-            }
-        }
-
-        pub fn set_root_account(origin, member_id: T::MemberId, new_root_account: T::AccountId) {
-            let sender = ensure_signed(origin)?;
-
-            let mut profile = Self::ensure_profile(member_id)?;
-
-            ensure!(profile.root_account == sender, "only root account can set new root account");
-
-            // only update if new root account is different than current one
-            if profile.root_account != new_root_account {
-                <MemberIdsByRootAccountId<T>>::mutate(&profile.root_account, |ids| {
-                    ids.retain(|id| *id != member_id);
-                });
-
-                <MemberIdsByRootAccountId<T>>::mutate(&new_root_account, |ids| {
-                    ids.push(member_id);
-                });
-
-                profile.root_account = new_root_account.clone();
-                Self::deposit_event(RawEvent::MemberSetRootAccount(member_id, new_root_account));
-            }
-        }
-
-        pub fn add_screened_member(origin, new_member_account: T::AccountId, user_info: UserInfo) {
-            // ensure sender is screening authority
-            let sender = ensure_signed(origin)?;
-
-            if let Some(screening_authority) = Self::screening_authority() {
-                ensure!(sender == screening_authority, "not screener");
-            } else {
-                // no screening authority defined. Cannot accept this request
-                return Err("no screening authority defined");
-            }
-
-            // make sure we are accepting new memberships
-            ensure!(Self::new_memberships_allowed(), "new members not allowed");
-
-            let user_info = Self::check_user_registration_info(user_info)?;
-
-            // ensure handle is not already registered
-            Self::ensure_unique_handle(&user_info.handle)?;
-
-            let member_id = Self::insert_member(&new_member_account, &user_info, EntryMethod::Screening(sender));
-
-            Self::deposit_event(RawEvent::MemberRegistered(member_id, new_member_account));
-        }
-
-        pub fn set_screening_authority(origin, authority: T::AccountId) {
-            ensure_root(origin)?;
-            <ScreeningAuthority<T>>::put(authority);
-        }
-    }
-}
-
-/// Reason why a given member id does not have a given account as the controller account.
-pub enum ControllerAccountForMemberCheckFailed {
-    NotMember,
-    NotControllerAccount,
-}
-
-pub enum MemberControllerAccountDidNotSign {
-    UnsignedOrigin,
-    MemberIdInvalid,
-    SignerControllerAccountMismatch,
-}
-
-pub enum MemberControllerAccountMismatch {
-    MemberIdInvalid,
-    SignerControllerAccountMismatch,
-}
-pub enum MemberRootAccountMismatch {
-    MemberIdInvalid,
-    SignerRootAccountMismatch,
-}
-
-impl<T: Trait> Module<T> {
-    /// Provided that the memberid exists return its profile. Returns error otherwise.
-    pub fn ensure_profile(id: T::MemberId) -> Result<Profile<T>, &'static str> {
-        Self::member_profile(&id).ok_or("member profile not found")
-    }
-
-    /// Ensure that given member has given account as the controller account
-    pub fn ensure_is_controller_account_for_member(
-        member_id: &T::MemberId,
-        account: &T::AccountId,
-    ) -> Result<Profile<T>, ControllerAccountForMemberCheckFailed> {
-        if MemberProfile::<T>::exists(member_id) {
-            let profile = MemberProfile::<T>::get(member_id).unwrap();
-
-            if profile.controller_account == *account {
-                Ok(profile)
-            } else {
-                Err(ControllerAccountForMemberCheckFailed::NotControllerAccount)
-            }
-        } else {
-            Err(ControllerAccountForMemberCheckFailed::NotMember)
-        }
-    }
-
-    /// Returns true if account is either a member's root or controller account
-    pub fn is_member_account(who: &T::AccountId) -> bool {
-        <MemberIdsByRootAccountId<T>>::exists(who)
-            || <MemberIdsByControllerAccountId<T>>::exists(who)
-    }
-
-    fn ensure_active_terms_id(
-        terms_id: T::PaidTermId,
-    ) -> Result<PaidMembershipTerms<T>, &'static str> {
-        let active_terms = Self::active_paid_membership_terms();
-        ensure!(
-            active_terms.iter().any(|&id| id == terms_id),
-            "paid terms id not active"
-        );
-        let terms = Self::paid_membership_terms_by_id(terms_id)
-            .ok_or("paid membership term id does not exist")?;
-        Ok(terms)
-    }
-
-    #[allow(clippy::ptr_arg)] // cannot change to the "&[u8]" suggested by clippy
-    fn ensure_unique_handle(handle: &Vec<u8>) -> dispatch::Result {
-        ensure!(!<Handles<T>>::exists(handle), "handle already registered");
-        Ok(())
-    }
-
-    fn validate_handle(handle: &[u8]) -> dispatch::Result {
-        ensure!(
-            handle.len() >= Self::min_handle_length() as usize,
-            "handle too short"
-        );
-        ensure!(
-            handle.len() <= Self::max_handle_length() as usize,
-            "handle too long"
-        );
-        Ok(())
-    }
-
-    fn validate_text(text: &[u8]) -> Vec<u8> {
-        let mut text = text.to_owned();
-        text.truncate(Self::max_about_text_length() as usize);
-        text
-    }
-
-    fn validate_avatar(uri: &[u8]) -> dispatch::Result {
-        ensure!(
-            uri.len() <= Self::max_avatar_uri_length() as usize,
-            "avatar uri too long"
-        );
-        Ok(())
-    }
-
-    /// Basic user input validation
-    fn check_user_registration_info(user_info: UserInfo) -> Result<CheckedUserInfo, &'static str> {
-        // Handle is required during registration
-        let handle = user_info
-            .handle
-            .ok_or("handle must be provided during registration")?;
-        Self::validate_handle(&handle)?;
-
-        let about = Self::validate_text(&user_info.about.unwrap_or_default());
-        let avatar_uri = user_info.avatar_uri.unwrap_or_default();
-        Self::validate_avatar(&avatar_uri)?;
-
-        Ok(CheckedUserInfo {
-            handle,
-            avatar_uri,
-            about,
-        })
-    }
-
-    fn insert_member(
-        who: &T::AccountId,
-        user_info: &CheckedUserInfo,
-        entry_method: EntryMethod<T>,
-    ) -> T::MemberId {
-        let new_member_id = Self::members_created();
-
-        let profile: Profile<T> = Profile {
-            handle: user_info.handle.clone(),
-            avatar_uri: user_info.avatar_uri.clone(),
-            about: user_info.about.clone(),
-            registered_at_block: <system::Module<T>>::block_number(),
-            registered_at_time: <timestamp::Module<T>>::now(),
-            entry: entry_method,
-            suspended: false,
-            subscription: None,
-            root_account: who.clone(),
-            controller_account: who.clone(),
-            roles: ActorInRoleSet::new(),
-        };
-
-        <MemberIdsByRootAccountId<T>>::mutate(who, |ids| {
-            ids.push(new_member_id);
-        });
-        <MemberIdsByControllerAccountId<T>>::mutate(who, |ids| {
-            ids.push(new_member_id);
-        });
-
-        <MemberProfile<T>>::insert(new_member_id, profile);
-        <Handles<T>>::insert(user_info.handle.clone(), new_member_id);
-        <NextMemberId<T>>::put(new_member_id + One::one());
-
-        new_member_id
-    }
-
-    fn _change_member_about_text(id: T::MemberId, text: &[u8]) -> dispatch::Result {
-        let mut profile = Self::ensure_profile(id)?;
-        let text = Self::validate_text(text);
-        profile.about = text;
-        Self::deposit_event(RawEvent::MemberUpdatedAboutText(id));
-        <MemberProfile<T>>::insert(id, profile);
-        Ok(())
-    }
-
-    fn _change_member_avatar(id: T::MemberId, uri: &[u8]) -> dispatch::Result {
-        let mut profile = Self::ensure_profile(id)?;
-        Self::validate_avatar(uri)?;
-        profile.avatar_uri = uri.to_owned();
-        Self::deposit_event(RawEvent::MemberUpdatedAvatar(id));
-        <MemberProfile<T>>::insert(id, profile);
-        Ok(())
-    }
-
-    fn _change_member_handle(id: T::MemberId, handle: Vec<u8>) -> dispatch::Result {
-        let mut profile = Self::ensure_profile(id)?;
-        Self::validate_handle(&handle)?;
-        Self::ensure_unique_handle(&handle)?;
-        <Handles<T>>::remove(&profile.handle);
-        <Handles<T>>::insert(handle.clone(), id);
-        profile.handle = handle;
-        Self::deposit_event(RawEvent::MemberUpdatedHandle(id));
-        <MemberProfile<T>>::insert(id, profile);
-        Ok(())
-    }
-
-    /// Determines if the signing account is a controller account of a member that has the registered
-    /// actor_in_role.
-    pub fn key_can_sign_for_role(
-        signing_account: &T::AccountId,
-        actor_in_role: ActorInRole<T::ActorId>,
-    ) -> bool {
-        Self::member_ids_by_controller_account_id(signing_account)
-            .iter()
-            .any(|member_id| {
-                let profile = Self::member_profile(member_id).unwrap(); // must exist
-                profile.roles.has_registered_role(&actor_in_role)
-            })
-    }
-
-    /// Returns true if member identified by their member id occupies a Role at least once
-    pub fn member_is_in_role(member_id: T::MemberId, role: Role) -> bool {
-        Self::ensure_profile(member_id)
-            .ok()
-            .map_or(false, |profile| profile.roles.occupies_role(role))
-    }
-
-    pub fn ensure_member_controller_account_signed(
-        origin: T::Origin,
-        member_id: &T::MemberId,
-    ) -> Result<T::AccountId, MemberControllerAccountDidNotSign> {
-        // Ensure transaction is signed.
-        let signer_account =
-            ensure_signed(origin).map_err(|_| MemberControllerAccountDidNotSign::UnsignedOrigin)?;
-
-        // Ensure member exists
-        let profile = Self::ensure_profile(*member_id)
-            .map_err(|_| MemberControllerAccountDidNotSign::MemberIdInvalid)?;
-
-        ensure!(
-            profile.controller_account == signer_account,
-            MemberControllerAccountDidNotSign::SignerControllerAccountMismatch
-        );
-
-        Ok(signer_account)
-    }
-
-    pub fn ensure_member_controller_account(
-        signer_account: &T::AccountId,
-        member_id: &T::MemberId,
-    ) -> Result<(), MemberControllerAccountMismatch> {
-        // Ensure member exists
-        let profile = Self::ensure_profile(*member_id)
-            .map_err(|_| MemberControllerAccountMismatch::MemberIdInvalid)?;
-
-        ensure!(
-            profile.controller_account == *signer_account,
-            MemberControllerAccountMismatch::SignerControllerAccountMismatch
-        );
-
-        Ok(())
-    }
-
-    pub fn ensure_member_root_account(
-        signer_account: &T::AccountId,
-        member_id: &T::MemberId,
-    ) -> Result<(), MemberRootAccountMismatch> {
-        // Ensure member exists
-        let profile = Self::ensure_profile(*member_id)
-            .map_err(|_| MemberRootAccountMismatch::MemberIdInvalid)?;
-
-        ensure!(
-            profile.root_account == *signer_account,
-            MemberRootAccountMismatch::SignerRootAccountMismatch
-        );
-
-        Ok(())
-    }
-
-    // policy across all roles is:
-    // members can only occupy a role at most once at a time
-    // members can enter any role
-    // no limit on total number of roles a member can enter
-    // ** Note ** Role specific policies should be enforced by the client modules
-    // this method should handle higher level policies
-    pub fn can_register_role_on_member(
-        member_id: &T::MemberId,
-        actor_in_role: &ActorInRole<T::ActorId>,
-    ) -> Result<Profile<T>, &'static str> {
-        // Ensure member exists
-        let profile = Self::ensure_profile(*member_id)?;
-
-        // ensure is active member
-        ensure!(!profile.suspended, "SuspendedMemberCannotEnterRole");
-
-        // guard against duplicate ActorInRole
-        ensure!(
-            !<MembershipIdByActorInRole<T>>::exists(actor_in_role),
-            "ActorInRoleAlreadyExists"
-        );
-
-        /*
-        Disabling this temporarily for Rome, later we will drop all this
-        integration with Membership module anyway:
-        https://github.com/Joystream/substrate-runtime-joystream/issues/115
-        ensure!(
-            !profile.roles.occupies_role(actor_in_role.role),
-            "MemberAlreadyInRole"
-        );
-        */
-
-        // Other possible checks:
-        // How long the member has been registered
-        // Minimum balance
-        // EntryMethod
-
-        Ok(profile)
-    }
-
-    pub fn register_role_on_member(
-        member_id: T::MemberId,
-        actor_in_role: &ActorInRole<T::ActorId>,
-    ) -> Result<(), &'static str> {
-        // Policy check
-        let mut profile = Self::can_register_role_on_member(&member_id, actor_in_role)?;
-
-        assert!(profile.roles.register_role(actor_in_role));
-
-        <MemberProfile<T>>::insert(member_id, profile);
-        <MembershipIdByActorInRole<T>>::insert(actor_in_role, member_id);
-        Self::deposit_event(RawEvent::MemberRegisteredRole(member_id, *actor_in_role));
-        Ok(())
-    }
-
-    pub fn can_unregister_role(actor_in_role: ActorInRole<T::ActorId>) -> Result<(), &'static str> {
-        ensure!(
-            <MembershipIdByActorInRole<T>>::exists(&actor_in_role),
-            "ActorInRoleNotFound"
-        );
-
-        Ok(())
-    }
-
-    pub fn unregister_role(actor_in_role: ActorInRole<T::ActorId>) -> Result<(), &'static str> {
-        Self::can_unregister_role(actor_in_role)?;
-
-        let member_id = <MembershipIdByActorInRole<T>>::get(actor_in_role);
-
-        let mut profile = Self::ensure_profile(member_id)?; // .expect().. ?
-
-        assert!(profile.roles.unregister_role(&actor_in_role));
-
-        <MembershipIdByActorInRole<T>>::remove(actor_in_role);
-
-        <MemberProfile<T>>::insert(member_id, profile);
-
-        Self::deposit_event(RawEvent::MemberUnregisteredRole(member_id, actor_in_role));
-
-        Ok(())
-    }
-}

+ 6 - 6
runtime-modules/membership/src/mock.rs

@@ -1,6 +1,6 @@
 #![cfg(test)]
 
-pub use super::members::{self, Trait, DEFAULT_PAID_TERM_ID};
+pub use crate::{GenesisConfig, Trait, DEFAULT_PAID_TERM_ID};
 pub use common::currency::GovernanceCurrency;
 pub use srml_support::traits::Currency;
 pub use system;
@@ -84,7 +84,7 @@ impl GovernanceCurrency for Test {
     type Currency = balances::Module<Self>;
 }
 
-impl members::Trait for Test {
+impl Trait for Test {
     type Event = ();
     type MemberId = u32;
     type PaidTermId = u32;
@@ -95,7 +95,7 @@ impl members::Trait for Test {
 
 pub struct TestExternalitiesBuilder<T: Trait> {
     system_config: Option<system::GenesisConfig>,
-    membership_config: Option<members::GenesisConfig<T>>,
+    membership_config: Option<GenesisConfig<T>>,
 }
 
 impl<T: Trait> Default for TestExternalitiesBuilder<T> {
@@ -114,7 +114,7 @@ impl<T: Trait> TestExternalitiesBuilder<T> {
         self
     }
     */
-    pub fn set_membership_config(mut self, membership_config: members::GenesisConfig<T>) -> Self {
+    pub fn set_membership_config(mut self, membership_config: GenesisConfig<T>) -> Self {
         self.membership_config = Some(membership_config);
         self
     }
@@ -128,7 +128,7 @@ impl<T: Trait> TestExternalitiesBuilder<T> {
 
         // Add membership
         self.membership_config
-            .unwrap_or(members::GenesisConfig::default())
+            .unwrap_or(GenesisConfig::default())
             .assimilate_storage(&mut t)
             .unwrap();
 
@@ -137,4 +137,4 @@ impl<T: Trait> TestExternalitiesBuilder<T> {
 }
 
 pub type Balances = balances::Module<Test>;
-pub type Members = members::Module<Test>;
+pub type Members = crate::Module<Test>;

+ 18 - 18
runtime-modules/membership/src/tests.rs

@@ -24,8 +24,8 @@ fn assert_dispatch_error_message(result: Result<(), &'static str>, expected_mess
     assert_eq!(message, expected_message);
 }
 
-fn get_alice_info() -> members::UserInfo {
-    members::UserInfo {
+fn get_alice_info() -> crate::UserInfo {
+    crate::UserInfo {
         handle: Some(String::from("alice").as_bytes().to_vec()),
         avatar_uri: Some(
             String::from("http://avatar-url.com/alice")
@@ -36,8 +36,8 @@ fn get_alice_info() -> members::UserInfo {
     }
 }
 
-fn get_bob_info() -> members::UserInfo {
-    members::UserInfo {
+fn get_bob_info() -> crate::UserInfo {
+    crate::UserInfo {
         handle: Some(String::from("bobby").as_bytes().to_vec()),
         avatar_uri: Some(
             String::from("http://avatar-url.com/bob")
@@ -86,7 +86,7 @@ fn initial_state() {
             // initial balance
             assert_eq!(
                 Balances::free_balance(initial_members[0]),
-                <Test as members::Trait>::InitialMembersBalance::get()
+                <Test as crate::Trait>::InitialMembersBalance::get()
             );
         });
 }
@@ -171,7 +171,7 @@ fn new_memberships_allowed_flag() {
             let initial_balance = DEFAULT_FEE + 1;
             set_alice_free_balance(initial_balance);
 
-            members::NewMembershipsAllowed::put(false);
+            crate::NewMembershipsAllowed::put(false);
 
             assert_dispatch_error_message(
                 buy_default_membership_as_alice(),
@@ -197,7 +197,7 @@ fn unique_handles() {
             set_alice_free_balance(initial_balance);
 
             // alice's handle already taken
-            <members::Handles<Test>>::insert(get_alice_info().handle.unwrap(), 1);
+            <crate::Handles<Test>>::insert(get_alice_info().handle.unwrap(), 1);
 
             // should not be allowed to buy membership with that handle
             assert_dispatch_error_message(
@@ -251,7 +251,7 @@ fn add_screened_member() {
         .build()
         .execute_with(|| {
             let screening_authority = 5;
-            <members::ScreeningAuthority<Test>>::put(&screening_authority);
+            <crate::ScreeningAuthority<Test>>::put(&screening_authority);
 
             let next_member_id = Members::members_created();
 
@@ -270,7 +270,7 @@ fn add_screened_member() {
             assert_eq!(Some(profile.avatar_uri), get_alice_info().avatar_uri);
             assert_eq!(Some(profile.about), get_alice_info().about);
             assert_eq!(
-                members::EntryMethod::Screening(screening_authority),
+                crate::EntryMethod::Screening(screening_authority),
                 profile.entry
             );
         });
@@ -359,7 +359,7 @@ fn registering_and_unregistering_roles_on_member() {
             // no initial roles for member
             assert!(!Members::member_is_in_role(
                 member_id_1,
-                members::Role::ChannelOwner
+                crate::Role::ChannelOwner
             ));
 
             // REGISTERING
@@ -367,11 +367,11 @@ fn registering_and_unregistering_roles_on_member() {
             // successful registration
             assert_ok!(Members::register_role_on_member(
                 member_id_1,
-                &members::ActorInRole::new(members::Role::ChannelOwner, DUMMY_ACTOR_ID)
+                &crate::ActorInRole::new(crate::Role::ChannelOwner, DUMMY_ACTOR_ID)
             ));
             assert!(Members::member_is_in_role(
                 member_id_1,
-                members::Role::ChannelOwner
+                crate::Role::ChannelOwner
             ));
 
             /*
@@ -381,7 +381,7 @@ fn registering_and_unregistering_roles_on_member() {
             assert_dispatch_error_message(
                 Members::register_role_on_member(
                     member_id_1,
-                    &members::ActorInRole::new(members::Role::ChannelOwner, DUMMY_ACTOR_ID + 1),
+                    &crate::ActorInRole::new(crate::Role::ChannelOwner, DUMMY_ACTOR_ID + 1),
                 ),
                 "MemberAlreadyInRole",
             );
@@ -391,7 +391,7 @@ fn registering_and_unregistering_roles_on_member() {
             assert_dispatch_error_message(
                 Members::register_role_on_member(
                     member_id_2,
-                    &members::ActorInRole::new(members::Role::ChannelOwner, DUMMY_ACTOR_ID),
+                    &crate::ActorInRole::new(crate::Role::ChannelOwner, DUMMY_ACTOR_ID),
                 ),
                 "ActorInRoleAlreadyExists",
             );
@@ -400,18 +400,18 @@ fn registering_and_unregistering_roles_on_member() {
 
             // trying to unregister non existant actor role should fail
             assert_dispatch_error_message(
-                Members::unregister_role(members::ActorInRole::new(members::Role::Curator, 222)),
+                Members::unregister_role(crate::ActorInRole::new(crate::Role::Curator, 222)),
                 "ActorInRoleNotFound",
             );
 
             // successfully unregister role
-            assert_ok!(Members::unregister_role(members::ActorInRole::new(
-                members::Role::ChannelOwner,
+            assert_ok!(Members::unregister_role(crate::ActorInRole::new(
+                crate::Role::ChannelOwner,
                 DUMMY_ACTOR_ID
             )));
             assert!(!Members::member_is_in_role(
                 member_id_1,
-                members::Role::ChannelOwner
+                crate::Role::ChannelOwner
             ));
         });
 }

+ 2 - 2
runtime-modules/proposals/codex/src/lib.rs

@@ -155,7 +155,7 @@ pub trait Trait:
     system::Trait
     + proposal_engine::Trait
     + proposal_discussion::Trait
-    + membership::members::Trait
+    + membership::Trait
     + governance::election::Trait
     + content_working_group::Trait
     + roles::actors::Trait
@@ -199,7 +199,7 @@ pub type BalanceOfMint<T> =
 pub type NegativeImbalance<T> =
     <<T as stake::Trait>::Currency as Currency<<T as system::Trait>::AccountId>>::NegativeImbalance;
 
-type MemberId<T> = <T as membership::members::Trait>::MemberId;
+type MemberId<T> = <T as membership::Trait>::MemberId;
 
 decl_error! {
     /// Codex module predefined errors

+ 1 - 1
runtime-modules/proposals/codex/src/tests/mock.rs

@@ -44,7 +44,7 @@ impl common::currency::GovernanceCurrency for Test {
     type Currency = balances::Module<Self>;
 }
 
-impl membership::members::Trait for Test {
+impl membership::Trait for Test {
     type Event = ();
     type MemberId = u64;
     type PaidTermId = u64;

+ 3 - 3
runtime-modules/proposals/discussion/src/lib.rs

@@ -23,7 +23,7 @@
 //! use system::ensure_root;
 //! use substrate_proposals_discussion_module::{self as discussions};
 //!
-//! pub trait Trait: discussions::Trait + membership::members::Trait {}
+//! pub trait Trait: discussions::Trait + membership::Trait {}
 //!
 //! decl_module! {
 //!     pub struct Module<T: Trait> for enum Call where origin: T::Origin {
@@ -61,7 +61,7 @@ use types::{Post, Thread, ThreadCounter};
 use common::origin_validator::ActorOriginValidator;
 use srml_support::dispatch::DispatchResult;
 
-type MemberId<T> = <T as membership::members::Trait>::MemberId;
+type MemberId<T> = <T as membership::Trait>::MemberId;
 
 decl_event!(
     /// Proposals engine events
@@ -83,7 +83,7 @@ decl_event!(
 );
 
 /// 'Proposal discussion' substrate module Trait
-pub trait Trait: system::Trait + membership::members::Trait {
+pub trait Trait: system::Trait + membership::Trait {
     /// Engine event type.
     type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
 

+ 2 - 2
runtime-modules/proposals/discussion/src/tests/mock.rs

@@ -41,7 +41,7 @@ mod discussion {
 }
 
 mod membership_mod {
-    pub use membership::members::Event;
+    pub use membership::Event;
 }
 
 impl_outer_event! {
@@ -75,7 +75,7 @@ impl common::currency::GovernanceCurrency for Test {
     type Currency = balances::Module<Self>;
 }
 
-impl membership::members::Trait for Test {
+impl membership::Trait for Test {
     type Event = TestEvent;
     type MemberId = u64;
     type PaidTermId = u64;

+ 3 - 5
runtime-modules/proposals/engine/src/lib.rs

@@ -62,7 +62,7 @@
 //! use codec::Encode;
 //! use substrate_proposals_engine_module::{self as engine, ProposalParameters};
 //!
-//! pub trait Trait: engine::Trait + membership::members::Trait {}
+//! pub trait Trait: engine::Trait + membership::Trait {}
 //!
 //! decl_module! {
 //!     pub struct Module<T: Trait> for enum Call where origin: T::Origin {
@@ -138,12 +138,10 @@ use crate::types::ApprovedProposalData;
 use common::origin_validator::ActorOriginValidator;
 use srml_support::dispatch::Dispatchable;
 
-type MemberId<T> = <T as membership::members::Trait>::MemberId;
+type MemberId<T> = <T as membership::Trait>::MemberId;
 
 /// Proposals engine trait.
-pub trait Trait:
-    system::Trait + timestamp::Trait + stake::Trait + membership::members::Trait
-{
+pub trait Trait: system::Trait + timestamp::Trait + stake::Trait + membership::Trait {
     /// Engine event type.
     type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
 

+ 2 - 2
runtime-modules/proposals/engine/src/tests/mock/mod.rs

@@ -38,7 +38,7 @@ mod engine {
 }
 
 mod membership_mod {
-    pub use membership::members::Event;
+    pub use membership::Event;
 }
 
 impl_outer_event! {
@@ -94,7 +94,7 @@ parameter_types! {
     pub const MaxActiveProposalLimit: u32 = 100;
 }
 
-impl membership::members::Trait for Test {
+impl membership::Trait for Test {
     type Event = TestEvent;
     type MemberId = u64;
     type PaidTermId = u64;

+ 8 - 8
runtime-modules/roles/src/actors.rs

@@ -15,7 +15,7 @@ use system::{self, ensure_root, ensure_signed};
 #[cfg(feature = "std")]
 use serde::{Deserialize, Serialize};
 
-pub use membership::members::Role;
+pub use membership::Role;
 
 const STAKING_ID: LockIdentifier = *b"role_stk";
 
@@ -87,13 +87,13 @@ pub trait ActorRemoved<T: Trait> {
     fn actor_removed(actor: &T::AccountId);
 }
 
-pub trait Trait: system::Trait + GovernanceCurrency + membership::members::Trait {
+pub trait Trait: system::Trait + GovernanceCurrency + membership::Trait {
     type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
 
     type OnActorRemoved: ActorRemoved<Self>;
 }
 
-pub type MemberId<T> = <T as membership::members::Trait>::MemberId;
+pub type MemberId<T> = <T as membership::Trait>::MemberId;
 // actor account, memberid, role, expires
 pub type Request<T> = (
     <T as system::Trait>::AccountId,
@@ -277,7 +277,7 @@ decl_module! {
                                     let _ = T::Currency::deposit_into_existing(&actor.account, params.reward);
                                 } else {
                                     // otherwise it should go the the member's root account
-                                    if let Some(profile) = <membership::members::Module<T>>::member_profile(&actor.member_id) {
+                                    if let Some(profile) = <membership::Module<T>>::member_profile(&actor.member_id) {
                                         let _ = T::Currency::deposit_into_existing(&profile.root_account, params.reward);
                                     }
                                 }
@@ -297,7 +297,7 @@ decl_module! {
 
             let role_parameters = Self::ensure_role_parameters(role)?;
 
-            <membership::members::Module<T>>::ensure_profile(member_id)?;
+            <membership::Module<T>>::ensure_profile(member_id)?;
 
             // pay (burn) entry fee - spam filter
             let fee = role_parameters.entry_request_fee;
@@ -314,7 +314,7 @@ decl_module! {
         /// Member activating entry request
         pub fn stake(origin, role: Role, actor_account: T::AccountId) {
             let sender = ensure_signed(origin)?;
-            ensure!(<membership::members::Module<T>>::is_member_account(&sender), "members only can accept storage entry request");
+            ensure!(<membership::Module<T>>::is_member_account(&sender), "members only can accept storage entry request");
 
             // get member ids from requests that are controller by origin
             let ids = Self::role_entry_requests()
@@ -322,7 +322,7 @@ decl_module! {
                 .filter(|request| request.0 == actor_account && request.2 == role)
                 .map(|request| request.1)
                 .filter(|member_id|
-                    <membership::members::Module<T>>::ensure_profile(*member_id)
+                    <membership::Module<T>>::ensure_profile(*member_id)
                         .ok()
                         .map_or(false, |profile| profile.root_account == sender || profile.controller_account == sender)
                 )
@@ -373,7 +373,7 @@ decl_module! {
             let sender = ensure_signed(origin)?;
             let actor = Self::ensure_actor(&actor_account)?;
 
-            let profile = <membership::members::Module<T>>::ensure_profile(actor.member_id)?;
+            let profile = <membership::Module<T>>::ensure_profile(actor.member_id)?;
             ensure!(profile.root_account == sender || profile.controller_account == sender, "only member can unstake storage provider");
 
             let role_parameters = Self::ensure_role_parameters(actor.role)?;

+ 3 - 3
runtime-modules/roles/src/mock.rs

@@ -91,7 +91,7 @@ impl timestamp::Trait for Test {
     type MinimumPeriod = MinimumPeriod;
 }
 
-impl membership::members::Trait for Test {
+impl membership::Trait for Test {
     type Event = ();
     type MemberId = u32;
     type SubscriptionId = u32;
@@ -114,7 +114,7 @@ pub fn initial_test_ext() -> runtime_io::TestExternalities {
         .build_storage::<Test>()
         .unwrap();
 
-    membership::members::GenesisConfig::<Test> {
+    membership::GenesisConfig::<Test> {
         default_paid_membership_fee: 0,
         members: vec![(alice_account(), "alice".into(), "".into(), "".into())],
     }
@@ -127,4 +127,4 @@ pub fn initial_test_ext() -> runtime_io::TestExternalities {
 pub type System = system::Module<Test>;
 pub type Balances = balances::Module<Test>;
 pub type Actors = actors::Module<Test>;
-pub type Members = membership::members::Module<Test>;
+pub type Members = membership::Module<Test>;

+ 2 - 2
runtime-modules/storage/src/data_directory.rs

@@ -8,7 +8,7 @@ use sr_primitives::traits::{MaybeSerialize, Member, SimpleArithmetic};
 use srml_support::{decl_event, decl_module, decl_storage, dispatch, ensure, Parameter};
 use system::{self, ensure_root, ensure_signed};
 
-pub trait Trait: timestamp::Trait + system::Trait + DOTRTrait + membership::members::Trait {
+pub trait Trait: timestamp::Trait + system::Trait + DOTRTrait + membership::Trait {
     type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
 
     type ContentId: Parameter + Member + MaybeSerialize + Copy + Ord + Default;
@@ -123,7 +123,7 @@ decl_module! {
             ipfs_content_id: Vec<u8>
         ) {
             let who = ensure_signed(origin)?;
-            ensure!(<membership::members::Module<T>>::is_member_account(&who), MSG_CREATOR_MUST_BE_MEMBER);
+            ensure!(<membership::Module<T>>::is_member_account(&who), MSG_CREATOR_MUST_BE_MEMBER);
 
             ensure!(T::IsActiveDataObjectType::is_active_data_object_type(&type_id),
                 MSG_DO_TYPE_MUST_BE_ACTIVE);

+ 4 - 4
runtime-modules/storage/src/mock.rs

@@ -3,7 +3,7 @@
 pub use super::{data_directory, data_object_storage_registry, data_object_type_registry};
 use crate::traits;
 pub use common::currency::GovernanceCurrency;
-use membership::members;
+use membership;
 use roles::actors;
 pub use system;
 
@@ -28,7 +28,7 @@ impl_outer_event! {
         data_object_storage_registry<T>,
         actors<T>,
         balances<T>,
-        members<T>,
+        membership<T>,
     }
 }
 
@@ -182,7 +182,7 @@ impl data_object_storage_registry::Trait for Test {
     type ContentIdExists = MockContent;
 }
 
-impl members::Trait for Test {
+impl membership::Trait for Test {
     type Event = MetaEvent;
     type MemberId = u32;
     type SubscriptionId = u32;
@@ -252,7 +252,7 @@ impl ExtBuilder {
         .assimilate_storage(&mut t)
         .unwrap();
 
-        membership::members::GenesisConfig::<Test> {
+        membership::GenesisConfig::<Test> {
             default_paid_membership_fee: 0,
             members: vec![(1, "alice".into(), "".into(), "".into())],
         }

+ 3 - 3
runtime/src/integration/proposals/council_origin_validator.rs

@@ -13,7 +13,7 @@ pub struct CouncilManager<T> {
     marker: PhantomData<T>,
 }
 
-impl<T: governance::council::Trait + membership::members::Trait>
+impl<T: governance::council::Trait + membership::Trait>
     ActorOriginValidator<<T as system::Trait>::Origin, MemberId<T>, <T as system::Trait>::AccountId>
     for CouncilManager<T>
 {
@@ -45,7 +45,7 @@ mod tests {
     use super::CouncilManager;
     use crate::Runtime;
     use common::origin_validator::ActorOriginValidator;
-    use membership::members::UserInfo;
+    use membership::UserInfo;
     use proposals_engine::VotersParameters;
     use sr_primitives::AccountId32;
     use system::RawOrigin;
@@ -60,7 +60,7 @@ mod tests {
         t.into()
     }
 
-    type Membership = membership::members::Module<Runtime>;
+    type Membership = membership::Module<Runtime>;
 
     #[test]
     fn council_origin_validator_fails_with_unregistered_member() {

+ 5 - 5
runtime/src/integration/proposals/membership_origin_validator.rs

@@ -6,14 +6,14 @@ use common::origin_validator::ActorOriginValidator;
 use system::ensure_signed;
 
 /// Member of the Joystream organization
-pub type MemberId<T> = <T as crate::members::Trait>::MemberId;
+pub type MemberId<T> = <T as membership::Trait>::MemberId;
 
 /// Default membership actor origin validator.
 pub struct MembershipOriginValidator<T> {
     marker: PhantomData<T>,
 }
 
-impl<T: crate::members::Trait>
+impl<T: membership::Trait>
     ActorOriginValidator<<T as system::Trait>::Origin, MemberId<T>, <T as system::Trait>::AccountId>
     for MembershipOriginValidator<T>
 {
@@ -27,7 +27,7 @@ impl<T: crate::members::Trait>
         let account_id = ensure_signed(origin)?;
 
         // check whether actor_id belongs to the registered member
-        let profile_result = <crate::members::Module<T>>::ensure_profile(actor_id);
+        let profile_result = <membership::Module<T>>::ensure_profile(actor_id);
 
         if let Ok(profile) = profile_result {
             // whether the account_id belongs to the actor
@@ -47,11 +47,11 @@ mod tests {
     use super::MembershipOriginValidator;
     use crate::Runtime;
     use common::origin_validator::ActorOriginValidator;
-    use membership::members::UserInfo;
+    use membership::UserInfo;
     use sr_primitives::AccountId32;
     use system::RawOrigin;
 
-    type Membership = crate::members::Module<Runtime>;
+    type Membership = crate::membership::Module<Runtime>;
 
     fn initial_test_ext() -> runtime_io::TestExternalities {
         let t = system::GenesisConfig::default()

+ 4 - 5
runtime/src/lib.rs

@@ -425,7 +425,6 @@ impl finality_tracker::Trait for Runtime {
 pub use forum;
 pub use governance::election_params::ElectionParameters;
 use governance::{council, election};
-use membership::members;
 use storage::{data_directory, data_object_storage_registry, data_object_type_registry};
 pub use versioned_store;
 
@@ -642,7 +641,7 @@ impl stake::StakingEventsHandler<Runtime> for ContentWorkingGroupStakingEventHan
         let member_id = curator_application.member_id;
 
         // get member's profile
-        let member_profile = membership::members::MemberProfile::<Runtime>::get(member_id).unwrap();
+        let member_profile = membership::MemberProfile::<Runtime>::get(member_id).unwrap();
 
         // deposit funds to member's root_account
         // The application doesn't recorded the original source_account from which staked funds were
@@ -758,7 +757,7 @@ impl roles::traits::Roles<Runtime> for LookupRoles {
     }
 }
 
-impl members::Trait for Runtime {
+impl membership::Trait for Runtime {
     type Event = Event;
     type MemberId = u64;
     type PaidTermId = u64;
@@ -783,7 +782,7 @@ pub struct ShimMembershipRegistry {}
 
 impl forum::ForumUserRegistry<AccountId> for ShimMembershipRegistry {
     fn get_forum_user(id: &AccountId) -> Option<forum::ForumUser<AccountId>> {
-        if members::Module::<Runtime>::is_member_account(id) {
+        if membership::Module::<Runtime>::is_member_account(id) {
             // For now we don't retreive the members profile since it is not used for anything,
             // but in the future we may need it to read out more
             // information possibly required to construct a
@@ -911,7 +910,7 @@ construct_runtime!(
         CouncilElection: election::{Module, Call, Storage, Event<T>, Config<T>},
         Council: council::{Module, Call, Storage, Event<T>, Config<T>},
         Memo: memo::{Module, Call, Storage, Event<T>},
-        Members: members::{Module, Call, Storage, Event<T>, Config<T>},
+        Members: membership::{Module, Call, Storage, Event<T>, Config<T>},
         Forum: forum::{Module, Call, Storage, Event<T>, Config<T>},
         Actors: actors::{Module, Call, Storage, Event<T>, Config},
         DataObjectTypeRegistry: data_object_type_registry::{Module, Call, Storage, Event<T>, Config<T>},

+ 3 - 3
runtime/src/test/proposals_integration.rs

@@ -5,7 +5,7 @@
 use crate::{BlockNumber, ElectionParameters, ProposalCancellationFee, Runtime};
 use codec::Encode;
 use governance::election::CouncilElected;
-use membership::members;
+use membership;
 use membership::role_types::Role;
 use proposals_engine::{
     ActiveStake, ApprovedProposalStatus, BalanceOf, Error, FinalizationData, Proposal,
@@ -32,7 +32,7 @@ fn initial_test_ext() -> runtime_io::TestExternalities {
 
 type Balances = balances::Module<Runtime>;
 type System = system::Module<Runtime>;
-type Membership = membership::members::Module<Runtime>;
+type Membership = membership::Module<Runtime>;
 type ProposalsEngine = proposals_engine::Module<Runtime>;
 type Council = governance::council::Module<Runtime>;
 type Election = governance::election::Module<Runtime>;
@@ -49,7 +49,7 @@ fn setup_members(count: u8) {
         Membership::add_screened_member(
             RawOrigin::Signed(authority_account_id.clone().into()).into(),
             account_id.clone().into(),
-            members::UserInfo {
+            membership::UserInfo {
                 handle: Some(account_id.to_vec()),
                 avatar_uri: None,
                 about: None,