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, 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 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. The underlying transaction data does not exist at a 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. 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 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. 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_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

  • Mark price: how the oracle feeds into mark / liquidation / trigger prices
  • Markets: list of live RE markets and their per-market configs