Pool Lifecycle
A Kasu lending pool end to end: creating it with tranche ratios and rates, assigning roles, configuring parameters, first loss capital, drawing and stopping.
Creating a Pool#
Role Required: ROLE_LENDING_POOL_CREATOR
Function: LendingPoolManager.createPool()
The Pool Creator specifies:
- Number of tranches (1-3)
- Tranche ratios (must sum to 100%)
- Interest rate per tranche
- Desired draw amount
- Minimum excess funds percentage
- Pool Admin address
The Pool Creator acts as Pool Admin at creation time and can designate another address.
Setting Up Roles#
Role Required: ROLE_POOL_ADMIN
Function: KasuController.grantLendingPoolRole()
The Pool Admin must assign the following roles for the new pool:
| Role | Purpose |
|---|---|
| Pool Manager | Manages pool parameters |
| Pool Funds Manager | Manages finances and losses |
| Pool Clearing Manager | Executes clearing each epoch |
Parameters: lendingPoolAddress, roleHash, accountAddress
Configuring Pool Parameters#
Role Required: ROLE_POOL_MANAGER
After roles are assigned, the Pool Manager sets pool parameters:
| Function | Purpose |
|---|---|
updateMinimumDepositAmount() | Minimum deposit per tranche |
updateMaximumDepositAmount() | Maximum deposit per tranche |
updateTrancheInterestRate() | Interest rate per tranche per epoch |
updateTrancheDesiredRatios() | Ratio between tranches (sum to 100%) |
updateDesiredDrawAmount() | Total capital to deploy into loans |
updateMinimumExcessLiquidityPercentage() | Minimum excess funds to maintain |
updateTargetExcessLiquidityPercentage() | Target excess funds percentage |
Role Required: ROLE_POOL_ADMIN
| Function | Purpose |
|---|---|
updateDrawRecipient() | Set the address that receives drawn funds |
Depositing First Loss Capital#
Role Required: ROLE_POOL_FUNDS_MANAGER
Function: LendingPoolManager.depositFirstLossCapital()
Before calling this function, the Pool Funds Manager must approve the USDC amount to be spent by the LendingPoolManager contract.
Once First Loss Capital is deposited, the pool is ready to accept LP deposits.
Pool Operation#
During normal operation:
- LPs deposit via
requestDeposit()orrequestDepositWithKYC() - Clearing executes each epoch (see Clearing Operations)
- Funds are drawn to the Draw Recipient after clearing
- Pool Funds Manager repays via
repayOwedFunds()(USDC approval required first; owed fees are deducted first) - LPs withdraw via
requestWithdrawal(), processed during the next clearing
Deposits and withdrawals submitted during the clearing period are accepted but queued for the next epoch. Cancellations of pending requests are not allowed during the clearing period.
Drawing Capital#
The Pool Manager sets the desired draw amount via updateDesiredDrawAmount(). This amount reflects the total owed amount, including any previously drawn capital and accrued interest.
Funds are drawn to the configured Draw Recipient during clearing Step 5. If insufficient deposits exist to meet the desired draw, the Pool Clearing Manager must override the draw amount during clearing configuration.
Stopping a Pool#
Role Required: ROLE_POOL_MANAGER
Function: LendingPoolManager.stopLendingPool()
Prerequisites: All owed funds must be repaid to the pool.
When stopped:
- Interest rate set to 0%
- No new draws or deposits accepted
- LPs can still submit withdrawal requests
- First Loss Capital can be withdrawn after all tranches are repaid
- The pool cannot be restarted