Skip to content
Snippets Groups Projects
Commit ba43b069 authored by bgallois's avatar bgallois Committed by Hugo Trentesaux
Browse files

add Invalid case in distance status

parent 5b81db57
No related branches found
No related tags found
1 merge request!200Harmonize and document events errors and calls
...@@ -234,7 +234,8 @@ pub mod pallet { ...@@ -234,7 +234,8 @@ pub mod pallet {
pallet_identity::IdentityIndexOf::<T>::get(&who).ok_or(Error::<T>::NoIdentity)?; pallet_identity::IdentityIndexOf::<T>::get(&who).ok_or(Error::<T>::NoIdentity)?;
ensure!( ensure!(
IdentityDistanceStatus::<T>::get(idty).is_none(), IdentityDistanceStatus::<T>::get(idty)
!= Some((who.clone(), DistanceStatus::Pending)),
Error::<T>::AlreadyInEvaluation Error::<T>::AlreadyInEvaluation
); );
...@@ -479,24 +480,23 @@ pub mod pallet { ...@@ -479,24 +480,23 @@ pub mod pallet {
MedianResult::One(m) => m, MedianResult::One(m) => m,
MedianResult::Two(m1, m2) => m1 + (m2 - m1) / 2, // Avoid overflow (since max is 1) MedianResult::Two(m1, m2) => m1 + (m2 - m1) / 2, // Avoid overflow (since max is 1)
}; };
if median >= T::MinAccessibleReferees::get() {
IdentityDistanceStatus::<T>::mutate(idty, |entry| { IdentityDistanceStatus::<T>::mutate(idty, |entry| {
entry.as_mut().map(|(account_id, status)| { entry.as_mut().map(|(account_id, status)| {
if median >= T::MinAccessibleReferees::get() {
T::Currency::unreserve( T::Currency::unreserve(
account_id, account_id,
<T as Config>::EvaluationPrice::get(), <T as Config>::EvaluationPrice::get(),
); );
*status = DistanceStatus::Valid; *status = DistanceStatus::Valid;
}) } else {
});
} else if let Some((account_id, _status)) =
IdentityDistanceStatus::<T>::take(idty)
{
<T as Config>::Currency::slash_reserved( <T as Config>::Currency::slash_reserved(
&account_id, &account_id,
<T as Config>::EvaluationPrice::get(), <T as Config>::EvaluationPrice::get(),
); );
*status = DistanceStatus::Invalid;
} }
});
});
} else if let Some((account_id, _status)) = IdentityDistanceStatus::<T>::take(idty) } else if let Some((account_id, _status)) = IdentityDistanceStatus::<T>::take(idty)
{ {
<T as Config>::Currency::unreserve( <T as Config>::Currency::unreserve(
......
...@@ -28,6 +28,8 @@ pub enum DistanceStatus { ...@@ -28,6 +28,8 @@ pub enum DistanceStatus {
Pending, Pending,
/// Identity respects the distance /// Identity respects the distance
Valid, Valid,
/// Identity doesn't respect the distance
Invalid,
} }
/// Pool where distance evaluation requests and results are stored /// Pool where distance evaluation requests and results are stored
......
...@@ -109,8 +109,10 @@ pub mod pallet { ...@@ -109,8 +109,10 @@ pub mod pallet {
pub enum Error<T, I = ()> { pub enum Error<T, I = ()> {
/// Insufficient certifications received to claim membership. /// Insufficient certifications received to claim membership.
NotEnoughCertsToClaimMembership, NotEnoughCertsToClaimMembership,
/// Distance has not received a positive evaluation. /// Distance is invalid.
DistanceNotOk, DistanceIsInvalid,
/// Distance is not evaluated.
DistanceNotEvaluated,
/// Identity is not allowed to request membership. /// Identity is not allowed to request membership.
IdtyNotAllowedToRequestMembership, IdtyNotAllowedToRequestMembership,
/// Identity not allowed to renew membership. /// Identity not allowed to renew membership.
...@@ -296,10 +298,7 @@ impl<T: Config<I>, I: 'static> sp_membership::traits::CheckMembershipCallAllowed ...@@ -296,10 +298,7 @@ impl<T: Config<I>, I: 'static> sp_membership::traits::CheckMembershipCallAllowed
idty_cert_meta.received_count >= T::MinCertForMembership::get(), idty_cert_meta.received_count >= T::MinCertForMembership::get(),
Error::<T, I>::NotEnoughCertsToClaimMembership Error::<T, I>::NotEnoughCertsToClaimMembership
); );
ensure!( T::IsDistanceOk::is_distance_ok(idty_index)?;
T::IsDistanceOk::is_distance_ok(idty_index),
Error::<T, I>::DistanceNotOk,
);
Ok(()) Ok(())
} }
...@@ -310,10 +309,7 @@ impl<T: Config<I>, I: 'static> sp_membership::traits::CheckMembershipCallAllowed ...@@ -310,10 +309,7 @@ impl<T: Config<I>, I: 'static> sp_membership::traits::CheckMembershipCallAllowed
idty_value.status == IdtyStatus::Validated, idty_value.status == IdtyStatus::Validated,
Error::<T, I>::IdtyNotAllowedToRenewMembership Error::<T, I>::IdtyNotAllowedToRenewMembership
); );
ensure!( T::IsDistanceOk::is_distance_ok(idty_index)?;
T::IsDistanceOk::is_distance_ok(idty_index),
Error::<T, I>::DistanceNotOk,
);
} else { } else {
return Err(Error::<T, I>::IdtyNotFound.into()); return Err(Error::<T, I>::IdtyNotFound.into());
} }
......
...@@ -14,14 +14,16 @@ ...@@ -14,14 +14,16 @@
// You should have received a copy of the GNU Affero General Public License // You should have received a copy of the GNU Affero General Public License
// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>. // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
use crate::DispatchError;
pub trait IsDistanceOk<IdtyId> { pub trait IsDistanceOk<IdtyId> {
fn is_distance_ok(idty_id: &IdtyId) -> bool; fn is_distance_ok(idty_id: &IdtyId) -> Result<(), DispatchError>;
} }
pub struct DistanceAlwaysOk; pub struct DistanceAlwaysOk;
impl<IdtyId> IsDistanceOk<IdtyId> for DistanceAlwaysOk { impl<IdtyId> IsDistanceOk<IdtyId> for DistanceAlwaysOk {
fn is_distance_ok(_idty_id: &IdtyId) -> bool { fn is_distance_ok(_idty_id: &IdtyId) -> Result<(), DispatchError> {
true Ok(())
} }
} }
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
use crate::{entities::IdtyData, AccountId, IdtyIndex}; use crate::{entities::IdtyData, AccountId, IdtyIndex};
use core::marker::PhantomData; use core::marker::PhantomData;
use pallet_universal_dividend::FirstEligibleUd; use pallet_universal_dividend::FirstEligibleUd;
use sp_runtime::DispatchError;
use sp_std::boxed::Box; use sp_std::boxed::Box;
use sp_std::vec::Vec; use sp_std::vec::Vec;
...@@ -112,13 +113,16 @@ pub struct MainWotIsDistanceOk<T>(PhantomData<T>); ...@@ -112,13 +113,16 @@ pub struct MainWotIsDistanceOk<T>(PhantomData<T>);
impl<T> pallet_duniter_wot::traits::IsDistanceOk<<T as pallet_identity::Config>::IdtyIndex> impl<T> pallet_duniter_wot::traits::IsDistanceOk<<T as pallet_identity::Config>::IdtyIndex>
for MainWotIsDistanceOk<T> for MainWotIsDistanceOk<T>
where where
T: pallet_distance::Config, T: pallet_distance::Config + pallet_duniter_wot::Config<frame_support::instances::Instance1>,
{ {
fn is_distance_ok(idty_id: &<T as pallet_identity::Config>::IdtyIndex) -> bool { fn is_distance_ok(
matches!( idty_id: &<T as pallet_identity::Config>::IdtyIndex,
pallet_distance::Pallet::<T>::identity_distance_status(idty_id), ) -> Result<(), DispatchError> {
Some((_, pallet_distance::DistanceStatus::Valid)) match pallet_distance::Pallet::<T>::identity_distance_status(idty_id) {
) Some((_, pallet_distance::DistanceStatus::Valid)) => Ok(()).into(),
Some((_, pallet_distance::DistanceStatus::Invalid)) => Err(pallet_duniter_wot::Error::<T, frame_support::instances::Instance1>::DistanceIsInvalid.into()),
_ => Err(pallet_duniter_wot::Error::<T, frame_support::instances::Instance1>::DistanceNotEvaluated.into()),
}
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment