diff --git a/src/onchain/TestArbitrage.sol b/src/onchain/TestArbitrage.sol index 95aee21..6d60451 100644 --- a/src/onchain/TestArbitrage.sol +++ b/src/onchain/TestArbitrage.sol @@ -207,6 +207,42 @@ contract TestArbitrage is IFlashLoanRecipient, ReentrancyGuard, Ownable, Pausabl /// @param executor Address executing the emergency action event EmergencyAction(string action, address token, uint256 amount, address executor); + ////////////////////////////////////////////////////////////// + // MODIFIERS // + ////////////////////////////////////////////////////////////// + + /// @notice Restricts access to authorized traders or owner + /// @dev Prevents unauthorized trade execution + modifier onlyAuthorized() { + require(authorizedTraders[msg.sender] || msg.sender == owner(), "TestArbitrage: Not authorized to trade"); + _; + } + + /// @notice Validates trade parameters before execution + /// @param params Trade parameters to validate + /// @dev Comprehensive validation of all trade inputs + modifier validTradeParams(TradeParams memory params) { + require(params.routerPath.length == 2, "TestArbitrage: Must provide exactly 2 routers"); + require(params.tokenPath.length == 2, "TestArbitrage: Must provide exactly 2 tokens"); + require(params.tokenPath[0] != params.tokenPath[1], "TestArbitrage: Tokens must be different"); + require( + params.routerPath[0] != address(0) && params.routerPath[1] != address(0), + "TestArbitrage: Invalid router addresses" + ); + require( + params.tokenPath[0] != address(0) && params.tokenPath[1] != address(0), + "TestArbitrage: Invalid token addresses" + ); + require(params.fee > 0 && params.fee <= 10000, "TestArbitrage: Invalid fee tier"); + require( + params.minProfitBps >= MIN_PROFIT_BPS && params.minProfitBps <= MAX_BPS, + "TestArbitrage: Invalid profit threshold" + ); + require(params.maxSlippageBps <= MAX_SLIPPAGE_BPS, "TestArbitrage: Slippage too high"); + require(params.deadline >= block.timestamp, "TestArbitrage: Trade deadline passed"); + _; + } + ////////////////////////////////////////////////////////////// // CONSTRUCTOR // //////////////////////////////////////////////////////////////