code-423n4 / loopfi-bug-bounty

5 stars 5 forks source link

Users will unfairly lose all their points during an emergency withdraw #8

Closed c4-bot-1 closed 2 months ago

c4-bot-1 commented 3 months ago

Lines of code

https://github.com/LoopFi/loop-prelaunch-contracts/blob/main/src/PrelaunchPoints.sol#L284-L306

Vulnerability details

Impact

When the owner start an emergency withdraw, LRT's stakers will unfairly lose all their points.

Proof of Concept

    function _claim(address _token, address _receiver, uint8 _percentage, Exchange _exchange, bytes calldata _data)
        internal
        returns (uint256 claimedAmount)
    {
        if (_percentage == 0) {
            revert CannotClaimZero();
        }
        uint256 userStake = balances[msg.sender][_token];
        if (userStake == 0) {
            revert NothingToClaim();
        }
        if (_token == address(WETH)) {
            claimedAmount = userStake.mulDiv(totalLpETH, totalSupply);
            balances[msg.sender][_token] = 0;
            if (_receiver != address(this)){
                lpETH.safeTransfer(_receiver, claimedAmount);
            }  
        } else {
            uint256 userClaim = userStake * _percentage / 100;
            _validateData(_token, userClaim, _exchange, _data);
            balances[msg.sender][_token] = userStake - userClaim;
            uint256 balanceWethBefore = WETH.balanceOf(address(this));

            // Swap token to ETH
            _fillQuote(IERC20(_token), userClaim, _data);

            // Convert swapped ETH to lpETH (1 to 1 conversion)
            claimedAmount = WETH.balanceOf(address(this)) - balanceWethBefore;
            WETH.approve(address(lpETH), claimedAmount);
            lpETH.deposit(claimedAmount, _receiver);
        }
        emit Claimed(msg.sender, _token, claimedAmount);
    }

Tools Used

Manual review

Recommended Mitigation Steps

Consider introducing a new emergency withdraw function for LRT stakers that dosen't trigger any Withdrawn event.

c4-bot-9 commented 3 months ago

Discord id(s) for hunter(s): [object Object]

bytes032 commented 2 months ago

Expected behavior in emergency situations.