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.