Skip to content

Commit

Permalink
noshow tolerance works
Browse files Browse the repository at this point in the history
  • Loading branch information
brenzi committed Feb 27, 2024
1 parent 54ffa22 commit 92266a2
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 56 deletions.
9 changes: 5 additions & 4 deletions ceremonies/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,17 +150,18 @@ pub mod pallet {
Self::participant_reputation(
(p.community_identifier, p.ceremony_index),
&p.attendee_public
) == Reputation::VerifiedUnlinked,
)
.is_verified_and_unlinked_for_cindex(cindex),
Error::<T>::AttendanceUnverifiedOrAlreadyUsed
);

ensure!(p.verify_signature(), Error::<T>::BadProofOfAttendanceSignature);

// this reputation must now be burned so it can not be used again
// this reputation must now be flagged so it can not be used again in the same cycle
<ParticipantReputation<T>>::insert(
(p.community_identifier, p.ceremony_index),
&p.attendee_public,
Reputation::VerifiedLinked,
Reputation::VerifiedLinked(cindex),
);
// register participant as reputable
<ParticipantReputation<T>>::insert(
Expand Down Expand Up @@ -253,7 +254,7 @@ pub mod pallet {
);

ensure!(
Self::participant_reputation(cc, &sender) == Reputation::VerifiedLinked,
Self::participant_reputation(cc, &sender) == Reputation::VerifiedLinked(cindex),
Error::<T>::ReputationMustBeLinked
);

Expand Down
34 changes: 28 additions & 6 deletions ceremonies/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1252,7 +1252,7 @@ fn register_with_reputation_works() {
);
assert_eq!(
EncointerCeremonies::participant_reputation((cid, cindex - 1), account_id(&zoran)),
Reputation::VerifiedLinked
Reputation::VerifiedLinked(cindex)
);

// double signing (re-using reputation) fails
Expand All @@ -1268,6 +1268,28 @@ fn register_with_reputation_works() {
register(account_id(&yuri), cid, Some(proof)),
Error::<TestRuntime>::AttendanceUnverifiedOrAlreadyUsed
);

// tolerate no shows
// no meetup will succeed in this cycle, still we want reputation to be valid for the next cycle
run_to_next_phase();
run_to_next_phase();
run_to_next_phase();
let cindex = EncointerScheduler::current_ceremony_index();
println!("cindex {cindex}");

let proof = prove_attendance(account_id(&zoran_new), cid, cindex - 2, &zoran);
assert_ok!(register(account_id(&zoran_new), cid, Some(proof)));
assert_eq!(
EncointerCeremonies::participant_reputation((cid, cindex - 2), account_id(&zoran)),
Reputation::VerifiedLinked(cindex)
);

// double signing (re-using reputation) fails
let proof_second = prove_attendance(account_id(&yuri), cid, cindex - 2, &zoran);
assert_err!(
register(account_id(&yuri), cid, Some(proof_second)),
Error::<TestRuntime>::AttendanceUnverifiedOrAlreadyUsed
);
});
}

Expand Down Expand Up @@ -2658,7 +2680,7 @@ fn unregister_participant_works_with_reputables() {
);
assert_eq!(
EncointerCeremonies::participant_reputation((cid, cindex - 1), &alice),
Reputation::VerifiedLinked
Reputation::VerifiedLinked(cindex)
);

assert_ok!(EncointerCeremonies::unregister_participant(
Expand Down Expand Up @@ -2699,7 +2721,7 @@ fn unregister_participant_fails_with_reputables_and_wrong_reputation() {
);
assert_eq!(
EncointerCeremonies::participant_reputation((cid, cindex - 1), &alice),
Reputation::VerifiedLinked
Reputation::VerifiedLinked(cindex)
);

assert_err!(
Expand Down Expand Up @@ -3276,7 +3298,7 @@ fn has_reputation_works() {
assert_eq!(EncointerCeremonies::has_reputation(&alice, &cid), false);

// reputation type qualifies
EncointerCeremonies::fake_reputation((cid, 1), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 1), &alice, Reputation::VerifiedLinked(1));

assert_eq!(EncointerCeremonies::has_reputation(&alice, &cid), true);

Expand Down Expand Up @@ -3397,7 +3419,7 @@ fn validate_reputation_works() {
// fails because too old
EncointerCeremonies::fake_reputation((cid, 2), &alice, Reputation::VerifiedUnlinked);
assert_eq!(EncointerCeremonies::validate_reputation(&alice, &cid, 2), false);
EncointerCeremonies::fake_reputation((cid, 2), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 2), &alice, Reputation::VerifiedLinked(2));
assert_eq!(EncointerCeremonies::validate_reputation(&alice, &cid, 2), false);

// fails because not verifieds
Expand All @@ -3409,7 +3431,7 @@ fn validate_reputation_works() {
// passes
EncointerCeremonies::fake_reputation((cid, 7), &alice, Reputation::VerifiedUnlinked);
assert_eq!(EncointerCeremonies::validate_reputation(&alice, &cid, 7), true);
EncointerCeremonies::fake_reputation((cid, 7), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 7), &alice, Reputation::VerifiedLinked(7));
assert_eq!(EncointerCeremonies::validate_reputation(&alice, &cid, 7), true);
});
}
66 changes: 33 additions & 33 deletions democracy/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,11 @@ fn proposal_submission_works() {
let alice = alice();

// invalid
EncointerCeremonies::fake_reputation((cid, 2), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 2), &alice, Reputation::VerifiedLinked(0));
// valid
EncointerCeremonies::fake_reputation((cid, 3), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 3), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked(0));

let proposal_action =
ProposalAction::UpdateNominalIncome(cid, NominalIncomeType::from(100u32));
Expand Down Expand Up @@ -185,7 +185,7 @@ fn eligible_reputations_works_with_different_reputations() {
Ok(1)
);

EncointerCeremonies::fake_reputation((cid2, 3), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid2, 3), &alice, Reputation::VerifiedLinked(0));
assert_eq!(
EncointerDemocracy::validate_and_commit_reputations(
1,
Expand All @@ -201,7 +201,7 @@ fn eligible_reputations_works_with_different_reputations() {
EncointerCeremonies::fake_reputation((cid3, 4), &alice, Reputation::Unverified);
EncointerCeremonies::fake_reputation((cid3, 5), &alice, Reputation::UnverifiedReputable);
EncointerCeremonies::fake_reputation((cid4, 4), &alice, Reputation::VerifiedUnlinked);
EncointerCeremonies::fake_reputation((cid4, 3), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid4, 3), &alice, Reputation::VerifiedLinked(0));
assert_eq!(
EncointerDemocracy::validate_and_commit_reputations(
1,
Expand All @@ -225,7 +225,7 @@ fn eligible_reputations_works_with_used_reputations() {
proposal_action
));

EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked(0));

// commit reputation
EncointerDemocracy::validate_and_commit_reputations(
Expand All @@ -235,7 +235,7 @@ fn eligible_reputations_works_with_used_reputations() {
)
.ok();

EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked(0));

assert_eq!(
EncointerDemocracy::validate_and_commit_reputations(
Expand All @@ -260,7 +260,7 @@ fn eligible_reputations_works_with_inexistent_reputations() {
proposal_action
));

EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked(0));

assert_eq!(
EncointerDemocracy::validate_and_commit_reputations(
Expand All @@ -287,8 +287,8 @@ fn eligible_reputations_works_with_cids() {
proposal_action
));

EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid2, 5), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid2, 5), &alice, Reputation::VerifiedLinked(0));

assert_eq!(
EncointerDemocracy::validate_and_commit_reputations(
Expand All @@ -313,9 +313,9 @@ fn eligible_reputations_fails_with_invalid_cindex() {
proposal_action
));

EncointerCeremonies::fake_reputation((cid, 1), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 6), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 1), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid, 6), &alice, Reputation::VerifiedLinked(0));

assert_eq!(
EncointerDemocracy::validate_and_commit_reputations(
Expand All @@ -339,8 +339,8 @@ fn voting_works() {
ProposalAction::SetInactivityTimeout(InactivityTimeoutType::from(100u32));

EncointerCeremonies::fake_reputation((cid, 3), &alice, Reputation::Unverified);
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked(0));

assert_err!(
EncointerDemocracy::vote(
Expand Down Expand Up @@ -369,9 +369,9 @@ fn voting_works() {
assert_eq!(tally.ayes, 2);

EncointerCeremonies::fake_reputation((cid2, 4), &alice, Reputation::Unverified);
EncointerCeremonies::fake_reputation((cid2, 5), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 2), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid2, 6), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid2, 5), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid, 2), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid2, 6), &alice, Reputation::VerifiedLinked(0));

assert_ok!(EncointerDemocracy::vote(
RuntimeOrigin::signed(alice.clone()),
Expand Down Expand Up @@ -500,7 +500,7 @@ fn do_update_proposal_state_works() {
EncointerCeremonies::fake_reputation(
(cid, 5),
&account_id(&p),
Reputation::VerifiedLinked,
Reputation::VerifiedLinked(0),
);
}

Expand Down Expand Up @@ -563,9 +563,9 @@ fn update_proposal_state_extrinsic_works() {
let alice = alice();
let cid = register_test_community::<TestRuntime>(None, 10.0, 10.0);

EncointerCeremonies::fake_reputation((cid, 3), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 3), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked(0));

assert_ok!(EncointerDemocracy::submit_proposal(
RuntimeOrigin::signed(alice.clone()),
Expand All @@ -591,11 +591,11 @@ fn test_get_electorate_works() {
let alice = alice();
let bob = bob();

EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid2, 3), &bob, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid2, 4), &bob, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid2, 5), &bob, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid2, 3), &bob, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid2, 4), &bob, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid2, 5), &bob, Reputation::VerifiedLinked(0));

let proposal_action = ProposalAction::SetInactivityTimeout(8);
assert_ok!(EncointerDemocracy::submit_proposal(
Expand Down Expand Up @@ -627,7 +627,7 @@ fn is_passing_works() {
EncointerCeremonies::fake_reputation(
(cid, 5),
&account_id(&p),
Reputation::VerifiedLinked,
Reputation::VerifiedLinked(0),
);
}

Expand Down Expand Up @@ -703,10 +703,10 @@ fn proposal_happy_flow() {
let cid2 = register_test_community::<TestRuntime>(None, 10.0, 10.0);
let alice = alice();

EncointerCeremonies::fake_reputation((cid, 3), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid2, 3), &alice, Reputation::VerifiedLinked);
EncointerCeremonies::fake_reputation((cid, 3), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid, 4), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid, 5), &alice, Reputation::VerifiedLinked(0));
EncointerCeremonies::fake_reputation((cid2, 3), &alice, Reputation::VerifiedLinked(0));

let proposal_action =
ProposalAction::UpdateNominalIncome(cid, NominalIncomeType::from(13037u32));
Expand Down
11 changes: 9 additions & 2 deletions primitives/src/ceremonies.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

use crate::communities::{CommunityIdentifier, Location};
pub use crate::scheduler::CeremonyIndexType;
use crate::scheduler::{CeremonyIndexShort, CeremonyPhaseType};
use crate::scheduler::CeremonyPhaseType;
use parity_scale_codec::{Decode, Encode, MaxEncodedLen};
use scale_info::TypeInfo;
#[cfg(feature = "serde_derive")]
Expand Down Expand Up @@ -58,13 +58,20 @@ pub enum Reputation {
}

impl Reputation {
pub fn is_verified(self) -> bool {
pub fn is_verified(&self) -> bool {
match self {
Self::VerifiedLinked(_) => true,
Self::VerifiedUnlinked => true,
_ => false,
}
}
pub fn is_verified_and_unlinked_for_cindex(&self, cindex: CeremonyIndexType) -> bool {
match self {
Self::VerifiedUnlinked => true,
Self::VerifiedLinked(c) => *c != cindex,
_ => false,
}
}
}

#[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)]
Expand Down
11 changes: 0 additions & 11 deletions primitives/src/scheduler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,6 @@ use serde::{Deserialize, Serialize};

pub type CeremonyIndexType = u32;

/// a very short type for ceremony index which can be wrapped in an enum variant
#[derive(Default, Encode, Decode, Copy, Clone, PartialEq, Eq, Debug, TypeInfo, MaxEncodedLen)]
#[cfg_attr(feature = "serde_derive", derive(Serialize, Deserialize))]
pub struct CeremonyIndexShort(u8);

impl From<CeremonyIndexType> for CeremonyIndexShort {
fn from(cindex: CeremonyIndexType) -> Self {
Self((cindex % 256) as u8)
}
}

#[derive(Default, Encode, Decode, Copy, Clone, PartialEq, Eq, Debug, TypeInfo, MaxEncodedLen)]
#[cfg_attr(feature = "serde_derive", derive(Serialize, Deserialize))]
pub enum CeremonyPhaseType {
Expand Down

0 comments on commit 92266a2

Please sign in to comment.