// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; /** * @title IFlashLoanRouter * @notice Interface for multi-provider flash loan router * @dev Aggregates flash loans from Aave, Balancer, Uniswap, DAI flash mint */ interface IFlashLoanRouter { enum FlashLoanProvider { AAVE, BALANCER, UNISWAP, DAI_FLASH } /** * @notice Flash loan parameters * @param asset Asset to borrow * @param amount Amount to borrow * @param provider Provider to use (or AUTO for liquidity-weighted) */ struct FlashLoanParams { address asset; uint256 amount; FlashLoanProvider provider; } /** * @notice Emitted when flash loan is initiated * @param asset Asset borrowed * @param amount Amount borrowed * @param provider Provider used */ event FlashLoanInitiated( address indexed asset, uint256 amount, FlashLoanProvider provider ); /** * @notice Emitted when flash loan is repaid * @param asset Asset repaid * @param amount Amount repaid (principal + fee) */ event FlashLoanRepaid(address indexed asset, uint256 amount); /** * @notice Execute a flash loan with callback * @param params Flash loan parameters * @param callbackData Data to pass to callback */ function flashLoan( FlashLoanParams memory params, bytes memory callbackData ) external; /** * @notice Execute multi-asset flash loan * @param params Array of flash loan parameters * @param callbackData Data to pass to callback */ function flashLoanBatch( FlashLoanParams[] memory params, bytes memory callbackData ) external; /** * @notice Get available liquidity for an asset from a provider * @param asset Asset address * @param provider Provider to check * @return available Available liquidity */ function getAvailableLiquidity( address asset, FlashLoanProvider provider ) external view returns (uint256 available); /** * @notice Get fee for flash loan from a provider * @param asset Asset address * @param amount Amount to borrow * @param provider Provider to check * @return fee Fee amount */ function getFlashLoanFee( address asset, uint256 amount, FlashLoanProvider provider ) external view returns (uint256 fee); /** * @notice Callback function executed during flash loan * @param asset Asset borrowed * @param amount Amount borrowed * @param fee Fee for the flash loan * @param callbackData Data passed from caller */ function onFlashLoan( address asset, uint256 amount, uint256 fee, bytes calldata callbackData ) external returns (bytes32); }