Skip to main content
A Conduit wraps an existing Vehicle and issues its own ERC20 shares. This lets multiple Multi-Vehicles access the same yield source while the Conduit manages position aggregation, deposits, and redeems through the STEAM lifecycle.
Platforms also deploy Conduits as distribution channels for existing strategies. See Deploy a Conduit as a platform for the platform-focused guide.

When to use a Conduit

Use a Conduit when:
  • Multiple Multi-Vehicles need access to the same underlying yield source
  • You want a single shared position instead of separate per-Multi-Vehicle positions
  • You need ERC20 transferable shares representing a pro-rata claim on the underlying Vehicle
If only one Multi-Vehicle will ever use a yield source, a regular Vehicle is simpler.

Prerequisites

  • A deployed STEAM Vehicle (e.g., an ERC4626Vehicle)
  • A deployed CoreFactory, an AssetRegistry, and a FreezablePausableBeacon holding the Conduit implementation
  • The CONDUIT_SPAWN role on the factory’s access controlspawn is gated on it
  • The deposit asset authorized in the AssetRegistry — the factory reads the initial deposit size from there at spawn time
  • Familiarity with the STEAM standard

Deploy a Conduit

1

Deploy the ConduitFactory

The ConduitFactory is responsible for spawning new Conduit instances. Its constructor pins the deployment plumbing and the trusted factories used to validate the optional modules you pass to spawn.
2

Configure spawn parameters

Define the Conduit’s configuration. The deposit asset is the underlying Vehicle’s own asset() and the initial deposit amount is read from the AssetRegistry — neither is passed here.
transferEnabled is a one-way latch. Deploy with false to mint and burn only, then flip it once with enableTransfers() (gated on CONDUIT_SET_TRANSFER_ENABLED); it can never be turned back off. A user-to-user transfer needs both transferEnabled and — when an accountList is set — accountList.canTransfer(from, to).
3

Spawn the Conduit

Resolve the deposit asset from the Vehicle, look up the amount in the AssetRegistry, approve the factory, then spawn. The deployment salt travels inside params, so spawn takes a single argument.
The initial deposit protects against inflation attacks by bootstrapping the share supply. Once the seed query settles, the factory transfers the shares it received to the burn address, checks totalSupply() >= initialExpectedSupply, and calls enable() on the Conduit. The registry amount also dampens cumulative rounding losses from nested vault accounting — see Asset registry for sizing guidance.
With an async underlying Vehicle the seed deposit does not settle inside spawn. The factory records a PendingDeposit, emits PendingConduitDeposit, and returns a Conduit that is not yet enabled. Call factory.finalizeConduitDeposit(conduit) once the query reaches SETTLED to burn the seed shares and enable it. The factory is the msg.sender of the seed deposit, so if you pass an accountList the factory address must itself satisfy canDeposit at spawn time.

Make a deposit

After deployment, deposit into the Conduit. The Conduit handles pulling assets and creating the STEAM query in the underlying Vehicle.
After the deposit settles, check your shares:

Redeem from a Conduit

Call createRedeemFromConduitShares() with the amount of Conduit shares to burn. It converts that cShare amount to Vehicle shares and routes through the same create entrypoint as a deposit, so the gating and salt binding are identical. No ERC20 approval is needed — the Conduit burns your shares internally.

Next steps

Configure fees

Add fee structures to your Conduit.

Learn about Conduits

Understand Conduit architecture in depth.