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

Commodity oracle

Commodity markets (BRENTOIL, COPPER, LUMBER, HRCSTEEL) source price data from the corresponding futures venues and publish it on chain. Unlike real estate, commodity oracles update on the order of seconds and stay live continuously, including during the underlying venue's off-hours.

Per-market venue

Parcl symbolUnderlying contractVenue
BRENTOILBrent crude (front-month)ICE
COPPERCopper (front-month)COMEX
LUMBERLumber (front-month)CME
HRCSTEELHot-rolled coil (front-month)COMEX

Smooth contract rolls

Each underlying futures contract expires monthly or quarterly, but Parcl V4 commodities are perps — they never expire. The on-chain oracle smooths the handoff: as the front-month contract approaches expiry, the published index blends gradually toward the next-month contract over a multi-day window. By the time the front contract drops off, the index has fully transitioned to the next month with no visible discontinuity.

Off-hours behavior

Futures venues close overnight, on weekends, and on exchange holidays. Parcl V4 perps trade 24/7 regardless.

When the underlying venue is open, the on-chain oracle tracks venue prices directly. When the venue is closed, the oracle drifts toward the on-chain orderbook's depth-weighted signal at a capped rate. No single update can move the oracle by more than ~9.5% of the gap between the current oracle and the orderbook signal — a hard ceiling that protects against thin-book manipulation moving the oracle materially during low-liquidity hours.

When the venue reopens, the oracle reverts to tracking venue prices directly. The transition is seamless because the orderbook signal during closure reflects market expectations of where the underlying will be when it reopens.

What you'll see in the UI

  • Index price updates continuously, whether the venue is open or closed.
  • No "venue closed" badge. Trading is 24/7 and the Index price is always live.
  • Funding rate is computed from the on-chain orderbook's impact mid, independent of the venue's state — it stays sensitive to local order flow at all times.

Mark price and triggers

Commodities use the median mark for mark price, liquidations, and TP/SL triggers:

mark = median(oracle_price, impact_mid, last_trade)

The median is robust to any single source being wrong. See mark price for the full breakdown and per-asset-class routing.

Safety controls

  • Per-update price band. The validator rejects any oracle update that moves the price by more than the per-market price_band_bps from the previous value. Hard ceiling on any single bad submission.
  • Off-hours rate cap. During venue closures, no single update can drift the oracle by more than ~9.5% of the orderbook–oracle gap.
  • Depth threshold. The orderbook-driven drift only activates when the on-chain book has enough depth to produce a reliable depth-weighted signal. If the book is thinner than the threshold, the oracle flips to Stale and the median mark falls back to its two non-oracle legs.
  • Signed authority. All UpdateOraclePrice transactions are signed by the registered oracle authority pubkey — the validator rejects any other signer.

What happens if updates stop landing

  • The chain holds the last submitted price.
  • After valid_until expires, oracle_status flips to Stale. Trading continues; the median mark falls back to impact_mid + last_trade, both of which are continuous on-chain signals.
  • On recovery, fresh oracle updates resume landing and oracle_status returns to Active. No manual intervention is required.

See also

  • Real estate oracle — the once-daily oracle path
  • Mark price — full median-mark formula and per-asset-class routing
  • Markets — live commodity markets and their per-market configs