# PalPools

**PalPools** - это основной компонент протокола. Каждый PalPool является независимым и хранит свой собственный базовый токен управления ERC20. Пользователи могут внести базовый токен в PalPool, получив сумму PalToken, представляющую их долю в PalPool, и получить часть сборов PalPool. Основное использование PalPool - это заимствование права голоса/предложения. При запуске заимствования PalPool создаст PalLoan, клонируя контракт Delegator, установленный в PalPool, он передаст заемщику сумму заимствованных токенов и уплаченные им сборы, делегирует право голоса в PalLoan заемщику и выпустит PalLoanToken для представления права собственности на PalLoan. Впоследствии заем может быть продлен, закрыт (при этом неиспользованные сборы будут возвращены заемщику) или уничтожен, если все сборы были использованы. Владелец займа также может изменить получателя права голоса своего PalLoan.

{% hint style="info" %}
Borrow - это структура данных, перечисленная в хранилище PalPool, в которой перечислены все данные, относящиеся к заимствованному праву голоса. PalLoan (также называемый Loan) - это контракт, содержащий право голоса и делегирующий его по указанному адресу. Каждый PalLoan связан с займом и с PalLoanToken (токен ERC 721, представляющий право собственности на PalLoan и его заем).
{% endhint %}

## Методы :

### События :&#x20;

### **Депозит**

`event Deposit(address user, uint amount, address palPool);`

Когда пользователь вносит депозит в пул

**Withdraw (Вывод Средств)**&#x20;

`event Withdraw(address user, uint amount, address palPool);`

Когда пользователь выходит из пула

**NewLoan (Новый займ)**&#x20;

`event NewLoan(address borrower, address delegatee, address underlying, uint amount, address palPool, address loanAddress, uint256 palLoanTokenId, uint startBlock);`

Когда начинается заимствование и создается PalLoan

**ExpandLoan (Расширение кредита)**

`event ExpandLoan(address borrower, address delegatee, address underlying, address palPool, uint newFeesAmount, address loanAddress, uint256 palLoanTokenId);`

Когда заемщик добавляет дополнительные комиссии к PalLoan, чтобы продлить срок кредита

**ChangeLoanDelegatee ( Изменение займа)**

`event ChangeLoanDelegatee( address borrower, address newDelegatee, address underlying, address palPool, address loanAddress, uint256 palLoanTokenId);`

Когда заемщик меняет делегата (получателя права голоса) PalLoan

**CloseLoan (Закрытие займа)**

`event CloseLoan(address borrower, address delegatee, address underlying, uint amount, address palPool, uint usedFees, address loanAddress, uint256 palLoanTokenId, bool wasKilled);`

Когда заем либо закрыт, либо погашен



### Read-only methods :

**palLoanToken**

`function palLoanToken() public view returns(address);`

Возвращает адрес контракта PalLoanToken

**underlying**

`function underlying() public view returns(address);`

Возвращает базовый токен управления, принадлежащий пулу

**palToken**

`function palToken() public view returns(address);`

Возвращает адрес palToken, связанного с этим пулом.

**totalReserve**

`function totalReserve() public view returns(uint);`

Возвращает сумму в резерве пула (in wei)

**totalBorrowed**

`function totalBorrowed() public view returns(uint);`

Возвращает текущую общую сумму средств, заимствованных из пула (in wei)



**minBorrowLength**

`function minBorrowLength() public view returns(uint);`

Возвращает минимальную продолжительность займа (in number of blocks)\
\


**killFactor**

`function killFactor() public view returns(uint);`

Возвращает значение коэффициента здоровья, при котором заемщик может быть убит (scale 1e18)



**killerRatio**

`function killerRatio() public view returns(uint);`

Возвращает отношение вознаграждения к вознаграждению убийцы заемщика (scale 1e18)\
\


**reserveFactor**

`function reserveFactor() public view returns(uint);`

Возвращает коэффициент сборов для установки в качестве резерва (scale 1e18)\
\


**accrualBlockNumber**

`function accrualBlockNumber() public view returns(uint);`

Возвращает номер блока для последнего обновления процентов для данного пула



**borrowIndex**

`function borrowIndex() public view returns(uint);`

Возвращает последний вычисленный индекс заимствования для данного пула (scale 1e18)\
\


**controller**

`function controller() public view returns(address);`

Возвращает адрес текущего контроллера для данного пула\
\


**underlyingBalance**

`function underlyingBalance() public view returns(uint);`

Возвращает количество базового токена в Пуле (in wei)\


**balanceOf**

`function balanceOf(address _account) external view returns(uint);`

Returns balance of the user in palToken (in wei)\
\


**underlyingBalanceOf**

`function underlyingBalanceOf(address _account) external view returns(uint)`

Возвращает баланс пользователя в базовом токене (in wei)\
\


**isLoanOwner**

`function isLoanOwner(address _loanAddress, address _user) external view returns(bool)`

Возвращает 'true', если данный пользователь является владельцем PalLoan



**idOfLoan**

`function idOfLoan(address _loanAddress) external view returns(uint256)`

Возвращает идентификатор PalLoanToken для данного PalLoan\


**getLoansPools**

`function getLoansPools() external view returns(address [] memory);`

Возвращает список всех кредитов (активных или закрытых).\


**getLoansByBorrower**

`function getLoansByBorrower(address _borrower) external view returns(address [] memory);`

Возвращает список всех кредитов пользователя (активных или закрытых).

**getBorrowData**

`function getBorrowData(address _loanAddress) external view returns (address _borrower, address _loan, uint _amount, address _underlying, uint _feesAmount, uint _feesUsed, uint _startBlock, bool _closed)`

Возвращает все данные, сохраненные для данного займа (для данного PalLoan).

_**Parameters :**_&#x20;



| name          | type    | desc                   |
| ------------- | ------- | ---------------------- |
| \_loanAddress | address | address of the PalLoan |

_**Returns :**_

| name             | type    | desc                                                                    |
| ---------------- | ------- | ----------------------------------------------------------------------- |
| \_borrower       | address | address of the owner of the Borrow (by being owner of the PalLoanToken) |
| \_delegatee      | address | address of the recipient of the voting power                            |
| \_loanPool       | address | address of the PalLoan for this Borrow                                  |
| \_palLoanTokenId | uint256 | id of the PalLoanToken for this PalLoan                                 |
| \_amount         | uint    | amount of token borrowed for delegation                                 |
| \_underlying     | address | address of the governance token                                         |
| \_feesAmount     | uint    | amount of fees paid by the borrower                                     |
| \_feesUsed       | uint    | amount of fees already used by the Borrow                               |
| \_startBlock     | uint    | block where the Borrow was started                                      |
| \_closed         | bool    | ‘false’ if the Borrow is still active                                   |
| \_killed         | bool    | 'true' if the Borrow was killed                                         |

\
**borrowRatePerBlock**

`function borrowRatePerBlock() external view returns (uint);`

Возвращает текущую ставку по займу (scale 1e18)\
\


**supplyRatePerBlock**

`function supplyRatePerBlock() external view returns (uint);`

Возвращает текущий тариф на поставку (scale 1e18)\
\


**exchangeRateStored**

`function exchangeRateStored() external view returns (uint);`

Возвращает последний обновленный обменный курс (ш1e18)\


**minBorrowFees**

`function minBorrowFees(uint _amount) external view returns (uint);`

Сумма минимальной платы, чтобы разрешить метод borrow(). Рассчитывается по заданному параметру amount (в wei). Возвращает минимальную сумму сборов (в wei).

**isKillable**

`function isKillable(address _loan) external view returns(bool);`

Возвращает true, если коэффициент здоровья заемщика (заданный адресом PalLoan) достаточно низок, чтобы быть убитым.

\
**State-changing methods :**&#x20;

**deposit**

`function deposit(uint _amount) external returns(uint);`

Внести базовый токен в Пул и получить количество palToken, соответствующее депозиту.

_**Parameters :**_&#x20;

| name     | type | desc                                   |
| -------- | ---- | -------------------------------------- |
| \_amount | uint | amount of token to deposit in the Pool |

&#x20;_**Returns :**_&#x20;

| name | type | desc                                   |
| ---- | ---- | -------------------------------------- |
|      | uint | amount of palTokens minted to the user |



{% hint style="info" %}
Значение\_суммы должно быть одобрено для PalPool перед этой транзакцией.
{% endhint %}

\
**withdraw**

`function withdraw(uint _amount) external returns(uint);`

Сжечь сумму palToken, чтобы вывести базовый токен пула.

_**Parameters :**_ \


| name     | type | desc                       |
| -------- | ---- | -------------------------- |
| \_amount | uint | amount of palToken to burn |

_**Returns :**_&#x20;

| name | type | desc                                                                               |
| ---- | ---- | ---------------------------------------------------------------------------------- |
|      | uint | <p>amount of underlying token returned to the user</p><h3 id="undefined"><br></h3> |

**borrow**

`function borrow(address _delegatee, uint _amount, uint _feeAmount) external returns(uint);`

Начинает Займа, создает PalLoan (и монетизирует PalLoanToken, связанный с этим PalLoan), и отправляет сумму займа и сборы в PalLoan, чтобы делегировать полномочия голосования/предложения делегату. Для начала займа требуется минимальная сумма сборов, покрывающая Минимальную длину займа.

_**Parameters :**_&#x20;

| name        | type    | desc                                                                                             |
| ----------- | ------- | ------------------------------------------------------------------------------------------------ |
| \_delegatee | address | address to receive the voting power                                                              |
| \_amount    | uint    | amount of governance token to borrow (representing how much power to receive through delegation) |
| \_feeAmount | uint    | amount of fees paid for the Borrow                                                               |

_**Returns :**_&#x20;

| name | type | desc                                      |
| ---- | ---- | ----------------------------------------- |
|      | uint | amount of token delegated to the borrower |

{% hint style="info" %}
The \_feeAmount должно быть одобрено для PalPool перед этой транзакцией.
{% endhint %}



**expandBorrow**

`function expandBorrow(address _loanPool, uint _feeAmount) external returns(uint);`

Если заемщик хочет увеличить длительность своего Займа, можно заплатить комиссию, которая будет добавлена к Займу (и перенесена на соответствующий PalLoan).

_**Parameters :**_&#x20;

| name        | type    | desc                                                  |
| ----------- | ------- | ----------------------------------------------------- |
| \_loanPool  | address | address of the PalLoan linked to the Borrow to expand |
| \_feeAmount | uint    | amount of fees to add to the Borrow                   |

&#x20;_**Returns :**_&#x20;

| name | type | desc                               |
| ---- | ---- | ---------------------------------- |
|      | uint | amount of fees added to the Borrow |

{% hint style="info" %}
The \_feeAmount должно быть одобрено для PalPool перед этой транзакцией.
{% endhint %}

**closeBorrow**

`function closeBorrow(address _loanPool) external;`

Заемщик может закрыть свои собственные Заимствования по своему желанию, возвращая неиспользованные сборы. Если заемщик попытается закрыть Заем до истечения Минимального срока займа, к комиссиям, подлежащим возврату пользователям, будут применены штрафные сборы, соответствующие сумме комиссий, которые необходимо уплатить до Минимального срока займа (применяются с использованием Ставки по займу на момент закрытия).

_**Parameters :**_&#x20;

| name       | type    | desc                                                               |
| ---------- | ------- | ------------------------------------------------------------------ |
| \_loanPool | address | <p>address of the PalLoan linked to the Borrow to close</p><p></p> |

**killBorrow**

`function killBorrow(address _loanPool) external;`

Если заемщик использовал все свои сборы, его можно убить, чтобы остановить делегирование и вернуть право голоса Пулу. Убийца не может быть пользователем, владеющим Заимствованием, и убийца получает вознаграждение в виде части сборов этого Заимствования.

_**Parameters :**_&#x20;

| name       | type    | desc                                                              |
| ---------- | ------- | ----------------------------------------------------------------- |
| \_loanPool | address | <p>address of the PalLoan linked to the Borrow to kill</p><p></p> |

**changeBorrowDelegatee**

`function changeBorrowDelegatee(address _loanPool, address _newDelegatee) external;`

Меняет получателя права голоса для данного PalLoan, обновляя данные в Borrow и запуская процесс делегирования для PalLoan, чтобы передать право голоса новому адресу делегата.

_**Parameters :**_&#x20;

| name           | type    | desc                                                                           |
| -------------- | ------- | ------------------------------------------------------------------------------ |
| \_loanPool     | address | address of the PalLoan                                                         |
| \_newDelegatee | address | <p>address of the new delegatee to receive the PalLoan voting power</p><p></p> |

**exchangeRateCurrent**

`function exchangeRateCurrent() external returns (uint);`

Обновляет состояние пула и возвращает последний обновленный курс обмена.

_**Returns :**_&#x20;

| name | type | desc                                                              |
| ---- | ---- | ----------------------------------------------------------------- |
|      | uint | <p>current Exchange Rate for the palToken (scale 1e18)</p><p></p> |

**\_updateInterest**

`function _updateInterest() external returns (uint);`

Обновление интересов Пула и значений хранилища. Этот метод вызывается перед любым депозитом/выводом/займом/закрытием займа/..., но также может быть вызван для обновления состояния Пула.

_**Returns :**_&#x20;

| name | type | desc           |
| ---- | ---- | -------------- |
|      | bool | Update success |

