This documents the oracle contract itself. For how the price aggregator
consumes it — as one source inside an
AssetOracle, with its own staleness and
sanity checks layered on top — see Oracles.Submitting prices
signer must authorize. submit_prices applies one package_timestamp to
every entry and fails with #10 LengthMismatch if the two vectors differ in
length.
package_timestamp is in milliseconds. Every submission is checked against
five rules before it is stored:
That last rule is per signer per feed: you cannot rewind your own history, and
one lagging signer cannot drag the aggregate backwards.
Storing a submission recomputes the feed’s aggregate immediately.
Reading prices
The read surface is Reflector-compatible, so a consumer written against Reflector works here unchanged. All reads are open.
A feed with no usable aggregate raises
#7 NoDataForFeed. That is the error you
see when the signer quorum is not met inside the aggregation window.
The three freshness knobs
They do different jobs and are easy to confuse:
Keep
max_submission_age_seconds at or below the consuming oracle’s
max_price_stale_seconds. Otherwise the aggregator rejects a price this contract
still considers valid.
Administration
All owner-gated (#[only_owner]), reached through governance.
Error codes
Its own enum, unrelated to the lending protocol’s codes.Next
Oracles
How the price aggregator composes this into a validated USD price.
Oracle disruption runbook
What to do when a feed stops producing an aggregate.
Addresses
Deployed oracle adapter addresses per network.

