> For the complete documentation index, see [llms.txt](https://docs.wombat.exchange/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.wombat.exchange/developers/integration-guideline/pool.md).

# Pool

contracts/wombat-core/pool/Pool.sol

> Title: Pool

> Notice: Manages deposits, withdrawals and swaps. Holds a mapping of assets and parameters.

> Details: The main entry-point of Wombat protocol Note: All variables are 18 decimals, except from that of underlying tokens

### *event* AssetAdded

\*\*\*Pool.AssetAdded(token, asset) \*\*\*

> Notice: An event thats emitted when an asset is added to Pool

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| token    | address  | indexed         |
| asset    | address  | indexed         |

### *event* AssetRemoved

\*\*\*Pool.AssetRemoved(token, asset) \*\*\*

> Notice: An event thats emitted when asset is removed from Pool

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| token    | address  | indexed         |
| asset    | address  | indexed         |

### *event* Deposit

\*\*\*Pool.Deposit(sender, token, amount, liquidity, to) \*\*\*

> Notice: An event thats emitted when a deposit is made to Pool

Arguments

| **name**  | **type** | **description** |
| --------- | -------- | --------------- |
| sender    | address  | indexed         |
| token     | address  | not indexed     |
| amount    | uint256  | not indexed     |
| liquidity | uint256  | not indexed     |
| to        | address  | indexed         |

### *event* FillPool

\*\*\*Pool.FillPool(token, amount) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| token    | address  | not indexed     |
| amount   | uint256  | not indexed     |

### *event* OwnershipTransferred

\*\*\*Pool.OwnershipTransferred(previousOwner, newOwner) \*\*\*

Arguments

| **name**      | **type** | **description** |
| ------------- | -------- | --------------- |
| previousOwner | address  | indexed         |
| newOwner      | address  | indexed         |

### *event* Paused

\*\*\*Pool.Paused(account) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| account  | address  | not indexed     |

### *event* PausedAsset

\*\*\*Pool.PausedAsset(asset, account) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| asset    | address  | not indexed     |
| account  | address  | not indexed     |

### *event* SetAmpFactor

\*\*\*Pool.SetAmpFactor(value) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| value    | uint256  | not indexed     |

### *event* SetDev

\*\*\*Pool.SetDev(addr) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| addr     | address  | not indexed     |

### *event* SetFee

\*\*\*Pool.SetFee(lpDividendRatio, retentionRatio) \*\*\*

Arguments

| **name**        | **type** | **description** |
| --------------- | -------- | --------------- |
| lpDividendRatio | uint256  | not indexed     |
| retentionRatio  | uint256  | not indexed     |

### *event* SetFeeTo

\*\*\*Pool.SetFeeTo(addr) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| addr     | address  | not indexed     |

### *event* SetHaircutRate

\*\*\*Pool.SetHaircutRate(value) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| value    | uint256  | not indexed     |

### *event* SetMasterWombat

\*\*\*Pool.SetMasterWombat(addr) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| addr     | address  | not indexed     |

### *event* SetMintFeeThreshold

\*\*\*Pool.SetMintFeeThreshold(value) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| value    | uint256  | not indexed     |

### *event* Swap

\*\*\*Pool.Swap(sender, fromToken, toToken, fromAmount, toAmount, to) \*\*\*

> Notice: An event thats emitted when a swap is made in Pool

Arguments

| **name**   | **type** | **description** |
| ---------- | -------- | --------------- |
| sender     | address  | indexed         |
| fromToken  | address  | not indexed     |
| toToken    | address  | not indexed     |
| fromAmount | uint256  | not indexed     |
| toAmount   | uint256  | not indexed     |
| to         | address  | indexed         |

### *event* TransferTipBucket

\*\*\*Pool.TransferTipBucket(token, amount, to) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| token    | address  | not indexed     |
| amount   | uint256  | not indexed     |
| to       | address  | not indexed     |

### *event* Unpaused

\*\*\*Pool.Unpaused(account) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| account  | address  | not indexed     |

### *event* UnpausedAsset

\*\*\*Pool.UnpausedAsset(asset, account) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| asset    | address  | not indexed     |
| account  | address  | not indexed     |

### *event* Withdraw

\*\*\*Pool.Withdraw(sender, token, amount, liquidity, to) \*\*\*

> Notice: An event thats emitted when a withdrawal is made from Pool

Arguments

| **name**  | **type** | **description** |
| --------- | -------- | --------------- |
| sender    | address  | indexed         |
| token     | address  | not indexed     |
| amount    | uint256  | not indexed     |
| liquidity | uint256  | not indexed     |
| to        | address  | indexed         |

### *function* addAsset

\*\*\*Pool.addAsset(token, asset) \*\*\*

> Notice: Adds asset to pool, reverts if asset already exists in pool

Arguments

| **name** | **type** | **description**                          |
| -------- | -------- | ---------------------------------------- |
| token    | address  | The address of token                     |
| asset    | address  | The address of the Wombat Asset contract |

### *function* addressOfAsset

***Pool.addressOfAsset(token) view***

> Notice: Gets Asset corresponding to ERC20 token. Reverts if asset does not exists in Pool.

> Details: to be used externally

Arguments

| **name** | **type** | **description**            |
| -------- | -------- | -------------------------- |
| token    | address  | The address of ERC20 token |

Outputs

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
|          | address  |                 |

### *function* ampFactor

***Pool.ampFactor() view***

> Notice: Amplification factor

Outputs

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
|          | uint256  |                 |

### *function* deposit

\*\*\*Pool.deposit(token, amount, minimumLiquidity, to, deadline, shouldStake) \*\*\*

> Notice: Deposits amount of tokens into pool ensuring deadline

> Details: Asset needs to be created and added to pool before any operation. This function assumes tax free token.

Arguments

| **name**         | **type** | **description**                                                    |
| ---------------- | -------- | ------------------------------------------------------------------ |
| token            | address  | The token address to be deposited                                  |
| amount           | uint256  | The amount to be deposited                                         |
| minimumLiquidity | uint256  |                                                                    |
| to               | address  | The user accountable for deposit, receiving the Wombat assets (lp) |
| deadline         | uint256  | The deadline to be respected                                       |
| shouldStake      | bool     |                                                                    |

Outputs

| **name**  | **type** | **description**              |
| --------- | -------- | ---------------------------- |
| liquidity | uint256  | Total asset liquidity minted |

### *function* dev

***Pool.dev() view***

> Notice: Dev address

Outputs

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
|          | address  |                 |

### *function* exchangeRate

***Pool.exchangeRate(token) view***

> Notice: Returns the exchange rate of the LP token

Arguments

| **name** | **type** | **description**          |
| -------- | -------- | ------------------------ |
| token    | address  | The address of the token |

Outputs

| **name** | **type** | **description**               |
| -------- | -------- | ----------------------------- |
| xr       | uint256  | The exchange rate of LP token |

### *function* feeTo

***Pool.feeTo() view***

Outputs

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
|          | address  |                 |

### *function* fillPool

\*\*\*Pool.fillPool(token, amount) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| token    | address  |                 |
| amount   | uint256  |                 |

### *function* getTokens

***Pool.getTokens() view***

> Notice: Return list of tokens in the pool

Outputs

| **name** | **type**   | **description** |
| -------- | ---------- | --------------- |
|          | address\[] |                 |

### *function* globalEquilCovRatio

***Pool.globalEquilCovRatio() view***

Outputs

| **name**        | **type** | **description** |
| --------------- | -------- | --------------- |
| equilCovRatio   | uint256  |                 |
| invariantInUint | uint256  |                 |

### *function* haircutRate

***Pool.haircutRate() view***

> Notice: Haircut rate

Outputs

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
|          | uint256  |                 |

### *function* initialize

\*\*\*Pool.initialize(ampFactor\_, haircutRate\_) \*\*\*

> Notice: Initializes pool. Dev is set to be the account calling this function.

Arguments

| **name**      | **type** | **description** |
| ------------- | -------- | --------------- |
| ampFactor\_   | uint256  |                 |
| haircutRate\_ | uint256  |                 |

### *function* lpDividendRatio

***Pool.lpDividendRatio() view***

> Notice: LP dividend ratio : the ratio of haircut that should distribute to LP

Outputs

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
|          | uint256  |                 |

### *function* masterWombat

***Pool.masterWombat() view***

Outputs

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
|          | address  |                 |

### *function* mintFee

\*\*\*Pool.mintFee(token) \*\*\*

> Notice: Send fee collected to the fee beneficiary

Arguments

| **name** | **type** | **description**                         |
| -------- | -------- | --------------------------------------- |
| token    | address  | The address of the token to collect fee |

### *function* mintFeeThreshold

***Pool.mintFeeThreshold() view***

> Notice: The threshold to mint fee (unit: WAD)

Outputs

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
|          | uint256  |                 |

### *function* owner

***Pool.owner() view***

> Details: Returns the address of the current owner.

Outputs

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
|          | address  |                 |

### *function* pause

\*\*\*Pool.pause() \*\*\*

> Details: pause pool, restricting certain operations

### *function* pauseAsset

\*\*\*Pool.pauseAsset(token) \*\*\*

> Details: pause asset, restricting deposit and swap operations

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| token    | address  |                 |

### *function* paused

***Pool.paused() view***

> Details: Returns true if the contract is paused, and false otherwise.

Outputs

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
|          | bool     |                 |

### *function* quoteAmountIn

***Pool.quoteAmountIn(fromToken, toToken, toAmount) view***

> Notice: Returns the minimum input asset amount required to buy the given output asset amount (accounting for fees and slippage)

> Details: To be used by frontend

Arguments

| **name**  | **type** | **description**          |
| --------- | -------- | ------------------------ |
| fromToken | address  | The initial ERC20 token  |
| toToken   | address  | The token wanted by user |
| toAmount  | int256   | The given output amount  |

Outputs

| **name** | **type** | **description**                   |
| -------- | -------- | --------------------------------- |
| amountIn | uint256  | The input amount required         |
| haircut  | uint256  | The haircut that would be applied |

### *function* quotePotentialDeposit

***Pool.quotePotentialDeposit(token, amount) view***

> Notice: Quotes potential deposit from pool

> Details: To be used by frontend

Arguments

| **name** | **type** | **description**              |
| -------- | -------- | ---------------------------- |
| token    | address  | The token to deposit by user |
| amount   | uint256  | The amount to deposit        |

Outputs

| **name**  | **type** | **description**                            |
| --------- | -------- | ------------------------------------------ |
| liquidity | uint256  | The potential liquidity user would receive |
| reward    | uint256  | reward                                     |

### *function* quotePotentialSwap

***Pool.quotePotentialSwap(fromToken, toToken, fromAmount) view***

> Notice: Given an input asset amount and token addresses, calculates the maximum output token amount (accounting for fees and slippage).

> Details: In reverse quote, the haircut is in the `fromAsset`

Arguments

| **name**   | **type** | **description**          |
| ---------- | -------- | ------------------------ |
| fromToken  | address  | The initial ERC20 token  |
| toToken    | address  | The token wanted by user |
| fromAmount | int256   | The given input amount   |

Outputs

| **name**         | **type** | **description**                         |
| ---------------- | -------- | --------------------------------------- |
| potentialOutcome | uint256  | The potential amount user would receive |
| haircut          | uint256  | The haircut that would be applied       |

### *function* quotePotentialWithdraw

***Pool.quotePotentialWithdraw(token, liquidity) view***

> Notice: Quotes potential withdrawal from pool

> Details: To be used by frontend

Arguments

| **name**  | **type** | **description**                                     |
| --------- | -------- | --------------------------------------------------- |
| token     | address  | The token to be withdrawn by user                   |
| liquidity | uint256  | The liquidity (amount of lp assets) to be withdrawn |

Outputs

| **name** | **type** | **description**                         |
| -------- | -------- | --------------------------------------- |
| amount   | uint256  | The potential amount user would receive |
| fee      | uint256  | The fee that would be applied           |

### *function* quotePotentialWithdrawFromOtherAsset

***Pool.quotePotentialWithdrawFromOtherAsset(fromToken, toToken, liquidity) view***

> Notice: Quotes potential withdrawal from other asset from the pool

> Details: To be used by frontend

Arguments

| **name**  | **type** | **description**                                              |
| --------- | -------- | ------------------------------------------------------------ |
| fromToken | address  | The corresponding token user holds the LP (Asset) from       |
| toToken   | address  | The token wanting to be withdrawn (needs to be well covered) |
| liquidity | uint256  | The liquidity (amount of the lp assets) to be withdrawn      |

Outputs

| **name**       | **type** | **description**                               |
| -------------- | -------- | --------------------------------------------- |
| amount         | uint256  | The potential amount user would receive       |
| withdrewAmount | uint256  | The amount of the from-token that is withdrew |

### *function* removeAsset

\*\*\*Pool.removeAsset(token) \*\*\*

> Notice: Removes asset from asset struct

> Details: Can only be called by owner

Arguments

| **name** | **type** | **description**                |
| -------- | -------- | ------------------------------ |
| token    | address  | The address of token to remove |

### *function* renounceOwnership

\*\*\*Pool.renounceOwnership() \*\*\*

> Details: Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.

### *function* retentionRatio

***Pool.retentionRatio() view***

> Notice: Retention ratio: the ratio of haircut that should stay in the pool

Outputs

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
|          | uint256  |                 |

### *function* setAmpFactor

\*\*\*Pool.setAmpFactor(ampFactor\_) \*\*\*

> Notice: Changes the pools amplification factor. Can only be set by the contract owner.

Arguments

| **name**    | **type** | **description**                 |
| ----------- | -------- | ------------------------------- |
| ampFactor\_ | uint256  | new pool's amplification factor |

### *function* setDev

\*\*\*Pool.setDev(dev\_) \*\*\*

> Notice: Changes the contract dev. Can only be set by the contract owner.

Arguments

| **name** | **type** | **description**          |
| -------- | -------- | ------------------------ |
| dev\_    | address  | new contract dev address |

### *function* setFee

\*\*\*Pool.setFee(lpDividendRatio\_, retentionRatio\_) \*\*\*

Arguments

| **name**          | **type** | **description** |
| ----------------- | -------- | --------------- |
| lpDividendRatio\_ | uint256  |                 |
| retentionRatio\_  | uint256  |                 |

### *function* setFeeTo

\*\*\*Pool.setFeeTo(feeTo\_) \*\*\*

> Notice: Changes the fee beneficiary. Can only be set by the contract owner. This value cannot be set to 0 to avoid unsettled fee.

Arguments

| **name** | **type** | **description**     |
| -------- | -------- | ------------------- |
| feeTo\_  | address  | new fee beneficiary |

### *function* setHaircutRate

\*\*\*Pool.setHaircutRate(haircutRate\_) \*\*\*

> Notice: Changes the pools haircutRate. Can only be set by the contract owner.

Arguments

| **name**      | **type** | **description**          |
| ------------- | -------- | ------------------------ |
| haircutRate\_ | uint256  | new pool's haircutRate\_ |

### *function* setMasterWombat

\*\*\*Pool.setMasterWombat(masterWombat\_) \*\*\*

Arguments

| **name**       | **type** | **description** |
| -------------- | -------- | --------------- |
| masterWombat\_ | address  |                 |

### *function* setMintFeeThreshold

\*\*\*Pool.setMintFeeThreshold(mintFeeThreshold\_) \*\*\*

> Notice: Set min fee to mint

Arguments

| **name**           | **type** | **description** |
| ------------------ | -------- | --------------- |
| mintFeeThreshold\_ | uint256  |                 |

### *function* swap

\*\*\*Pool.swap(fromToken, toToken, fromAmount, minimumToAmount, to, deadline) \*\*\*

> Notice: Swap fromToken for toToken, ensures deadline and minimumToAmount and sends quoted amount to `to` address

> Details: This function assumes tax free token.

Arguments

| **name**        | **type** | **description**                                            |
| --------------- | -------- | ---------------------------------------------------------- |
| fromToken       | address  | The token being inserted into Pool by user for swap        |
| toToken         | address  | The token wanted by user, leaving the Pool                 |
| fromAmount      | uint256  | The amount of from token inserted                          |
| minimumToAmount | uint256  | The minimum amount that will be accepted by user as result |
| to              | address  | The user receiving the result of swap                      |
| deadline        | uint256  | The deadline to be respected                               |

Outputs

| **name**       | **type** | **description** |
| -------------- | -------- | --------------- |
| actualToAmount | uint256  |                 |
| haircut        | uint256  |                 |

### *function* tipBucketBalance

***Pool.tipBucketBalance(token) view***

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| token    | address  |                 |

Outputs

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| balance  | uint256  |                 |

### *function* transferOwnership

\*\*\*Pool.transferOwnership(newOwner) \*\*\*

> Details: Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| newOwner | address  |                 |

### *function* transferTipBucket

\*\*\*Pool.transferTipBucket(token, amount, to) \*\*\*

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| token    | address  |                 |
| amount   | uint256  |                 |
| to       | address  |                 |

### *function* unpause

\*\*\*Pool.unpause() \*\*\*

> Details: unpause pool, enabling certain operations

### *function* unpauseAsset

\*\*\*Pool.unpauseAsset(token) \*\*\*

> Details: unpause asset, enabling deposit and swap operations

Arguments

| **name** | **type** | **description** |
| -------- | -------- | --------------- |
| token    | address  |                 |

### *function* withdraw

\*\*\*Pool.withdraw(token, liquidity, minimumAmount, to, deadline) \*\*\*

> Notice: Withdraws liquidity amount of asset to `to` address ensuring minimum amount required

Arguments

| **name**      | **type** | **description**                                  |
| ------------- | -------- | ------------------------------------------------ |
| token         | address  | The token to be withdrawn                        |
| liquidity     | uint256  | The liquidity to be withdrawn                    |
| minimumAmount | uint256  | The minimum amount that will be accepted by user |
| to            | address  | The user receiving the withdrawal                |
| deadline      | uint256  | The deadline to be respected                     |

Outputs

| **name** | **type** | **description**            |
| -------- | -------- | -------------------------- |
| amount   | uint256  | The total amount withdrawn |

### *function* withdrawFromOtherAsset

\*\*\*Pool.withdrawFromOtherAsset(fromToken, toToken, liquidity, minimumAmount, to, deadline) \*\*\*

> Notice: Enables withdrawing liquidity from an asset using LP from a different asset

Arguments

| **name**      | **type** | **description**                                              |
| ------------- | -------- | ------------------------------------------------------------ |
| fromToken     | address  | The corresponding token user holds the LP (Asset) from       |
| toToken       | address  | The token wanting to be withdrawn (needs to be well covered) |
| liquidity     | uint256  | The liquidity to be withdrawn (in fromToken decimal)         |
| minimumAmount | uint256  | The minimum amount that will be accepted by user             |
| to            | address  | The user receiving the withdrawal                            |
| deadline      | uint256  | The deadline to be respected                                 |

Outputs

| **name** | **type** | **description**            |
| -------- | -------- | -------------------------- |
| toAmount | uint256  | The total amount withdrawn |
