Skip to content

Pause Condition

The vault implements an automatic withdrawal pause triggered by two conditions. When paused, processWithdrawals() reverts — no redemptions are paid out until the pause clears.

Pause Formula

paused = (aggregateGapBps > 1500) || (idleReserve < dailyCap)

Trigger Conditions

Condition 1: Aggregate Gap Exceeds 15%

aggregateGapBps = max(0, aggModeledNAV − aggMarketNAV) × 10000 / aggModeledNAV

When the spread between what the model says the vault is worth and what the market prices it at exceeds 1500 bps (15%), the system pauses. This indicates significant unacknowledged impairment — for example, one or more positions are deteriorating but have not been rebased or written off yet.

Aggregate, not per-position

The gap is computed on the aggregate, not per-position. A single position deteriorating may or may not trigger the pause depending on its size relative to total NAV. A small position with a large gap may not trigger the system pause, while a large position with a moderate gap may.

Condition 2: Idle Reserve Below Daily Cap

If the vault does not have enough idle USDC to satisfy even one full day of maximum redemptions, the system pauses. This protects against a scenario where redemptions would exceed available cash.

Automatic Unpause

The pause clears automatically when both conditions are resolved: 1. The aggregate gap drops below 1500 bps (e.g., the market recovers, a rebase is applied, or a write-off is processed) 2. The idle reserve rises above one daily cap (e.g., a HouseBuffer topup is received or a position settles)

There is no explicit unpause() function — the system checks the live state on every processWithdrawals() call.

Effect on the Queue

When paused: - requestWithdraw() still works — investors can queue requests - processWithdrawals() reverts — queued requests accumulate but are not paid - cancelWithdraw() still works — investors can cancel and reclaim shares

When the system unpauses, the keeper can resume calling processWithdrawals() and the queue drains normally.

Operator Response to Pause

When paused, the operator should: 1. Diagnose: Is it a gap issue, a reserve issue, or both? 2. If gap issue: Consider rebasePosition() to realign modeled price to market reality, or wait for market recovery 3. If reserve issue: Request HouseBuffer topup, or wait for a position to settle 4. Last resort: emergencyLiquidate() — see Emergency Liquidation