Attacker can call `Uniswapper::swapNoPath` function with address(0) in `swapParams.tokenIn` and his address in `receiver` param by this he can drain all ethers from `Uniswapper` contract. 
Audit: 2024-01-decent-findings
Severity: HIGH

# Lines of code

https://github.com/code-423n4/2024-01-decent/blob/main/src/swappers/UniSwapper.sol#L100-L121
https://github.com/code-423n4/2024-01-decent/blob/main/src/swappers/UniSwapper.sol#L79-L93


# Vulnerability details


## Summary 

Missing check of msg.value when swapParams.tokenIn is address(0) in `Uniswapper::_receiveAndWrapIfNeeded` function.
When attacker calls `Uniswapper::swapNoPath` function with address(0) in `swapParams.tokenIn` then `swapNoPath` function calls `_receiveAndWrapIfNeeded` function internally and `wrapped` is assigned into `swapParams.tokenIn` and Ether is deposited to `wrapped` contract but `wrapped` tokens never checked msg.value passed by `msg.sender` when he passed address(0) in `swapParams.tokenIn`. It creates a attack point for attacker since in this situation no msg.value is transferred from `msg.sender` but in `swapNoPath` function when `swapParams.direction` is `SwapDirection.EXACT_IN` then `swapNoPath` function will call `_sendToRecipient` function internally. `swapParams.tokenOut` token will be transferred to attacker passed `receiver` address. So by this way attacker can drain all ethers from `Uniswapper` contract by passing `WETH` token address in `swapParams.tokenOut`.

**Note: To make report simpler I mentioned terminology related to Ethereum Mainnet eg: `WETH contract` or `Ethers`,`WETH` tokens. But this can also be possible on all chains similarly where instead of ethers that chan native currency will be used and instead of WETH contract their chain native wrapped token contract will be used. Other than everything will be same. wrapped native token ERC20 contract in `wrapped`**

## Vulnerability Details and Attack Path : 

1. First user calls `Uniswapper::swapNoPath` function with below parameters
2. 
```
Values of swapNoPath function parameters passed by attacker
In  swapParams 
          amountIn  => Amount of Ether balance Uniswapper holds
          amountOut => any doesn't matter in this case for attack
          tokenIn   => address(0)
          tokenOut  => Native currency wrapped token address ,for Ethereum WETH contract address
          direction => SwapDirection.EXACT_IN
          path      => ""

    receiver => The address in that attacker want to withdraw wrapped tokens
    refund =>  address of attacker doesn't matter in this attack scenario
             
```

[function swapNoPath(](https://github.com/code-423n4/2024-01-decent/blob/main/src/swappers/UniSwapper.sol#L100C4-L121C6)

```solidity
100:      function swapNoPath(
            SwapParams memory swapParams,
            address receiver,
            address refund
         ) public payable returns (address tokenOut, uint256 amountOut) {
105:        swapParams = _receiveAndWrapIfNeeded(swapParams);

           if (swapParams.direction == SwapDirection.EXACT_OUT) {
            _refundUser(
                refund,
                swapParams.tokenIn,
                swapParams.amountIn - swapParams.amountOut
            );