From a58cd9a8e14a3a3f6a72a163cb8333d4e01f8bf4 Mon Sep 17 00:00:00 2001 From: grw-ms Date: Mon, 28 Aug 2023 04:53:13 -0700 Subject: [PATCH] feat: add GenesisConfig to identity pallet --- substrate/bin/node/cli/src/chain_spec.rs | 7 ++-- substrate/bin/node/testing/src/genesis.rs | 5 ++- substrate/frame/identity/src/lib.rs | 50 +++++++++++++++++++++++ substrate/frame/identity/src/tests.rs | 32 +++++++++++++++ 4 files changed, 89 insertions(+), 5 deletions(-) diff --git a/substrate/bin/node/cli/src/chain_spec.rs b/substrate/bin/node/cli/src/chain_spec.rs index 51beaad03688a..3a13c4e29f1c3 100644 --- a/substrate/bin/node/cli/src/chain_spec.rs +++ b/substrate/bin/node/cli/src/chain_spec.rs @@ -21,9 +21,9 @@ use grandpa_primitives::AuthorityId as GrandpaId; use kitchensink_runtime::{ constants::currency::*, wasm_binary_unwrap, BabeConfig, BalancesConfig, Block, CouncilConfig, - DemocracyConfig, ElectionsConfig, ImOnlineConfig, IndicesConfig, MaxNominations, - NominationPoolsConfig, SessionConfig, SessionKeys, SocietyConfig, StakerStatus, StakingConfig, - SudoConfig, SystemConfig, TechnicalCommitteeConfig, + DemocracyConfig, ElectionsConfig, IdentityConfig, ImOnlineConfig, IndicesConfig, + MaxNominations, NominationPoolsConfig, SessionConfig, SessionKeys, SocietyConfig, StakerStatus, + StakingConfig, SudoConfig, SystemConfig, TechnicalCommitteeConfig, }; use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use sc_chain_spec::ChainSpecExtension; @@ -298,6 +298,7 @@ pub fn testnet_genesis( balances: BalancesConfig { balances: endowed_accounts.iter().cloned().map(|x| (x, ENDOWMENT)).collect(), }, + identity: IdentityConfig { registrars: vec![] }, indices: IndicesConfig { indices: vec![] }, session: SessionConfig { keys: initial_authorities diff --git a/substrate/bin/node/testing/src/genesis.rs b/substrate/bin/node/testing/src/genesis.rs index 6e7bcebfc00d1..e8413ad79e2f5 100644 --- a/substrate/bin/node/testing/src/genesis.rs +++ b/substrate/bin/node/testing/src/genesis.rs @@ -21,8 +21,8 @@ use crate::keyring::*; use kitchensink_runtime::{ constants::currency::*, wasm_binary_unwrap, AccountId, AssetsConfig, BabeConfig, - BalancesConfig, GluttonConfig, GrandpaConfig, IndicesConfig, RuntimeGenesisConfig, - SessionConfig, SocietyConfig, StakerStatus, StakingConfig, SystemConfig, + BalancesConfig, GluttonConfig, GrandpaConfig, IdentityConfig, IndicesConfig, + RuntimeGenesisConfig, SessionConfig, SocietyConfig, StakerStatus, StakingConfig, SystemConfig, BABE_GENESIS_EPOCH_CONFIG, }; use sp_keyring::{Ed25519Keyring, Sr25519Keyring}; @@ -52,6 +52,7 @@ pub fn config_endowed(code: Option<&[u8]>, extra_endowed: Vec) -> Run code: code.map(|x| x.to_vec()).unwrap_or_else(|| wasm_binary_unwrap().to_vec()), ..Default::default() }, + identity: IdentityConfig { registrars: vec![] }, indices: IndicesConfig { indices: vec![] }, balances: BalancesConfig { balances: endowed }, session: SessionConfig { diff --git a/substrate/frame/identity/src/lib.rs b/substrate/frame/identity/src/lib.rs index f192ee2b461b3..b3784f9f047a5 100644 --- a/substrate/frame/identity/src/lib.rs +++ b/substrate/frame/identity/src/lib.rs @@ -99,6 +99,7 @@ type AccountIdLookupOf = <::Lookup as StaticLookup #[frame_support::pallet] pub mod pallet { use super::*; + use enumflags2::BitFlags; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; @@ -201,6 +202,55 @@ pub mod pallet { ValueQuery, >; + #[pallet::genesis_config] + pub struct GenesisConfig { + pub registrars: Vec<(T::AccountId, Vec<(T::AccountId, BoundedVec>)>)>, + } + + impl Default for GenesisConfig { + fn default() -> Self { + GenesisConfig { registrars: Default::default() } + } + } + + #[pallet::genesis_build] + impl BuildGenesisConfig for GenesisConfig { + fn build(&self) { + for (registrar, identities) in &self.registrars { + >::put( + BoundedVec::try_from(vec![Some(RegistrarInfo { + account: registrar.clone(), + fee: Zero::zero(), + fields: IdentityFields(>::all()), + })]) + .unwrap(), + ); + for (account, name) in identities { + let judgements = + BoundedVec::try_from(vec![(0, Judgement::KnownGood); 1]).unwrap(); + >::insert( + account, + Registration { + info: IdentityInfo { + display: Data::Raw(name.clone()), + twitter: Data::None, + riot: Data::None, + email: Data::None, + pgp_fingerprint: None, + image: Data::None, + legal: Data::None, + web: Data::None, + additional: BoundedVec::default(), + }, + judgements, + deposit: Zero::zero(), + }, + ); + } + } + } + } + #[pallet::error] pub enum Error { /// Too many subs-accounts. diff --git a/substrate/frame/identity/src/tests.rs b/substrate/frame/identity/src/tests.rs index 1532980574c2a..8838d63b5c68f 100644 --- a/substrate/frame/identity/src/tests.rs +++ b/substrate/frame/identity/src/tests.rs @@ -619,3 +619,35 @@ fn test_has_identity() { )); }); } + +#[test] +fn test_genesis_config_should_register_identities() { + let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + pallet_identity::GenesisConfig:: { + registrars: vec![( + 0, + vec![ + (1, BoundedVec::try_from("One".to_string().as_bytes().to_vec()).unwrap()), + (2, BoundedVec::try_from("Two".to_string().as_bytes().to_vec()).unwrap()), + (3, BoundedVec::try_from("Three".to_string().as_bytes().to_vec()).unwrap()), + ], + )], + } + .assimilate_storage(&mut t) + .unwrap(); + let mut ext: sp_io::TestExternalities = t.into(); + ext.execute_with(|| { + assert_eq!( + Identity::identity(1).unwrap().info.display, + Data::Raw(b"One".to_vec().try_into().unwrap()) + ); + assert_eq!( + Identity::identity(2).unwrap().info.display, + Data::Raw(b"Two".to_vec().try_into().unwrap()) + ); + assert_eq!( + Identity::identity(3).unwrap().info.display, + Data::Raw(b"Three".to_vec().try_into().unwrap()) + ); + }); +}