@@ -5,12 +5,18 @@ import { ReentrancyGuard } from "../../lib/openzeppelin-contracts/contracts/util
55
66import { ERC1967Proxy } from "../../lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol " ;
77
8- import { IWEETHLike, ILiquidityPoolLike, IEETHLike } from "../../src/libraries/WeETHLib.sol " ;
8+ import { IWEETHLike, IEETHLike } from "../../src/libraries/WeETHLib.sol " ;
99
10- import { WeEthModule } from "../../src/WeEthModule .sol " ;
10+ import { WEETHModule } from "../../src/WEETHModule .sol " ;
1111
1212import "./ForkTestBase.t.sol " ;
1313
14+ interface ILiquidityPoolLike {
15+ function amountForShare (uint256 shareAmount ) external view returns (uint256 );
16+ function sharesForAmount (uint256 amount ) external view returns (uint256 );
17+ function withdrawRequestNFT () external view returns (address );
18+ }
19+
1420interface IWithdrawRequestNFTLike {
1521 function finalizeRequests (uint256 requestId ) external ;
1622 function getClaimableAmount (uint256 requestId ) external view returns (uint256 );
@@ -43,9 +49,9 @@ contract MainnetControllerWeETHTestBase is ForkTestBase {
4349
4450 weETHModule = address (
4551 new ERC1967Proxy (
46- address (new WeEthModule ()),
52+ address (new WEETHModule ()),
4753 abi.encodeCall (
48- WeEthModule .initialize,
54+ WEETHModule .initialize,
4955 (Ethereum.SPARK_PROXY, address (almProxy))
5056 )
5157 )
@@ -56,14 +62,18 @@ contract MainnetControllerWeETHTestBase is ForkTestBase {
5662 return 23469772 ; // September 29, 2025
5763 }
5864
65+ function _getMinSharesOut (uint256 amount ) internal view returns (uint256 ) {
66+ return liquidityPool.sharesForAmount (amount) - 1 ;
67+ }
68+
5969}
6070
6171contract MainnetControllerDepositToWeETHFailureTests is MainnetControllerWeETHTestBase {
6272
6373 function test_depositToWeETH_reentrancy () external {
6474 _setControllerEntered ();
6575 vm.expectRevert (ReentrancyGuard.ReentrancyGuardReentrantCall.selector );
66- mainnetController.depositToWeETH (1e18 );
76+ mainnetController.depositToWeETH (1e18 , 0 );
6777 }
6878
6979 function test_depositToWeETH_notRelayer () external {
@@ -72,13 +82,13 @@ contract MainnetControllerDepositToWeETHFailureTests is MainnetControllerWeETHTe
7282 address (this ),
7383 RELAYER
7484 ));
75- mainnetController.depositToWeETH (1e18 );
85+ mainnetController.depositToWeETH (1e18 , 0 );
7686 }
7787
7888 function test_depositToWeETH_zeroMaxAmount () external {
7989 vm.prank (relayer);
8090 vm.expectRevert ("RateLimits/zero-maxAmount " );
81- mainnetController.depositToWeETH (1e18 );
91+ mainnetController.depositToWeETH (1e18 , 0 );
8292 }
8393
8494 function test_depositToWeETH_rateLimitsBoundary () external {
@@ -91,10 +101,28 @@ contract MainnetControllerDepositToWeETHFailureTests is MainnetControllerWeETHTe
91101
92102 vm.prank (relayer);
93103 vm.expectRevert ("RateLimits/rate-limit-exceeded " );
94- mainnetController.depositToWeETH (1_000e18 + 1 );
104+ mainnetController.depositToWeETH (1_000e18 + 1 , 0 );
95105
96106 vm.prank (relayer);
97- mainnetController.depositToWeETH (1_000e18 );
107+ mainnetController.depositToWeETH (1_000e18 , 0 );
108+ }
109+
110+ function test_depositToWeETH_slippageTooHighBoundary () external {
111+ bytes32 key = mainnetController.LIMIT_WEETH_DEPOSIT ();
112+
113+ vm.prank (Ethereum.SPARK_PROXY);
114+ rateLimits.setRateLimitData (key, 1_000e18 , uint256 (1_000e18 ) / 1 days);
115+
116+ deal (Ethereum.WETH, address (almProxy), 1_000e18 );
117+
118+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
119+
120+ vm.prank (relayer);
121+ vm.expectRevert ("MC/slippage-too-high " );
122+ mainnetController.depositToWeETH (1_000e18 , minSharesOut + 1 );
123+
124+ vm.prank (relayer);
125+ mainnetController.depositToWeETH (1_000e18 , minSharesOut);
98126 }
99127
100128}
@@ -119,10 +147,12 @@ contract MainnetControllerDepositToWeETHTests is MainnetControllerWeETHTestBase
119147 assertEq (weETH.balanceOf (address (almProxy)), 0 );
120148 assertEq (address (liquidityPool).balance, initialLiquidityPoolBalance);
121149
150+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
151+
122152 vm.record ();
123153
124154 vm.prank (relayer);
125- uint256 shares = mainnetController.depositToWeETH (1_000e18 );
155+ uint256 shares = mainnetController.depositToWeETH (1_000e18 , minSharesOut );
126156
127157 _assertReentrancyGuardWrittenToTwice ();
128158
@@ -207,8 +237,10 @@ contract MainnetControllerRequestWithdrawFromWeETHTests is MainnetControllerWeET
207237
208238 deal (Ethereum.WETH, address (almProxy), 1_000e18 );
209239
240+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
241+
210242 vm.prank (relayer);
211- mainnetController.depositToWeETH (1_000e18 );
243+ mainnetController.depositToWeETH (1_000e18 , minSharesOut );
212244
213245 uint256 initialWeETHBalance = weETH.balanceOf (address (almProxy));
214246
@@ -239,7 +271,7 @@ contract MainnetControllerRequestWithdrawFromWeETHTests is MainnetControllerWeET
239271
240272 vm.prank (WITHDRAW_REQUEST_NFT_ADMIN);
241273 IWithdrawRequestNFTLike (withdrawRequestNFT).finalizeRequests (requestId);
242-
274+
243275 assertEq (withdrawRequestNFT.isFinalized (requestId), true );
244276 assertEq (withdrawRequestNFT.getClaimableAmount (requestId), expectedEEthBalance - 1 ); // Rounding error
245277
@@ -284,8 +316,10 @@ contract MainnetControllerClaimWithdrawalFromWeETHFailureTests is MainnetControl
284316
285317 deal (Ethereum.WETH, address (almProxy), 1_000e18 );
286318
319+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
320+
287321 vm.prank (relayer);
288- mainnetController.depositToWeETH (1_000e18 );
322+ mainnetController.depositToWeETH (1_000e18 , minSharesOut );
289323
290324 vm.record ();
291325
@@ -331,8 +365,10 @@ contract MainnetControllerClaimWithdrawalFromWeETHFailureTests is MainnetControl
331365
332366 deal (Ethereum.WETH, address (almProxy), 1_000e18 );
333367
368+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
369+
334370 vm.prank (relayer);
335- mainnetController.depositToWeETH (1_000e18 );
371+ mainnetController.depositToWeETH (1_000e18 , minSharesOut );
336372
337373 vm.record ();
338374
@@ -345,7 +381,7 @@ contract MainnetControllerClaimWithdrawalFromWeETHFailureTests is MainnetControl
345381
346382 vm.prank (WITHDRAW_REQUEST_NFT_ADMIN);
347383 IWithdrawRequestNFTLike (withdrawRequestNFT).invalidateRequest (requestId);
348-
384+
349385 vm.prank (relayer);
350386 vm.expectRevert ("WeEthModule/invalid-request-id " );
351387 mainnetController.claimWithdrawalFromWeETH (weETHModule, requestId);
@@ -372,8 +408,10 @@ contract MainnetControllerClaimWithdrawalFromWeETHFailureTests is MainnetControl
372408
373409 deal (Ethereum.WETH, address (almProxy), 1_000e18 );
374410
411+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
412+
375413 vm.prank (relayer);
376- mainnetController.depositToWeETH (1_000e18 );
414+ mainnetController.depositToWeETH (1_000e18 , minSharesOut );
377415
378416 vm.record ();
379417
@@ -415,8 +453,10 @@ contract MainnetControllerClaimWithdrawalFromWeETHTests is MainnetControllerWeET
415453
416454 deal (Ethereum.WETH, address (almProxy), 1_000e18 );
417455
456+ uint256 minSharesOut = _getMinSharesOut (1_000e18 );
457+
418458 vm.prank (relayer);
419- mainnetController.depositToWeETH (1_000e18 );
459+ mainnetController.depositToWeETH (1_000e18 , minSharesOut );
420460
421461 vm.record ();
422462
0 commit comments