Christmas Dinner

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

L-02: The initial host cannot become the host again without depositing

Summary

If the initial host handed over the role to another participant, he/she cannot become the host again without depositing as he/she is not registered as a participant.

Vulnerability Details

function changeHost(address _newHost) external onlyHost {
if(!participant[_newHost]) {
revert OnlyParticipantsCanBeHost();
}
host = _newHost;
emit NewHost(host);
}

Impact

function testHostCannotBecomeHostAgain() public {
// User1 deposits and become participant
vm.startPrank(user1);
cd.deposit(address(wbtc), 2e18);
vm.stopPrank();
assertEq(cd.getParticipationStatus(user1), true, "User not participant");
// Initial host hand over role to user1
vm.startPrank(deployer);
cd.changeHost(user1);
vm.stopPrank();
assertEq(cd.host(), user1, "User1 is not host");
// User1 hand back host role to initial host but fails
vm.startPrank(user1);
vm.expectRevert(ChristmasDinner.OnlyParticipantsCanBeHost.selector);
cd.changeHost(deployer);
vm.stopPrank();
}

Results

[PASS] testHostCannotBecomeHostAgain() (gas: 112396)
Traces:
[112396] ChristmasDinnerTest::testHostCannotBecomeHostAgain()
├─ [0] VM::startPrank(user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF])
│ └─ ← [Return]
├─ [90270] ChristmasDinner::deposit(ERC20Mock: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 2000000000000000000 [2e18])
│ ├─ [35666] ERC20Mock::transferFrom(user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF], ChristmasDinner: [0x8Ad159a275AEE56fb2334DBb69036E9c7baCEe9b], 2000000000000000000 [2e18])
│ │ ├─ emit Transfer(from: user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF], to: ChristmasDinner: [0x8Ad159a275AEE56fb2334DBb69036E9c7baCEe9b], value: 2000000000000000000 [2e18])
│ │ └─ ← [Return] true
│ ├─ emit NewSignup(: user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF], : 2000000000000000000 [2e18], : true)
│ └─ ← [Stop]
├─ [0] VM::stopPrank()
│ └─ ← [Return]
├─ [571] ChristmasDinner::getParticipationStatus(user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF]) [staticcall]
│ └─ ← [Return] true
├─ [0] VM::assertEq(true, true, "User not participant") [staticcall]
│ └─ ← [Return]
├─ [0] VM::startPrank(deployer: [0xaE0bDc4eEAC5E950B67C6819B118761CaAF61946])
│ └─ ← [Return]
├─ [6902] ChristmasDinner::changeHost(user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF])
│ ├─ emit NewHost(: user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF])
│ └─ ← [Stop]
├─ [0] VM::stopPrank()
│ └─ ← [Return]
├─ [414] ChristmasDinner::host() [staticcall]
│ └─ ← [Return] user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF]
├─ [0] VM::assertEq(user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF], user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF], "User1 is not host") [staticcall]
│ └─ ← [Return]
├─ [0] VM::startPrank(user1: [0x29E3b139f4393aDda86303fcdAa35F60Bb7092bF])
│ └─ ← [Return]
├─ [0] VM::expectRevert(OnlyParticipantsCanBeHost())
│ └─ ← [Return]
├─ [2738] ChristmasDinner::changeHost(deployer: [0xaE0bDc4eEAC5E950B67C6819B118761CaAF61946])
-> │ └─ ← [Revert] OnlyParticipantsCanBeHost()
├─ [0] VM::stopPrank()
│ └─ ← [Return]
└─ ← [Stop]
Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.92s (131.96µs CPU time)

Tools Used

Foundry

Recommendations

Set initial host's participant to True in constructor

constructor (address _WBTC, address _WETH, address _USDC) {
host = msg.sender;
i_WBTC = IERC20(_WBTC);
whitelisted[_WBTC] = true;
i_WETH = IERC20(_WETH);
whitelisted[_WETH] = true;
i_USDC = IERC20(_USDC);
whitelisted[_USDC] = true;
+ participant[host] = true;
}
Updates

Lead Judging Commences

0xtimefliez Lead Judge about 1 year ago
Submission Judgement Published
Invalidated
Reason: Incorrect statement

Appeal created

0xlasadie Submitter
about 1 year ago
0xtimefliez Lead Judge
about 1 year ago
0xlasadie Submitter
about 1 year ago
0xtimefliez Lead Judge about 1 year ago
Submission Judgement Published
Invalidated
Reason: Incorrect statement

Support

FAQs

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

Give us feedback!