# PlusPool

&#x20;This contract manages the leveraged assets of Meshswap's plus pool liquidity providers. Liquidity providers can maximize their returns with positive assets (deposited assets + utilized assets) by using positive deposits according to their deposited assets. However, a high asset utilization ratio can result in automatic returns, which can result in losses.&#x20;

## Code

Github Link: (Will be updated after official launch)

## Address

* Contract adress after production is deployed&#x20;

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**ChangeBorrowFactor**

```solidity
event ChangeBorrowFactor(uint newBorrowFactor);
```

* Event log of borrow factor change

**ChangeLiquidationFactor**

```solidity
event ChangeLiquidationFactor(uint newLiquidationFactor);
```

* Event log of liquidation factor change&#x20;

**ChangeBorrowable**

```solidity
event ChangeBorrowable(address token, bool b);
```

* Event that occurs when availability is changed

**GiveReward**

```solidity
event GiveReward(address user, uint amount, uint lastIndex, uint rewardSum);
```

* Event log of when mined MESH is claimed and distributed
* Parameters
  * `user` :  address of the user who claimed
  * `amount` :  the amount of MESH claimed
  * `lastIndex` :  index result of the pair of the wallet after claiming&#x20;
  * `rewardSum` :  The amount of MESH that has been accrued so far

**GiveAirdropReward**

```solidity
event GiveAirdropReward(address user, address dist, uint amount, uint currentIndex, uint userAirdropSum);
```

* Event log of when airdrop token is claimed and distributed
* Parameters
  * `user` :  address of the user who claimed
  * `dist` : Airdrop contract address
  * `amount` :  the amount of token claimed
  * `lastIndex` :  index result of the pair of the wallet after claiming&#x20;
  * `rewardSum` :  The amount of token that has been accrued so far

**OpenPosition**

```solidity
event OpenPosition(address user, uint amount0, uint amount1, uint borrow0, uint borrow1, uint amountLP, uint userLP);
```

* Events that occur when depositing to PlusPool
* If the token to deposit is MESH, `msg.value` is provided.
* Parameters
  * `user` : address of the user&#x20;
  * `amount0` : The deposit amount of token0
  * `amount1` : The deposit amount of token1
  * `borrow0` : The utilization amount of token0
  * `borrow1`: The utilization amount of token1
  * `amountLP`:  The amount of LP tokens minted due to additional liquidity
  * `userLP` :  the total amount of LP tokens minted due to additional liquidity

**ClosePosition**

```solidity
event ClosePosition(address user, uint amountLP, uint amount0, uint amount1, uint userLP);
```

* Events that occur when withdraw liquidity
* Parameters
  * `user` : address of the user&#x20;
  * `amountLP`:  The amount of LP tokens burned due to liquidity removal
  * `amount0` : The withdraw amount of token0
  * `amount1` : The withdraw amount of token1
  * `userLP` :  the total amount of LP tokens minted due to additional liquidity

**Liquidate**

```solidity
event Liquidate(address user, uint idx, uint debt0, uint debt1, uint lp, uint debtRatio, uint time);
```

* Event that occur when the automatic return system activates&#x20;
* Parameters
  * `user` : address of the user&#x20;
  * `idx` : Number of auto-return count
  * `dept0` : Number of token0 returned automatically
  * `dept1` : Number of token1 returned automatically
  * `lp` : the total amount of LP tokens&#x20;
  * `debtRatio` : Asset utilization ratio in case of automatic return
  * `time` : Automatic return time
    {% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

#### totalLP

* mint/burn depending on liquidity addition/removal

**lpToken**

* target liquidity pool address

#### token0

* The first token address composed of the pair

#### token1

* The second token address composed of the pair

#### borrowable0

* Whether token0 can be borrowable

#### borrowable1

* Whether token1 can be borrowable

#### liquidationFactor

* automatic return factor
* It is a value between 1 and 1e18, in units of 1/1e16%
* Default - 0.85e18

#### borrowFactor

* Utilization cost interest rate of utilized assets
* It is a value between 1 and 1e18, in units of 1/1e16%
* Default - 0.67e18

#### userLP

* Number of PlusPool tokens held by each address

#### liquidationBonusRate

* Ratio of resources to be used for MESH buyback & incineration in case of automatic return

#### liquidationCount

```solidity
function liquidationCount(address user) public view returns (uint)
```

* Returns the user's cumulative automatic return count
  {% endtab %}

{% tab title="State-Changing Functions" %}

## State-Changing Functions

#### claimReward

```solidity
function claimReward() public
```

* Method that a user calls to claim the claimable MESH that has accumulated for the pair
* When called, MESH is claimed from the Factory and paid to msg.sender
* Even if the method is not called directly, it is automatically called when the LP token balance of the user’s wallet changes.
  * When liquidity is added
  * When liquidity is removed

#### openPositionETH

```solidity
function openPositionETH(uint amount1, uint borrow0, uint borrow1, uint minAmountLP) public payable
```

* Method that depositing MATIC to PlusPool
* After liquidity is provided, the LP token corresponding to the pool share is minted in the `msg.sender` wallet.
* If there is claimable MESH when called, the claim proceeds to `msg.sender`.
* Parameter
  * `amount1` : The deposit amount of token1
  * `borrow0` : The utilization amount of WMATIC
  * `borrow1`: The utilization amount of token1
  * `minAmountLP` : Minimum Guaranteed LP amount

#### openPositionToken

```solidity
function openPositionToken(uint amount0, uint amount1, uint borrow0, uint borrow1, uint minAmountLP) public payable
```

* Method that depositing to PlusPool
* After liquidity is provided, the LP token corresponding to the pool share is minted in the `msg.sender` wallet.
* If there is claimable MESH when called, the claim proceeds to `msg.sender`.
* Parameter
  * `amount0` : The deposit amount of token0
  * `amount1` : The deposit amount of token1
  * `borrow0` : The utilization amount of token0
  * `borrow1`: The utilization amount of token1
  * `minAmountLP` : Minimum Guaranteed LP amount

#### closePositionETH

```solidity
function closePositionETH(uint amountLP, uint minAmount0, uint minAmount1) public
```

* Returns the amount of LP tokens, and distributes the corresponding MATIC and token1 to the `msg.sender` wallet
* The returned LP token amount is burned
* If there is claimable MESH and Airdrop when called, the claim proceeds to `msg.sender`.
* Parameters
  * `amountLP`:  The amount of LP tokens burned due to liquidity removal
  * `minAmount0` : The withdraw amount of token0
  * `minAmount1` : The withdraw amount of token1

#### closePositionToken

```solidity
function closePositionToken(uint amountLP, uint minAmount0, uint minAmount1) public
```

* Returns the amount of LP tokens, and distributes the corresponding token0 and token1 to the `msg.sender` wallet
* The returned LP token amount is burned
* If there is claimable MESH and Airdrop when called, the claim proceeds to `msg.sender`.
* Parameters
  * `amountLP`:  The amount of LP tokens burned due to liquidity removal
  * `minAmount0` : The withdraw amount of token0
  * `minAmount1` : The withdraw amount of token1
    {% endtab %}
    {% endtabs %}


---

# Agent Instructions: 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.meshswap.fi/developers/contract/pluspool.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.
