In plain English
Every time someone swaps a stock for dollars on Robinhood Chain, they pay a small fee — and that fee goes to whoever supplied the pool they traded against.
Supplying a pool well is a full-time job. Your money has to sit in a narrow price band, and the moment the price walks out of your band you stop earning anything. Stocks make it harder: the chain trades 24/7, but the NYSE closes, so prices gap while you are asleep.
Nightshyft does that job for you. You deposit USDG, and the vault buys about half into the stock, parks a tight band around the real Chainlink price, re-centres it as the price moves, widens it overnight and at weekends, tightens it at the opening bell, and puts the fees it collects back to work.
In one sentence: the stock pools on Robinhood Chain pay real fees around the clock, but only to liquidity sitting in the right place — Nightshyft keeps your money there, and widens it out when Wall Street goes home.
Your money stays yours
- Only you can withdraw your deposit. Your shares are the only key, and they only ever pay out to you. Withdrawals are never paused.
- The vault operator cannot move depositor funds; strategy settings are administered by the protocol.
- Anyone can create a vault, for any stock the protocol has listed. The price feed and the vault's name come from the on-chain registry, never from whoever creates it — so a vault cannot be pointed at a fake oracle or named to impersonate another one.
- Anyone can trigger a rebalance. If our keeper goes down, your vault still works.
What you are taking on
- Your deposit becomes about half stock, so your balance moves with the stock price — down as well as up.
- Unaudited, hackathon-grade software. Assume total loss is possible.
Overview
A Nightshyft vault holds one Robinhood stock token paired with USDG in a single concentrated Uniswap v3 position. You deposit USDG only. The vault mints shares against its oracle-priced net asset value, swaps into exactly the amount of stock the target range needs, and mints the position — all in your deposit transaction.
From then on it behaves like a disciplined market maker: it quotes tightly while the US session is open, steps back overnight, re-centres when price walks away from it, and compounds collected fees back into the range every few hours.
Shares are a plain ERC-20. Their price only moves up as fees accrue, or with the value of the underlying position; there is no rebasing and no reward token.
Mechanics
Pricing
oraclePrice() returns USDG (6 decimals) per 1e18 stock, computed as the stock Chainlink feed divided by the USDG feed, with a staleness check and a positive-answer check. Robinhood's feeds already include the token's UI multiplier, so dividends and splits need no special handling.
NAV is priced entirely off the oracle — idle USDG, idle stock, the amounts implied by the position at the oracle's sqrt price, plus uncollected fees. A manipulated pool therefore cannot inflate or deflate the share price.
Regimes
isMarketOpen() is computed on chain from block.timestamp: Monday to Friday, 09:30–16:00 New York time, with US daylight-saving applied on chain. Open ⇒ narrow band. Closed ⇒ wide band. The owner can override with forceRegime for exchange holidays.
Rebalance triggers
canRebalance() returns a boolean and a reason string. It is true when: there is no position but assets exist (no position), the regime changed (regime change), the oracle price left the band (out of band), the pool tick drifted more than recenterBps from the band centre (recenter), or minRebalanceInterval has elapsed (compound). It is false with halted, stale oracle, deviation, twap drift, no twap, no assets or nothing to do.
A rebalance burns the old position, collects everything, computes the new band, swaps the surplus leg with SwapRouter02 using an oracle-derived amountOutMinimum, and mints the new range. Leftover dust stays idle and still counts toward NAV.
Guards
Before any trade the vault compares spot to the oracle and reverts with PriceDeviation(poolPx, oraclePx) beyond maxDeviationBps, then compares spot to the pool's own TWAP and reverts with TwapDrift(poolPx, twapPx) beyond maxTwapDriftBps. Swaps are bounded by swapSlippageBps and revert with Slippage(). A feed older than maxOracleAge reverts with StaleOracle(). A deposit tears the position down and collects its fees before pricing the new shares, so accrued fees stay with the holders who earned them. In-kind withdrawal (withdraw(shares, false, 0)) never touches the oracle or the guards: it is a pro-rata slice of the vault, and keeps working through a dead feed. The owner can emergencyUnwind() a vault into idle balances without an oracle, after which only in-kind withdrawals run until the halt is lifted.
Economics: a worked example
The vault earns swap fees and pays for that with concentration risk. Whether it is profitable is a question of volume against volatility, so here is the arithmetic on a concrete vault. All numbers below are illustrative inputs you can swap for the live ones on a vault page; nothing in this section is a forecast.
The setup
Take an NVDA vault whose depositors have put in 100,000 USDG in total (its NAV), on the 0.05% pool, with the stock at $100 during the session. Every dollar figure below is for that whole vault; a $1,000 deposit is 1% of it and earns or loses 1% of each number. The narrow band is ±1.5%, so the position quotes between $98.50 and $101.50 and the rebalance swap splits the inventory into roughly $49,600 of NVDA and $50,400 of USDG — the mix that band needs at the oracle price.
Income: fees
Every swap that crosses the band pays the fee tier to the liquidity in range, pro rata. Daily fee income is therefore:
A ±1.5% band is about 130× as concentrated as full-range liquidity for the same capital, which is why a $100k vault can hold a meaningful share of the range even in a pool with more total value. Two scenarios:
| Quiet session | Busy session | |
|---|---|---|
| Volume through the band | $400,000 | $2,000,000 |
| Fee tier | 0.05% | 0.05% |
| Vault share of in-range liquidity | 15% | 15% |
| Fee income that day | $30 | $150 |
| Return on the vault's $100k of NAV, annualised (×252 sessions) | 7.6% | 37.8% |
Fees are collected into the position and folded back into the range on the next rebalance, so they show up as share-price drift rather than as a payout.
Cost: being on the wrong side of a move
Concentrated liquidity sells the stock as it rises and buys it as it falls, inside the band. If price then keeps going, the vault holds the worse leg. Against simply holding the same $49.6k / $50.4k mix, the position is worth this much less after a move (fees excluded):
| Price move | Narrow band ±1.5% | Wide band ±6% |
|---|---|---|
| ±1% | −$166 (−0.17%) | −$42 (−0.04%) |
| +1.5% (edge of narrow band) | −$374 (−0.37%) | −$94 (−0.09%) |
| +3% | −$1,118 (−1.12%) | −$375 (−0.37%) |
| +6% (edge of wide band) | −$2,607 (−2.61%) | −$1,477 (−1.48%) |
Two things follow. A 1% intraday wobble costs the narrow band about $166, which a busy session's $150 of fees roughly covers and a quiet one does not — that is the whole bet, in one line. And a gap is far more expensive than a drift: the position stops earning once price leaves the band and simply rides the leg it is left with. That is why the vault widens to ±6% when the market is closed: overnight and weekend gaps are where the big moves live, and the wide band gives up roughly four-fifths of the fee share to cut the gap loss by more than half.
Break-even
Rearranging the fee formula gives the volume a session needs to pay for a given move:
With the inputs above, a 1% move (−$166) needs about $2.2M of band volume at a 15% share to break even; a 0.5% move (about −$42) needs $560k. Sessions where price oscillates inside the band without leaving it are the profitable ones: every round trip pays fees twice and ends with the inventory back where it started. Trending sessions are the losing ones. The re-centre trigger (recenterBps) limits how long the vault stays lopsided after a drift, at the cost of one rebalance swap.
Other costs
Each rebalance swaps the inventory drift through the pool and pays the fee tier on it — on a $100k vault re-centred after a 1% drift that is roughly $10k swapped, so about $5 at 0.05% plus price impact. Gas on Robinhood Chain is a few cents per rebalance and is paid by the keeper. There is no vault fee. The guard parameters bound the swap price against the oracle (see Parameters), so a rebalance cannot quietly fill far from fair value.
Reading the vault page
The share price is NAV per share at the oracle price, so its drift since your deposit is your realised net of everything above: fees earned, minus adverse moves, minus rebalance costs. The 24h and 7d figures on each vault are that drift annualised. A vault whose share price is rising through a choppy week and flat through a trending one is doing exactly what this page describes.
Parameters
| Name | Default | Meaning |
|---|---|---|
| narrowBps | 150 | Half-width of the band, in bps, while the US session is open (±1.5%). |
| wideBps | 600 | Half-width once the session closes or at weekends (±6%). |
| recenterBps | 50 | Drift of the pool tick from the band centre that triggers a re-centre. |
| maxOracleAge | 26 h | Staleness bound. Stock feeds hold their last price overnight; heartbeat is 24 h. |
| maxDeviationBps | 105–200 | Refuse to trade when the pool's spot price is further than this from the oracle. Defaults to 100 bps plus the fee tier; the worker's tuner then re-derives it per vault from the p95 of the recorded spot/oracle gap. Owner-only. |
| maxTwapDriftBps | 50 | Refuse to trade when spot is further than this from the pool's own TWAP. The TWAP excludes the current block, so this caps how far one transaction can move the pool before making the vault trade. Owner-only. |
| twapWindow | 5 min | TWAP window in seconds; 0 disables the drift guard. Owner-only. |
| swapSlippageBps | 135–325 | amountOutMinimum for the internal rebalancing swap, versus the oracle-implied amount: maxDeviationBps + the pool's fee tier + 25 bps of impact allowance. setParams rejects a bound below maxDeviationBps + fee. Owner-only. |
| minRebalanceInterval | 6 h | Compounding cadence when nothing else triggers a rebalance. Regime changes, out-of-band moves and re-centres are never delayed by it. |
| openMinutesEt / closeMinutesEt | 570 / 960 | Session window in minutes past midnight, New York time — 09:30–16:00 ET. US daylight-saving is applied on chain, so these never need re-tuning. |
| forceRegime | 0 | 0 = auto, 1 = force narrow, 2 = force wide. Owner escape hatch for exchange holidays. |
Parameters are owner-settable through setParams and every change emits ParamsUpdated. Live values for a given vault are readable from params().
Contracts & addresses
Robinhood Chain, chain id 4663. Explorer: robinhoodchain.blockscout.com.
Protocol
| Vault factory | 0xb8de7A431376437BAB1db44A650820D5F912fcCe |
| USDG (6 dec) | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
| Uniswap v3 factory | 0x1f7d7550B1b028f7571E69A784071F0205FD2EfA |
| NonfungiblePositionManager | 0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3 |
| SwapRouter02 | 0xCaf681a66D020601342297493863E78C959E5cb2 |
Vaults
| NVDA / USDG · 0.05% | 0x3244F88Ab6219722Abf4Ff12Eb94a249ef709f47 |
| GME / USDG · 1% | 0xEEFF1daE33e05e799B5298aA17fA4Dec3B41A009 |
| TSLA / USDG · 0.3% | 0xD4beaC0Af520706e418E82149B01d83Ef957103f |
| GOOGL / USDG · 0.05% | 0x6CDdEB639dc05469873C5dd21AC0De83cDb7Fd5F |
| MSTR / USDG · 1% | 0x1e9Ac322109faF73BB8B7ab5Bc5EC53119eF2780 |
| AMZN / USDG · 0.3% | 0x4A3Bd0B42a432Ac0D1B04e5fEf83d9d7e4c55BaF |
| MSFT / USDG · 0.3% | 0xc5E2a31d867dAAfC7c65726AB88A2C5A48F2e6BD |
| QQQ / USDG · 0.05% | 0x636e2c69669008348739302E83df9dfe6dF88938 |
| AAPL / USDG · 0.05% | 0x64711Bb16D86998b685402c1b69352354c8c4568 |
| SPY / USDG · 0.05% | 0x2BB6d06f88D696685A7D9d6c42358671f6C3e363 |
Chainlink feeds (8 decimals)
FAQ
- Why anchor to Chainlink instead of the pool?
- A tokenized-stock pool is thin enough that a single large swap can move it several percent. If the vault centred on the pool it would happily re-mint liquidity around a manipulated price and hand the attacker the fill. Centring on the oracle — refusing to act when spot disagrees with the oracle by more than maxDeviationBps (100 bps plus the fee tier by default), or with the pool's own 5-minute TWAP by more than 50 bps — makes that attack unprofitable: one transaction cannot move the pool and make the vault trade there.
- What actually earns the yield?
- Uniswap v3 swap fees on the pool's fee tier, collected and folded back into the position on every rebalance. Because fees compound into the range instead of being distributed, the share price drifts upward; that drift is the yield you see on the vault pages.
- Why widen the band overnight?
- The reference market is shut but the token keeps trading. Prices gap. A ±1.5% range would simply be run over by the first informed trade after a headline, leaving the vault holding the wrong leg. Widening to ±6% earns fewer fees per unit of volume but keeps the vault on the right side of an overnight gap.
- Who calls rebalance?
- Anyone. rebalance() is permissionless and reverts with NothingToDo when there is nothing to do, so a keeper bot, a bored user, or the button on the vault page all work identically. canRebalance() tells you in advance whether it will succeed and why.
- Are there fees?
- No management or performance fee. The only costs are gas, Uniswap's swap fee on the vault's internal rebalancing swaps, and slippage bounded by swapSlippageBps.
- Can I withdraw when the market is closed?
- Yes. Withdrawals are never paused, and you can choose to exit to USDG (which swaps the stock leg, subject to the deviation guard) or to take both legs in kind, which always works.
Risks
Oracle risk
Every priced action depends on a Chainlink feed. A stale feed halts rebalancing; a wrong feed would mis-price NAV. The staleness bound is the only defence, and it is deliberately generous because stock feeds go quiet at weekends.
Impermanent loss
Concentrated liquidity is a short-volatility position. A gap through the band leaves the vault holding more of the leg that just lost.
Deviation lock-out
The guard that stops manipulation also stops the vault from acting during genuine dislocations. Deposits and USDG withdrawals revert until the pool converges.
Tokenized-equity risk
Robinhood stock tokens are issuer-backed instruments carrying counterparty and regulatory risk. They are not shares, and are not offered to US or UK persons.
Smart contract risk
Unaudited, hackathon-grade software. Assume total loss is possible.
Nightshyft is experimental software provided without warranty. Nothing here is investment advice, and the product is not offered to US or UK persons.