# IV2SwapRouter

Functions for swapping tokens via Dragonswap V2

### Functions <a href="#functions" id="functions"></a>

#### exactInputSingle <a href="#exactinputsingle" id="exactinputsingle"></a>

Swaps `amountIn` of one token for as much as possible of another token

*Setting `amountIn` to 0 will cause the contract to look up its own balance, and swap the entire amount, enabling contracts to send tokens before calling this function.*

```solidity
function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
```

**Parameters**

| Name     | Type                     | Description                                                                            |
| -------- | ------------------------ | -------------------------------------------------------------------------------------- |
| `params` | `ExactInputSingleParams` | The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata |

**Returns**

| Name        | Type      | Description                      |
| ----------- | --------- | -------------------------------- |
| `amountOut` | `uint256` | The amount of the received token |

#### exactInput <a href="#exactinput" id="exactinput"></a>

Swaps `amountIn` of one token for as much as possible of another along the specified path

*Setting `amountIn` to 0 will cause the contract to look up its own balance, and swap the entire amount, enabling contracts to send tokens before calling this function.*

```solidity
function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);
```

**Parameters**

| Name     | Type               | Description                                                                                |
| -------- | ------------------ | ------------------------------------------------------------------------------------------ |
| `params` | `ExactInputParams` | The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata |

**Returns**

| Name        | Type      | Description                      |
| ----------- | --------- | -------------------------------- |
| `amountOut` | `uint256` | The amount of the received token |

#### exactOutputSingle <a href="#exactoutputsingle" id="exactoutputsingle"></a>

Swaps as little as possible of one token for `amountOut` of another token that may remain in the router after the swap.

```solidity
function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);
```

**Parameters**

| Name     | Type                      | Description                                                                             |
| -------- | ------------------------- | --------------------------------------------------------------------------------------- |
| `params` | `ExactOutputSingleParams` | The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata |

**Returns**

| Name       | Type      | Description                   |
| ---------- | --------- | ----------------------------- |
| `amountIn` | `uint256` | The amount of the input token |

#### exactOutput <a href="#exactoutput" id="exactoutput"></a>

Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed) that may remain in the router after the swap.

```solidity
function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
```

**Parameters**

| Name     | Type                | Description                                                                                 |
| -------- | ------------------- | ------------------------------------------------------------------------------------------- |
| `params` | `ExactOutputParams` | The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata |

**Returns**

| Name       | Type      | Description                   |
| ---------- | --------- | ----------------------------- |
| `amountIn` | `uint256` | The amount of the input token |

### Structs <a href="#structs" id="structs"></a>

#### ExactInputSingleParams <a href="#exactinputsingleparams" id="exactinputsingleparams"></a>

```solidity
struct ExactInputSingleParams {
    address tokenIn;
    address tokenOut;
    uint24 fee;
    address recipient;
    uint256 amountIn;
    uint256 amountOutMinimum;
    uint160 sqrtPriceLimitX96;
}
```

#### ExactInputParams <a href="#exactinputparams" id="exactinputparams"></a>

```solidity
struct ExactInputParams {
    bytes path;
    address recipient;
    uint256 amountIn;
    uint256 amountOutMinimum;
}
```

#### ExactOutputSingleParams <a href="#exactoutputsingleparams" id="exactoutputsingleparams"></a>

```solidity
struct ExactOutputSingleParams {
    address tokenIn;
    address tokenOut;
    uint24 fee;
    address recipient;
    uint256 amountOut;
    uint256 amountInMaximum;
    uint160 sqrtPriceLimitX96;
}
```

#### ExactOutputParams <a href="#exactoutputparams" id="exactoutputparams"></a>

```solidity
struct ExactOutputParams {
    bytes path;
    address recipient;
    uint256 amountOut;
    uint256 amountInMaximum;
}
```
