Skip to main content
A Conduit wraps an existing strategy (Multi-Vehicle or Vehicle) with your own ERC20 share token, fee structure, and access control. This guide walks you through deploying one using the ConduitFactory already deployed on each supported chain.

Before you begin

You need a strategy to wrap and an External Access Control (EAC) contract. Fee Manager and AccountList are optional.
Already completed Use a Strategy? You already have an EAC and a Strategy-level Fee Manager deployed. You can optionally deploy a separate Fee Manager for your Conduit — see Configure fees. Skip to Choose your configuration.
Starting fresh? At minimum, deploy an EAC before proceeding — it’s a single transaction. See Compliance — Deploy and configure access control.

Choose your configuration

Before deploying, decide on three key parameters:
Deploy a FeeManager to collect fees on your Conduit. You can configure:
  • Management fee — annualized, prorated by time elapsed
  • Performance fee — charged on gains above a high water mark
  • Deposit fee — deducted from shares received
  • Redeem fee — deducted from assets received
Set to address(0) if you don’t need fees. To deploy a Fee Manager, see Configure fees.
Deploy an AccountList to control who can deposit, transfer, and hold shares. It combines an allow-list, a block-list, and an optional sanctions oracle, with one of three modes:Precedence is sanctions, then block-list, then the allow-list mode. Redeems are the exception: any non-sanctioned holder can always exit, even if blocked or de-listed. Sanctions screening plugs into Chainalysis-style oracles via ISanctionsList and fails closed if the oracle reverts.Set to address(0) for permissionless access. To deploy an AccountList, see Compliance.
Your Conduit’s ERC20 shares are governed by a single bool transferEnabled latch, not a mode enum:
  • Spawn with transferEnabled: false for a mint-and-burn-only token. User-to-user cShare transfers, wrapped-query NFT transfers, and third-party-receiver creates are all denied; deposits, redeems, fee dispatch, and forceRedeem still work.
  • Spawn with transferEnabled: true, or flip it later with enableTransfers() (gated on CONDUIT_SET_TRANSFER_ENABLED). This is a one-way latch: calling it again reverts StateUnchanged, and transfers can never be turned back off.
Both gates must pass for value to move: transferEnabled and, when an AccountList is set, accountList.canTransfer(from, to). So a STRICT AccountList still restricts transfers to allow-listed parties even with the latch on.

Deploy the Conduit

1

Get the ConduitFactory address

Railnet deploys a ConduitFactory on each supported chain. Look up factory addresses in Supported protocols. spawn is gated on the CONDUIT_SPAWN role held in the factory’s own access control — Railnet’s, not the EAC you pass in params — so have your deployer address granted that role first.
2

Configure spawn parameters

Define your Conduit’s configuration. The vehicle parameter accepts any STEAM-compliant contract — a Multi-Vehicle or a Vehicle. The deposit asset is that Vehicle’s own asset() and the initial deposit amount is read from the AssetRegistry — neither is passed here.
3

Approve and spawn

Look up the initial deposit amount in the AssetRegistry, approve the factory, then spawn the Conduit. 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 sends the shares it received to the burn address, checks totalSupply() >= initialExpectedSupply, and calls enable(). See Asset registry for initial deposit sizing guidance.
The factory is the msg.sender of the seed deposit. If you pass an accountList, the factory address must itself satisfy canDeposit at spawn time (allow-listed under REGULAR/STRICT, never blocked or sanctioned), or the spawn reverts.
4

Finalize (async strategies only)

For sync yield sources, the Conduit is enabled inside spawn. For async yield sources (or strategies wrapping async sources) the seed deposit cannot settle in the same transaction: the factory records a PendingDeposit, emits PendingConduitDeposit, and returns a Conduit that is not yet enabled. Wait for the deposit to settle, then finalize:

Verify deployment

After deployment, confirm the Conduit is operational:

Next steps

Deposits & withdrawals

Process deposits and withdrawals through your Conduit.

Compliance & access control

Configure roles and permissions for your Conduit.

Configure fees & revenue

Set up fee structures and revenue distribution.

Supported protocols

Look up deployed factory and infrastructure addresses per chain.