DEVNETYou are on Solana devnet. Funds are not real. Behavior matches mainnet.

LP shares & NAV

When you deposit USDC into a Milky pool, you don't get an ERC-20-style LP token. Instead, the protocol records your stake in an LP position account that stores the number of shares you own in that pool. Your dollar value at any time is shares × price_per_share (PPS).

This page explains how shares are minted on deposit, how PPS is computed, and how the pool's net asset value (NAV) drives both.

The accounting model

Each pool tracks a few aggregate numbers that, together, define its state:

  • Quote vault balance — idle USDC currently sitting in the pool's vault.
  • Outstanding principal — the sum of all principal currently lent out in active loans.
  • Accrued interest — interest that has been recognized as belonging to the pool but not yet paid out.
  • Accumulated protocol fees — fee revenue earmarked for the protocol, not the LPs (withdrawn by a separate admin instruction).
  • Total LP shares — the sum of all outstanding LP shares across every position.

From these, two derived quantities matter most for LPs:

NAV = quote_vault_balance + outstanding_principal + accrued_interest − accumulated_protocol_fees

PPS = NAV × 10^6 / total_lp_shares (in micro-USDC per share)

The × 10^6 factor reflects that pool quote tokens use 6 decimals, so PPS is itself stored at 6 decimals of precision.

Deposits — how shares are minted

When you deposit, the protocol mints you shares according to two cases:

  • First-ever depositor in a pool receives shares 1:1 with the amount deposited. NAV is zero before the first deposit, so PPS is initialized at 1 USDC per share (in micro-USDC terms).
  • Subsequent depositors receive amount × 10^6 / PPS shares, where PPS is the current price-per-share at the moment of deposit.

This means a depositor who arrives later, when NAV has grown from accrued interest, gets fewer shares per USDC than the first depositor — but each of those shares is worth more. New deposits don't dilute existing LPs, because they pay the current PPS for their entry.

Withdrawals — burning shares for USDC

To withdraw, you burn some number of shares. The pool sends you USDC equal to shares × PPS / 10^6, computed at the current PPS.

A few constraints apply:

  • The pool must hold enough idle USDC in the vault to cover the withdrawal. If most of the pool is currently lent out, large withdrawals may need to wait for loans to repay (or be split across multiple smaller withdrawals as repayments arrive).
  • Withdrawals are not blocked by the global pause. Even when the protocol is paused for new loan or deposit activity, lenders can still exit at the current PPS.

When does NAV change?

NAV moves continuously as the pool absorbs:

  • Interest income from repaid loans → NAV ↑ → PPS ↑.
  • Principal returns from repaid loans → no NAV change (USDC moves from outstanding principal to vault balance).
  • Auction proceeds in excess of debt (pool's share of surplus) → NAV ↑.
  • Auction shortfalls (winning bid less than debt) → NAV ↓.
  • Origination fees on new loans → NAV ↑ (origination is interest revenue to the pool/protocol).
  • Protocol fee accrual on auction surplus → NAV is calculated net of this, so accrued protocol fees do not count toward LP value.

A worked example

Suppose a pool starts empty. Alice deposits 10,000 USDC and gets 10,000 shares. PPS is 1.0.

A month later, the pool has earned 200 USDC of net interest. NAV is now 10,200, and PPS is 10,200 / 10,000 = 1.02. Alice's stake is worth 10,000 × 1.02 = 10,200.

Bob deposits 5,000 USDC at this point. He receives 5,000 / 1.02 ≈ 4,901.96 shares. Total shares are now 10,000 + 4,901.96 ≈ 14,901.96 and NAV is 10,200 + 5,000 = 15,200. PPS is unchanged at 1.02.

A month later, after more interest, NAV is 15,500. PPS is 15,500 / 14,901.96 ≈ 1.04. Alice's stake is 10,000 × 1.04 = 10,400, Bob's is 4,901.96 × 1.04 ≈ 5,098.

If Alice withdraws 5,000 shares, she receives 5,000 × 1.04 = 5,200 USDC and her position is reduced to 5,000 shares, worth 5,000 × 1.04 = 5,200.