The problem

A third of every week has no price.

Robinhood Chain went live on 1 July 2026 as an Arbitrum Orbit L2, and it trades tokenised US equities and ETFs around the clock, alongside DeFi lending. The shares those tokens represent trade for six and a half hours a day, five days a week.

Here is the actual week:

WhenHoursStateWhat it means
Mon–Fri09:30–16:00 ETRegularreal price discovery
Mon–Fri04:00–09:30 ETPre-marketthin but real
Mon–Fri16:00–20:00 ETAfter-hoursthin but real
Mon–Fri20:00–04:00 ETDark8h a night, nothing
Fri 20:00 → Sun 18:00Dark~46 continuous hours
Sun 18:00 → Mon 04:00Futures onlyES/NQ reopen on Globex
~10 days a yearHolidayfull closure

Roughly a third of every week has no price discovery at all. A tokenised position can be lent against, liquidated, or traded in every hour of it.

What oracles do today

They return one number. A lending market reading HOOD = 119.83 cannot tell a live consolidated print from Friday's close warmed over for two days. So it has to assume the worst at all times, and prices that assumption into everyone's loan-to-value.

This is not hypothetical. While building this we found a real oracle whose equity endpoint stamps some tickers with fetch time rather than print time. Query it at midnight UTC on a Saturday and the timestamp looks live. A naive consumer would treat a two-day-old close as a fresh print. hoodoracle reconciles every upstream timestamp against the exchange calendar instead of trusting it, and records per provider whether its timestamps may be used for freshness at all.

What we publish instead

Not a price. A price plus its epistemics, so the consumer can decide for itself:

struct Quote {
    uint128 price;
    uint64  confidence;    // bps band, widens as the tape goes cold
    uint8   session;       // REGULAR|PRE|POST|CLOSED|HOLIDAY
    uint8   provenance;    // TRADED|DERIVED|STALE
    uint8   sourceCount;
    uint64  maxDeviationBps;
    uint64  lastTradeTime;
}

Now a protocol can write policy that was previously impossible:

Where the number comes from when nothing trades

Crypto is the only liquid thing still open through a US weekend, so it is the proxy of last resort. We take the last close and apply a per-instrument beta against the blended BTC/ETH move measured over exactly the window the tape was shut. Both the beta and the band are fitted, against two years of realised close-to-open gaps.

The square-root-of-time model was wrong

The first version of this widened the band by √t, on the standard argument that uncertainty under a random walk grows with the square root of elapsed time. Fitting it against real gaps showed that is not what equities do.

Solving for the exponent in σ ∝ hours^k across all eight instruments gives k = 0.107, not 0.5. A weekend is roughly 3.7 times the clock hours of an overnight gap, yet its realised dispersion is only a few percent wider.

InstrumentOvernight σWeekend σFitted k
HOOD215 bps232 bps0.058
COIN180 bps165 bps-0.064
NVDA150 bps184 bps0.154
TSLA188 bps218 bps0.110
AAPL104 bps124 bps0.133
MSTR169 bps195 bps0.106
SPY55 bps62 bps0.086
TLT57 bps65 bps0.103

Calendar time is a poor clock for market risk. Information arrives around the close and the open, not evenly through Saturday. The practical consequence is that almost all of the weekend's uncertainty exists the moment the bell rings, and waiting two more days adds little. A protocol that widens gradually through a weekend is mispricing Friday evening. The old model went ±0.53% to ±6.84% across a weekend; the fitted one goes ±3.60% to ±4.80%, which is what actually happens.

The band is validated, not asserted

The band is a two-sided 95% interval, 1.96 σ. Whether that is honest is a testable question, so it is tested: every historical gap is replayed and counted against the published band.

InstrumentFitted βPrior βCoverage
HOOD0.6900.450.37993.8%
COIN0.7910.600.55793.4%
NVDA0.2750.200.14895.0%
TSLA0.3570.250.17295.2%
AAPL0.1150.120.06496.4%
MSTR0.9500.800.64594.2%
SPY0.1280.150.24195.8%
TLT0.0010.00-0.00295.6%

Every instrument lands between 93.4% and 96.4% against a 95% target, across roughly 500 gaps each. Every prior was too low except AAPL and TLT. The R² column matters too: crypto explains 56% of COIN's overnight moves and essentially none of TLT's, which is why TLT gets no drift applied at all.

What calibration does not fix. These betas are fitted on two years ending September 2026 and describe that regime. They do not anticipate a structural break, and a single headline can move a stock far outside any band fitted on ordinary days. The band is an honest summary of normal gaps, not a guarantee.

No single upstream

Sourcing is pluggable. An earlier build read prices from DIA directly, which made their terms and their uptime ours. Providers are now adapters behind one interface and the oracle runs on whichever are configured, so no vendor becomes load-bearing.

The published price is the median across whichever resolved, so one bad feed cannot drag it, and their disagreement widens the band directly through maxDeviationBps. Only providers that report genuine print times may establish freshness; the rest can contribute a price but not a timestamp.

That distinction is not academic. DIA's RWA endpoint stamps several tickers with fetch time, so it is registered as a source of prices but never of freshness, and it is off by default because their own configuration documents the free tier as evaluation-only.

The current default, Yahoo's chart endpoint, needs no key and reports a real last-print time, which makes it the best free source for freshness. It is not licensed for commercial redistribution. Add a licensed vendor before production.


Try the APIRead the docs