Skip to main content
Your Conduit can have its own Fee Manager to charge distribution-layer fees — independent of any fees configured on the underlying Strategy. This guide covers how to design your fee model, deploy a Fee Manager for your Conduit, and configure recipient splits.
For the full fee calculation reference (formulas, preview functions, view functions), see Fee Manager reference.

Fee types

Fee typeTypical useWhen applied
Management feePlatform distribution revenue — annualized, prorated by timeBefore new deposits (onOperations)
Performance feeOptional platform share of yield — earned on new gainsBefore new deposits (onOperations)
Deposit feeOptional — deducted from deposit amountsDuring unlock (STEAM state)
Redeem feeOptional — deducted from redemption amountsDuring unlock (STEAM state)
All fees are in basis points (bps), where 10,000 bps = 100%.

Understanding fee layers

Railnet supports fees at two independent levels. Each level has its own Fee Manager contract with its own rates, caps, and recipients.
  • Strategy-level fees handle revenue distribution for the strategy operator. If you followed Use a Strategy, you already configured these during deployment.
  • Conduit fees (this page) are your platform’s additional distribution-layer fees. They are applied on top of the Strategy’s fees.
Users experience the combined effect of both fee layers in the Conduit’s share price.
Consider the total fee load when designing your Conduit-level fees. If the underlying Strategy already charges a 2% management fee, adding another 2% at the Conduit level may be uncompetitive.

Design your fee model

A typical Conduit fee structure is lighter than the Strategy’s, since the asset manager is already compensated at the Strategy level:
FeeRateRecipientPurpose
Management fee0–0.5% annualizedPlatformDistribution revenue, covers platform infrastructure
Performance fee0%Typically zero (AM compensated at Strategy level)
Deposit fee0%Usually zero for growth
Redeem fee0–0.25%PlatformOptional exit friction
No fees at all? Pass address(0) as the Fee Manager when deploying your Conduit. You can still earn revenue from the Strategy-level Fee Manager configured during Use a Strategy.

Common configurations

No Conduit-level fees — rely entirely on Strategy-level fee distribution.Pass address(0) as the Fee Manager during Conduit deployment.

Deploy the Fee Manager

Deploy a Fee Manager for your Conduit. This is separate from any Fee Manager attached to the underlying Strategy.
// All Conduit-level fees go to the platform
FeeManager.FeeRecipient[] memory recipients = new FeeManager.FeeRecipient[](1);

recipients[0] = FeeManager.FeeRecipient({
    target: platformTreasury,
    shareBps: 10000  // 100% to platform
});

FeeManagerFactory.SpawnParams memory params = FeeManagerFactory.SpawnParams({
    accessControl: externalAccessControl,
    initialFees: FeeManager.Fees({
        performanceFeeBps: 0,      // AM compensated at Strategy level
        managementFeeBps: 50,      // 0.5% annual distribution fee
        depositFeeBps: 0,
        redeemFeeBps: 0
    }),
    initialMaxFees: FeeManager.Fees({
        performanceFeeBps: 1000,   // 10% max (future flexibility)
        managementFeeBps: 200,     // 2% max
        depositFeeBps: 100,        // 1% max
        redeemFeeBps: 100          // 1% max
    }),
    initialRecipients: recipients,
    deploymentSalt: keccak256("conduit-fee-manager-v1")
});

FeeManager conduitFeeManager = feeManagerFactory.spawn(params);
initialMaxFees are immutable caps. You can lower fees later but never exceed these maximums. Set them thoughtfully — leave room for future adjustments.

Update fees

You can adjust fee rates at any time (within the max caps). Requires: FEE_MANAGER_SET_FEES role scoped to the Fee Manager.
FeeManager.Fees memory newFees = FeeManager.Fees({
    performanceFeeBps: 0,
    managementFeeBps: 25,   // Reduce management fee to 0.25%
    depositFeeBps: 0,
    redeemFeeBps: 0
});

feeManager.setFees(newFees);

Update recipients

Change how collected fees are split. Distribute pending fees first to avoid loss. Requires: FEE_MANAGER_SET_FEE_RECIPIENTS role scoped to the Fee Manager.
// IMPORTANT: Distribute pending fees before changing recipients
feeManager.dispatchERC20(IERC20(usdc));

// Update the split: add a DAO treasury
FeeManager.FeeRecipient[] memory newRecipients = new FeeManager.FeeRecipient[](2);

newRecipients[0] = FeeManager.FeeRecipient({
    target: platformTreasury,
    shareBps: 8000  // 80% to platform
});
newRecipients[1] = FeeManager.FeeRecipient({
    target: daoTreasury,
    shareBps: 2000  // 20% to DAO
});

feeManager.setFeeRecipients(newRecipients);
Changing recipients causes old recipients to lose access to uncollected fees. Always call dispatchERC20 first.

Fee collection workflow

Fees accumulate as Conduit shares held by the Fee Manager. To convert them into the underlying asset and distribute:
1

Redeem Conduit shares

Convert accumulated fee shares into the underlying asset.Requires: FEE_MANAGER_REDEEM_VEHICLE_SHARES role.
feeManager.redeemVehicleShares(address(conduit));
2

Distribute to recipients

Send the redeemed assets to each recipient according to their share.Requires: FEE_MANAGER_DISPATCH_ERC20 role.
feeManager.dispatchERC20(IERC20(usdc));

Role setup for fee management

As the Conduit owner, you retain fee configuration roles on your Conduit’s Fee Manager. If you also own the Strategy’s Fee Manager, you manage those roles separately.
RoleGrant toPurpose
FEE_MANAGER_SET_FEESPlatform adminChange fee rates
FEE_MANAGER_SET_FEE_RECIPIENTSPlatform adminChange recipient splits
FEE_MANAGER_DISPATCH_ERC20Operator or keeperDistribute collected fees
FEE_MANAGER_REDEEM_VEHICLE_SHARESOperator or keeperRedeem fee shares
See Roles and permissions for the complete role setup guide.

Next steps

Deposits & withdrawals

Process deposits and withdrawals through your Conduit.

Fee reference

Full fee calculation formulas, preview functions, and view functions.