Deposit Flow¶
Trigger: Investor wishes to deposit USDC into the vault. Caller: Any address — deposit is always accepted regardless of pause state
Steps¶
-
Investor approves USDC — calls
USDC.approve(vaultAddress, assets)to grant the vault transfer authorization. -
Investor calls
deposit(assets, receiver)onLiquidityVault. -
Vault computes shares to mint:
Theif totalShares == 0: sharesToMint = assets × 1e12 // first-deposit initialisation rule else: sharesToMint = assets × totalShares / aggModeledNav() // floor division1e12scaling factor on the first deposit aligns USDC (6 decimals) with shares (18 decimals) and prevents share price manipulation. See Section 6.10 — Arithmetic Precision for the full rationale. -
USDC transferred from
msg.senderto the vault. -
Assets added to
idleReserve— capital stays idle. It is NOT immediately deployed. -
Shares minted to
receiver. -
Depositevent emitted with(sender, receiver, assets, shares).
Important: Decoupled Deployment¶
Capital deployment is separate
Deposited USDC enters idleReserve and stays there until the operator deploys it via openPosition(). The vault can accept deposits at any time without a ready market. This decoupling prevents rushed capital deployment just because a deposit arrived.
Share Price at Deposit¶
The deposit exchange rate is based on aggregateModeledNav() — the modeled NAV including all active positions and idle reserve. This means:
- A new depositor pays a share price that reflects existing positions at their modeled value (not market value)
- If there is a significant gap (modeled > market), the new depositor is buying into that gap at the modeled price
- Once deployed, the new depositor's capital accrues yield along with existing holders