@@ -8,6 +8,7 @@ import { ISuperformRouterPlusAsync } from "src/interfaces/ISuperformRouterPlusAs
8
8
import { IBaseSuperformRouterPlus } from "src/interfaces/IBaseSuperformRouterPlus.sol " ;
9
9
import { IBaseRouter } from "src/interfaces/IBaseRouter.sol " ;
10
10
import { ERC20 } from "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol " ;
11
+ import { IERC4626 } from "openzeppelin-contracts/contracts/interfaces/IERC4626.sol " ;
11
12
12
13
contract RejectEther {
13
14
// This function will revert when called, simulating a contract that can't receive native tokens
@@ -553,6 +554,136 @@ contract SuperformRouterPlusTest is ProtocolActions {
553
554
SuperformRouterPlus (ROUTER_PLUS_SOURCE).deposit4626 { value: 1 ether }(address (mockVault), args);
554
555
}
555
556
557
+ function test_deposit4626_toleranceExceeded () public {
558
+ vm.startPrank (deployer);
559
+
560
+ // Deploy a mock ERC4626 vault
561
+ VaultMock mockVault = new VaultMock (IERC20 (getContract (SOURCE_CHAIN, "DAI " )), "Mock Vault " , "mVLT " );
562
+
563
+ // Mint some DAI to the deployer
564
+ uint256 daiAmount = 1e18 ;
565
+ deal (getContract (SOURCE_CHAIN, "DAI " ), deployer, daiAmount);
566
+
567
+ // Approve and deposit DAI into the mock vault
568
+ MockERC20 (getContract (SOURCE_CHAIN, "DAI " )).approve (address (mockVault), daiAmount);
569
+ uint256 vaultTokenAmount = mockVault.deposit (daiAmount, deployer);
570
+
571
+ // Mock the redeem function to return a value less than expected
572
+ vm.mockCall (
573
+ address (mockVault),
574
+ abi.encodeWithSelector (IERC4626 .redeem.selector , vaultTokenAmount, ROUTER_PLUS_SOURCE, ROUTER_PLUS_SOURCE),
575
+ abi.encode (1 ) // Return 1 wei
576
+ );
577
+
578
+ // Prepare deposit4626 args
579
+ ISuperformRouterPlus.Deposit4626Args memory args = ISuperformRouterPlus.Deposit4626Args ({
580
+ amount: vaultTokenAmount,
581
+ expectedOutputAmount: daiAmount,
582
+ maxSlippage: 100 , // 1%
583
+ receiverAddressSP: deployer,
584
+ depositCallData: _buildDepositCallData (superformId1, daiAmount)
585
+ });
586
+
587
+ // Approve RouterPlus to spend vault tokens
588
+ mockVault.approve (ROUTER_PLUS_SOURCE, vaultTokenAmount);
589
+
590
+ // Execute deposit4626
591
+ vm.recordLogs ();
592
+ vm.expectRevert (ISuperformRouterPlus.TOLERANCE_EXCEEDED.selector );
593
+ SuperformRouterPlus (ROUTER_PLUS_SOURCE).deposit4626 { value: 1 ether }(address (mockVault), args);
594
+
595
+ vm.stopPrank ();
596
+ }
597
+
598
+ function test_deposit4626_toleranceExceeded_noSlippage () public {
599
+ vm.startPrank (deployer);
600
+
601
+ // Deploy a mock ERC4626 vault
602
+ VaultMock mockVault = new VaultMock (IERC20 (getContract (SOURCE_CHAIN, "DAI " )), "Mock Vault " , "mVLT " );
603
+
604
+ // Mint some DAI to the deployer
605
+ uint256 daiAmount = 1e18 ;
606
+ deal (getContract (SOURCE_CHAIN, "DAI " ), deployer, daiAmount);
607
+
608
+ // Approve and deposit DAI into the mock vault
609
+ MockERC20 (getContract (SOURCE_CHAIN, "DAI " )).approve (address (mockVault), daiAmount);
610
+ uint256 vaultTokenAmount = mockVault.deposit (daiAmount, deployer);
611
+
612
+ // Mock the redeem function to return a value less than expected
613
+ vm.mockCall (
614
+ address (mockVault),
615
+ abi.encodeWithSelector (IERC4626 .redeem.selector , vaultTokenAmount, ROUTER_PLUS_SOURCE, ROUTER_PLUS_SOURCE),
616
+ abi.encode (daiAmount - 15 wei) // Return 15 wei less than expected
617
+ );
618
+
619
+ // Prepare deposit4626 args
620
+ ISuperformRouterPlus.Deposit4626Args memory args = ISuperformRouterPlus.Deposit4626Args ({
621
+ amount: vaultTokenAmount,
622
+ expectedOutputAmount: daiAmount,
623
+ maxSlippage: 100 , // 1%
624
+ receiverAddressSP: deployer,
625
+ depositCallData: _buildDepositCallData (superformId1, daiAmount)
626
+ });
627
+
628
+ // Approve RouterPlus to spend vault tokens
629
+ mockVault.approve (ROUTER_PLUS_SOURCE, vaultTokenAmount);
630
+
631
+ // Execute deposit4626
632
+ vm.recordLogs ();
633
+ vm.expectRevert (ISuperformRouterPlus.TOLERANCE_EXCEEDED.selector );
634
+ SuperformRouterPlus (ROUTER_PLUS_SOURCE).deposit4626 { value: 1 ether }(address (mockVault), args);
635
+
636
+ vm.stopPrank ();
637
+ }
638
+
639
+ function test_deposit4626_withinTolerance () public {
640
+ vm.startPrank (deployer);
641
+
642
+ // Deploy a mock ERC4626 vault
643
+ VaultMock mockVault = new VaultMock (IERC20 (getContract (SOURCE_CHAIN, "DAI " )), "Mock Vault " , "mVLT " );
644
+
645
+ // Mint some DAI to the deployer
646
+ uint256 daiAmount = 1e18 - 2 wei ;
647
+
648
+ // Approve and deposit DAI into the mock vault
649
+ MockERC20 (getContract (SOURCE_CHAIN, "DAI " )).approve (address (mockVault), daiAmount);
650
+ uint256 vaultTokenAmount = mockVault.deposit (daiAmount, deployer);
651
+
652
+ // Prepare deposit4626 args
653
+ ISuperformRouterPlus.Deposit4626Args memory args = ISuperformRouterPlus.Deposit4626Args ({
654
+ amount: vaultTokenAmount,
655
+ expectedOutputAmount: daiAmount, // Assuming 1:1 ratio for simplicity
656
+ maxSlippage: 100 , // 1%
657
+ receiverAddressSP: deployer,
658
+ depositCallData: _buildDepositCallData (superformId1, daiAmount)
659
+ });
660
+
661
+ // Approve RouterPlus to spend vault tokens
662
+ mockVault.approve (ROUTER_PLUS_SOURCE, vaultTokenAmount);
663
+
664
+ // Execute deposit4626
665
+ vm.recordLogs ();
666
+ SuperformRouterPlus (ROUTER_PLUS_SOURCE).deposit4626 { value: 1 ether }(address (mockVault), args);
667
+
668
+ // Verify the results
669
+ assertGt (
670
+ SuperPositions (SUPER_POSITIONS_SOURCE).balanceOf (deployer, superformId1),
671
+ 0 ,
672
+ "Superform balance should be greater than 0 "
673
+ );
674
+
675
+ // Check that the vault tokens were transferred from the deployer
676
+ assertEq (mockVault.balanceOf (deployer), 0 , "Deployer's vault token balance should be 0 " );
677
+
678
+ // Check that the RouterPlus contract doesn't hold any tokens
679
+ assertEq (mockVault.balanceOf (ROUTER_PLUS_SOURCE), 0 , "RouterPlus should not hold any vault tokens " );
680
+ assertEq (
681
+ MockERC20 (getContract (SOURCE_CHAIN, "DAI " )).balanceOf (ROUTER_PLUS_SOURCE),
682
+ 0 ,
683
+ "RouterPlus should not hold any DAI "
684
+ );
685
+ }
686
+
556
687
function test_rebalanceSinglePosition_errors () public {
557
688
vm.startPrank (deployer);
558
689
0 commit comments