diff --git a/pallets/identity/src/lib.rs b/pallets/identity/src/lib.rs index 33a3fe3307ccce80f78f33dd3276267f1378b385..9a55804fd7dea1abd4d81ee3a5a089dd4a4c40e4 100644 --- a/pallets/identity/src/lib.rs +++ b/pallets/identity/src/lib.rs @@ -378,8 +378,8 @@ pub mod pallet { payload.using_encoded(|bytes| payload_sig.verify(bytes, &payload.owner_key)), Error::<T>::InvalidRevocationProof ); - if let Some(idty_index) = <IdentityIndexOf<T>>::take(payload.owner_key) { - Self::do_remove_identity(idty_index); + if let Some(idty_index) = <IdentityIndexOf<T>>::take(&payload.owner_key) { + Self::do_remove_identity(idty_index, Some(&payload.owner_key)); Ok(().into()) } else { Err(Error::<T>::IdtyNotFound.into()) @@ -394,7 +394,7 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { ensure_root(origin)?; - Self::do_remove_identity(idty_index); + Self::do_remove_identity(idty_index, None); if let Some(idty_name) = idty_name { <IdentitiesNames<T>>::remove(idty_name); } @@ -499,9 +499,15 @@ pub mod pallet { // INTERNAL FUNCTIONS // impl<T: Config> Pallet<T> { - pub(super) fn do_remove_identity(idty_index: T::IdtyIndex) -> Weight { + pub(super) fn do_remove_identity( + idty_index: T::IdtyIndex, + maybe_owner_key: Option<&T::AccountId>, + ) -> Weight { if let Some(idty_val) = Identities::<T>::take(idty_index) { T::RemoveIdentityConsumers::remove_idty_consumers(idty_index); + if let Some(owner_key) = maybe_owner_key { + IdentityIndexOf::<T>::remove(owner_key); + } frame_system::Pallet::<T>::dec_sufficients(&idty_val.owner_key); Self::deposit_event(Event::IdtyRemoved { idty_index }); T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Removed); @@ -523,7 +529,8 @@ pub mod pallet { for (idty_index, idty_status) in IdentitiesRemovableOn::<T>::take(block_number) { if let Ok(idty_val) = <Identities<T>>::try_get(idty_index) { if idty_val.removable_on == block_number && idty_val.status == idty_status { - total_weight += Self::do_remove_identity(idty_index) + total_weight += + Self::do_remove_identity(idty_index, Some(&idty_val.owner_key)) } } } diff --git a/pallets/identity/src/tests.rs b/pallets/identity/src/tests.rs index 19c3cd75da529690f3b39da04ea5114fb8920b55..3c4978e1c660fb21a88ec5099da2add0b0f06146 100644 --- a/pallets/identity/src/tests.rs +++ b/pallets/identity/src/tests.rs @@ -74,6 +74,50 @@ fn test_create_identity_ok() { }); } +#[test] +fn test_create_identity_but_not_confirm_it() { + new_test_ext(IdentityConfig { + identities: vec![alice()], + }) + .execute_with(|| { + // We need to initialize at least one block before any call + run_to_block(1); + + // Alice should be able te create an identity + assert_ok!(Identity::create_identity(Origin::signed(1), 2)); + + // The identity shoud expire in blocs #3 + run_to_block(3); + let events = System::events(); + assert_eq!(events.len(), 1); + assert_eq!( + events[0], + EventRecord { + phase: Phase::Initialization, + event: Event::Identity(crate::Event::IdtyRemoved { idty_index: 2 }), + topics: vec![], + } + ); + + // We shoud be able to recreate the identity + run_to_block(4); + assert_ok!(Identity::create_identity(Origin::signed(1), 2)); + let events = System::events(); + assert_eq!(events.len(), 1); + assert_eq!( + events[0], + EventRecord { + phase: Phase::Initialization, + event: Event::Identity(crate::Event::IdtyCreated { + idty_index: 3, + owner_key: 2, + }), + topics: vec![], + } + ); + }); +} + #[test] fn test_idty_creation_period() { new_test_ext(IdentityConfig {