NAV, drift & pricing
How basket value is displayed, why weights drift, and what the staleness badges mean.
Prices exist in exactly two places in Vimen, 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 v1 behavior: rebalancing requires either trading authority over the vault (an admin key over funds) or an oracle in the core, and Vimen 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).
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. Vimen 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.