# PlusPool

&#x20;This contract manages the leveraged assets of KLAYswap'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

* Cypress : 0x

## 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 KSP is claimed and distributed
* Parameters
  * `user` :  address of the user who claimed
  * `amount` :  the amount of KSP claimed
  * `lastIndex` :  index result of the pair of the wallet after claiming&#x20;
  * `rewardSum` :  The amount of KSP 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 amountA, uint amountB, uint borrowA, uint borrowB, uint amountLP, uint userLP);
```

* Events that occur when depositing to PlusPool
* If the token to deposit is KLAY, `msg.value` is provided.
* Parameters
  * `user` : address of the user&#x20;
  * `amountA` : The deposit amount of tokenA
  * `amountB` : The deposit amount of tokenB
  * `borrowA` : The utilization amount of tokenA
  * `borrowB`: The utilization amount of tokenB
  * `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 amountA, uint amountB, 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
  * `amountA` : The withdraw amount of tokenA
  * `amountB` : The withdraw amount of tokenB
  * `userLP` :  the total amount of LP tokens minted due to additional liquidity

**Liquidate**

```solidity
event Liquidate(address user, uint idx, uint debtA, uint debtB, 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
  * `deptA` : Number of tokenA returned automatically
  * `deptB` : Number of tokenB 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

#### tokenA

* The first token address composed of the pair
* When KLAY is one part of the pair, tokenA == 0x0

#### tokenB

* The second token address composed of the pair

#### borrowableA

* Whether tokenA can be borrowable

#### borrowableB

* Whether tokenB can be borrowable

#### liquidationFactor

* automatic return factor
* It is a value between 1 and 10^18, in units of 0.000000000000000001%
* Default - 850000000000000000

#### borrowFactor

* Utilization cost interest rate of utilized assets
* It is a value between 1 and 10^18, in units of 0.000000000000000001%
* Default - 750000000000000000

#### userLP

* Number of PlusPool tokens held by each address

#### liquidationBonusRate

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

#### liquidationCount

```
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 KSP that has accumulated for the pair
* When called, KSP 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

#### openPosition

```solidity
function openPosition(uint amountA, uint amountB, uint borrowA, uint borrowB, uint minAmountLP) public payable
```

* Method that depositing to PlusPool
* If the token to deposit is KLAY, `msg.value` is provided.
* After liquidity is provided, the LP token corresponding to the pool share is minted in the `msg.sender` wallet.
* If there is claimable KSP when called, the claim proceeds to `msg.sender`.
* Parameter
  * `amountA` : The deposit amount of tokenA
  * `amountB` : The deposit amount of tokenB
  * `borrowA` : The utilization amount of tokenA
  * `borrowB`: The utilization amount of tokenB
  * `minAmountLP` : Minimum Guaranteed LP amount

#### closePosition

```solidity
function closePosition(uint amountLP, uint minAmountA, uint minAmountB) public
```

* Returns the amount of LP tokens, and distributes the corresponding tokenA and tokenB to the `msg.sender` wallet
* The returned LP token amount is burned
* If there is claimable KSP and Airdrop when called, the claim proceeds to `msg.sender`.
* Parameters
  * `amountLP`:  The amount of LP tokens burned due to liquidity removal
  * `minAmountA` : The withdraw amount of tokenA
  * `minAmountB` : The withdraw amount of tokenB
    {% 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-new.klayswap.com/book-en/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.
