Capture and distribute extra yield from DeFi incentive programs
This page covers the smart contract implementation details. See Glossary.
Additional rewards are incentive tokens distributed outside the normal yield flow by DeFi protocols. These rewards — such as AAVE, COMP, MORPHO, or ENA tokens — arrive via side channels and can significantly enhance user returns.The key characteristic is that these rewards do not flow through the normal deposit/redeem lifecycle. They are distributed directly to vehicle addresses by external reward contracts and must be captured and distributed separately from base yield.
The Interceptor standard is Railnet’s solution for managing additional reward distribution. It provides a declarative on-chain configuration that off-chain indexing services read to correctly route rewards.
The Vehicle declares distribution rules via the interceptions() view function.
2
Indexers query rules
Off-chain indexers (e.g., reward distributors, airdrop systems) read these rules to determine how to route rewards.
3
Rewards are distributed
The indexer applies the routing logic and distributes rewards according to the declared rules.
By keeping distribution logic off-chain, Railnet achieves gas efficiency (no on-chain overhead for reward splitting), flexibility (rules can be updated without migrating assets), and cross-chain support (rules can specify chainId targets).
Interceptors use last-matching-rule semantics, similar to CSS or firewall rules:
The indexer iterates through the interceptions array and selects the last entry that matches the reward token (either exactly or via the address(0) wildcard)
Within the selected rule, for each unique target, only the last valid entry matching the current chainId (or the 0 wildcard) is used
This allows you to define a default rule for all tokens, then append overrides for specific high-value tokens.
Best for: Community-first strategies, DAOs with community governance, maximum transparency setups.
The operator takes a percentage of rewards; the rest passes through to users.
// Take 5% fee on all additional rewardsInterceptor.Interception[] memory interceptions = new Interceptor.Interception[](1);interceptions[0] = Interceptor.Interception({ asset: address(0), // All reward tokens recipients: new Interceptor.Recipient[](1)});interceptions[0].recipients[0] = Interceptor.Recipient({ target: operatorFeeAddress, shareBps: 500, // 5% chainId: 0 // All chains});// Remaining 95% passes through to usersmultiVehicle.setInterceptions(interceptions);
Best for: Professional strategy operators, sustainable long-term operations, institutional strategies.
The operator intercepts all rewards, sells them for the base asset, and reinvests to increase share price for all holders.
// Intercept 100% of all additional rewardsInterceptor.Interception[] memory interceptions = new Interceptor.Interception[](1);interceptions[0] = Interceptor.Interception({ asset: address(0), recipients: new Interceptor.Recipient[](1)});interceptions[0].recipients[0] = Interceptor.Recipient({ target: operatorRewardVault, shareBps: 10000, // 100% chainId: 0});multiVehicle.setInterceptions(interceptions);
Best for: Yield aggregators, single-asset strategies, operators with trading infrastructure.
When using the reinvestment strategy, the operator sells reward tokens and deposits the proceeds back into the Multi-Vehicle without minting new shares. This increases the share price for all holders.
// Before reinvestment:// Total assets: 1,000,000 USDC// Total supply: 1,000,000 shares// Share price: 1.0 USDC/share// Rewards earned and sold:// 10,000 COMP -> 50,000 USDC// 5,000 AAVE -> 100,000 USDC// Total to reinvest: 150,000 USDC// Operator deposits without minting shares:USDC.approve(address(sectorAccountingEngine), totalUsdc);sectorAccountingEngine.deposit( totalUsdc, false // allocate=false: assets go to DEPOSIT sector);// After reinvestment:// Total assets: 1,150,000 USDC// Total supply: 1,000,000 shares (unchanged)// Share price: 1.15 USDC/share (+15%)
Calling sectorAccountingEngine.deposit() without minting shares increases totalAssets while keeping totalSupply constant. Since share price = totalAssets / totalSupply, all existing holders benefit proportionally.
After rewards accumulate at the operator reward vault:
1
Sell reward tokens for the base asset
Use a DEX aggregator (e.g. 1inch, Paraswap) to sell accumulated reward tokens for the Multi-Vehicle’s base asset (e.g. USDC).
2
Deposit back into the Multi-Vehicle
Call deposit() on the Sector Accounting Engine with allocate=false. This increases totalAssets without minting new shares, raising the share price for all holders.Requires:MULTI_VEHICLE_DEPOSIT role scoped to the Sector Accounting Engine.
// Approve and deposit reinvested rewardsIERC20(usdc).approve(address(sectorAccountingEngine), totalRewards);sectorAccountingEngine.deposit(totalRewards, false);// allocate=false: assets go to the deposit sector as idle liquidity
3
Verify share price impact
After reinvestment, totalAssets increases while totalSupply stays the same, resulting in a higher share price.
// Before reinvestment: totalAssets = 1,000,000, totalSupply = 1,000,000// Share price = 1.0// After reinvesting 150,000 USDC from rewards:// totalAssets = 1,150,000, totalSupply = 1,000,000// Share price = 1.15 (+15%)