Skip to content

Commit

Permalink
Improved events and fixed a bug
Browse files Browse the repository at this point in the history
  • Loading branch information
asselstine committed Jun 28, 2023
1 parent c9e89f3 commit e040da0
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 9 deletions.
15 changes: 10 additions & 5 deletions src/PrizePool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ error DrawManagerAlreadySet();
/// @notice Emitted when someone tries to claim a prize that was already claimed
/// @param winner The winner of the prize
/// @param tier The prize tier
error AlreadyClaimedPrize(address vault, address winner, uint8 tier, uint32 prizeIndex);
error AlreadyClaimedPrize(address vault, address winner, uint8 tier, uint32 prizeIndex, address recipient);

/// @notice Emitted when someone tries to withdraw too many rewards
/// @param requested The requested reward amount to withdraw
Expand Down Expand Up @@ -133,6 +133,7 @@ contract PrizePool is TieredLiquidityDistributor {
address indexed recipient,
uint16 drawId,
uint8 tier,
uint32 prizeIndex,
uint152 payout,
uint96 fee,
address feeRecipient
Expand Down Expand Up @@ -523,22 +524,25 @@ contract PrizePool is TieredLiquidityDistributor {
address _feeRecipient
) external returns (uint256) {
Tier memory tierLiquidity = _getTier(_tier, numberOfTiers);

if (_fee > tierLiquidity.prizeSize) {
revert FeeTooLarge(_fee, tierLiquidity.prizeSize);
}

(SD59x18 _vaultPortion, SD59x18 _tierOdds, uint16 _drawDuration) = _computeVaultTierDetails(msg.sender, _tier, numberOfTiers, lastCompletedDrawId);


if (!_isWinner(msg.sender, _winner, _tier, _prizeIndex, _vaultPortion, _tierOdds, _drawDuration)) {
revert DidNotWin(msg.sender, _winner, _tier, _prizeIndex);
}


if (claimedPrizes[_winner][lastCompletedDrawId][_tier][_prizeIndex]) {
revert AlreadyClaimedPrize(msg.sender, _winner, _tier, _prizeIndex);
revert AlreadyClaimedPrize(msg.sender, _winner, _tier, _prizeIndex, _prizeRecipient);
}

claimedPrizes[_winner][lastCompletedDrawId][_tier][_prizeIndex] = true;

if (_isCanaryTier(_tier, numberOfTiers)) {
canaryClaimCount++;
} else {
Expand All @@ -556,9 +560,10 @@ contract PrizePool is TieredLiquidityDistributor {
}

uint256 payout = tierLiquidity.prizeSize - _fee;
emit ClaimedPrize(msg.sender, _winner, _prizeRecipient, lastCompletedDrawId, _tier, uint152(payout), _fee, _feeRecipient);

_transfer(_winner, payout);
emit ClaimedPrize(msg.sender, _winner, _prizeRecipient, lastCompletedDrawId, _tier, _prizeIndex, uint152(payout), _fee, _feeRecipient);

_transfer(_prizeRecipient, payout);

return tierLiquidity.prizeSize;
}
Expand Down
38 changes: 34 additions & 4 deletions test/PrizePool.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,18 @@ contract PrizePoolTest is Test {
address indexed drawManager
);

event ClaimedPrize(
address indexed vault,
address indexed winner,
address indexed recipient,
uint16 drawId,
uint8 tier,
uint32 prizeIndex,
uint152 payout,
uint96 fee,
address feeRecipient
);

/**********************************************************************************/

ConstructorParams params;
Expand Down Expand Up @@ -621,10 +633,28 @@ contract PrizePoolTest is Test {
function testClaimPrize_single() public {
contribute(100e18);
completeAndStartNextDraw(winningRandomNumber);
mockTwab(msg.sender, 0);
claimPrize(msg.sender, 0, 0);
address winner = makeAddr("winner");
address recipient = makeAddr("recipient");
mockTwab(winner, 1);

console2.log("winner", winner);
console2.log("recipient", recipient);

vm.expectEmit();
emit ClaimedPrize(
address(this),
winner,
recipient,
1,
1,
0,
1.13636363636363635e18,
0,
address(0)
);
prizePool.claimPrize(winner, 1, 0, recipient, 0, address(0));
// grand prize is (100/220) * 0.1 * 100e18 = 4.5454...e18
assertEq(prizeToken.balanceOf(msg.sender), 4.5454545454545454e18);
assertEq(prizeToken.balanceOf(recipient), 1.13636363636363635e18, "recipient balance is good");
assertEq(prizePool.claimCount(), 1);
}

Expand Down Expand Up @@ -661,7 +691,7 @@ contract PrizePoolTest is Test {
mockTwab(msg.sender, 0);
assertEq(claimPrize(msg.sender, 0, 0), 4.5454545454545454e18, "prize size");
// second claim is zero
vm.expectRevert(abi.encodeWithSelector(AlreadyClaimedPrize.selector, address(this), msg.sender, 0, 0));
vm.expectRevert(abi.encodeWithSelector(AlreadyClaimedPrize.selector, address(this), msg.sender, 0, 0, msg.sender));
claimPrize(msg.sender, 0, 0);
}

Expand Down

0 comments on commit e040da0

Please sign in to comment.