Oracles

Every on-chain Stellar oracle we ingest and cross-reference. Oracles are reported alongside our independent VWAP but never included in it — mixing them would import their methodology, and would double-count whichever upstream markets they read.

SEP-40 compatibility

Drop-in oracle interface

We expose three SEP-40 endpoints — /v1/oracle/lastprice, /v1/oracle/prices, /v1/oracle/x_last_price— that match the SEP-40 contract trait on-chain consumers already integrate against.

Routing your existing on-chain lastprice() calls through Rates Engine swaps in independent VWAP-backed prices without touching the calling contract.

Reflector — DEX

On-chain VWAP, SEP-40 contract

On-chain DEX oracle reading Stellar order books. One of three Reflector contracts (DEX, CEX, FX) — they share interface but route different upstream feeds.

  • No on-chain twap() or x_*() methods despite the proposal claim — we compute TWAP and cross-pair locally.
  • Three separate contracts, not one. Each has its own price set.

Reflector — CEX

CEX-fed oracle, SEP-40 contract

Reflector CEX feed — pulls aggregated CEX prices on-chain. Excluded from our VWAP at aggregator time (would import their methodology).

  • Reported alongside our prices but never priced in — the divergence worker uses it as a sanity reference, not an input.

Reflector — FX

FX-rate oracle, SEP-40 contract

Fiat-cross feed for chained pairs (e.g. EUR/USD, GBP/USD). Contributes to triangulation when an asset trades against EURC, MXNe etc.

  • Used during X2.5 forex-factor snap (chained-fiat aggregation) when no direct fiat market exists for the asset.

Redstone

Adapter contract emitting batch events

Redstone Adapter does emit events — single batched WritePrices push containing every updated feed in one transaction.

  • WritePrices body has prices + timestamps but NOT feed_ids. Feed IDs live in the InvokeContract op args (write_prices(updater, feed_ids, payload)).
  • Adapter zip-merges feed_ids and updated_feeds when their lengths match; otherwise the whole event is skipped (ErrFeedIDCountMismatch).

Band

Soroban contract — operation-args ingest

Band's Soroban contract emits ZERO events. We observe the relay()/force_relay() InvokeContract calls instead — same dispatcher hook used by any future event-less storage-mutating Soroban contract.

  • Band stores pair rates at E18 scale; relayed single-asset rates at E9. Decoder normalises to canonical fixed-point.
  • Topic-match alone never fires Band — match by (contract_id, function_name) using the dispatcher's ContractCallDecoder interface.

Divergence monitoring

Cross-check vs the canonical VWAP

The divergence worker continuously compares each oracle's published price against our computed VWAP. A persistent gap flips flags.divergence_warning on the canonical coin pages and writes a row to divergence_observations for the historical trail.