Precision loss in `swETH::_deposit` from unnecessary hidden division before multiplication
`swETH::_deposit` L170 contains a hidden unnecessary division before multiplication as the call to `_ethToSwETHRate` performs a division which then gets multiplied by msg.value:\\n```\\nuint256 swETHAmount = wrap(msg.value).mul(_ethToSwETHRate()).unwrap();\\n// @audit expanding this out\\n// wrap(msg.value).mul(_ethToSwETHRate()).unwrap();\\n// wrap(msg.value).mul(wrap(1 ether).div(_swETHToETHRate())).unwrap();\\n```\\n\\nThis issue has not been introduced in the new changes but is in the mainnet code.
Refactor to perform multiplication before division:\\n```\\nuint256 swETHAmount = wrap(msg.value).mul(wrap(1 ether)).div(_swETHToETHRate()).unwrap();\\n```\\n
Slightly less `swETH` will be minted to depositors. While the amount by which individual depositors are short-changed is individually small, the effect is cumulative and increases as depositors and deposit size increase.\\nProof of Concept: This stand-alone stateless fuzz test can be run inside Foundry to prove this as well as provided hard-coded test cases:\\n```\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.23;\\n\\nimport {UD60x18, wrap} from "@prb/math/src/UD60x18.sol";\\n\\nimport "forge-std/Test.sol";\\n\\n// run from base project directory with:\\n// (fuzz test) forge test --match-test FuzzMint -vvv\\n// (hardcoded) forge test --match-test HardcodedMint -vvv\\ncontract MintTest is Test {\\n\\n    uint256 private constant SWETH_ETH_RATE = 1050754209601187151; //as of 2024-02-15\\n\\n    function _mintOriginal(uint256 inputAmount) private pure returns(uint256) {\\n        // hidden division before multiplication\\n        // wrap(inputAmount).mul(_ethToSwETHRate()).unwrap();\\n        // wrap(inputAmount).mul(wrap(1 ether).div(_swETHToETHRate())).unwrap()\\n\\n        return wrap(inputAmount).mul(wrap(1 ether).div(wrap(SWETH_ETH_RATE))).unwrap();\\n    }\\n\\n    function _mintFixed(uint256 inputAmount) private pure returns(uint256) {\\n        // refactor to perform multiplication before division\\n        // wrap(inputAmount).mul(wrap(1 ether)).div(_swETHToETHRate()).unwrap();\\n\\n        return wrap(inputAmount).mul(wrap(1 ether)).div(wrap(SWETH_ETH_RATE)).unwrap();\\n    }\\n\\n    function test_FuzzMint(uint256 inputAmount) public pure {\\n        uint256 resultOriginal = _mintOriginal(inputAmount);\\n        uint256 resultFixed    = _mintFixed(inputAmount);\\n\\n        assert(resultOriginal == resultFixed);\\n    }\\n\\n    function test_HardcodedMint() public {\\n        // found by fuzzer\\n        console.log(_mintFixed(3656923177187149889) - _mintOriginal(3656923177187149889)); // 1\\n\\n        // 100 eth\\n        console.log(_mintFixed(100 ether) - _mintOriginal(100 ether)); // 21\\n\\n        // 1000 eth\\n        console.log(_mintFixed(1000 ether) - _mintOriginal(1000 ether)); // 215\\n\\n        // 10000 eth\\n        console.log(_mintFixed(10000 ether) - _mintOriginal(10000 ether)); // 2159\\n    }\\n}\\n```\\n
```\\nuint256 swETHAmount = wrap(msg.value).mul(_ethToSwETHRate()).unwrap();\\n// @audit expanding this out\\n// wrap(msg.value).mul(_ethToSwETHRate()).unwrap();\\n// wrap(msg.value).mul(wrap(1 ether).div(_swETHToETHRate())).unwrap();\\n```\\n