Skip to main content
In Railnet smart contracts, an Allocation Strategy is implemented as a MultiVehicle. See Glossary for all terminology.
This guide covers how to authorize yield sources, configure allocation queues, and run day-to-day operations for your Allocation Strategy — moving assets between sectors, dispatching to yield sources, rebalancing allocations, handling redemptions, and integrating with keepers for automation.
The MultiVehicle exposes only its manager. Reach every engine through it:
Solidity

Prerequisites

  • A deployed Allocation Strategy ecosystem (see Create an Allocation Strategy)
  • Your External Access Control (EAC) contract address
  • At least one authorized yield source
  • The following roles on your EAC:
    • MULTI_VEHICLE_MOVE and MULTI_VEHICLE_DISPATCH, scoped to the Sector Accounting Engine
    • MULTI_VEHICLE_SET_QUEUES, scoped to the Queue Strategy Engine

Operating a platform-owned Allocation Strategy

If a Conduit owner deployed the Allocation Strategy and invited you to manage it, be aware of the guardrails:
  • Yield source authorization is controlled by the owner. You manage allocations within the set of sources they have authorized.
  • Fee structure is set by the owner. You earn through the configured performance fee share.
  • Admin access remains with the owner. You cannot grant roles to others or change the access control configuration.
Your operational roles are scoped to specific contracts — you can move capital, dispatch, and manage queues, but cannot change the strategic boundaries. See Guardrails for details.

Authorize yield sources

Before your Allocation Strategy can allocate assets to a yield source, the source must be authorized on the Vehicle Manager.
The Vehicle Manager validates that a yield source uses the same base asset as the Allocation Strategy, is a contract, and reports ready().
Requires: MULTI_VEHICLE_SET_VEHICLE_AUTHORIZATION role scoped to the Vehicle Manager.
1

Find your Vehicle Manager address

Authorization is performed on the Vehicle Manager. Read it from the MultiVehicle, or look it up via the Railnet API.
2

Authorize a yield source

Call authorize for the default configuration, or authorizeAndConfigure to set the vehicle’s mode and cap in the same transaction.
Change a cap or mode later with manager.configure(vehicle, config).
3

Unauthorize a yield source

To remove a yield source, first redeem all assets out of it, then unauthorize it.
Unauthorizing a yield source does not automatically redeem existing positions. Withdraw all funds from the source before removing it.
syncVehicleActivationStatus is not an authorization call. It takes a single vehicle argument, is callable only by the SubQueryEngine, and keeps the accounting engine’s internal active vehicles list in sync as positions and in-flight queries appear or clear.

Configure allocation queues

The Queue Strategy Engine determines how assets are distributed across authorized yield sources using deposit and redeem queues.

Target semantics

In the deposit queue, target.value acts as a ceiling — the share holdings a yield source is filled up to before the queue moves to the next entry.
  • The queue processes in order: the first entry is filled first, up to its target, then the second entry, and so on.
  • type(uint256).max means no limit (allocate all available to this source).
  • target.threshold is a tolerance band: the entry is skipped when holdings are already within threshold of the target, so tiny top-ups don’t churn gas.
  • The queue does not enforce ongoing ratios. If yields diverge across sources, allocations will drift.
Example: With deposit queue [{Aave, target: 80000e18}, {Morpho, target: 20000e18}]:
  1. First 80,000 shares go to Aave
  2. Next 20,000 shares go to Morpho
  3. Any additional shares overflow to subsequent entries

Set queues

Requires: MULTI_VEHICLE_SET_QUEUES role scoped to the Queue Strategy Engine.
A common pattern is to set the redeem queue in reverse order of the deposit queue. This ensures that the last yield source to receive deposits is the first to be drained during redemptions.

How asset flow works

The Sector Accounting Engine tracks every asset and share in a sector, a bytes32 identifier. Five are fixed, plus one staging sector per authorized yield source: RESERVED exists so you can hold liquidity back: it counts toward NAV but neither auto-fulfill nor the Queue Strategy Engine can consume it. Getting liquidity in or out of RESERVED always takes an explicit move. The typical operator workflow is: move assets from AVAILABLE into a vehicle’s sector, then dispatch to execute the deposit into the yield source.

View holdings and allocations

Before operating, check the current state of your Allocation Strategy’s sectors and allocations.
You can also query the Railnet API:
GraphQL

Move assets to a yield source

Use move to shift the base asset from AVAILABLE into a yield source’s sector. This stages the assets for dispatch. Requires: MULTI_VEHICLE_MOVE role scoped to the Sector Accounting Engine.
Moving assets does not deposit them into the yield source yet. You must call dispatch afterward to execute the deposit.
Set amount to type(uint256).max to move the entire sector balance. operationId is a free-form tag echoed into the emitted event — reuse one value across the steps of a multi-step operation so dashboards and indexers can group them.

Dispatch assets to a yield source

After staging assets in a yield source’s sector, call dispatch to create the deposit query on that source. This executes the actual deposit. Requires: MULTI_VEHICLE_DISPATCH role scoped to the Sector Accounting Engine.
dispatchState is the state the sub-query reached in this call — SETTLED for a sync source, PROCESSING for an async one.
amount: type(uint256).max dispatches the whole sector balance and auto-limits to the vehicle’s cap instead of reverting, but it requires minOutput: 0. A slippage bound may only bind to an explicit amount, never to the execution-time sector balance.
You can batch move and dispatch operations: stage assets into several yield source sectors first, then dispatch to each source in sequence.

Rebalance between yield sources

There is no single rebalance call. You compose one from the same primitives, reusing one operationId so the steps read as a single logical operation off-chain:
1

Redeem from the source

Dispatch a REDEEM for the source vehicle’s shares, sending the proceeds to AVAILABLE.
Solidity
2

Stage the proceeds for the destination

Once the redeem settles, move the freed assets into the destination vehicle’s sector.
Solidity
3

Dispatch into the destination

Solidity
If the source’s redemption is asynchronous, step 1 returns PROCESSING and the assets are not in AVAILABLE yet. Wait for the sub-query to settle before running steps 2 and 3 — check vehicleHoldings or the indexed query state.

Handle user deposits

When users deposit into the Allocation Strategy, assets flow through the STEAM lifecycle. With allocation queues configured, deposits are automatically distributed to yield sources based on the deposit queue priority.

Handle redemptions

Redemptions follow the STEAM lifecycle. The Queue Strategy Engine processes redeems according to the redeem queue priority.

Keeper integration

Keepers are off-chain bots that automate routine operations. As an operator, understanding keeper integration helps you decide what to automate vs manage manually.

What keepers automate

What remains manual

Check keeper status

If your Allocation Strategy is registered with the keeper system, verify automation is running:
GraphQL
status is STARTED, DONE, or CANCELLED. There is no last-execution timestamp field — read it from event.tx.block.timestamp. If keepers are not processing redemptions, you can handle them manually (see Troubleshooting below).

Update queue priorities

You can change the allocation strategy at any time by updating the deposit and redeem queues.

Troubleshooting

If redemptions are not progressing (e.g. due to keeper failure or insufficient liquidity):1. Feed the redeem queue — if withdrawable assets are available. Requires MULTI_VEHICLE_FEED_QUERY_REDEEM_QUEUE scoped to the Vehicle Manager:
Solidity
2. Progress stuck sub-queries — if a sub-query is stuck in a non-terminal state. Requires MULTI_VEHICLE_PROGRESS_QUERY scoped to the SubQueryEngine:
Solidity
3. Dispatch staged assets — if assets sit in a yield source’s sector with no active query:
Solidity
If a deposit query is stuck in PROCESSING state, the yield source may require manual progression (common with async protocols like Ethena):
Solidity
Check the yield source’s STEAM state to understand what transition is needed.
If dispatch reverts, common causes include:
  • No staged assets — check the yield source’s sector has a non-zero balance with getSectorBalance
  • Source not authorized — verify the yield source is still authorized: manager.isAuthorized(vehicle)
  • Missing role — confirm you hold MULTI_VEHICLE_DISPATCH scoped to the Sector Accounting Engine
  • Slippage boundminOutput must be 0 when amount is type(uint256).max
  • Cap reachedmaxDepositable(vehicle) returns 0 when the vehicle is at its configured cap or paused
  • Source rejection — the yield source’s create may be reverting (check the underlying protocol’s status)
Remember that queues use ceiling (deposit) and floor (redeem) semantics:
  • Deposit queue targets are maximums, not ratios — allocations will drift with yield
  • If all yield sources have reached their ceiling, new deposits stay idle in AVAILABLE
  • Redeem queue targets are minimums — a source won’t be drained below its target
Update queue targets as your strategy evolves. See Configure allocation queues.

Next steps

Risk management

Evaluate yield sources, manage concentration risk, and handle emergencies.

Configure fees

Set up performance, management, and transactional fee structures.