- Vehicle / Multi-Vehicle — The strategy (executes protocol-specific logic, manages allocations)
- Conduit — The distribution channel (each platform deploys its own Conduit with custom fees, shares, and compliance on top of the same strategy)
Why Conduits exist
Scaling without fragmentation
Scaling without fragmentation
Asset managers build one strategy (a Multi-Vehicle) — they don’t need to deploy a separate strategy for each distribution partner. Each platform deploys its own Conduit on top of the same Multi-Vehicle, with its own fee structure and access control. One strategy, N platforms.
Liquidity attribution
Liquidity attribution
Conduits identify exactly where liquidity comes from. Because each platform has its own Conduit, the protocol knows which platform originated each deposit. This enables custom revenue-sharing deals and precise attribution for business development.
Unified user experience
Unified user experience
Regardless of underlying protocol complexity — whether the strategy uses Aave (sync) or Ethena (async with cooldowns) — the deposit and redeem interface through a Conduit is identical. Platforms don’t need to build different UX flows for different protocols.
Automated operations
Automated operations
Keepers automatically process async operations on behalf of Conduit users. In standard DeFi, users must come back after a cooldown period to manually claim their assets. With Conduits, keepers call
process() automatically — users deposit and receive their shares (or assets) without a second transaction. This is a fundamental UX improvement over standard DeFi vault patterns.The share token model
A Conduit issues its own ERC20 shares (conduit shares) to represent ownership. Internally, the Conduit holds shares issued by the underlying Vehicle.totalAssets(), increasing the value of each conduit share. Users never touch Vehicle shares directly.
The create/process lifecycle
Conduits simplify the STEAM lifecycle into two user-facing operations.Create
When a user callscreate(query, receiver):
Validation
The Conduit checks the receiver, ensures the Conduit is enabled, and verifies the sender is allowed (via AccountList if configured).
Asset pull
Pulls assets from
msg.sender — underlying tokens for deposits, conduit shares for redeems.Fee capture
Captures the current fee configuration from the FeeManager to ensure consistent fee application at settlement.
Process
Theprocess(query) function advances the query through the STEAM state machine:
- Fee accrual — Accrues management and performance fees by minting shares to the FeeManager
- State check — Checks the current state of the query in the Vehicle
- WAITING — Calls
vehicle.resume()to continue - UNLOCKING — Calls
vehicle.unlock(), mints conduit shares (deposits) or transfers assets (redeems), and applies transactional fees - RECOVERING — Calls
vehicle.recover()to refund assets or restore shares
Keeper automation
For async Vehicles (Ethena, Syrup), theprocess() call doesn’t happen immediately — the underlying protocol needs time to complete the operation. Keepers monitor active queries and call process() automatically when the operation is ready to settle.
This means users never need to return to manually claim their assets. They deposit, and their shares appear once the operation settles — no second transaction required.
Keeper setup
How to configure keeper automation for your Vehicle.
Deposit flow
Withdrawal flow
Optional modules
Conduits are extensible through optional modules set at deployment.AccountList
AccountList
Controls who can create queries and receive shares.
- Implements allowlist or blocklist logic
- Checked on every
create()call and share transfer - Can integrate with external sanctions oracles (e.g., Chainalysis) via
ISanctionsList
OwnerRegistry
OwnerRegistry
Delegates query ownership to an external registry.
- Enables wrapping queries into transferable ERC721 NFTs
- Advanced use case for tokenized positions
FeeManager
FeeManager
Handles all fee types:
- Management fee — Annualized, prorated by time elapsed
- Performance fee — Charged on gains above high water mark
- Deposit fee — Deducted from shares received
- Redeem fee — Deducted from assets received
Transfer policies
Each Conduit is configured with a TransferMode that governs ERC20 share transfers:| Mode | Behavior |
|---|---|
ACCOUNT_LIST | Enforces AccountList rules on all transfers (default) |
ALLOW_TRANSFER | Permissionless transfers — anyone can send or receive shares |
BLOCK_TRANSFER | Only mint and burn allowed — no user-to-user transfers |
Conduit vs direct Vehicle vs Multi-Vehicle
| Aspect | Direct Vehicle | Conduit | Multi-Vehicle |
|---|---|---|---|
| Share token | Vehicle shares (internal) | Conduit ERC20 shares | Multi-Vehicle ERC20 shares |
| Fee management | None | Full suite (mgmt, perf, deposit, redeem) | Full suite via FeeManager |
| Access control | None | AccountList (allowlist/blocklist) | EAC role-based |
| Wraps | Single protocol | Any Vehicle or Multi-Vehicle | Multiple sub-vehicles |
| User experience | Manual query management | Simple create/process with keeper automation | Automated queue-based |
| Best for | Protocol integrations | Platform distribution | Institutional strategies |
Key interface summary
| Method | Description |
|---|---|
create(query, receiver) | Create a deposit or redeem query. Auto-processes if possible. |
process(query) | Advance a query through the STEAM lifecycle. |
holdings() | Total Vehicle shares held by the Conduit. |
totalAssets() | Total underlying assets managed. |
estimate(query) | Preview output including fees. |
convert(assets, direction) | Pure conversion without fees. |
isEnabled() | Whether the Conduit is open for deposits. |
getVehicle() | The underlying Vehicle contract address. |
asset() | The underlying ERC20 asset address. |
Deployment
Conduits are deployed viaConduitFactory.spawn():