Real estate oracle
Real estate markets (NYC, USA, Austin, Atlanta, Boston, MiamiBeach, BrooklynRent) use a daily oracle sourced from Parcl Labs.
How it works
- Source. Parcl Labs publishes a daily real estate price index per market, computed from a rolling window of transaction data.
- Cadence. One on-chain update per market per day at 09:05 ET.
- On chain. Each daily update lands as a signed
UpdateOraclePricetransaction from the registered oracle authority. Validators verify the signature and reject anything else.
Between updates, the chain holds the most recent published value. The underlying transaction data does not exist at a higher frequency.
What goes on chain
| Field | Meaning |
|---|---|
oracle_price | The published index value in USD, scaled to PRICE_EXPO = -8 |
last_oracle_timestamp | Wall-clock at submission |
oracle_valid_until | (date + 1 day) at 09:05 ET in UTC — when the chain marks this price as expired |
oracle_status | Active while now < valid_until, Stale after that, Halted if the per-update circuit breaker tripped |
What you'll see in the UI
- Index price: the latest oracle value. Doesn't change intraday.
- A small countdown next to the Index price showing time until the next 09:05 ET update.
The Index price is intentionally flat between updates. That's correct behavior. The housing market itself doesn't tick every second.
Mark price and triggers
For RE liquidations and TP/SL triggers, the chain uses oracle_price directly, not the orderbook-derived mark. This is the most important asymmetry vs. continuous markets, which use the median mark. See mark price for the full per-asset-class routing.
The trader-facing consequence: a stop on NYC fires when the next daily oracle update crosses your threshold, not when the orderbook moves intraday. If you set a stop $5 below the current Index, the stop won't fire until the next morning's index update prints below your trigger. The orderbook on thin daily-cadence books can drift. Orderbook activity cannot manipulate the oracle.
Safety controls
- Date monotonicity. The validator rejects any
UpdateOraclePricewhosedateis less than or equal to the last accepted date for that market. Re-submissions are safely rejected as duplicates. - Circuit breaker. If a new price moves more than the per-market
circuit_breaker_bps(default 400 bps = 4%) from the previous value, the oracle flips toHalted. The validator rejects further updates until the circuit breaker is cleared. Protects against obvious bad-data events. - Signer verification. Only the registered oracle authority pubkey can submit
UpdateOraclePrice. Validators reject any other signer.
What happens if a daily update is delayed
- The chain's
oracle_pricestays at the previous day's value. - After
valid_untilpasses,oracle_statusflips toStale. Trading continues. The chain still has a price (yesterday's), but the validator marks it as expired. - On recovery, the next successful submission advances the date and
oracle_statusreturns toActive. No state loss, no manual recovery needed.
See also
- Mark price: how the oracle feeds into mark / liquidation / trigger prices
- Markets: list of live RE markets and their per-market configs