# SinglePool

This contract is a single pool contract, where liquidity providers deposit/withdraw assets, and Plus Pool users bring or return utilized assets from a single pool.

## Code

Github Link: (Will be updated after official launch)

## Address

Contract address after production is deployed&#x20;

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

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

## Events

**GiveReward**

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

* Event log of when mined MESH is claimed and distributed

**Deposit**

```solidity
event Deposit(address user, uint depositAmount, uint depositTokens, uint totalAmount, uint totalSupply);
```

* Event log of single pool liquidity additions
* Parameters
  * `user` : user address
  * `depositAmount` : amount of tokens deposited by the user
  * `depositTokens` : amount of single pool tokens deposited&#x20;
  * `totalAmount` : total amount of tokens deposited&#x20;
  * `totalSupply` : total amount of single pool tokens deposited&#x20;

**Withdraw**

```solidity
event Withdraw(address user, uint withdrawAmount, uint withdrawTokens, uint totalAmount, uint totalSupply);
```

* Event log of single pool liquidity removals
* Parameters
  * `user` : User address&#x20;
  * `withdrawAmount` : The amount of tokens removed by the user
  * `withdrawTokens` : The amount of single pool tokens removed by the user
  * `totalAmount` : Total amount of tokens deposited&#x20;
  * `totalSupply` : Total amount of single pool tokens deposited&#x20;

**Borrow**

```solidity
event Borrow(address user, address plusPoolAddress, uint borrowAmount, uint accountBorrows, uint totalBorrows);
```

* Event log of using assets utilized during plus deposit
* Parameters
  * `user` : user address
  * `plusPoolAddress` : Plus Pool address
  * `borrowAmount` : The amount of tokens utilized&#x20;
  * `accountBorrows` : Total amount of assets utilized by users
  * `totalBorrows` : Total amount of single pool utilized&#x20;

**Repay**

```solidity
event Repay(address user, address plusPoolAddress, uint repayAmount, uint accountBorrows, uint totalBorrows);
```

* Event log of used assets are returned
* Parameters
  * `user` : User address&#x20;
  * `plusPoolAddress` : PlusPool address
  * `repayAmount` : The amount of returned asset tokens
  * `accountBorrows` : Total amount of assets utilized by users
  * `totalBorrows` : Total amount of single pool utilized
    {% endtab %}

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

## Read-Only Functions

#### name

* "I" + token name

#### symbol

* "i" + token symbol

**decimals**

* 18

**token**

* ERC-20 token address&#x20;

#### totalSupply

* mint/burn depending on liquidity addition/removal

#### balanceOf

* Number of LP tokens held by each address

#### allowance

* Status of approval to spender for each address

#### getCash

* Number of tokens held by contract

#### reserveFactor

* MESH buyback & burn allocation ratio among utilization fees&#x20;
* It is a value between 0 and 10^18, in units of 0.000000000000000001%
* Default - 200000000000000000

#### totalBorrow

* Total Assets Utilized

#### mining

* The ratio of MESHs distributed to a single pool mined by that pool
* It is a value between 0 and 10000, in units of 0.0001%

#### lastMined

* SinglePoolFactory.mined() value at the last time the pair updated the index

#### withdrawActive

```solidity
function withdrawActive() public view returns (bool)
```

* Whether single pool withdrawal is possible

#### depositActive

```solidity
function depositActive() public view returns (bool)
```

* Whether single pool deposit is possible
  {% endtab %}

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

## State-Changing Functions

#### transfer

```solidity
function transfer(address _to, uint _value) public returns (bool)
```

* ERC-20 Standard
* Method to transfer tokens&#x20;

#### transferFrom

```solidity
function transferFrom(address _from, address _to, uint _value) public returns (bool)
```

* ERC-20 Standard
* Method to transfer tokens on behalf of the approved wallet

#### approve

```solidity
function approve(address _spender, uint _value) public returns (bool)
```

* ERC-20 Standard
* Method to approve a transfer as much as value to spender

#### depositETH

```solidity
function depositETH() public payable
```

* Method used to provide liquidity when token is MATIC
* Liquidity of the MATIC `msg.value`&#x20;

#### depositToken

```solidity
function depositToken(uint depositAmount) public
```

* Method used to provide liquidity when token is ERC-20 standard token
* Liquidity of the number of deposit amount is provided

#### withdrawETH

```solidity
function withdraw(uint withdrawAmount)
```

* Method to withdraw MATIC to `msg.sender` wallet.
* `withdrawAmount` : Number of token amount to withdraw

#### withdrawETHByAmount

```solidity
function withdrawETHByAmount(uint withdrawTokens)
```

* Method to withdraw MATIC to `msg.sender` wallet.&#x20;
* `withdrawTokens` : Number of SinglePool liquidity token amount to withdraw&#x20;

#### withdrawToken

```solidity
function withdrawToken(uint withdrawAmount)
```

* Method to withdraw tokens to `msg.sender` wallet.
* `withdrawAmount` : Number of token amount to withdraw

#### withdrawTokenByAmount

```solidity
function withdrawTokenByAmount(uint withdrawTokens)
```

* Method to withdraw tokens to `msg.sender` wallet.&#x20;
* `withdrawTokens` : Number of SinglePool liquidity token amount to withdraw&#x20;

#### addReserves

```solidity
function addReserves(uint addAmount) external payable
```

* Method to transfer tokens to using buyback MESH
* `addAmount` : Number of token&#x20;

#### claimReward

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

* Method that a user calls to claim the claimable MESH and airdrop that has accumulated for the pair
* When called, MESH is claimed from the Factory and paid to `msg.sende`
* Even if the method is not called directly, it is automatically called when the SinglePool token balance of the user’s wallet changes.
  * When liquidity is added
  * When liquidity is removed
    {% 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/singlepool.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.
