In Railnet smart contracts, an Allocation Strategy is implemented as a MultiVehicle. See Glossary for all terminology.
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_MOVEandMULTI_VEHICLE_DISPATCH, scoped to the Sector Accounting EngineMULTI_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.
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().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 Change a cap or mode later with
authorize for the default configuration, or authorizeAndConfigure to set the vehicle’s mode and cap in the same transaction.manager.configure(vehicle, config).3
Unauthorize a yield source
To remove a yield source, first redeem all assets out of it, then unauthorize 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
- Deposit queue
- Redeem queue
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).maxmeans no limit (allocate all available to this source).target.thresholdis a tolerance band: the entry is skipped when holdings are already withinthresholdof 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.
[{Aave, target: 80000e18}, {Morpho, target: 20000e18}]:- First 80,000 shares go to Aave
- Next 20,000 shares go to Morpho
- Any additional shares overflow to subsequent entries
Set queues
Requires:MULTI_VEHICLE_SET_QUEUES role scoped to the Queue Strategy Engine.
How asset flow works
The Sector Accounting Engine tracks every asset and share in a sector, abytes32 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.GraphQL
Move assets to a yield source
Usemove 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.Dispatch assets to a yield source
After staging assets in a yield source’s sector, calldispatch 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.
Rebalance between yield sources
There is no singlerebalance 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
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
Stuck redemptions
Stuck redemptions
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 2. Progress stuck sub-queries — if a sub-query is stuck in a non-terminal state. Requires 3. Dispatch staged assets — if assets sit in a yield source’s sector with no active query:
MULTI_VEHICLE_FEED_QUERY_REDEEM_QUEUE scoped to the Vehicle Manager:Solidity
MULTI_VEHICLE_PROGRESS_QUERY scoped to the SubQueryEngine:Solidity
Solidity
Stuck deposits
Stuck deposits
If a deposit query is stuck in Check the yield source’s STEAM state to understand what transition is needed.
PROCESSING state, the yield source may require manual progression (common with async protocols like Ethena):Solidity
Failed dispatches
Failed dispatches
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_DISPATCHscoped to the Sector Accounting Engine - Slippage bound —
minOutputmust be0whenamountistype(uint256).max - Cap reached —
maxDepositable(vehicle)returns 0 when the vehicle is at its configured cap or paused - Source rejection — the yield source’s
createmay be reverting (check the underlying protocol’s status)
Allocation queue not behaving as expected
Allocation queue not behaving as expected
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
Next steps
Risk management
Evaluate yield sources, manage concentration risk, and handle emergencies.
Configure fees
Set up performance, management, and transactional fee structures.