The three prices, and why they are not interchangeable
Everything on this chain has three prices at once. They agree most of the time, which is what makes mixing them up expensive: a position marked at the wrong one looks safe and silently is not.
| What it is | What it is for | |
|---|---|---|
| Oracle | the Chainlink stock feed ÷ the USDG feed | NAV, share price, the deviation gate, fees |
| Pool | the pool's own sqrtPriceX96 | execution checks, and how much stock a position actually holds |
| Venue mark | a perp venue's own price | where a hedge fills and where liquidation is measured |
An LP position has no fixed share count: its composition is a function of the pool tick. So "how many shares do we hold" has to be read from the pool, and a narrow range makes that violently sensitive — in one live sample a 0.37% price gap moved the holdings by 29%. Marking a hedge at the oracle looks safe and under-hedges silently: target and position agree with each other while both disagree with reality, so no breaker arms.
Chainlink on Robinhood Chain
Chainlink is the only oracle deployed here. Data Feeds, Data Streams and CCIP are live; we use Data Feeds.
- Equity feeds are named
RHNVDA / USD, notNVDA / USD, and the answer already includes the token'suiMultiplier(). Multiplying by the multiplier again double-counts every corporate action. - Feeds are 24/5. Overnight they update rarely; across a weekend they stop entirely and hold the last value.
latestRoundData()keeps returning it, soupdatedAtis the only guard there is. - Each stock token exposes
oraclePaused(), set while a corporate action is processed: the feed freezes at the last good value while the multiplier changes. Everything here fails closed on it. - There is no L2 Sequencer Uptime Feed published for this chain, so Chainlink's standard staleness gate for
L2s cannot be built.
updatedAtis all we have.
A stale feed is not evidence about the pool, and age alone cannot tell a scheduled market close from an oracle outage. That is why the trading calendar is on chain and consulted first, and why age is a backstop rather than the primary test.
The pool side
- A stock's USDG pool is a Uniswap V3 pool, and a tick range must land on the pool's tick spacing. Asking for ±1% gives ±1.3% at the 0.3% tier and ±3% at the 1% tier; fee yield scales inversely with width, so simulating the band you asked for rather than the band you got overstates fees by ~30% and ~3x respectively.
- USDG is token0 in some pools and token1 in others. Assuming one ordering produces a near-zero liquidity figure with no error at all, which reads as "not worth deploying into" — exactly backwards.
- A V3 TWAP over a concentrated pool is a tick mean over an emptyable book. That is why the mark that prices lending debt is clamped, and why StockLend treats the pool as a cost of buying back rather than as a price.
- Uniswap V4 pools have no observation ring: the oracle moved into hooks. A V4 pool can only be TWAP-priced by something that samples it, or by its own hook.
Weekends
From Friday's close to Sunday's reopen, the feed holds while the token keeps trading. The gap between the two is the weekend premium — the thing StockLend lets a borrower sell into and the thing the $HEDGE treasury earns a fee for supplying stock against. It is also the reason a "discount" or a "premium" quoted against a frozen feed is not by itself a signal: half of what it measures is that the feed stopped.