# ERC20SwapModule

### Overview

`ERC20SwapModule` contract facilitates ERC20 token swaps based on predefined parameters.

### Key Features

* **Secure ERC20 Swaps**: Enables ERC20 swaps with security checks on input and output amounts.
* **Parameter Validation**: Ensures swap parameters like deadlines and minimum amounts are respected.
* **Allowance Management**: Uses `forceApprove` to manage allowances securely after swaps.

### Error Definitions

* **Deadline**: Raised when the swap operation exceeds the specified deadline.
* **SwapFailed**: The swap operation did not execute successfully.
* **InvalidSwapAmounts**: Input or output amounts don't meet the expected values.

### Methods

1. **Swap Function**
   * `swap(SwapParams, address, bytes)`: Executes a token swap based on provided parameters.
     * **params**: Contains details of the swap operation:
       * **tokenIn**: The address of the input token.
       * **tokenOut**: The address of the output token.
       * **amountIn**: The amount of the input token to swap.
       * **minAmountOut**: The minimum acceptable amount of the output token.
       * **deadline**: The deadline for completing the swap.
     * **to**: Address of the swap target.
     * **data**: Call data required to execute the swap operation.
     * **Returns**: The response from the swap call.
     * **Errors**:
       * `Deadline`: If the current timestamp is past the deadline.
       * `InvalidSwapAmounts`: If the amount of tokens swapped does not match the specified input or output criteria.
       * `SwapFailed`: The swap operation failed to execute successfully.

### Event

* `ERC20SwapModuleSwap(SwapParams, address, bytes, uint256, bytes)`: Emitted after a swap is successfully executed.
  * **params**: The parameters used for the swap.
  * **to**: The address of the swap target.
  * **data**: The call data used for the swap.
  * **timestamp**: The timestamp when the swap was completed.
  * **response**: The response data returned from the swap operation.
