# Variable Rate Lending

```mermaid
sequenceDiagram
  actor User
  participant VRLM as Variable Rate LendingMarket
  participant Oracle as Oracle

  Note over User,VRLM: User approves collateralToken to VRLM (ERC20 approve)
  User->>VRLM: supplyCollateral(marketParamsUSDC, collateral, user, "")
  VRLM-->>User: position updated (collateral credited)
  User->>VRLM: borrow(marketParamsUSDC, usdcToBorrow, 0, user, receiver)
  VRLM-->>User: USDC transferred to receiver
  Note over VRLM,Oracle: Interest accrues, LTV/LLTV enforced via oracle price
```

**Key references**: `src/LendingMarket.sol` (`supplyCollateral`, `borrow`, `getUserPosition`).

## Details

* **Goal**: Supply collateral and borrow variable-rate assets (e.g., USDC) directly from the lending market.
* **Preconditions**:
  * Market created with `loanToken = USDC`, appropriate `oracle`, `ltv/lltv` enabled.
  * Approvals for `collateralToken` to LendingMarket.
* **Notes**:
  * FW deposits may be rehypothecated into this market on the supply side, while borrowers take variable-rate loans.

## Views and events

**Views**

* Lending: `getUserPosition(marketParamsUSDC, user)` → `supplyAssets`, `supplyShares`, `borrowAssets`, `borrowShares`, `collateralAssets`.
* Lending: `position(id, user)`, `market(id)`.
* Oracle: `price()` (via marketParams' oracle) for health checks.

**Events**

* Lending: `EventsLib.SupplyCollateral`, `EventsLib.Borrow`, `EventsLib.AccrueInterest`.

## Reward share (variable-rate borrow)

* Formula: `userBorrowAssets / totalBorrowAssets` over the epoch (TWAP).
* Functions to call:
  * `LendingMarket.getUserPosition(marketParamsUSDC, user)` → `borrowAssets`
  * `LendingMarket.position(idUSDC, user)`, `LendingMarket.market(idUSDC)` (optional)
  * Index events: `EventsLib.Borrow`, `EventsLib.AccrueInterest`

## Reward share (variable-rate lend)

* Formula: `userVaultAssets / totalVaultAssets` over the epoch (TWAP).
* Functions to call:
  * `ISisuVault.balanceOf(user)`; `ISisuVault.convertToAssets(shares)` → `userVaultAssets`
  * `ISisuVault.totalAssets()` (denominator); `ISisuVault.totalSupply()` (optional)
  * Index events (optional): vault `Deposit`/`Withdraw` if exposed
