refactor: minor optimization when expiring memberships

This commit is contained in:
Richard Ramos 2024-09-06 12:09:04 -04:00
parent 5ddfc3554d
commit 9a1c1dc33d
No known key found for this signature in database
GPG Key ID: 1CE87DB518195760
2 changed files with 43 additions and 12 deletions

View File

@ -228,13 +228,7 @@ contract Membership {
delete members[head];
// Promote the next oldest membership to oldest
uint256 nextOldest = oldestMembership.next;
head = nextOldest;
if (nextOldest != 0) {
members[nextOldest].prev = 0;
} else {
tail = 0;
}
head = oldestMembership.next;
// Move balance from expired membership to holder balance
balancesToWithdraw[oldestMembership.holder][oldestMembership.token] += oldestMembership.amount;
@ -244,6 +238,13 @@ contract Membership {
revert ExceedAvailableMaxRateLimitPerEpoch();
}
}
// Ensure new head and tail are pointing to the correct memberships
if (head != 0) {
members[head].prev = 0;
} else {
tail = 0;
}
}
uint256 prev = 0;

View File

@ -465,16 +465,46 @@ contract WakuRlnV2Test is Test {
}
function test__RegistrationWhenMaxRateLimitIsReachedAndMultipleExpiredMembersAvailable() external {
// TODO: implement
// TODO: validate elements are chained correctly
vm.pauseGasMetering();
vm.startPrank(w.owner());
w.setMinRateLimitPerMembership(1);
w.setMaxRateLimitPerMembership(5);
w.setMaxTotalRateLimitPerEpoch(5);
vm.stopPrank();
vm.resumeGasMetering();
(, uint256 price) = w.priceCalculator().calculate(1, 10);
w.register{ value: price }(1, 1, 10);
vm.warp(block.timestamp + 100);
w.register{ value: price }(2, 1, 10);
vm.warp(block.timestamp + 100);
uint256 expirationDate = w.expirationDate(2);
vm.warp(expirationDate);
w.register{ value: price }(3, 1, 10);
// Make sure only the first 2 memberships are expired
assertTrue(w.isExpired(1));
assertTrue(w.isExpired(2));
assertFalse(w.isExpired(3) || w.isGracePeriod(3));
// Attempt to register a membership that will require to expire 2 memberships
// Currently there is 2 available, and we want to register 4
// If we remove first membership, we'll have 3 available
// If we also remove the second, we'll have 4 available
vm.expectEmit(true, false, false, false);
emit Membership.MemberExpired(1, 0, 0);
vm.expectEmit(true, false, false, false);
emit Membership.MemberExpired(2, 0, 0);
(, price) = w.priceCalculator().calculate(4, 10);
w.register{ value: price }(4, 4, 10);
// TODO: validate reuse of index
// TODO: validate balance
// TODO: check that the expired memberships are gone
// TODO: check that the expired memberships are gone and membership 3 is still there
// TODO: check the usermessage limits (total)
// TODO: check that it reused the index of the one gone
// TODO: check head and tail are correct and next and prev
// TODO: validate that expired event is emitted
// TODO: there should be at least a single index available
// TODO: validate balance
}