Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

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 UpdateOraclePrice transaction 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

FieldMeaning
oracle_priceThe published index value in USD, scaled to PRICE_EXPO = -8
last_oracle_timestampWall-clock at submission
oracle_valid_until(date + 1 day) at 09:05 ET in UTC — when the chain marks this price as expired
oracle_statusActive 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 UpdateOraclePrice whose date is 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 to Halted and 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_price stays at the previous day's value.
  • After valid_until passes, oracle_status flips to Stale. 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_status returns to Active. 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