Skip to main content
Multi-depositor vaults extend the base guardian workflow with shared liquidity across multiple depositors, tokenized vault units (ERC-20), and an async order-solving model for deposits and redemptions. For background on how the guardian role works at the protocol level, see the Guardian Model. For base guardian operations like strategy execution and vault reads, see the Single-Depositor Vaults guide — this page focuses on the operations unique to multi-depositor vaults.
Before starting, make sure you have:

Setup

Configure your environment for interacting with the vault, Provisioner, and PriceAndFeeCalculator contracts. Multi-depositor vaults require more contract addresses than single-depositor vaults because pricing and order fulfillment involve additional periphery contracts.

Strategy Execution

Strategy execution in multi-depositor vaults uses the same submit(Operation[]) pattern as single-depositor vaults — the guardian submits batched operations that are validated against a Merkle tree. See the Single-Depositor Vaults guide for full details on operation submission, vault state reads, and rebalancing.

Order Solving

Order solving is the primary difference between multi-depositor and single-depositor vault operations. Depositors interact with the vault through the Provisioner contract using an asynchronous request/fulfill lifecycle. The guardian (acting as solver) monitors pending requests and fulfills them through the vault’s submit flow.

How Orders Work

The async order lifecycle has three stages:
  1. Request — A depositor calls requestDeposit or requestRedeem on the Provisioner, locking their assets (for deposits) or vault units (for redemptions). Each request receives a unique requestId.
  2. Fulfill — The guardian processes the request through the vault’s submit flow. For deposit requests, the guardian ensures assets are accounted for and vault units are allocated. For redemption requests, the guardian ensures exit positions are unwound and assets are available.
  3. Claim — The depositor (or receiver) calls claimDeposit or claimRedeem on the Provisioner to receive their vault units or underlying assets.
This async model is essential for cross-chain operations where CCTP bridging introduces latency between the request and fulfillment. See Cross-Chain for the conceptual overview of cross-chain vault flows.

Monitoring Pending Orders

Monitor the Provisioner for incoming deposit and redemption requests by watching for DepositRequested and RedeemRequested events. This lets the guardian detect new orders that need fulfillment.

Fulfilling Deposit Orders

When a depositor places a deposit request via requestDeposit, the guardian fulfills it by processing the request through the vault’s submit flow. Once fulfilled, the depositor can claim their vault units by calling claimDeposit on the Provisioner.

Fulfilling Redemption Orders

Redemption requests follow the same async pattern. The depositor calls requestRedeem on the Provisioner, and after the guardian ensures the underlying assets are available (by unwinding positions if needed via submit), the depositor claims the assets with claimRedeem.
Order fulfillment is executed through the guardian’s submit flow on the vault. The exact fulfillment mechanics depend on whether the deposit/redemption is same-chain or cross-chain. See the Provisioner Contract Reference for full function signatures and the Cross-Chain page for how cross-chain bridging integrates with the order lifecycle.

Price Reporting

Price reporting is unique to multi-depositor vaults. Because multiple depositors share the same pool, accurate unit pricing is essential for fair minting and redemption of vault shares. The PriceAndFeeCalculator contract manages price snapshots and uses them for both share pricing and fee computation.

Why Prices Matter

In a multi-depositor vault, each depositor’s ownership is represented by ERC-20 vault units. The unit price determines how many shares a depositor receives on deposit and how many assets they receive on redemption. Accurate, timely price reporting ensures:
  • Fair entry and exit prices for all depositors
  • Correct NAV (Net Asset Value) calculation for the vault
  • Accurate fee accrual based on vault performance
The PriceAndFeeCalculator uses managed accountant snapshots rather than real-time pricing to prevent fee manipulation through short-term vault value changes. See the Periphery Contract Reference for full function signatures.

Taking Snapshots

The guardian takes price snapshots by calling snapshot on the PriceAndFeeCalculator. This records the current unit price and total supply for fee calculation. Snapshots are typically taken as part of the submit flow via an afterSubmit hook, but can also be called directly.

Monitoring Prices

Read the current vault state to determine the unit price and total supply before taking a snapshot or verifying pricing accuracy.

Fee Reporting

Multi-depositor vaults use the PriceAndFeeCalculator for fee computation instead of the DelayedFeeCalculator used by single-depositor vaults. The same two fee types apply — management fees (percentage of AUM over time) and performance fees (percentage of gains above a high-water mark). See the Single-Depositor Vaults guide for the conceptual explanation of how these fee types work.

Reporting Fees

Report fees by providing the current vault value to the fee vault. The PriceAndFeeCalculator uses its most recent snapshot to compute accrued fees.

Claiming Fees

The fee recipient claims accrued fees from the fee vault. Specify the token, amount, and recipient address. See the FeeVault Contract Reference for full function details.

Transfer Hooks

Multi-depositor vault units are ERC-20 tokens that can be transferred between addresses. Transfer hooks allow the vault owner to enforce restrictions on these transfers — for example, compliance blocklists, lock-up periods, or allowlists for approved recipients.

Setting Transfer Hooks

Setting the transfer hook is an owner operation (not a guardian operation), but understanding the mechanism is important for guardians because transfer hooks affect how vault units flow between depositors.
When a transfer hook is configured, every vault unit transfer calls beforeTransfer(address from, address to, uint256 amount) on the hook contract before executing. If the hook reverts, the transfer fails with MultiDepositorVault__TransferHookFailed. See Custom Hooks for building custom transfer hook contracts and the Hook Interfaces Contract Reference for the IBeforeTransferHook interface.

Emergency Procedures

Emergency procedures for multi-depositor vaults follow the same pattern as single-depositor vaults. See the Single-Depositor Vaults guide for full details on when and why to use these. The key operations are summarized below.

Pausing the Vault

Calling pause immediately halts all guardian operations. Both the guardian and the vault owner can pause.
Only the vault owner can call unpause to resume operations. As a guardian, once you pause the vault, you cannot unpause it yourself. Coordinate with the vault owner before pausing in non-emergency situations.

Checking Pause Status

Verify whether the vault is currently paused before attempting operations.

Guardian Whitelist Check

Verify that the guardian is still authorized on the vault’s whitelist.