NAV, drift & pricing
How basket value is displayed, why weights drift, and what the staleness badges mean.
Prices exist in exactly two places in Robinwood Stocks, and neither is on-chain in the core contracts:
- Off-chain at deploy, once, to convert equal USD weights into the immutable raw units.
- In the frontend, to display NAV, weights and drift.
The contracts themselves never read an oracle. Mint and redeem are pure in-kind exchanges against fixed units, so a wrong, stale or manipulated price can never mis-price a mint or block a redeem. See Architecture.
NAV
Displayed NAV is the sum over constituents of units[i] × price[i], using:
- Chainlink feeds for Stock Tokens:
latestRoundData()per constituent, 8 decimals, checked against the feed's heartbeat (24h). - Uniswap v4 pool prices for chain-native constituents (HOOD6), read from each token's own pool against USDG or ETH.
Weight drift
Units are fixed; prices move; therefore weights drift. A basket deployed at 1/7 each will, months later, be overweight its best performers, exactly like an ETF that never rebalances. This is deliberate behavior of the frozen line: rebalancing requires trading authority over the vault and an oracle in the core, and a frozen basket refuses both. The app shows current weights and drift on every basket page. If drift matters to you, redeem and re-mint (redeem is free; mint pays the 0.30% fee) — or hold an agentic basket, the product line built exactly for recipes that follow the market instead of drifting with it.
Staleness badges
Honest numbers beat pretty ones. The app annotates prices rather than hiding their limits:
| Badge | Meaning |
|---|---|
| market closed: Friday close prices | Stock feeds update 24/5 with US market hours; on weekends the last (Friday close) price is shown. |
| corporate action in progress | The token's oraclePaused() flag is set: Chainlink pauses the feed during splits/dividend reinvestments. Display only; raw balances and units are unaffected. |
| stale pool | A pool-priced constituent hasn't traded in 24 hours. |
Corporate actions never touch the vault
Stock Tokens implement ERC-8056 (Scaled UI Amount): splits and reinvested dividends change a display multiplier, never raw balances. Robinwood Stocks contracts work purely on raw amounts and never read the multiplier, so a 10:1 split cannot desync a basket: the vault's raw holdings and your redemption amounts are exactly what they were. Full detail: Stock Tokens & ERC-8056.