# 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 %}
