Skip to content

Observation

An observation is the act of reading the official closing price of the underlying at one timestamp in observations[] and applying the series rules to it. Observations are the only moments at which anything happens to a live series. Between observations, prices are irrelevant to the protocol.

  • observations[] is an array of uint40 UNIX timestamps, strictly ascending, fixed at creation and validated by MarketCalendar.isOfficialClose (each must be an official US equity close).
  • observations[0] is the strike observation. It fixes s0 and is the moment matching is finalised (finalizeStrike).
  • observations[1..last-1] are intermediate observations: coupon and autocall.
  • observations[last] is maturity: coupon and knock-in decision.

A “26 fortnightly observations” series therefore has 27 timestamps: one strike plus 26 coupon dates, of which the 26th is maturity.

fact Official close is 20:00 UTC while US daylight saving time is in force and 21:00 UTC otherwise, Monday to Friday, excluding registered holidays, with registered early closes at 17:00 or 18:00 UTC. DST boundaries are computed on-chain (second Sunday in March, first Sunday in November). See Oracle and MarketCalendar.

YearDST begins (US)DST ends (US)Regular close before / after
20268 Mar1 Nov21:00 UTC → 20:00 UTC → 21:00 UTC
202714 Mar7 Novsame pattern
202812 Mar5 Novsame pattern
202911 Mar4 Novsame pattern
203010 Mar3 Novsame pattern

NoteCore.observe(seriesId) is permissionless. It calls OracleAdapter.observe(feed, closeTs), which is accepted only once closeTs + closeGrace (default 5 min) has passed and walks Chainlink rounds backwards from latestRoundData to the last round with updatedAt ≤ closeTs + closeGrace — the closing print; that round must be no older than closeTs − maxPreCloseLag (default 30 min), positive and answeredInRound >= roundId. Rounds published after the grace never qualify, so the observed round does not depend on when the keeper calls. If a backup feed is configured and the primary fails, the backup is used; if the two deviate by more than maxDeviationBps (default 300) or both fail, the observation is Deferred.

observe(seriesId)price P at closeTs P < barrier barrier ≤ P < autocall P ≥ autocall intermediate maturity no couponseries continues no couponphysical settlement coupon paidseries continues coupon paidcash settlement coupon + autocallprincipal returned coupon paidcash settlement
The same price produces different outcomes at an intermediate observation and at maturity. At maturity the autocall level is irrelevant: any price at or above the barrier settles in cash.
  • Observation i cannot be processed before observation i−1 is finalised, and not before its own closeTs.
  • A Deferred observation may be retried by anyone within deferralWindow (72 h). After that, governance may forceObserve with an explicit price after a mandatory 24 h delay (event emitted), or cancel the observation, in which case no coupon is paid and no autocall occurs for that date and the series continues.
  • The first successful observe after closeTs earns keeperRewardQuote (default 2 USDG) from accrued fees. See Automation and cranks.
  • The provisional reference price used during Subscription to value SHIELD deposits pro rata. It is the latest feed answer at deposit time and has no effect on settlement; final matching uses s0.
  • Any price read outside observations[], including weekend prints, intraday moves and the 24/7 on-chain AMM price.