Skip to content

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() in KingsVaultV2AsyncRedeem always 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

  1. Rounding Direction: Shares are rounded down — users receive slightly fewer shares than the theoretical exact value. This prevents value extraction via dust deposits.
  2. 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.
  3. 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.