Skip to content

Commit

Permalink
[Q-5] Inaccurate getClaimTimestamp() return value
Browse files Browse the repository at this point in the history
  • Loading branch information
kumaryash90 committed Aug 9, 2022
1 parent 5f11ac9 commit 29eaaaf
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 9 deletions.
19 changes: 11 additions & 8 deletions contracts/drop/DropERC20.sol
Expand Up @@ -376,8 +376,8 @@ contract DropERC20 is
"exceed claim limit for wallet"
);

(uint256 lastClaimTimestamp, uint256 nextValidClaimTimestamp) = getClaimTimestamp(_conditionId, _claimer);
require(lastClaimTimestamp == 0 || block.timestamp >= nextValidClaimTimestamp, "cannot claim yet.");
(, uint256 nextValidClaimTimestamp) = getClaimTimestamp(_conditionId, _claimer);
require(block.timestamp >= nextValidClaimTimestamp, "cannot claim yet.");
}

/// @dev Checks whether a claimer meets the claim condition's allowlist criteria.
Expand Down Expand Up @@ -428,15 +428,18 @@ contract DropERC20 is
{
lastClaimTimestamp = claimCondition.limitLastClaimTimestamp[_conditionId][_claimer];

unchecked {
nextValidClaimTimestamp =
lastClaimTimestamp +
claimCondition.phases[_conditionId].waitTimeInSecondsBetweenClaims;
if(lastClaimTimestamp != 0) {
unchecked {
nextValidClaimTimestamp =
lastClaimTimestamp +
claimCondition.phases[_conditionId].waitTimeInSecondsBetweenClaims;

if (nextValidClaimTimestamp < lastClaimTimestamp) {
nextValidClaimTimestamp = type(uint256).max;
if (nextValidClaimTimestamp < lastClaimTimestamp) {
nextValidClaimTimestamp = type(uint256).max;
}
}
}

}

/// @dev Returns the claim condition at the given uid.
Expand Down
50 changes: 49 additions & 1 deletion src/test/drop/DropERC20.t.sol
Expand Up @@ -24,7 +24,7 @@ contract DropERC20Test is BaseTest {
address receiver = getActor(0);
bytes32[] memory proofs = new bytes32[](0);

DropERC20.ClaimCondition[] memory conditions = new DropERC1155.ClaimCondition[](1);
DropERC20.ClaimCondition[] memory conditions = new DropERC20.ClaimCondition[](1);
conditions[0].maxClaimableSupply = 500;
conditions[0].quantityLimitPerTransaction = 100;
conditions[0].waitTimeInSecondsBetweenClaims = type(uint256).max;
Expand All @@ -46,4 +46,52 @@ contract DropERC20Test is BaseTest {
vm.expectRevert("invalid quantity claimed.");
drop.claim(receiver, 200, address(0), 0, proofs, 1);
}

function test_state_claim_timestamps() public {
vm.warp(100);

address receiver = getActor(0);
bytes32[] memory proofs = new bytes32[](0);

DropERC20.ClaimCondition[] memory conditions = new DropERC20.ClaimCondition[](1);
conditions[0].maxClaimableSupply = 500;
conditions[0].quantityLimitPerTransaction = 100;
conditions[0].waitTimeInSecondsBetweenClaims = type(uint256).max;

vm.prank(deployer);
drop.setClaimConditions(conditions, false);

(uint256 lastClaimTimestamp, uint256 nextValidClaimTimestamp) = drop.getClaimTimestamp(0, getActor(5));
assertEq(lastClaimTimestamp, 0);
assertEq(nextValidClaimTimestamp, 0);

vm.prank(getActor(5), getActor(5));
drop.claim(receiver, 50, address(0), 0, proofs, 1);

(lastClaimTimestamp, nextValidClaimTimestamp) = drop.getClaimTimestamp(0, getActor(5));
assertEq(lastClaimTimestamp, 100);
assertEq(nextValidClaimTimestamp, type(uint256).max);
}

function test_revert_claim_timestamps() public {
vm.warp(1);

address receiver = getActor(0);
bytes32[] memory proofs = new bytes32[](0);

DropERC20.ClaimCondition[] memory conditions = new DropERC20.ClaimCondition[](1);
conditions[0].maxClaimableSupply = 500;
conditions[0].quantityLimitPerTransaction = 100;
conditions[0].waitTimeInSecondsBetweenClaims = type(uint256).max;

vm.prank(deployer);
drop.setClaimConditions(conditions, false);

vm.prank(getActor(5), getActor(5));
drop.claim(receiver, 50, address(0), 0, proofs, 1);

vm.prank(getActor(5), getActor(5));
vm.expectRevert("cannot claim yet.");
drop.claim(receiver, 50, address(0), 0, proofs, 1);
}
}

0 comments on commit 29eaaaf

Please sign in to comment.