Skip to content

Commit

Permalink
changed from cooldown to global limit
Browse files Browse the repository at this point in the history
  • Loading branch information
wagmiwiz committed Aug 12, 2024
1 parent de48702 commit 15a4a4e
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 21 deletions.
39 changes: 25 additions & 14 deletions src/DailyDonut.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,40 @@
pragma solidity 0.8.23;

contract DailyDonut {
mapping(address => uint256) public lastClaimTimestamp;

uint256 public _claimId;
mapping(address => uint256) public lastClaimDay;
uint256 public claimId;

event Transfer(address indexed from, address indexed to, uint256 claimId);

function claimDonut() public {
require(lastClaimTimestamp[msg.sender] == 0 || block.timestamp >= lastClaimTimestamp[msg.sender] + 24 hours, "You can only claim once every 24 hours");
function getCurrentDay() public view returns (uint256) {
return block.timestamp / 1 days;
}

lastClaimTimestamp[msg.sender] = block.timestamp;
function claimDonut() public {
uint256 currentDay = getCurrentDay();

_claimId++;
require(
lastClaimDay[msg.sender] < currentDay,
"You can only claim once per day"
);

emit Transfer(address(0), msg.sender, _claimId);
lastClaimDay[msg.sender] = currentDay;
claimId++;
emit Transfer(address(0), msg.sender, claimId);
}

// Function to check the time remaining until next claim
function timeUntilNextClaim() public view returns (uint256) {
uint256 timeSinceLastClaim = block.timestamp - lastClaimTimestamp[msg.sender];
if (timeSinceLastClaim >= 24 hours) {
function timeUntilNextClaim(
address _address
) public view returns (uint256) {
uint256 currentDay = getCurrentDay();
if (lastClaimDay[_address] < currentDay) {
return 0;
}
return 24 hours - timeSinceLastClaim;
uint256 nextMidnight = (currentDay + 1) * 1 days;
return nextMidnight - block.timestamp;
}

}
function canClaimToday(address _address) public view returns (bool) {
return lastClaimDay[_address] < getCurrentDay();
}
}
23 changes: 16 additions & 7 deletions test/DailyDonut.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,37 @@ contract DailyDonutTest is Test {

function setUp() public {
dailyDonut = new DailyDonut();

vm.warp(100 days);
}

function test_claimDonut() public {
dailyDonut.claimDonut();
assertEq(dailyDonut._claimId(), 1);
assertEq(dailyDonut.claimId(), 1);
assertEq(dailyDonut.timeUntilNextClaim(address(this)), 24 hours);

// expect to revert if claiming again before 24 hours over
vm.expectRevert("You can only claim once every 24 hours");
vm.expectRevert("You can only claim once per day");
dailyDonut.claimDonut();

// but another address can
vm.startPrank(vm.addr(1));
assertEq(dailyDonut.timeUntilNextClaim(vm.addr(1)), 0);

dailyDonut.claimDonut();
assertEq(dailyDonut.claimId(), 2);
vm.warp(block.timestamp + 10 seconds);
assertEq(dailyDonut.timeUntilNextClaim(vm.addr(1)), 24 hours - 10 seconds);

vm.expectRevert("You can only claim once per day");
dailyDonut.claimDonut();
assertEq(dailyDonut._claimId(), 2);

vm.stopPrank();

// in 24 hours can claim again
vm.warp(24 hours + 1);
vm.warp(block.timestamp + 24 hours);

dailyDonut.claimDonut();
assertEq(dailyDonut._claimId(), 3);
assertEq(dailyDonut.claimId(), 3);
}


}

0 comments on commit 15a4a4e

Please sign in to comment.