Skip to content

Commit 14f630f

Browse files
authored
Add change reward threshold in live contract. Closes #80 (#81)
* Add change reward threshold in live contract. Closes #80 * add test for increase threshold * test if even score=0 updates participants * add passing tests * add passing tests * add passing tests * add passing tests * add passing tests * fix test
1 parent 087c50d commit 14f630f

File tree

3 files changed

+183
-21
lines changed

3 files changed

+183
-21
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ will be called and the round finishes.
5555

5656
### `.balanceOf(address account) view -> uint`
5757

58+
### `.participantIsReadyForTransfer(address account) view -> bool`
59+
5860
## Roles
5961

6062
### `.EVALUATE_ROLE()`

src/Balances.sol

+14-2
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,28 @@ contract Balances {
2626
return scheduledForTransfer.length;
2727
}
2828

29+
function participantIsReadyForTransfer (address participant) public view returns (bool) {
30+
for (uint i = 0; i < readyForTransfer.length; i++) {
31+
if (readyForTransfer[i] == participant) {
32+
return true;
33+
}
34+
}
35+
return false;
36+
}
37+
2938
function increaseParticipantBalance(
3039
address payable participant,
3140
uint amount
3241
) internal {
3342
uint oldBalance = balances[participant];
3443
uint newBalance = oldBalance + amount;
3544
balances[participant] = newBalance;
45+
if (newBalance <= minBalanceForTransfer) {
46+
return;
47+
}
3648
if (
37-
oldBalance <= minBalanceForTransfer &&
38-
newBalance > minBalanceForTransfer
49+
oldBalance <= minBalanceForTransfer
50+
|| !participantIsReadyForTransfer(participant)
3951
) {
4052
readyForTransfer.push(participant);
4153
}

test/ImpactEvaluator.t.sol

+167-19
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,149 @@ contract ImpactEvaluatorTest is Test {
230230
impactEvaluator.setScores(0, addresses, scores);
231231
}
232232

233+
function test_SetScoresAfterDecreaseMinBalanceForTransfer() public {
234+
ImpactEvaluator impactEvaluator = new ImpactEvaluator(address(this));
235+
vm.deal(payable(address(impactEvaluator)), 100 ether);
236+
237+
impactEvaluator.adminAdvanceRound();
238+
impactEvaluator.adminAdvanceRound();
239+
240+
address payable[] memory addresses = new address payable[](3);
241+
addresses[0] = payable(vm.addr(1));
242+
addresses[1] = payable(vm.addr(2));
243+
addresses[2] = payable(vm.addr(3));
244+
uint[] memory scores = new uint[](3);
245+
scores[0] = 1;
246+
scores[1] = impactEvaluator.MAX_SCORE() - scores[0];
247+
scores[2] = 0;
248+
249+
impactEvaluator.setScores(1, addresses, scores);
250+
assertEq(
251+
impactEvaluator.participantIsReadyForTransfer(vm.addr(1)),
252+
false,
253+
"participant 0 is not ready"
254+
);
255+
assertEq(
256+
impactEvaluator.participantIsReadyForTransfer(vm.addr(2)),
257+
true,
258+
"participant 1 is ready"
259+
);
260+
assertEq(
261+
impactEvaluator.participantIsReadyForTransfer(vm.addr(3)),
262+
false,
263+
"participant 2 is not ready"
264+
);
265+
266+
impactEvaluator.setMinBalanceForTransfer(1);
267+
impactEvaluator.adminAdvanceRound();
268+
269+
address payable[] memory addresses2 = new address payable[](4);
270+
addresses2[0] = payable(vm.addr(1));
271+
addresses2[1] = payable(vm.addr(2));
272+
addresses2[2] = payable(vm.addr(3));
273+
addresses2[3] = payable(0x000000000000000000000000000000000000dEaD);
274+
uint[] memory scores2 = new uint[](4);
275+
scores2[0] = 0;
276+
scores2[1] = 0;
277+
scores2[2] = 0;
278+
scores2[3] = impactEvaluator.MAX_SCORE();
279+
impactEvaluator.setScores(2, addresses2, scores2);
280+
assertEq(
281+
impactEvaluator.participantIsReadyForTransfer(vm.addr(1)),
282+
true,
283+
"participant 0 is now ready"
284+
);
285+
assertEq(
286+
impactEvaluator.participantIsReadyForTransfer(vm.addr(2)),
287+
true,
288+
"participant 1 is still ready"
289+
);
290+
assertEq(
291+
impactEvaluator.participantIsReadyForTransfer(vm.addr(3)),
292+
false,
293+
"participant 2 is still not ready"
294+
);
295+
assertEq(impactEvaluator.readyForTransfer(0), vm.addr(2));
296+
assertEq(impactEvaluator.readyForTransfer(1), vm.addr(1));
297+
vm.expectRevert();
298+
impactEvaluator.readyForTransfer(2);
299+
}
300+
301+
function test_SetScoresAfterIncreaseMinBalanceForTransfer() public {
302+
ImpactEvaluator impactEvaluator = new ImpactEvaluator(address(this));
303+
vm.deal(payable(address(impactEvaluator)), 100 ether);
304+
305+
impactEvaluator.adminAdvanceRound();
306+
impactEvaluator.adminAdvanceRound();
307+
308+
address payable[] memory addresses = new address payable[](3);
309+
addresses[0] = payable(vm.addr(1));
310+
addresses[1] = payable(vm.addr(2));
311+
addresses[2] = payable(vm.addr(3));
312+
uint[] memory scores = new uint[](3);
313+
// The minimum score required to be ready for transfer
314+
scores[0] =
315+
((impactEvaluator.MAX_SCORE() *
316+
impactEvaluator.minBalanceForTransfer()) /
317+
impactEvaluator.roundReward()) +
318+
1;
319+
scores[1] = 0;
320+
scores[2] = impactEvaluator.MAX_SCORE() - scores[0];
321+
322+
impactEvaluator.setScores(1, addresses, scores);
323+
assertEq(
324+
impactEvaluator.participantIsReadyForTransfer(vm.addr(1)),
325+
true,
326+
"participant 0 is ready"
327+
);
328+
assertEq(
329+
impactEvaluator.participantIsReadyForTransfer(vm.addr(2)),
330+
false,
331+
"participant 1 is not ready"
332+
);
333+
assertEq(
334+
impactEvaluator.participantIsReadyForTransfer(vm.addr(3)),
335+
true,
336+
"participant 2 is ready"
337+
);
338+
339+
impactEvaluator.setMinBalanceForTransfer(1 ether);
340+
impactEvaluator.adminAdvanceRound();
341+
342+
address payable[] memory addresses2 = new address payable[](4);
343+
addresses2[0] = payable(vm.addr(1));
344+
addresses2[1] = payable(vm.addr(2));
345+
addresses2[2] = payable(vm.addr(3));
346+
addresses2[3] = payable(0x000000000000000000000000000000000000dEaD);
347+
uint[] memory scores2 = new uint[](4);
348+
scores2[0] = 0;
349+
scores2[1] = 0;
350+
scores2[2] = 0;
351+
scores2[3] = impactEvaluator.MAX_SCORE();
352+
impactEvaluator.setScores(2, addresses2, scores2);
353+
354+
assertEq(
355+
impactEvaluator.participantIsReadyForTransfer(vm.addr(1)),
356+
true,
357+
"participant 0 is still ready, although now below the threshold"
358+
);
359+
assertEq(
360+
impactEvaluator.participantIsReadyForTransfer(vm.addr(2)),
361+
false,
362+
"participant 1 is still not ready"
363+
);
364+
assertEq(
365+
impactEvaluator.participantIsReadyForTransfer(vm.addr(3)),
366+
true,
367+
"participant 2 is still ready"
368+
);
369+
370+
assertEq(impactEvaluator.readyForTransfer(0), vm.addr(1));
371+
assertEq(impactEvaluator.readyForTransfer(1), vm.addr(3));
372+
vm.expectRevert();
373+
impactEvaluator.readyForTransfer(2);
374+
}
375+
233376
function test_AdvanceRoundCleanUp() public {
234377
ImpactEvaluator impactEvaluator = new ImpactEvaluator(address(this));
235378

@@ -472,18 +615,12 @@ contract ImpactEvaluatorTest is Test {
472615
scores[0] = impactEvaluator.MAX_SCORE() / 2;
473616
scores[1] = impactEvaluator.MAX_SCORE() / 2;
474617
impactEvaluator.setScores(1, addresses, scores);
475-
assertEq(
476-
impactEvaluator.balanceHeld(),
477-
100 ether
478-
);
618+
assertEq(impactEvaluator.balanceHeld(), 100 ether);
479619

480620
impactEvaluator.adminAdvanceRound();
481621
addresses[0] = payable(0x000000000000000000000000000000000000dEaD);
482622
impactEvaluator.setScores(2, addresses, scores);
483-
assertEq(
484-
impactEvaluator.balanceHeld(),
485-
100 ether
486-
);
623+
assertEq(impactEvaluator.balanceHeld(), 100 ether);
487624

488625
impactEvaluator.releaseRewards();
489626
assertEq(impactEvaluator.balanceHeld(), 100 ether);
@@ -505,18 +642,12 @@ contract ImpactEvaluatorTest is Test {
505642
uint[] memory scores = new uint[](1);
506643
scores[0] = impactEvaluator.MAX_SCORE();
507644
impactEvaluator.setScores(1, addresses, scores);
508-
assertEq(
509-
impactEvaluator.availableBalance(),
510-
0 ether
511-
);
645+
assertEq(impactEvaluator.availableBalance(), 0 ether);
512646

513647
impactEvaluator.adminAdvanceRound();
514648
addresses[0] = payable(0x000000000000000000000000000000000000dEaD);
515649
impactEvaluator.setScores(2, addresses, scores);
516-
assertEq(
517-
impactEvaluator.availableBalance(),
518-
0 ether
519-
);
650+
assertEq(impactEvaluator.availableBalance(), 0 ether);
520651

521652
impactEvaluator.releaseRewards();
522653
assertEq(impactEvaluator.availableBalance(), 0);
@@ -633,9 +764,9 @@ contract ImpactEvaluatorTest is Test {
633764
balances[1] = 50 ether;
634765

635766
vm.expectRevert("Sum of balances must match msg.value");
636-
impactEvaluator.addBalances{ value: 0 }(addresses, balances);
767+
impactEvaluator.addBalances{value: 0}(addresses, balances);
637768

638-
impactEvaluator.addBalances{ value: 100 ether }(addresses, balances);
769+
impactEvaluator.addBalances{value: 100 ether}(addresses, balances);
639770
assertEq(
640771
impactEvaluator.rewardsScheduledFor(addresses[0]),
641772
50 ether,
@@ -664,7 +795,7 @@ contract ImpactEvaluatorTest is Test {
664795
addresses[0] = payable(vm.addr(1));
665796
uint[] memory balances = new uint[](2);
666797
balances[0] = 100 ether;
667-
impactEvaluator.addBalances{ value: 100 ether }(addresses, balances);
798+
impactEvaluator.addBalances{value: 100 ether}(addresses, balances);
668799

669800
impactEvaluator.withdraw(payable(vm.addr(1)));
670801

@@ -691,4 +822,21 @@ contract ImpactEvaluatorTest is Test {
691822

692823
assertEq(vm.addr(1).balance, 0);
693824
}
825+
826+
function test_ParticipantIsReadyForTransfer() public {
827+
ImpactEvaluator impactEvaluator = new ImpactEvaluator(address(this));
828+
address payable[] memory addresses = new address payable[](2);
829+
addresses[0] = payable(vm.addr(1));
830+
addresses[1] = payable(vm.addr(2));
831+
uint[] memory balances = new uint[](2);
832+
balances[0] = 50 ether;
833+
balances[1] = impactEvaluator.minBalanceForTransfer() / 2;
834+
impactEvaluator.addBalances{value: balances[0] + balances[1]}(addresses, balances);
835+
836+
assert(impactEvaluator.participantIsReadyForTransfer(vm.addr(1)));
837+
assert(!impactEvaluator.participantIsReadyForTransfer(vm.addr(2)));
838+
assert(
839+
!impactEvaluator.participantIsReadyForTransfer(payable(vm.addr(3)))
840+
);
841+
}
694842
}

0 commit comments

Comments
 (0)