# Router

The `UniswapV2Router02` contract facilitates interactions with the Uniswap decentralized exchange, including adding and removing liquidity, swapping tokens, and retrieving price quotes. It supports the following operations:

* **Add Liquidity:** Allows users to contribute tokens to liquidity pools.
* **Remove Liquidity:** Enables users to withdraw their tokens from liquidity pools.
* **Token Swaps:** Facilitates swapping of tokens through Uniswap pairs.
* **Supporting Fee-On-Transfer Tokens:** Handles tokens with transfer fees during liquidity removal and swaps.
* **Price Quotes and Amounts:** Provides functions to compute price quotes and required token amounts for swaps.

### State Variables

* `factory`: Address of the Uniswap V2 factory contract.
* `WETH`: Address of the wrapped ETH (WETH) token contract.

### Set Functions in UniswapV2Router02

#### `addLiquidity`

Adds liquidity to a pair of tokens.

Parameters:

* `address tokenA`: Address of token A.
* `address tokenB`: Address of token B.
* `uint amountADesired`: Desired amount of token A.
* `uint amountBDesired`: Desired amount of token B.
* `uint amountAMin`: Minimum amount of token A.
* `uint amountBMin`: Minimum amount of token B.
* `address to`: Address to receive liquidity tokens.
* `uint deadline`: Timestamp after which the transaction will revert.

#### `addLiquidityETH`

Adds liquidity to a token-ETH pair.

Parameters:

* `address token`: Address of the token.
* `uint amountTokenDesired`: Desired amount of the token.
* `uint amountTokenMin`: Minimum amount of the token.
* `uint amountETHMin`: Minimum amount of ETH.
* `address to`: Address to receive liquidity tokens.
* `uint deadline`: Timestamp after which the transaction will revert.

#### `removeLiquidity`

Removes liquidity from a pair of tokens.

Parameters:

* `address tokenA`: Address of token A.
* `address tokenB`: Address of token B.
* `uint liquidity`: Amount of liquidity tokens to remove.
* `uint amountAMin`: Minimum amount of token A.
* `uint amountBMin`: Minimum amount of token B.
* `address to`: Address to receive tokens.
* `uint deadline`: Timestamp after which the transaction will revert.

#### `removeLiquidityETH`

Removes liquidity from a token-ETH pair.

Parameters:

* `address token`: Address of the token.
* `uint liquidity`: Amount of liquidity tokens to remove.
* `uint amountTokenMin`: Minimum amount of the token.
* `uint amountETHMin`: Minimum amount of ETH.
* `address to`: Address to receive tokens.
* `uint deadline`: Timestamp after which the transaction will revert.

#### `removeLiquidityWithPermit`

Removes liquidity from a pair of tokens using a permit.

Parameters:

* `address tokenA`: Address of token A.
* `address tokenB`: Address of token B.
* `uint liquidity`: Amount of liquidity tokens to remove.
* `uint amountAMin`: Minimum amount of token A.
* `uint amountBMin`: Minimum amount of token B.
* `address to`: Address to receive tokens.
* `uint deadline`: Timestamp after which the transaction will revert.
* `bool approveMax`: Whether to approve the maximum amount.
* `uint8 v`: V value of the permit signature.
* `bytes32 r`: R value of the permit signature.
* `bytes32 s`: S value of the permit signature.

#### `removeLiquidityETHWithPermit`

Removes liquidity from a token-ETH pair using a permit.

Parameters:

* `address token`: Address of the token.
* `uint liquidity`: Amount of liquidity tokens to remove.
* `uint amountTokenMin`: Minimum amount of the token.
* `uint amountETHMin`: Minimum amount of ETH.
* `address to`: Address to receive tokens.
* `uint deadline`: Timestamp after which the transaction will revert.
* `bool approveMax`: Whether to approve the maximum amount.
* `uint8 v`: V value of the permit signature.
* `bytes32 r`: R value of the permit signature.
* `bytes32 s`: S value of the permit signature.

#### `swapExactTokensForTokens`

Swaps an exact amount of tokens for another token.

Parameters:

* `uint amountIn`: Amount of input tokens.
* `uint amountOutMin`: Minimum amount of output tokens.
* `address[] calldata path`: Array of token addresses to trade through.
* `address to`: Address to receive output tokens.
* `uint deadline`: Timestamp after which the transaction will revert.

#### `swapTokensForExactTokens`

Swaps tokens for an exact amount of another token.

Parameters:

* `uint amountOut`: Amount of output tokens.
* `uint amountInMax`: Maximum amount of input tokens.
* `address[] calldata path`: Array of token addresses to trade through.
* `address to`: Address to receive output tokens.
* `uint deadline`: Timestamp after which the transaction will revert.

#### `swapExactETHForTokens`

Swaps an exact amount of ETH for tokens.

Parameters:

* `uint amountOutMin`: Minimum amount of output tokens.
* `address[] calldata path`: Array of token addresses to trade through.
* `address to`: Address to receive output tokens.
* `uint deadline`: Timestamp after which the transaction will revert.

#### `swapTokensForExactETH`

Swaps tokens for an exact amount of ETH.

Parameters:

* `uint amountOut`: Amount of output ETH.
* `uint amountInMax`: Maximum amount of input tokens.
* `address[] calldata path`: Array of token addresses to trade through.
* `address to`: Address to receive ETH.
* `uint deadline`: Timestamp after which the transaction will revert.

#### `swapExactTokensForETH`

Swaps an exact amount of tokens for ETH.

Parameters:

* `uint amountIn`: Amount of input tokens.
* `uint amountOutMin`: Minimum amount of output ETH.
* `address[] calldata path`: Array of token addresses to trade through.
* `address to`: Address to receive ETH.
* `uint deadline`: Timestamp after which the transaction will revert.

#### `swapETHForExactTokens`

Swaps ETH for an exact amount of tokens.

Parameters:

* `uint amountOut`: Amount of output tokens.
* `address[] calldata path`: Array of token addresses to trade through.
* `address to`: Address to receive output tokens.
* `uint deadline`: Timestamp after which the transaction will revert.

### Read Functions

#### `factory`

Returns the address of the factory contract.

Parameters: None

Returns:

* `address`: Address of the factory contract.

Description: Retrieves the address of the factory contract used to create pairs of tokens.

#### `WETH`

Returns the address of the WETH token.

Parameters: None

Returns:

* `address`: Address of the WETH token.

Description: Retrieves the address of the Wrapped ETH (WETH) token used in the router.

#### `quote`

Calculates the amount of token B given an amount of token A and reserves.

Parameters:

* `uint amountA`: Amount of token A.
* `uint reserveA`: Reserve amount of token A.
* `uint reserveB`: Reserve amount of token B.

Returns:

* `uint amountB`: Amount of token B.

Description: Computes the equivalent amount of token B given the amount of token A and their respective reserves.

#### `getAmountOut`

Calculates the maximum output amount of the other asset given an input amount and pair reserves.

Parameters:

* `uint amountIn`: Input amount of the asset.
* `uint reserveIn`: Reserve amount of the input asset.
* `uint reserveOut`: Reserve amount of the output asset.

Returns:

* `uint amountOut`: Output amount of the asset.

Description: Determines the maximum output amount of the other asset given the input amount and the pair reserves.

#### `getAmountIn`

Calculates the required input amount of the other asset given an output amount and pair reserves.

Parameters:

* `uint amountOut`: Output amount of the asset.
* `uint reserveIn`: Reserve amount of the input asset.
* `uint reserveOut`: Reserve amount of the output asset.

Returns:

* `uint amountIn`: Input amount of the asset.

Description: Computes the required input amount of the other asset given the output amount and the pair reserves.

#### `getAmountsOut`

Performs chained `getAmountOut` calculations on any number of pairs.

Parameters:

* `uint amountIn`: Input amount of the first asset.
* `address[] memory path`: Array of token addresses to trade through.

Returns:

* `uint[] memory amounts`: Array of output amounts for each step in the path.

Description: Executes a series of `getAmountOut` calculations along a specified path of token pairs.

#### `getAmountsIn`

Performs chained `getAmountIn` calculations on any number of pairs.

Parameters:

* `uint amountOut`: Output amount of the last asset.
* `address[] memory path`: Array of token addresses to trade through.

Returns:

* `uint[] memory amounts`: Array of input amounts for each step in the path.

Description: Executes a series of `getAmountIn` calculations along a specified path of token pairs.

### Events

#### `PairCreated`

Emitted when a new liquidity pair is created.

* **Indexed Parameters**:
  * `address indexed token0`: The address of the first token in the pair.
  * `address indexed token1`: The address of the second token in the pair.
  * `address pair`: The address of the created pair.
* **Non-Indexed Parameters**:
  * `uint`: The length of allPairs array after the pair is created.

#### `Approval`

Emitted when a token approval is made.

* **Indexed Parameters**:
  * `address indexed owner`: The address of the token owner.
  * `address indexed spender`: The address of the spender.
* **Non-Indexed Parameters**:
  * `uint value`: The amount of tokens approved.

#### `Transfer`

Emitted when a token transfer occurs.

* **Indexed Parameters**:
  * `address indexed from`: The address of the sender.
  * `address indexed to`: The address of the recipient.
* **Non-Indexed Parameters**:
  * `uint value`: The amount of tokens transferred.

#### `Mint`

Emitted when liquidity is added to a pool.

* **Indexed Parameters**:
  * `address indexed sender`: The address that initiated the minting.
* **Non-Indexed Parameters**:
  * `uint amount0`: The amount of token0 added.
  * `uint amount1`: The amount of token1 added.

#### `Burn`

Emitted when liquidity is removed from a pool.

* **Indexed Parameters**:
  * `address indexed sender`: The address that initiated the burning.
  * `address indexed to`: The address that received the tokens.
* **Non-Indexed Parameters**:
  * `uint amount0`: The amount of token0 removed.
  * `uint amount1`: The amount of token1 removed.

#### `Swap`

Emitted when a swap occurs in the pool.

* **Indexed Parameters**:
  * `address indexed sender`: The address that initiated the swap.
  * `address indexed to`: The address that received the output tokens.
* **Non-Indexed Parameters**:
  * `uint amount0In`: The amount of token0 input.
  * `uint amount1In`: The amount of token1 input.
  * `uint amount0Out`: The amount of token0 output.
  * `uint amount1Out`: The amount of token1 output.

#### `Sync`

Emitted when reserves are synced in the pool.

* **Non-Indexed Parameters**:
  * `uint112 reserve0`: The reserve of token0.
  * `uint112 reserve1`: The reserve of token1.

#### `Deposit`

Emitted when ETH is deposited to the WETH contract.

* **Indexed Parameters**:
  * `address indexed sender`: The address that deposited ETH.
* **Non-Indexed Parameters**:
  * `uint value`: The amount of ETH deposited.

#### `Withdraw`

Emitted when ETH is withdrawn from the WETH contract.

* **Indexed Parameters**:
  * `address indexed sender`: The address that withdrew ETH.
* **Non-Indexed Parameters**:
  * `uint value`: The amount of ETH withdrawn.
