DatingDapp

AI First Flight #6
Beginner FriendlyFoundrySolidityNFT
EXP
View results
Submission Details
Severity: high
Valid

User deposits are never accounted for in LikeRegistry::likeUser leading to a complete lock of the deposited funds and failure of protocol

Vulnerability Details

The LikeRegistry::likeUser function does not track the ETH deposited by users when they like someone. This results in an issue where, during a potential match, the matchRewards function attempts to pool ETH from the userBalances mapping, but since userBalances is never updated, the pooled balance remains zero. Consequently, the ETH sent by users remains locked in the contract permanently with no mechanism for withdrawal.

Impact

  • Permanent ETH Lockup: Users' ETH payments remain trapped in the contract, with no function allowing withdrawals.

  • Empty MultiSig Wallets: Since matchRewards relies on userBalances, all MultiSig wallets created will have a zero balance, making them unusable.

  • Protocol Failure: The DatingDapp protocol specifies that matched users should receive a pooled balance in a shared MultiSig wallet. However, due to this bug, the intended feature does not function correctly.

Recommended Mitigation

Update userBalances in likeUser

Modify the function to track ETH deposits correctly:\

function likeUser(address liked) external payable {
require(msg.value >= 1 ether, "Must send at least 1 ETH");
require(!likes\[msg.sender]\[liked], "Already liked");
require(msg.sender != liked, "Cannot like yourself");
require(profileNFT.profileToToken(msg.sender) != 0, "Must have a profile NFT");
require(profileNFT.profileToToken(liked) != 0, "Liked user must have a profile NFT");
+userBalances\[msg.sender] += 1 ether; //<--- Add the Missing Line
&#x20; likes\[msg.sender]\[liked] = true;
emit Liked(msg.sender, liked);
if (likes\[liked]\[msg.sender]) {
&#x20; matches\[msg.sender].push(liked);
&#x20; matches\[liked].push(msg.sender);
emit Matched(msg.sender, liked);
&#x20; matchRewards(liked, msg.sender);
&#x20; }
}\
\`\`\`
Updates

Lead Judging Commences

ai-first-flight-judge Lead Judge about 10 hours ago
Submission Judgement Published
Validated
Assigned finding tags:

[H-01] After the user calls the `likeUser` function, the userBalance does not increase by the corresponding value.

## Description User A calls `likeUser` and sends `value > 1` ETH. According to the design of DatingDapp, the amount for user A should be accumulated by `userBalances`. Otherwise, in the subsequent calculations, the balance for each user will be 0. ## Vulnerability Details When User A calls `likeUser`, the accumulation of `userBalances` is not performed. ```solidity function likeUser( address liked ) external payable { require(msg.value >= 1 ether, "Must send at least 1 ETH"); require(!likes[msg.sender][liked], "Already liked"); require(msg.sender != liked, "Cannot like yourself"); require(profileNFT.profileToToken(msg.sender) != 0, "Must have a profile NFT"); require(profileNFT.profileToToken(liked) != 0, "Liked user must have a profile NFT"); likes[msg.sender][liked] = true; emit Liked(msg.sender, liked); // Check if mutual like if (likes[liked][msg.sender]) { matches[msg.sender].push(liked); matches[liked].push(msg.sender); emit Matched(msg.sender, liked); matchRewards(liked, msg.sender); } } ``` This will result in `totalRewards` always being 0, affecting all subsequent calculations: ```solidity uint256 totalRewards = matchUserOne + matchUserTwo; uint256 matchingFees = (totalRewards * FIXEDFEE ) / 100; uint256 rewards = totalRewards - matchingFees; totalFees += matchingFees; ``` ## POC ```solidity function testUserBalanceshouldIncreaseAfterLike() public { vm.prank(user1); likeRegistry.likeUser{value: 20 ether}(user2); assertEq(likeRegistry.userBalances(user1), 20 ether, "User1 balance should be 20 ether"); } ``` Then we will get an error: ```shell [FAIL: User1 balance should be 20 ether: 0 != 20000000000000000000] ``` ## Impact - Users will be unable to receive rewards. - The contract owner will also be unable to withdraw ETH from the contract. ## Recommendations Add processing for `userBalances` in the `likeUser` function: ```diff function likeUser( address liked ) external payable { require(msg.value >= 1 ether, "Must send at least 1 ETH"); require(!likes[msg.sender][liked], "Already liked"); require(msg.sender != liked, "Cannot like yourself"); require(profileNFT.profileToToken(msg.sender) != 0, "Must have a profile NFT"); require(profileNFT.profileToToken(liked) != 0, "Liked user must have a profile NFT"); likes[msg.sender][liked] = true; + userBalances[msg.sender] += msg.value; emit Liked(msg.sender, liked); [...] } ```

Support

FAQs

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

Give us feedback!