Skip to content
Snippets Groups Projects

automatically claim membership

Merged Hugo Trentesaux requested to merge hugo-dev into master
1 file
+ 33
36
Compare changes
  • Side-by-side
  • Inline
@@ -282,8 +282,13 @@ pub mod pallet {
) -> DispatchResultWithPostInfo {
let who = ensure_signed(origin)?;
// Verify caller ownership
let issuer_owner_key =
T::OwnerKeyOf::convert(issuer).ok_or(Error::<T>::IssuerNotFound)?;
ensure!(issuer_owner_key == who, DispatchError::BadOrigin);
let block_number = frame_system::pallet::Pallet::<T>::block_number();
Self::check_cert_allowed(who, issuer, receiver, block_number)?;
Self::check_add_cert(issuer, receiver, block_number)?;
Self::do_add_cert(block_number, issuer, receiver);
Ok(().into())
@@ -326,37 +331,18 @@ pub mod pallet {
receiver: T::IdtyIndex,
verify_rules: bool,
) -> DispatchResultWithPostInfo {
// Verify rule (1.) Forbid self cert
ensure!(issuer != receiver, Error::<T>::CannotCertifySelf);
let block_number = frame_system::pallet::Pallet::<T>::block_number();
if verify_rules {
// Verify rule (3.) MinReceivedCertToBeAbleToIssueCert
let issuer_idty_cert_meta = StorageIdtyCertMeta::<T>::get(issuer);
ensure!(
issuer_idty_cert_meta.received_count
>= T::MinReceivedCertToBeAbleToIssueCert::get(),
Error::<T>::NotEnoughCertReceived
);
// Verify rule (4.) MaxByIssuer
ensure!(
issuer_idty_cert_meta.issued_count < T::MaxByIssuer::get(),
Error::<T>::IssuedTooManyCert
);
// Verify rule (5.) CertPeriod
ensure!(
block_number >= issuer_idty_cert_meta.next_issuable_on,
Error::<T>::NotRespectCertPeriod
);
// only verify internal rules if asked
Self::check_add_cert_internal(issuer, receiver, block_number)?;
};
Self::do_add_cert(block_number, issuer, receiver);
Ok(().into())
}
/// perform cert addition or renewal
fn do_add_cert(block_number: T::BlockNumber, issuer: T::IdtyIndex, receiver: T::IdtyIndex) {
// Write CertsRemovableOn
@@ -416,6 +402,7 @@ pub mod pallet {
Self::deposit_event(Event::CertRenewed { issuer, receiver });
};
}
/// remove the certifications due to expire on the given block
// (run at on_initialize step)
fn prune_certifications(block_number: T::BlockNumber) -> Weight {
@@ -430,6 +417,7 @@ pub mod pallet {
total_weight
}
/// perform the certification removal
/// if block number is given only remove cert if still set to expire at this block number
pub fn do_remove_cert(
@@ -493,24 +481,19 @@ pub mod pallet {
}
/// check cert allowed
// first internal checks
// then external checks
fn check_cert_allowed(
caller_key: T::AccountId,
// 1. no self cert
// 2. issuer received cert count
// 3. issuer max emitted cert
// 4. issuer cert period
fn check_add_cert_internal(
issuer: T::IdtyIndex,
receiver: T::IdtyIndex,
block_number: T::BlockNumber,
) -> DispatchResult {
// --- first internal checks
// 1. Forbid self cert
ensure!(issuer != receiver, Error::<T>::CannotCertifySelf);
// 2. Verify caller ownership
let issuer_owner_key =
T::OwnerKeyOf::convert(issuer).ok_or(Error::<T>::IssuerNotFound)?;
ensure!(issuer_owner_key == caller_key, DispatchError::BadOrigin);
// 3. Verify rule MinReceivedCertToBeAbleToIssueCert
// 2. Verify rule MinReceivedCertToBeAbleToIssueCert
// (this number can differ from the one necessary to be member)
let issuer_idty_cert_meta = <StorageIdtyCertMeta<T>>::get(issuer);
ensure!(
@@ -519,18 +502,32 @@ pub mod pallet {
Error::<T>::NotEnoughCertReceived
);
// 4. Verify rule MaxByIssuer
// 3. Verify rule MaxByIssuer
ensure!(
issuer_idty_cert_meta.issued_count < T::MaxByIssuer::get(),
Error::<T>::IssuedTooManyCert
);
// 5. Verify rule CertPeriod
// 4. Verify rule CertPeriod
ensure!(
block_number >= issuer_idty_cert_meta.next_issuable_on,
Error::<T>::NotRespectCertPeriod
);
Ok(())
}
/// check cert allowed
// first internal checks
// then external checks
fn check_add_cert(
issuer: T::IdtyIndex,
receiver: T::IdtyIndex,
block_number: T::BlockNumber,
) -> DispatchResult {
// internal checks
Self::check_add_cert_internal(issuer, receiver, block_number)?;
// --- then external checks
// - issuer is member
// - receiver is confirmed
Loading