Skip to main content
In user-facing documentation, a MultiVehicle is referred to as a Strategy. See Glossary.
Multi-Vehicle implements rigorous double-entry accounting to track all asset movements through the system. Understanding the sector model and asset flow is essential for operating multi-vehicle deployments.

Why sector-based accounting

In a multi-protocol environment, assets are rarely static. They move between being idle in the vault, committed to a deposit query, held as shares in a sub-vehicle, or queued for redemption. Traditional balance-based accounting struggles to track these “in-flight” assets, leading to potential double-counting or inaccurate share pricing. Multi-Vehicle solves this by partitioning assets into logical sectors that represent their current operational state. This allows the protocol to:
  • Track the exact lifecycle stage of every asset
  • Handle asynchronous settlements without losing track of value
  • Provide an accurate totalAssets() calculation at any point in time

The double-entry principle

Every movement of assets within the system has an explicit source and destination sector. The SectorAccountingEngine:
  1. Decrements the balance of the source sector
  2. Increments the balance of the destination sector
  3. Emits a SectorTransfer event for a clear audit trail
This ensures total supply of accounted assets remains constant across internal transfers, making the system resistant to accounting leaks or “lost” assets.

Core sectors

RESERVED exists so that you can park liquidity neither the auto-fulfill path nor the QueueStrategyEngine can consume: both spend against withdrawable(), which reads only AVAILABLE, so a parked balance is invisible to them while still counting towards totalAssets(). Nothing reaches RESERVED implicitly — you must move assets in explicitly (AVAILABLE → RESERVED to park, RESERVED → AVAILABLE to unpark), or route a redeem’s settledDestination there.

Dynamic sectors

Beyond the core sectors, the system creates dynamic sectors for per-vehicle operations:

Deposit flow

Assets flowing from users into sub-vehicles follow this path:
1

Asset reception

The user deposits base assets into the Multi-Vehicle. Assets transfer from ENTRY (virtual) to the AVAILABLE sector.
2

Allocation decision

The QueueStrategyEngine processes the deposit queue and determines which sub-vehicle receives the assets.
3

Staging

Assets move from AVAILABLE into the target vehicle’s own sector, SectorLib.toSector(vehicle), where they wait for a query to be created.
4

Query dispatch

dispatch creates the STEAM query and sends the assets to the sub-vehicle, so they leave the vehicle sector and the accounting system in one step. Ephemeral accounting estimates the expected shares to keep totalAssets accurate during this gap.
5

Settlement

When the sub-vehicle query settles (sync or async), shares enter the accounting system. ENTRY → ALLOCATION (virtual). Ephemeral estimates are replaced with actual values.
Between steps 4 and 5, assets exist outside the Multi-Vehicle’s accounting system (they are held by the sub-vehicle). Ephemeral accounting tracks their estimated value during this gap to keep totalAssets() and share price accurate.

Redeem flow

Assets flowing from sub-vehicles back to users follow the reverse path:
1

Unallocation decision

The QueueStrategyEngine processes the redeem queue and determines which sub-vehicle to unallocate from. ALLOCATION → vehicle sector.
2

Query dispatch

dispatch creates a STEAM redeem query and sends the shares to the sub-vehicle, so they leave the vehicle sector and the accounting system. Ephemeral accounting estimates the expected base assets to keep totalAssets accurate.
3

Settlement

Base assets arrive from the sub-vehicle and land in the query’s settledDestinationAVAILABLE by default, though you can route them to RESERVED or to another vehicle’s sector instead. Ephemeral estimates are replaced with actual values.
4

Asset return

The user withdraws their base assets. AVAILABLE → EXIT.

Example: deposit cycle walkthrough

A Multi-Vehicle starts with 100k in total assets. A user deposits 50k, which is allocated to an Aave sub-vehicle.Key insight: totalAssets stays at ~150k through every step. At T2 the 50k is still accounted for, just staged in the vehicle sector. At T3 it has left the system entirely and the shares have not arrived yet (ENTRY → ALLOCATION has not happened); ephemeral accounting bridges this gap by estimating the expected share value.

Asynchronous redemptions

When immediate liquidity is insufficient, the QueryRedeemQueue handles fulfillment over time:
  1. User requests a redemption that exceeds available liquidity
  2. A demand is created in the QueryRedeemQueue for the unfulfilled portion
  3. A keeper or operator provides liquidity by calling feedQueryRedeemQueue on the VehicleManager, which spends withdrawable() (the AVAILABLE balance)
  4. FIFO position-based matching pairs demands with fulfillments as liquidity arrives
  5. The user receives assets (full or partial) as liquidity becomes available

Ephemeral accounting

One of the most critical challenges in async asset management is accounting for value that has been committed but not yet received. When a deposit to a sub-vehicle is PROCESSING, the Multi-Vehicle no longer has the base assets, but it does not yet have the shares. The SubQueryEngine manages ephemeral accounting to bridge this gap:
When a sub-query enters PROCESSING, the assets leave the vehicle sector and the accounting system altogether, and the system uses the vehicle’s estimate() function to determine the expected output. This estimated value is tracked as ephemeral accounting against the query’s settledDestination. On settlement, shares enter the system (ENTRY → ALLOCATION) and the ephemeral estimation is replaced with actual values.

Exchange rate and share price

Multi-Vehicle uses the ERC-4626 standard for pricing:
The totalAssets() function aggregates value across all sectors:
By including both settled and in-flight value, Multi-Vehicle ensures that its share price always reflects the true underlying value of the entire portfolio. withdrawable() is deliberately narrower: it reports only the AVAILABLE balance. RESERVED, vehicle-sector residuals and ALLOCATION shares are never counted as immediate liquidity, because reaching them requires an explicit move or dispatch.

Monitoring

Operators should track these key metrics:
  • AVAILABLE — Idle base-asset liquidity, and everything withdrawable() reports
  • RESERVED — Earmarked base assets, excluded from withdrawable()
  • ALLOCATION — Total deployed capital, held as sub-vehicle shares
  • Vehicle sectors — Assets and shares staged for the next query
  • Ephemeral — Value in flight for PROCESSING queries
  • Demand — Total pending redemptions in the QueryRedeemQueue
  • Fulfillment — Available liquidity for matching
  • Average wait time — User experience metric
  • Per-vehicle — totalAssets, share price, query states
  • Distribution — Actual vs target allocations across sub-vehicles
Best practices:
  • Monitor vehicle sectors for balances that linger, indicating slow query settlement
  • Maintain a sufficient AVAILABLE balance for immediate withdrawals
  • Regularly fulfill the QueryRedeemQueue to minimize user wait times
  • Validate sector balances for accounting integrity with regular audits

Next steps

Multi-Vehicle architecture

How Multi-Vehicle orchestrates capital across sub-vehicles.

The STEAM standard

The state machine interface that drives all deposit and redeem queries.

Create an Allocation Strategy

Deploy an Allocation Strategy (MultiVehicle) ecosystem.

Operate an Allocation Strategy

Day-to-day operations including queue management and rebalancing.