Christmas Dinner

First Flight #31
Beginner FriendlyFoundrySolidity
100 EXP
View results
Submission Details
Severity: high
Invalid

H-05: Users can deposit 0 amount of tokens and still be participant

Summary

In ChristmasDinner::deposit(), users can deposit 0 amount of tokens and still become a participant.

Vulnerability Details

The function is missing zero checks for _amount

function deposit(address _token, uint256 _amount) external beforeDeadline {
if(!whitelisted[_token]) {
revert NotSupportedToken();
}
if(participant[msg.sender]){
balances[msg.sender][_token] += _amount;
IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
emit GenerousAdditionalContribution(msg.sender, _amount);
} else {
participant[msg.sender] = true;
balances[msg.sender][_token] += _amount;
IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
emit NewSignup(msg.sender, _amount, getParticipationStatus(msg.sender));
}
}

Impact

Deposit 0 amount of WBTC and participation status is True

function testDepositZeroAmountAndBeParticipant() public {
vm.startPrank(user1);
// Deposit 0 amount of WBTC
cd.deposit(address(wbtc), 0);
assertEq(cd.getParticipationStatus(user1), true, "User not participant");
console.log("User1 participant: ", cd.getParticipationStatus(user1));
vm.stopPrank();
}

Results

[PASS] testDepositZeroAmountAndBeParticipant() (gas: 64143)
Logs:
User1 participant: true
Traces:
[64143] ChristmasDinnerTest::testDepositZeroAmountAndBeParticipant()
├─ [0] VM::startPrank(user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF])
│ └─ ← [Return]
├─ [44870] ChristmasDinner::deposit(ERC20Mock: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 0)
│ ├─ [10166] ERC20Mock::transferFrom(user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF], ChristmasDinner: [0x8Ad159a275AEE56fb2334DBb69036E9c7baCEe9b], 0)
│ │ ├─ emit Transfer(from: user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF], to: ChristmasDinner: [0x8Ad159a275AEE56fb2334DBb69036E9c7baCEe9b], value: 0)
│ │ └─ ← [Return] true
│ ├─ emit NewSignup(: user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF], : 0, : true)
│ └─ ← [Stop]
├─ [571] ChristmasDinner::getParticipationStatus(user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF]) [staticcall]
│ └─ ← [Return] true
├─ [0] VM::assertEq(true, true, "User not participant") [staticcall]
│ └─ ← [Return]
├─ [571] ChristmasDinner::getParticipationStatus(user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF]) [staticcall]
│ └─ ← [Return] true
├─ [0] console::log("User1 participant: ", true) [staticcall]
│ └─ ← [Stop]
├─ [0] VM::stopPrank()
│ └─ ← [Return]
└─ ← [Stop]
Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.10s (245.13ms CPU time)

Tools Used

Foundry

Recommendations

Add a zero check to require amount to be more than 0

function deposit(address _token, uint256 _amount) external beforeDeadline {
+ require(_amount > 0, "Insufficient amount");
if(!whitelisted[_token]) {
revert NotSupportedToken();
}
if(participant[msg.sender]){
balances[msg.sender][_token] += _amount;
IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
emit GenerousAdditionalContribution(msg.sender, _amount);
} else {
participant[msg.sender] = true;
balances[msg.sender][_token] += _amount;
IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
emit NewSignup(msg.sender, _amount, getParticipationStatus(msg.sender));
}
}
Updates

Lead Judging Commences

0xtimefliez Lead Judge about 1 year ago
Submission Judgement Published
Invalidated
Reason: Design choice

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.

Give us feedback!