Skip to main content

Research

The thinking behind every Stellar Index choice. Architecture decision records (ADRs) below capture every load-bearing design call with its alternatives + consequences. The operations runbooks and architecture narratives live alongside the source on GitHub.

Architecture narratives

7 docs · source on GitHub
ArchitectureVerified 2026-06-12

Ingest pipeline — the one canonical data path

How a Stellar ledger event becomes a row in our trades hypertable. Galexie → MinIO → ledgerstream → dispatcher → per-source decoders. The one canonical path.

ArchitectureVerified 2026-05-03

Aggregation plan — the policy chain from raw trade to served price

The policy chain from raw trade to served price — class filter, outlier filter, VWAP, freeze gate. Every load-bearing decision the aggregator makes.

ArchitectureVerified 2026-05-03

Supply pipeline — three-algorithm derivation, per-asset refresh

Three-domain supply derivation: XLM hard-coded, classic from ledger entries, SEP-41 from event sums. Per-asset refresh cadence. ADR-0011 in full.

ArchitectureVerified 2026-05-03

Per-contract schema evolution across versions — handling strategy

Soroban DeFi contracts upgrade in place, and event schemas can change with them. How decoders stay correct across WASM versions, including for backfill.

ArchitectureVerified 2026-05-03

Oracle manipulation — attack catalogue and defensive layers

Attack catalogue: TWAP-window stuffing, single-block manipulation, oracle drift. The defensive layers we run, ordered by how cheap they are to detect.

ArchitectureVerified 2026-06-12

High-Availability Infrastructure Plan

Per-region high-availability topology — colo primary + cloud DR, three-tier hot/warm/cold storage, the failover decision tree.

ArchitectureVerified 2026-05-05

SemVer policy for Stellar Index

What bumps the major / minor / patch on every binary release. Public types in pkg/* are SemVer-stable; internal/* moves freely.

Operations runbooks

4 guides · source on GitHub

The recipes any new operator (or auditor) would want to read before standing up their own copy. Per-alert on-call runbooks stay private; these four are the cross-cutting procedures.

Architecture decision records

36 records · source on GitHub
ADR-0038Accepted2026-06-14

Network explorer (full Stellar + Soroban) over the certified lake

ADR-0035Accepted2026-06-12

Factory-anchored contract gating for Soroban decoders

ADR-0034Accepted2026-06-05

Tiered data architecture — ClickHouse raw lake, Postgres served tier

ADR-0033Accepted2026-06-02

Completeness verification — substrate continuity, recognition, projection reconciliation

ADR-0032Accepted2026-05-29

Per-source tables are projections of soroban_events

ADR-0031Accepted2026-05-29

Coverage signal is data-derived from authoritative stores

ADR-0030Accepted2026-05-28

Per-source coverage invariant

ADR-0028Accepted2026-05-22

Tokenized real-world assets as AssetType "rwa

ADR-0026Accepted2026-05-10

Stablecoin → fiat proxy is late-binding aggregator policy, not eager ingest normalisation

ADR-0025Accepted2026-05-10

Caddy trusts Cloudflare for client-IP signal via CIDR-pinned static list

ADR-0024Accepted2026-04-30

Redis HA via Sentinel (not Cluster)

ADR-0023Accepted2026-04-30

SEP-41 supply observer — mint / burn / clawback event-stream tracking

ADR-0022Accepted2026-04-30

Classic-supply observers — Trustline / ClaimableBalance / LiquidityPool / ContractData entry tracking

ADR-0021Accepted2026-04-30

AccountEntry observer — live home-domain + reserve-balance tracking

ADR-0020Accepted2026-04-30

Chart API contract — timeframe + granularity + price_type

ADR-0019Accepted2026-04-28

Anomaly response policy and confidence scoring — per-asset statistical baselines

ADR-0018Accepted2026-04-28

API consistency surfaces — closed-bucket, tip, and observations

ADR-0017Accepted2026-04-27

Archive completeness invariants and dual-archive integrity model

ADR-0016Accepted2026-04-27

Per-region storage strategies for archival nodes (Hetzner full / AWS hybrid / Vultr hybrid)

ADR-0015Accepted2026-04-27

API rates served from last-closed bucket, never in-progress

ADR-0014Accepted2026-04-23

Crypto tickers as AssetType "crypto

ADR-0013Accepted2026-04-23

Adopt go-stellar-sdk/xdr for SCVal decoding in source connectors

ADR-0011Accepted2026-04-27

Three-domain supply algorithm — XLM hard-coded, classic from ledger entries, SEP-41 from event sums

ADR-0010Accepted2026-04-22

Off-chain fiat currencies as AssetType "fiat

ADR-0009Accepted2026-04-27

API latency budget — per-component time slices summing to p95 ≤ 200ms / p99 ≤ 500ms

ADR-0008Accepted2026-04-27

Per-region HA topology — colo primary + cloud DR, three-tier hot/warm/cold storage

ADR-0007Accepted2026-04-22

Redis as hot-path cache + rate-limit + ephemeral state

ADR-0006Accepted2026-04-22

TimescaleDB for price time-series storage

ADR-0005Accepted2026-04-22

Monorepo with a single Go module

ADR-0004Accepted2026-04-22

Tier-1 three-validator aspiration (post-launch)

ADR-0003Accepted2026-04-22

i128 / u128 values preserved end-to-end; never truncated to int64

ADR-0002Accepted2026-04-22

Self-hosted storage is S3-compatible (MinIO), not local filesystem

ADR-0001Accepted2026-04-22

Horizon is not in the Stellar Index architecture

Why we publish all of this

Stellar already has Horizon. The reason a second pricing stack adds value is methodology — what gets included in the VWAP, how we handle cross-pair triangulation, what triggers a freeze, how we audit a Soroban contract before flipping BackfillSafe. None of that is useful behind a closed door. Every choice has an ADR with a "Why this not the alternative" section; every alert has a runbook.