@@ -33,6 +33,13 @@ contract SuperformRouterPlus is ISuperformRouterPlus, BaseSuperformRouterPlus {
33
33
/// @dev Tolerance constant to account for tokens with rounding issues on transfer
34
34
uint256 constant TOLERANCE_CONSTANT = 10 wei ;
35
35
36
+ //////////////////////////////////////////////////////////////
37
+ // ERRORS //
38
+ //////////////////////////////////////////////////////////////
39
+
40
+ /// @notice thrown if the receiver address is invalid
41
+ /// @dev notice this error was added to prevent malicious deposits
42
+ error RECEIVER_ADDRESS_MISMATCH ();
36
43
//////////////////////////////////////////////////////////////
37
44
// CONSTRUCTOR //
38
45
//////////////////////////////////////////////////////////////
@@ -485,7 +492,8 @@ contract SuperformRouterPlus is ISuperformRouterPlus, BaseSuperformRouterPlus {
485
492
revert Error.VAULT_IMPLEMENTATION_FAILED ();
486
493
}
487
494
488
- uint256 amountIn = _validateAndGetAmountIn (rebalanceToCallData, availableBalanceToDeposit);
495
+ uint256 amountIn =
496
+ _validateAndGetAmountIn (rebalanceToCallData, args.receiverAddressSP, availableBalanceToDeposit);
489
497
490
498
_deposit (router_, interimAsset, amountIn, args.rebalanceToMsgValue, rebalanceToCallData);
491
499
}
@@ -643,7 +651,7 @@ contract SuperformRouterPlus is ISuperformRouterPlus, BaseSuperformRouterPlus {
643
651
644
652
uint256 amountRedeemed = _redeemShare (vault, assetAdr, args.amount, args.expectedOutputAmount, args.maxSlippage);
645
653
646
- uint256 amountIn = _validateAndGetAmountIn (args.depositCallData, amountRedeemed);
654
+ uint256 amountIn = _validateAndGetAmountIn (args.depositCallData, args.receiverAddressSP, amountRedeemed);
647
655
648
656
address router = _getAddress (keccak256 ("SUPERFORM_ROUTER " ));
649
657
@@ -656,6 +664,7 @@ contract SuperformRouterPlus is ISuperformRouterPlus, BaseSuperformRouterPlus {
656
664
657
665
function _validateAndGetAmountIn (
658
666
bytes calldata rebalanceToCallData ,
667
+ address receiverAddressSP ,
659
668
uint256 availableBalanceToDeposit
660
669
)
661
670
internal
@@ -674,10 +683,12 @@ contract SuperformRouterPlus is ISuperformRouterPlus, BaseSuperformRouterPlus {
674
683
SingleVaultSFData memory sfData =
675
684
abi.decode (_parseCallData (rebalanceToCallData), (SingleDirectSingleVaultStateReq)).superformData;
676
685
amountIn = _takeAmountIn (sfData.liqRequest, sfData.amount);
686
+ _checkReceiverAddress (receiverAddressSP, sfData.receiverAddress, sfData.receiverAddressSP);
677
687
} else if (rebalanceToSelector == IBaseRouter.singleXChainSingleVaultDeposit.selector ) {
678
688
SingleVaultSFData memory sfData =
679
689
abi.decode (_parseCallData (rebalanceToCallData), (SingleXChainSingleVaultStateReq)).superformData;
680
690
amountIn = _takeAmountIn (sfData.liqRequest, sfData.amount);
691
+ _checkReceiverAddress (receiverAddressSP, sfData.receiverAddress, sfData.receiverAddressSP);
681
692
} else if (rebalanceToSelector == IBaseRouter.singleDirectMultiVaultDeposit.selector ) {
682
693
MultiVaultSFData memory sfData =
683
694
abi.decode (_parseCallData (rebalanceToCallData), (SingleDirectMultiVaultStateReq)).superformData;
@@ -687,6 +698,7 @@ contract SuperformRouterPlus is ISuperformRouterPlus, BaseSuperformRouterPlus {
687
698
amountInTemp = _takeAmountIn (sfData.liqRequests[i], sfData.amounts[i]);
688
699
amountIn += amountInTemp;
689
700
}
701
+ _checkReceiverAddress (receiverAddressSP, sfData.receiverAddress, sfData.receiverAddressSP);
690
702
} else if (rebalanceToSelector == IBaseRouter.singleXChainMultiVaultDeposit.selector ) {
691
703
MultiVaultSFData memory sfData =
692
704
abi.decode (_parseCallData (rebalanceToCallData), (SingleXChainMultiVaultStateReq)).superformsData;
@@ -695,13 +707,15 @@ contract SuperformRouterPlus is ISuperformRouterPlus, BaseSuperformRouterPlus {
695
707
amountInTemp = _takeAmountIn (sfData.liqRequests[i], sfData.amounts[i]);
696
708
amountIn += amountInTemp;
697
709
}
710
+ _checkReceiverAddress (receiverAddressSP, sfData.receiverAddress, sfData.receiverAddressSP);
698
711
} else if (rebalanceToSelector == IBaseRouter.multiDstSingleVaultDeposit.selector ) {
699
712
SingleVaultSFData[] memory sfData =
700
713
abi.decode (_parseCallData (rebalanceToCallData), (MultiDstSingleVaultStateReq)).superformsData;
701
714
uint256 lenDst = sfData.length ;
702
715
for (uint256 i; i < lenDst; ++ i) {
703
716
amountInTemp = _takeAmountIn (sfData[i].liqRequest, sfData[i].amount);
704
717
amountIn += amountInTemp;
718
+ _checkReceiverAddress (receiverAddressSP, sfData[i].receiverAddress, sfData[i].receiverAddressSP);
705
719
}
706
720
} else if (rebalanceToSelector == IBaseRouter.multiDstMultiVaultDeposit.selector ) {
707
721
MultiVaultSFData[] memory sfData =
@@ -713,6 +727,7 @@ contract SuperformRouterPlus is ISuperformRouterPlus, BaseSuperformRouterPlus {
713
727
amountInTemp = _takeAmountIn (sfData[i].liqRequests[j], sfData[i].amounts[j]);
714
728
amountIn += amountInTemp;
715
729
}
730
+ _checkReceiverAddress (receiverAddressSP, sfData[i].receiverAddress, sfData[i].receiverAddressSP);
716
731
}
717
732
}
718
733
@@ -726,4 +741,21 @@ contract SuperformRouterPlus is ISuperformRouterPlus, BaseSuperformRouterPlus {
726
741
revert ASSETS_RECEIVED_OUT_OF_SLIPPAGE ();
727
742
}
728
743
}
744
+
745
+ function _checkReceiverAddress (
746
+ address receiverAddressSP ,
747
+ address callDataReceiverAddress ,
748
+ address callDataReceiverAddressSP
749
+ )
750
+ internal
751
+ pure
752
+ {
753
+ /// @dev These checks below prevent a user approving funds to router plus while another user receives the
754
+ /// SuperPositions
755
+
756
+ /// @dev We force all receiver addresses to match
757
+ if (receiverAddressSP != callDataReceiverAddressSP || callDataReceiverAddressSP != callDataReceiverAddress) {
758
+ revert RECEIVER_ADDRESS_MISMATCH ();
759
+ }
760
+ }
729
761
}
0 commit comments