Deposit
Overview
Deposits follow the ERC-4626 standard. Users approve USDC to the KingsVault contract and call deposit(). Shares are minted at the marked price (last-settled PPS), not a real-time spot price.
Access Control
Only addresses holding the ROLE_INVESTOR role (whitelisted users) may deposit.
Flow Diagram
sequenceDiagram
actor User as Investor
participant UI as Frontend
participant Token as USDC (ERC-20)
participant Vault as KingsVault
participant Ctrl as Controller (IEpochPrice)
User->>UI: Enter deposit amount
UI->>Vault: previewDeposit(assets)
Vault->>Ctrl: previewMarkedPrice(vault)
Ctrl-->>Vault: markedPrice (PPS)
Vault-->>UI: estimated shares
UI->>Token: approve(vault, amount)
Token-->>UI: tx confirmed
UI->>Vault: deposit(assets, receiver)
Vault->>Ctrl: previewMarkedPrice(vault)
Ctrl-->>Vault: markedPrice
Note over Vault: shares = assets / markedPrice<br/>(rounded down, favoring protocol)
Vault->>Token: transferFrom(user, vault, assets)
Vault->>Vault: _mint(receiver, shares)
Vault-->>UI: shares minted
UI-->>User: Display updated share balance
Step-by-Step
| Step | Actor | Action | Function / Detail |
|---|---|---|---|
| 1 | User | Preview expected shares. | previewDeposit(assets) — returns estimated shares at current marked price. |
| 2 | User | Approve USDC transfer. | USDC.approve(vaultAddress, amount) |
| 3 | User | Execute deposit. | vault.deposit(assets, receiver) — receiver is typically the user's own address. |
| 4 | Vault | Query current PPS. | Calls Controller.previewMarkedPrice(vault) to get the last-settled price. |
| 5 | Vault | Calculate shares. | shares = assets / markedPrice (rounded down). |
| 6 | Vault | Transfer USDC. | USDC.transferFrom(user, vault, assets) via SafeERC20. |
| 7 | Vault | Mint shares. | _mint(receiver, shares) — ERC-20 share tokens credited to receiver. |
Pricing
- The exchange rate is determined by the last settlement's PPS, not a live calculation.
_effectivePrice()inKingsVaultV2AsyncRedeemalways returns the marked price (no dual spot/marked pricing).- Default PPS before any deposit: 1.000000 (1 USDC = 1 Share, adjusted for decimal offset).
Preconditions
| Condition | Enforcement |
|---|---|
Caller is whitelisted (ROLE_INVESTOR) |
AccessControl modifier |
| Vault is not paused | whenNotPaused modifier |
| Vault is not in shutdown mode | isShutdown == false check |
| USDC allowance >= deposit amount | transferFrom will revert otherwise |
Events
| Event | Parameters |
|---|---|
Deposit |
sender (indexed), owner (indexed), assets, shares |
Security Considerations
- Rounding Direction: Shares are rounded down — users receive slightly fewer shares than the theoretical exact value. This prevents value extraction via dust deposits.
- Stale PPS Risk: If settlement has not been run recently, the PPS may be outdated. Users deposit at an old price, which could be favorable or unfavorable depending on whether the true NAV has increased or decreased since last settlement.
- Virtual Offset: The vault uses a virtual offset of 10^6 to inflate share precision (12 decimal places), mitigating first-depositor inflation attacks where an attacker donates assets to manipulate share pricing.