Skip to content

Commit 7346e79

Browse files
committed
Cannot redeem a perk more than once
1 parent b2a85e3 commit 7346e79

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

packages/foundry/contracts/KiddoPerks.sol

+5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ contract KiddoPerks is Ownable {
2525
error KiddoPerks__NotEnoughTokenBalance(
2626
uint256 id, address by, uint256 tokensRequired
2727
);
28+
error KiddoPerks__PerkAlreadyRedemmed(uint256 id, address by);
2829

2930
KDOToken token;
3031
address public parent;
@@ -203,12 +204,16 @@ contract KiddoPerks is Ownable {
203204
perkId, msg.sender, perk.tokensRequired
204205
);
205206
}
207+
if (s_perksRedeemedBy[perkId][msg.sender]) {
208+
revert KiddoPerks__PerkAlreadyRedemmed(perkId, msg.sender);
209+
}
206210

207211
bool sent =
208212
token.transferFrom(msg.sender, address(this), perk.tokensRequired);
209213
if (!sent) {
210214
revert("Error on token transfer");
211215
}
216+
s_perksRedeemedBy[perkId][msg.sender] = true;
212217
emit PerkRedeemed(perkId, msg.sender);
213218
}
214219

packages/foundry/test/KiddoPerks.t.sol

+24
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,30 @@ contract KiddoPerksTest is Test {
274274
assertEq(initialChildBalance, perkTokensRequired + userFinalBalance);
275275
}
276276

277+
function testChildCannotReddemMoreThanOnceAPerk() public withPerkCreated {
278+
uint256 perkId = 0;
279+
uint256 initialChildBalance = 5 * 10 ** 18;
280+
uint256 perkTokensRequired = 2 * 10 ** 18;
281+
vm.prank(address(kiddoPerks));
282+
kdoToken.mint(CHILD_ONE, initialChildBalance);
283+
284+
vm.prank(CHILD_ONE);
285+
kdoToken.approve(address(kiddoPerks), perkTokensRequired);
286+
287+
vm.expectEmit(true, true, false, true);
288+
emit PerkRedeemed(perkId, CHILD_ONE);
289+
vm.prank(CHILD_ONE);
290+
kiddoPerks.redeemPerk(perkId);
291+
292+
vm.expectRevert(
293+
abi.encodeWithSelector(
294+
KiddoPerks.KiddoPerks__PerkAlreadyRedemmed.selector, perkId, CHILD_ONE
295+
)
296+
);
297+
vm.prank(CHILD_ONE);
298+
kiddoPerks.redeemPerk(perkId);
299+
}
300+
277301
function testRevertsOnRedeemWhenChildHasNotEnoughTokenBalance()
278302
public
279303
withPerkCreated

0 commit comments

Comments
 (0)