function executeOperation(
address _asset,
uint256 _amount,
uint256 _premium,
address _initiator,
bytes calldata _params
) external returns (bool) {
require(msg.sender == address(aavePool), "Caller must be Aave Pool");
require(_initiator == address(this), "Initiator must be this contract");
OperationType opType = abi.decode(_params, (OperationType));
if (opType == OperationType.OPEN) {
return _executeOpenOperation(_asset, _amount, _premium, _params);
} else {
return _executeUnwindOperation(_asset, _amount, _premium, _params);
}
}
function _executeOpenOperation(address _asset, uint256 _amount, uint256 _premium, bytes calldata _params)
internal
returns (bool)
{
(, address user, FlashLoanParams memory flashParams) =
abi.decode(_params, (OperationType, address, FlashLoanParams));
function _executeOpenOperation(address _asset, uint256 _amount, uint256 _premium, bytes calldata _params)
internal
returns (bool)
{
(, address user, FlashLoanParams memory flashParams) =
abi.decode(_params, (OperationType, address, FlashLoanParams));
+
+ // Validate user authorization - store authorized user in state variable
+ require(user == authorizedUser, "Unauthorized user in params");
+ delete authorizedUser; // Clear after use
// ... rest of function
}
function createLeveragedPosition(
address _flashLoanToken,
uint256 _flashLoanAmount,
uint256 _collateralAmount,
address _borrowToken,
uint256 _borrowAmount,
bytes calldata _oneInchSwapData,
uint256 _minReturnAmount
) public onlyOwner {
require(_collateralAmount > 0, "Collateral Cannot be Zero");
+
+ // Store authorized user before flash loan
+ authorizedUser = msg.sender;
+
IERC20(_flashLoanToken).transferFrom(msg.sender, address(this), _collateralAmount);
function _executeOpenOperation(address _asset, uint256 _amount, uint256 _premium, bytes calldata _params)
internal
returns (bool)
{
(, address user, FlashLoanParams memory flashParams) =
abi.decode(_params, (OperationType, address, FlashLoanParams));
+
+ // Validate user authorization - store authorized user in state variable
+ require(user == authorizedUser, "Unauthorized user in params");
+ delete authorizedUser; // Clear after use
// ... rest of function
}
function createLeveragedPosition(
address _flashLoanToken,
uint256 _flashLoanAmount,
uint256 _collateralAmount,
address _borrowToken,
uint256 _borrowAmount,
bytes calldata _oneInchSwapData,
uint256 _minReturnAmount
) public onlyOwner {
require(_collateralAmount > 0, "Collateral Cannot be Zero");
+
+ // Store authorized user before flash loan
+ authorizedUser = msg.sender;
+
IERC20(_flashLoanToken).transferFrom(msg.sender, address(this), _collateralAmount);