@@ -3,12 +3,18 @@ pragma solidity >=0.8.0;
33
44import { ReentrancyGuard } from "../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol " ;
55
6- import { IWEETHLike, ILiquidityPoolLike, IEETHLike } from "../../src/libraries/WeETHLib .sol " ;
6+ import { IWEETHLike, IEETHLike } from "../../src/libraries/WEETHLib .sol " ;
77
8- import { WeEthModule } from "../../src/WeEthModule .sol " ;
8+ import { WEETHModule } from "../../src/WEETHModule .sol " ;
99
1010import "./ForkTestBase.t.sol " ;
1111
12+ interface ILiquidityPoolLike {
13+ function amountForShare (uint256 shareAmount ) external view returns (uint256 );
14+ function sharesForAmount (uint256 amount ) external view returns (uint256 );
15+ function withdrawRequestNFT () external view returns (address );
16+ }
17+
1218interface IWithdrawRequestNFTLike {
1319 function finalizeRequests (uint256 requestId ) external ;
1420 function getClaimableAmount (uint256 requestId ) external view returns (uint256 );
@@ -39,21 +45,25 @@ contract MainnetControllerWeETHTestBase is ForkTestBase {
3945 eETH = IEETHLike (address (IWEETHLike (Ethereum.WEETH).eETH ()));
4046 liquidityPool = ILiquidityPoolLike (IEETHLike (eETH).liquidityPool ());
4147
42- weETHModule = address (new WeEthModule (Ethereum.SPARK_PROXY, address (almProxy)));
48+ weETHModule = address (new WEETHModule (Ethereum.SPARK_PROXY, address (almProxy)));
4349 }
4450
4551 function _getBlock () internal override pure returns (uint256 ) {
4652 return 23469772 ; // September 29, 2025
4753 }
4854
55+ function _getMinSharesOut (uint256 amount ) internal view returns (uint256 ) {
56+ return liquidityPool.sharesForAmount (amount) - 1 ;
57+ }
58+
4959}
5060
5161contract MainnetControllerDepositToWeETHFailureTests is MainnetControllerWeETHTestBase {
5262
5363 function test_depositToWeETH_reentrancy () external {
5464 _setControllerEntered ();
5565 vm.expectRevert (ReentrancyGuard.ReentrancyGuardReentrantCall.selector );
56- mainnetController.depositToWeETH (1e18 );
66+ mainnetController.depositToWeETH (1e18 , 0 );
5767 }
5868
5969 function test_depositToWeETH_notRelayer () external {
@@ -62,13 +72,13 @@ contract MainnetControllerDepositToWeETHFailureTests is MainnetControllerWeETHTe
6272 address (this ),
6373 RELAYER
6474 ));
65- mainnetController.depositToWeETH (1e18 );
75+ mainnetController.depositToWeETH (1e18 , 0 );
6676 }
6777
6878 function test_depositToWeETH_zeroMaxAmount () external {
6979 vm.prank (relayer);
7080 vm.expectRevert ("RateLimits/zero-maxAmount " );
71- mainnetController.depositToWeETH (1e18 );
81+ mainnetController.depositToWeETH (1e18 , 0 );
7282 }
7383
7484 function test_depositToWeETH_rateLimitsBoundary () external {
@@ -81,10 +91,28 @@ contract MainnetControllerDepositToWeETHFailureTests is MainnetControllerWeETHTe
8191
8292 vm.prank (relayer);
8393 vm.expectRevert ("RateLimits/rate-limit-exceeded " );
84- mainnetController.depositToWeETH (1_000e18 + 1 );
94+ mainnetController.depositToWeETH (1_000e18 + 1 , 0 );
8595
8696 vm.prank (relayer);
87- mainnetController.depositToWeETH (1_000e18 );
97+ mainnetController.depositToWeETH (1_000e18 , 0 );
98+ }
99+
100+ function test_depositToWeETH_slippageTooHighBoundary () external {
101+ bytes32 key = mainnetController.LIMIT_WEETH_DEPOSIT ();
102+
103+ vm.prank (Ethereum.SPARK_PROXY);
104+ rateLimits.setRateLimitData (key, 1_000e18 , uint256 (1_000e18 ) / 1 days);
105+
106+ deal (Ethereum.WETH, address (almProxy), 1_000e18 );
107+
108+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
109+
110+ vm.prank (relayer);
111+ vm.expectRevert ("MC/slippage-too-high " );
112+ mainnetController.depositToWeETH (1_000e18 , minSharesOut + 1 );
113+
114+ vm.prank (relayer);
115+ mainnetController.depositToWeETH (1_000e18 , minSharesOut);
88116 }
89117
90118}
@@ -109,10 +137,12 @@ contract MainnetControllerDepositToWeETHTests is MainnetControllerWeETHTestBase
109137 assertEq (weETH.balanceOf (address (almProxy)), 0 );
110138 assertEq (address (liquidityPool).balance, initialLiquidityPoolBalance);
111139
140+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
141+
112142 vm.record ();
113143
114144 vm.prank (relayer);
115- uint256 shares = mainnetController.depositToWeETH (1_000e18 );
145+ uint256 shares = mainnetController.depositToWeETH (1_000e18 , minSharesOut );
116146
117147 _assertReentrancyGuardWrittenToTwice ();
118148
@@ -197,8 +227,10 @@ contract MainnetControllerRequestWithdrawFromWeETHTests is MainnetControllerWeET
197227
198228 deal (Ethereum.WETH, address (almProxy), 1_000e18 );
199229
230+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
231+
200232 vm.prank (relayer);
201- mainnetController.depositToWeETH (1_000e18 );
233+ mainnetController.depositToWeETH (1_000e18 , minSharesOut );
202234
203235 uint256 initialWeETHBalance = weETH.balanceOf (address (almProxy));
204236
@@ -229,7 +261,7 @@ contract MainnetControllerRequestWithdrawFromWeETHTests is MainnetControllerWeET
229261
230262 vm.prank (WITHDRAW_REQUEST_NFT_ADMIN);
231263 IWithdrawRequestNFTLike (withdrawRequestNFT).finalizeRequests (requestId);
232-
264+
233265 assertEq (withdrawRequestNFT.isFinalized (requestId), true );
234266 assertEq (withdrawRequestNFT.getClaimableAmount (requestId), expectedEEthBalance - 1 ); // Rounding error
235267
@@ -274,8 +306,10 @@ contract MainnetControllerClaimWithdrawalFromWeETHFailureTests is MainnetControl
274306
275307 deal (Ethereum.WETH, address (almProxy), 1_000e18 );
276308
309+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
310+
277311 vm.prank (relayer);
278- mainnetController.depositToWeETH (1_000e18 );
312+ mainnetController.depositToWeETH (1_000e18 , minSharesOut );
279313
280314 vm.record ();
281315
@@ -321,8 +355,10 @@ contract MainnetControllerClaimWithdrawalFromWeETHFailureTests is MainnetControl
321355
322356 deal (Ethereum.WETH, address (almProxy), 1_000e18 );
323357
358+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
359+
324360 vm.prank (relayer);
325- mainnetController.depositToWeETH (1_000e18 );
361+ mainnetController.depositToWeETH (1_000e18 , minSharesOut );
326362
327363 vm.record ();
328364
@@ -335,7 +371,7 @@ contract MainnetControllerClaimWithdrawalFromWeETHFailureTests is MainnetControl
335371
336372 vm.prank (WITHDRAW_REQUEST_NFT_ADMIN);
337373 IWithdrawRequestNFTLike (withdrawRequestNFT).invalidateRequest (requestId);
338-
374+
339375 vm.prank (relayer);
340376 vm.expectRevert ("WeEthModule/invalid-request-id " );
341377 mainnetController.claimWithdrawalFromWeETH (weETHModule, requestId);
@@ -362,8 +398,10 @@ contract MainnetControllerClaimWithdrawalFromWeETHFailureTests is MainnetControl
362398
363399 deal (Ethereum.WETH, address (almProxy), 1_000e18 );
364400
401+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
402+
365403 vm.prank (relayer);
366- mainnetController.depositToWeETH (1_000e18 );
404+ mainnetController.depositToWeETH (1_000e18 , minSharesOut );
367405
368406 vm.record ();
369407
@@ -405,8 +443,10 @@ contract MainnetControllerClaimWithdrawalFromWeETHTests is MainnetControllerWeET
405443
406444 deal (Ethereum.WETH, address (almProxy), 1_000e18 );
407445
446+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
447+
408448 vm.prank (relayer);
409- mainnetController.depositToWeETH (1_000e18 );
449+ mainnetController.depositToWeETH (1_000e18 , minSharesOut );
410450
411451 vm.record ();
412452
0 commit comments