> For the complete documentation index, see [llms.txt](https://docs.connext.network/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.connext.network/developers/reference/contracts/stableswap.md).

# Stableswap

## Events

### TokenSwap

```solidity
event TokenSwap(bytes32 key, address buyer, uint256 tokensSold, uint256 tokensBought, uint128 soldId, uint128 boughtId)
```

### AddLiquidity

```solidity
event AddLiquidity(bytes32 key, address provider, uint256[] tokenAmounts, uint256[] fees, uint256 invariant, uint256 lpTokenSupply)
```

### RemoveLiquidity

```solidity
event RemoveLiquidity(bytes32 key, address provider, uint256[] tokenAmounts, uint256 lpTokenSupply)
```

### RemoveLiquidityOne

```solidity
event RemoveLiquidityOne(bytes32 key, address provider, uint256 lpTokenAmount, uint256 lpTokenSupply, uint256 boughtId, uint256 tokensBought)
```

***

## Getters

### getSwapStorage

```solidity
function getSwapStorage(bytes32 key) external view returns (struct SwapUtils.Swap)
```

Return Stable swap storage

#### Parameters

| Name | Type    | Description                       |
| ---- | ------- | --------------------------------- |
| key  | bytes32 | Hash of the canonical id + domain |

#### Return Values

| Name | Type                  | Description    |
| ---- | --------------------- | -------------- |
| \[0] | struct SwapUtils.Swap | SwapUtils.Swap |

### getSwapLPToken

```solidity
function getSwapLPToken(bytes32 key) external view returns (address)
```

Return LP token for canonical Id

#### Parameters

| Name | Type    | Description                       |
| ---- | ------- | --------------------------------- |
| key  | bytes32 | Hash of the canonical id + domain |

#### Return Values

| Name | Type    | Description |
| ---- | ------- | ----------- |
| \[0] | address | LPToken     |

### getSwapA

```solidity
function getSwapA(bytes32 key) external view returns (uint256)
```

Return A, the amplification coefficient \_ n \_ (n - 1)

*See the StableSwap paper for details*

#### Parameters

| Name | Type    | Description                       |
| ---- | ------- | --------------------------------- |
| key  | bytes32 | Hash of the canonical id + domain |

#### Return Values

| Name | Type    | Description |
| ---- | ------- | ----------- |
| \[0] | uint256 | A parameter |

### getSwapAPrecise

```solidity
function getSwapAPrecise(bytes32 key) external view returns (uint256)
```

Return A in its raw precision form

*See the StableSwap paper for details*

#### Parameters

| Name | Type    | Description                       |
| ---- | ------- | --------------------------------- |
| key  | bytes32 | Hash of the canonical id + domain |

#### Return Values

| Name | Type    | Description                           |
| ---- | ------- | ------------------------------------- |
| \[0] | uint256 | A parameter in its raw precision form |

### getSwapToken

```solidity
function getSwapToken(bytes32 key, uint8 index) public view returns (contract IERC20)
```

Return address of the pooled token at given index. Reverts if tokenIndex is out of range.

#### Parameters

| Name  | Type    | Description                       |
| ----- | ------- | --------------------------------- |
| key   | bytes32 | Hash of the canonical id + domain |
| index | uint8   | the index of the token            |

#### Return Values

| Name | Type            | Description                         |
| ---- | --------------- | ----------------------------------- |
| \[0] | contract IERC20 | address of the token at given index |

### getSwapTokenIndex

```solidity
function getSwapTokenIndex(bytes32 key, address tokenAddress) public view returns (uint8)
```

Return the index of the given token address. Reverts if no matching token is found.

#### Parameters

| Name         | Type    | Description                       |
| ------------ | ------- | --------------------------------- |
| key          | bytes32 | Hash of the canonical id + domain |
| tokenAddress | address | address of the token              |

#### Return Values

| Name | Type  | Description                          |
| ---- | ----- | ------------------------------------ |
| \[0] | uint8 | the index of the given token address |

### getSwapTokenBalance

```solidity
function getSwapTokenBalance(bytes32 key, uint8 index) external view returns (uint256)
```

Return current balance of the pooled token at given index

#### Parameters

| Name  | Type    | Description                       |
| ----- | ------- | --------------------------------- |
| key   | bytes32 | Hash of the canonical id + domain |
| index | uint8   | the index of the token            |

#### Return Values

| Name | Type    | Description                                                                      |
| ---- | ------- | -------------------------------------------------------------------------------- |
| \[0] | uint256 | current balance of the pooled token at given index with token's native precision |

### getSwapVirtualPrice

```solidity
function getSwapVirtualPrice(bytes32 key) external view returns (uint256)
```

Get the virtual price, to help calculate profit

#### Parameters

| Name | Type    | Description                       |
| ---- | ------- | --------------------------------- |
| key  | bytes32 | Hash of the canonical id + domain |

#### Return Values

| Name | Type    | Description                                                |
| ---- | ------- | ---------------------------------------------------------- |
| \[0] | uint256 | the virtual price, scaled to the POOL\_PRECISION\_DECIMALS |

### calculateSwap

```solidity
function calculateSwap(bytes32 key, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx) external view returns (uint256)
```

Calculate amount of tokens you receive on swap

#### Parameters

| Name           | Type    | Description                                                                                                                               |
| -------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| key            | bytes32 | Hash of the canonical id + domain                                                                                                         |
| tokenIndexFrom | uint8   | the token the user wants to sell                                                                                                          |
| tokenIndexTo   | uint8   | the token the user wants to buy                                                                                                           |
| dx             | uint256 | the amount of tokens the user wants to sell. If the token charges a fee on transfers, use the amount that gets transferred after the fee. |

#### Return Values

| Name | Type    | Description                            |
| ---- | ------- | -------------------------------------- |
| \[0] | uint256 | amount of tokens the user will receive |

### calculateSwapTokenAmount

```solidity
function calculateSwapTokenAmount(bytes32 key, uint256[] amounts, bool deposit) external view returns (uint256)
```

A simple method to calculate prices from deposits or withdrawals, excluding fees but including slippage. This is helpful as an input into the various "min" parameters on calls to fight front-running

*This shouldn't be used outside frontends for user estimates.*

#### Parameters

| Name    | Type       | Description                                                                                                                                                                                                                                 |
| ------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| key     | bytes32    | Hash of the canonical id + domain                                                                                                                                                                                                           |
| amounts | uint256\[] | an array of token amounts to deposit or withdrawal, corresponding to pooledTokens. The amount should be in each pooled token's native precision. If a token charges a fee on transfers, use the amount that gets transferred after the fee. |
| deposit | bool       | whether this is a deposit or a withdrawal                                                                                                                                                                                                   |

#### Return Values

| Name | Type    | Description                        |
| ---- | ------- | ---------------------------------- |
| \[0] | uint256 | token amount the user will receive |

### calculateRemoveSwapLiquidity

```solidity
function calculateRemoveSwapLiquidity(bytes32 key, uint256 amount) external view returns (uint256[])
```

A simple method to calculate amount of each underlying tokens that is returned upon burning given amount of LP tokens

#### Parameters

| Name   | Type    | Description                                                |
| ------ | ------- | ---------------------------------------------------------- |
| key    | bytes32 | Hash of the canonical id + domain                          |
| amount | uint256 | the amount of LP tokens that would be burned on withdrawal |

#### Return Values

| Name | Type       | Description                                        |
| ---- | ---------- | -------------------------------------------------- |
| \[0] | uint256\[] | array of token balances that the user will receive |

### calculateRemoveSwapLiquidityOneToken

```solidity
function calculateRemoveSwapLiquidityOneToken(bytes32 key, uint256 tokenAmount, uint8 tokenIndex) external view returns (uint256 availableTokenAmount)
```

Calculate the amount of underlying token available to withdraw when withdrawing via only single token

#### Parameters

| Name        | Type    | Description                            |
| ----------- | ------- | -------------------------------------- |
| key         | bytes32 | Hash of the canonical id + domain      |
| tokenAmount | uint256 | the amount of LP token to burn         |
| tokenIndex  | uint8   | index of which token will be withdrawn |

#### Return Values

| Name                 | Type    | Description                                                 |
| -------------------- | ------- | ----------------------------------------------------------- |
| availableTokenAmount | uint256 | calculated amount of underlying token available to withdraw |

***

## Functions

### swap

```solidity
function swap(bytes32 key, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx, uint256 minDy, uint256 deadline) external returns (uint256)
```

Swap two tokens using this pool

#### Parameters

| Name           | Type    | Description                                               |
| -------------- | ------- | --------------------------------------------------------- |
| key            | bytes32 | Hash of the canonical id + domain                         |
| tokenIndexFrom | uint8   | the token the user wants to swap from                     |
| tokenIndexTo   | uint8   | the token the user wants to swap to                       |
| dx             | uint256 | the amount of tokens the user wants to swap from          |
| minDy          | uint256 | the min amount the user would like to receive, or revert. |
| deadline       | uint256 | latest timestamp to accept this transaction               |

### swapExact

```solidity
function swapExact(bytes32 key, uint256 amountIn, address assetIn, address assetOut, uint256 minAmountOut, uint256 deadline) external returns (uint256)
```

Swap two tokens using this pool

#### Parameters

| Name         | Type    | Description                                      |
| ------------ | ------- | ------------------------------------------------ |
| key          | bytes32 | Hash of the canonical id + domain                |
| amountIn     | uint256 | the amount of tokens the user wants to swap from |
| assetIn      | address | the token the user wants to swap from            |
| assetOut     | address | the token the user wants to swap to              |
| minAmountOut | uint256 |                                                  |
| deadline     | uint256 |                                                  |

### swapExactOut

```solidity
function swapExactOut(bytes32 key, uint256 amountOut, address assetIn, address assetOut, uint256 maxAmountIn, uint256 deadline) external returns (uint256)
```

Swap two tokens using this pool

#### Parameters

| Name        | Type    | Description                                    |
| ----------- | ------- | ---------------------------------------------- |
| key         | bytes32 | Hash of the canonical id + domain              |
| amountOut   | uint256 | the amount of tokens the user wants to swap to |
| assetIn     | address | the token the user wants to swap from          |
| assetOut    | address | the token the user wants to swap to            |
| maxAmountIn | uint256 |                                                |
| deadline    | uint256 |                                                |

### addSwapLiquidity

```solidity
function addSwapLiquidity(bytes32 key, uint256[] amounts, uint256 minToMint, uint256 deadline) external returns (uint256)
```

Add liquidity to the pool with the given amounts of tokens

#### Parameters

| Name      | Type       | Description                                                                                                             |
| --------- | ---------- | ----------------------------------------------------------------------------------------------------------------------- |
| key       | bytes32    | Hash of the canonical id + domain                                                                                       |
| amounts   | uint256\[] | the amounts of each token to add, in their native precision                                                             |
| minToMint | uint256    | the minimum LP tokens adding this amount of liquidity should mint, otherwise revert. Handy for front-running mitigation |
| deadline  | uint256    | latest timestamp to accept this transaction                                                                             |

#### Return Values

| Name | Type    | Description                                 |
| ---- | ------- | ------------------------------------------- |
| \[0] | uint256 | amount of LP token user minted and received |

### removeSwapLiquidity

```solidity
function removeSwapLiquidity(bytes32 key, uint256 amount, uint256[] minAmounts, uint256 deadline) external returns (uint256[])
```

Burn LP tokens to remove liquidity from the pool. Withdraw fee that decays linearly over period of 4 weeks since last deposit will apply.

*Liquidity can always be removed, even when the pool is paused.*

#### Parameters

| Name       | Type       | Description                                                                                                  |
| ---------- | ---------- | ------------------------------------------------------------------------------------------------------------ |
| key        | bytes32    | Hash of the canonical id + domain                                                                            |
| amount     | uint256    | the amount of LP tokens to burn                                                                              |
| minAmounts | uint256\[] | the minimum amounts of each token in the pool acceptable for this burn. Useful as a front-running mitigation |
| deadline   | uint256    | latest timestamp to accept this transaction                                                                  |

#### Return Values

| Name | Type       | Description                     |
| ---- | ---------- | ------------------------------- |
| \[0] | uint256\[] | amounts of tokens user received |

### removeSwapLiquidityOneToken

```solidity
function removeSwapLiquidityOneToken(bytes32 key, uint256 tokenAmount, uint8 tokenIndex, uint256 minAmount, uint256 deadline) external returns (uint256)
```

Remove liquidity from the pool all in one token. Withdraw fee that decays linearly over period of 4 weeks since last deposit will apply.

#### Parameters

| Name        | Type    | Description                                      |
| ----------- | ------- | ------------------------------------------------ |
| key         | bytes32 | Hash of the canonical id + domain                |
| tokenAmount | uint256 | the amount of the token you want to receive      |
| tokenIndex  | uint8   | the index of the token you want to receive       |
| minAmount   | uint256 | the minimum amount to withdraw, otherwise revert |
| deadline    | uint256 | latest timestamp to accept this transaction      |

#### Return Values

| Name | Type    | Description                          |
| ---- | ------- | ------------------------------------ |
| \[0] | uint256 | amount of chosen token user received |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.connext.network/developers/reference/contracts/stableswap.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
