Real estate oracle
Real estate markets (NYC, USA, Austin, Atlanta, Boston, Miami Beach, 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. There is no intraday price discovery for housing — the underlying data simply does not exist at 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. commodities. 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; the oracle cannot be manipulated by orderbook activity.
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 toHaltedand further updates are rejected 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
- Commodity oracle — the very different architecture for sub-minute markets
- Mark price — how the oracle feeds into mark / liquidation / trigger prices
- Markets — list of live RE markets and their per-market configs