Pool parameters
This page is a reference for every parameter a Milky pool exposes. It's useful both for would-be pool operators and for LPs and borrowers who want to understand exactly what a pool has committed to.
Parameters are grouped by what they control: liquidity, loans, fees, risk caps, and governance.
Liquidity & accounting
These parameters define how the pool holds and tracks capital.
| Parameter | Meaning | Mutable? |
|---|---|---|
quote_mint | The SPL token used for deposits, loans, and repayments. USDC in production. | No (set at init) |
quote_vault | PDA holding the pool's idle USDC. | No (derived) |
total_lp_shares | Sum of all outstanding shares across LP positions. | Auto |
outstanding_principal | Sum of principal currently lent out. | Auto |
accrued_interest | Interest recognized as belonging to the pool. | Auto |
protocol_fees_accumulated | Fee revenue earmarked for the protocol (separate from LP NAV). | Auto |
Loan terms
Each pool publishes up to three term options. A borrower picks one at loan creation; the term option fully determines duration, rate, and grace period.
| Field | Meaning | Bounds |
|---|---|---|
term_secs | Loan duration in seconds. | 86,400 (1 day) to 31,557,600 (1 year) |
rate_bps | Fixed APR in basis points (10,000 = 100%). | Up to 22,000 (220%) per term |
grace_period_secs | Time after maturity before default is eligible. | Up to 2,592,000 (30 days) |
Pools typically advertise three options like 7d / 30d / 90d at progressively higher rates. The protocol does not require all three to be set; one or two options are valid configurations.
Principal & LTV limits
These are the per-loan ceilings that bound how much can be borrowed against a single card.
| Parameter | Meaning | Protocol bounds |
|---|---|---|
min_principal | Smallest allowed principal per loan. | Floor 1 USDC (1,000,000 micro-USDC) |
max_principal | Largest allowed principal per loan. | Ceiling 1,000,000 USDC |
max_principal_per_card | Per-card cap to prevent single-card concentration. | Pool-defined (within max_principal) |
max_ltv_bps | Maximum LTV the pool will accept for any loan. | Up to 9,000 (90%); typical default 7,000 (70%) |
The actual LTV applied to a given loan is the minimum of max_ltv_bps
and the LTV the oracle returns in its signed quote. The oracle can be
more conservative than the pool ceiling on a per-card basis.
Risk caps
The risk caps prevent quiet over-concentration as the pool fills up.
| Parameter | Meaning | Protocol bounds |
|---|---|---|
utilization_cap_bps | Max post-draw utilization (outstanding / NAV). | Default 8,000 (80%); ceiling 9,500 (95%) |
max_exposure_per_type | Max outstanding principal per canonical asset type. | Must be > 0; updates can raise but not zero out |
TypeExposure accounts track running outstanding-principal-by-asset-type,
and the protocol refuses any new draw that would push a given asset type
over the cap.
Allowlists
Allowlists restrict which collections of NFTs can secure loans from this
pool. They live in separate AllowedCollection PDAs, one per accepted
collection mint, with an active flag the admin can toggle.
| Parameter | Meaning |
|---|---|
AllowedCollection.collection_mint | The Metaplex collection mint to allow. |
AllowedCollection.active | Whether the collection is currently accepted. |
A loan against an NFT whose verified collection isn't on the pool's allowlist will be rejected at create time. NFTs without a verified collection bypass this check (but are still subject to the global Merkle allowlist).
Fees
The fee parameters live primarily on the global Config, but pools inherit
them and they affect borrower and LP economics directly.
| Parameter | Meaning | Bounds |
|---|---|---|
Config.origination_fee_bps | Origination fee as a percentage of interest. | Default 200 (2%); max 500 (5%) |
Config.auction_fee_bps | Protocol's share of auction surplus above debt. | Default 5,000 (50%); max 5,000 (50%) |
Config.insurance_fund_split_bps | Of the protocol fee, what share routes to the insurance fund. | Default 3,000 (30%) |
The pool itself accumulates protocol fees in protocol_fees_accumulated;
a separate admin instruction (protocol_withdraw_fees) sweeps them to the
protocol fee recipient and the insurance fund.
Governance
Parameters that control who can modify the pool.
| Parameter | Meaning | Mutable? |
|---|---|---|
admin | The wallet authorized to update parameters and (today) deposit liquidity. | No (set at init) |
paused | Per-pool emergency pause flag. Halts new loans and deposits. | Yes (admin or governance) |
auto_approve_threshold_micro_usdc | Backend hint for which loans don't need manual review. | Yes |
Some constraints worth noting:
- The pool
adminis immutable. There is no admin-rotation instruction, by design — anyone evaluating the pool can verify the admin pubkey once and trust that it can't silently change. - The
auto_approve_threshold_micro_usdcis a backend-only hint that doesn't gate any on-chain behavior. The on-chain program ignores it.
Updating parameters
Most mutable parameters are changed via pool_update_params, which
requires the pool admin signature and validates each new value against
the same protocol-wide bounds enforced at initialization. A few specific
constraints:
max_exposure_per_typecan be raised but cannot be set to zero (initialization also requires non-zero).- LTV and fee parameters are checked against their global ceilings.
- Term options are validated for bounds; setting an empty term-option list is not allowed.
Read next
- Pools overview — the conceptual picture before the parameter list.
- Lending overview — what these parameters mean for an LP.
- Borrowing overview — what they mean for a borrower.