Dara Docs
ReferenceDiscovery

Stellar Technology Baseline (Stage 1)

Verified: 2026-10-29. Release numbers come from the GitHub Releases API and Docker Hub, queried on that date. Semantics come from developers.stellar.org and stellar.org.

Evidence labels:

  • [OFF] official Stellar page or SDF repository.
  • [REL] GitHub release or Docker Hub tag data.
  • [PROTO] long-standing protocol behaviour that I know but did not re-fetch today. Re-verify before Testnet.
  • [3P] third-party source only; treat as unverified.

Re-verify every row before the first Testnet deployment and again before Mainnet. Protocol 30 is voted on Mainnet on 2026-11-23, during our build.


0. Assumptions in the brief that are outdated or need adjusting

#Brief assumes / impliesCurrent reality (2026-10-29)Effect on design
A1Pin "current" versionsMainnet runs Protocol 29 (2026-10-01, security fixes only, no new CAPs). Protocol 30 "Bell": Core v30.0.0 released 2026-10-16; Testnet vote 2026-11-03, Mainnet vote 2026-11-23 [OFF]. P30's CAP-88 changes the ledger-header XDR, and SDKs older than the P30 releases fail to decode P30 ledgers [OFF]Pin P30-ready versions from the start: Go SDK v0.8.0, JS SDK v17.3.0+, RPC/Galexie v30.0.0. The indexer must use P30 XDR before 2026-11-23
A2Horizon is a normal componentHorizon is deprecated for new projects: it gets protocol-compatibility updates only, no new features. Stellar RPC is the recommended API [OFF]No Horizon. RPC for reads and submission; our own indexer for history
A3Go SDK at github.com/stellar/goThe monorepo is archived. The official SDK is now github.com/stellar/go-stellar-sdk (txnbuild, rpcclient, ingest, xdr, strkey, processors) [OFF/REL]Import only go-stellar-sdk; never stellar/go
A4A single Treasury account can absorb concurrent settlements by careful sequence managementAn account can have only one transaction consumed per ledger [OFF]Sequence management alone is not enough. Throughput needs batching (up to 100 operations per transaction) and/or channel accounts: the transaction source is a channel account, while the operation source stays Treasury. This shapes the SequenceManager design (§8)
A5A supply cap can be enforced on-chain, as in the EVM siblingsA Classic asset has no on-chain supply cap. Any signature set that meets the issuer's medium threshold can issue an unlimited amount with a Payment [OFF]Either the cap is enforced by native multisig on the issuer (human co-signers) plus backend checks, or by a custom SAC admin contract with the issuer locked. This is decision Q-02
A6Burn is an operationNo burn operation exists. Supply is removed by paying the asset back to the issuer, or by Clawback; both destroy the tokens. SAC burn/clawback do the same [OFF]The domain Burn(asset, amount) maps to Treasury → issuer Payment (medium threshold on Treasury, not on the issuer)
A7Supply can be read from a nodeRPC has no asset-supply endpoint (Horizon's /assets did). Supply = Σ trustline balances + claimable balances + liquidity-pool reserves + SAC contract balances [PROTO/OFF]Compute supply ourselves. With AUTH_REQUIRED, every possible holder is an account we authorized, so the holder set is known and closed (§10)
A8Authorization and issuance need separate keys or a contractThresholds are per operation class on one account: SetTrustLineFlags is low, Payment and Clawback are medium, and changing signers/thresholds is high [OFF]Native multisig can separate KYC authorization (a low-weight online signer) from issuance (medium, human signers). See §6
A9Quickstart is only a dev toolConfirmed: "for local development and testing only… not suitable for production" [OFF]As the brief says
A10Validator vs RPCStellar RPC runs a captive Core (a watcher, not a validator). SDF runs no public Mainnet RPC [OFF]Self-hosting RPC is mandatory for Mainnet anyway; no validator needed (§11)
A11AmountsClassic amounts are int64 in stroops (7 fixed decimals); max ≈ 922,337,203,685.4775807 per balance. SAC contract balances are i128 [OFF/PROTO]The token unit (Q-04) must fit in 7 decimals, and the largest balance must fit int64

None of these breaks the brief's architecture. A4, A5 and A8 materially shape the Treasury and issuer designs.


1. Network

ItemValueSource
Mainnet protocol29 (since 2026-10-01)[OFF] software-versions
Next protocol30 "Bell": CAP-84 muxed contract addresses (W…), CAP-87 ML-DSA verification host functions, CAP-88 millisecond close time in the ledger header (closeTime stays whole seconds; consecutive ledgers may share a second)[OFF] Bell upgrade guide
P30 effect on usNot backwards-incompatible at the transaction level; XDR consumers must update[OFF]
Recent protocolsP25 X-Ray (Jan 2026), P26 Yardstick (May), P27 Zipper (Jul), P28 Adapter (Sep: CAP-83 empty tx-set value, CAP-85, CAP-86; faster ledger close; validators must run NTP)[OFF]
PassphrasesMainnet Public Global Stellar Network ; September 2015; Testnet Test SDF Network ; September 2015; Futurenet Test SDF Future Network ; October 2022[OFF]
Classic ledger capacity1,000 classic operations per ledger on Mainnet (July 2026)[OFF] fees page
Ledger close time≈5 s historically; P28 shortened and steadied it. Read it at runtime; never hard-code[OFF] / [PROTO]
TestnetReset periodically, so Testnet asset identities are disposable. Friendbot for funding; SDF public Testnet RPC exists[PROTO] / [OFF]

2. Software versions (candidates to pin)

TechnologyCurrent versionPurposeMaturityWhy selectedAlternativesCompatibility / upgrade riskSource
Stellar Corev30.0.0 (2026-10-16); v29.0.0 runs Mainnet P29Captive core inside RPC and GalexieStableRequired—Must be ≥ v30 before 2026-11-23[REL]
Stellar RPCv30.0.0 (2026-10-21); image stellar/stellar-rpc:30.0.0Reads, simulation, submission, recent eventsStable; SDF's recommended APIReplaces Horizon; self-hostableHorizon (deprecated); commercial RPC (rejected: independence)Default history window is 7 days[REL]/[OFF]
Horizonv30.0.0Legacy APIDeprecated (compatibility only)Not selected——[REL]/[OFF]
Galexiev30.0.0 (galexie-v30.0.0)Exports ledger metadata to a data lake (GCS, S3-compatible, filesystem for dev only)StableOnly if we need history beyond the RPC window (Q later)RPC retention window; history archivesData lake format is versioned[REL]/[OFF] config
Go SDKgithub.com/stellar/go-stellar-sdk v0.8.0 (2026-10-20; go 1.25 minimum)txnbuild, rpcclient, ingest, xdr, strkeyOfficial, 0.x (API may change between minors)Our backend is Go; officialJS SDK sidecar (rejected: two languages on the money path)Pin exactly; wrap behind our StellarGateway port[REL]/[OFF] README
JS/TS SDK @stellar/stellar-sdkv17.4.0 (2026-10-25); v17.3.0 is the P30 minimum for W addressesFrontends (display only; the custodial model signs server-side)OfficialNext.js frontends—v16.x line still patched[REL]/[OFF]
Stellar CLIv28.1.0 (2026-09-26); P30 release pendingLocal network, key generation for dev, SAC deploy, contract buildStableOfficial tooling—Need P30 CLI before rebuilding any contract against soroban-sdk 30[REL]/[OFF]
soroban-sdk (Rust)v29.0.1 stable; v30.0.0-rc.1Only if a contract is selected (Q-02)Stable——Use 30.0.0 stable once released (before the vote)[REL]
Rust1.97.1 local; contracts need target wasm32v1-noneContracts onlyStable——Pin with rust-toolchain.tomlLocal
OpenZeppelin Stellar Contractsv0.8.0 (2026-10-20), with an audit report for v0.8.0 in the repoAudited Soroban building blocks: tokens/{fungible, rwa, vault}, access, governance, accounts, fee-abstraction0.x, audited per releaseThe only audited RWA library foundCustom contract (rejected: §38)0.x API churn[REL]
OZ rwa modulein v0.8.0T-REX / ERC-3643-style Soroban token: identity registry, compliance modules, address and partial freeze, forced transfer, recovery, pause, batch ops, optional capAudited with the libraryOption C of the asset evaluation—It is a contract token, not a Classic asset: DEX, trustlines and Classic wallets do not apply[OFF] repo
Quickstartstellar/quickstart:latest = v689-b1585.1-latest (2026-10-28)Local / CI / demo networkDev onlyOfficial—Pin by digest, never latest[REL]

3. Classic asset semantics

TopicBehaviourSource
Identityasset_code (1–4 chars → alphanum4, 5–12 → alphanum12) + issuer account. The same code from another issuer is a different asset[OFF]
IssuanceA Payment from the issuer creates new units. The issuer holds no balance of its own asset[OFF] SAC page
BurnA Payment to the issuer destroys units. Clawback also destroys them[OFF]
Distribution patternIssuer → distribution (Treasury) account → holders. Issuer and distribution must be separate accounts[OFF]
TrustlineA holder must ChangeTrust (medium threshold, the holder's own signature) before receiving; it costs 0.5 XLM reserve and has a limit[OFF]
Flags (issuer account)AUTH_REQUIRED (trustlines start unauthorized), AUTH_REVOCABLE (the issuer can de-authorize), AUTH_CLAWBACK_ENABLED (requires revocable), AUTH_IMMUTABLE (flags can never change, and the issuer can never be merged)[OFF]
Trustline auth statesAUTHORIZED (full); AUTHORIZED_TO_MAINTAIN_LIABILITIES (keeps offers, cannot send or receive); unauthorized (frozen)[OFF]/[PROTO]
Clawback scopeApplies only to trustlines that carry TRUSTLINE_CLAWBACK_ENABLED, which is copied from the issuer flag when the trustline is created. Turning clawback on later does not affect existing trustlines[OFF]/[PROTO]
Payment errorsNO_DESTINATION, NO_TRUST, NOT_AUTHORIZED, LINE_FULL, SRC_NO_TRUST, SRC_NOT_AUTHORIZED, UNDERFUNDED[OFF]
Metadatahome_domain on the issuer + stellar.toml (SEP-1) [[CURRENCIES]][OFF]
Classic eventsSince P23 (CAP-67), Classic transfer/mint/burn/clawback/set_authorized emit Soroban-format events, readable through RPC getEvents[OFF]

4. Accounts, thresholds, multisig, reserves, fees, sequence numbers

TopicBehaviourSource
ThresholdsEach account has master weight + up to 20 signers and low/medium/high thresholds (0–255). A transaction needs the summed weight ≥ the threshold of each operation's class[OFF]/[PROTO]
LowSetTrustLineFlags, AllowTrust (deprecated), BumpSequence, ClaimClaimableBalance; also the transaction source's own check[OFF]
MediumPayment (= issuance from the issuer), PathPayment*, CreateAccount, ChangeTrust, Clawback, ClawbackClaimableBalance, sponsorship ops, ManageData, SetOptions (flags, home domain)[OFF]
HighSetOptions that changes signers or thresholds; AccountMerge[OFF]
Multisig best practiceNative signers on cold keys; never leave master weight > 0 on the issuer; check that thresholds stay reachable before every change (a misconfiguration locks the account forever)[OFF]/[PROTO]
Minimum balance(2 + subentries + numSponsoring − numSponsored) × 0.5 XLM. Account = 1 XLM; each trustline / signer / data entry / offer +0.5 XLM; max 1,000 subentries[OFF]
Sponsored reservesBeginSponsoringFutureReserves / EndSponsoringFutureReserves sandwich in one transaction; both sponsor and sponsored sign; covers account creation (starting balance 0), trustlines, signers, data, offers. The sponsor can revoke or transfer[OFF]
FeesInclusion fee ≥ 100 stroops per operation; surge pricing when demand exceeds capacity (everyone pays the lowest included bid). The fee is charged even when the transaction fails[OFF]/[PROTO]
Fee bumpA fee account wraps a signed inner transaction and pays the fee; replacing a pending transaction needs a 10× fee bid[OFF]
Ops per transaction≤ 100 Classic operations; Soroban: 1 (+1 if fee-bumped)[OFF]
Sequence numbersTransaction seq must be account seq + 1 (or within minSeqNum with that precondition). A failed transaction still consumes the sequence number and the fee; txBAD_SEQ does not consume anything [PROTO]. One transaction per source account per ledger [OFF][OFF]/[PROTO]
PreconditionsTime bounds (ledger close time), ledger bounds, minSeqNum, min sequence age, min sequence ledger gap, up to 2 extra signers. An upper time bound of 0 keeps a transaction valid forever: never use 0[OFF]
Source accountsThe transaction source pays the fee and supplies the sequence number; each operation may name another source account, whose threshold must then be met[OFF]
FinalitySCP has no reorgs: a transaction in a closed ledger is final. "Unknown" exists only between submission and the time bound[PROTO]

5. Stellar RPC: production deployment

ItemValueSource
MethodsDocker stellar/stellar-rpc (preferred), Debian package from apt.stellar.org, or source[OFF]
ConfigurationTOML file (recommended for production); runs a captive Core inside[OFF]
Hardware (Mainnet)4–8 vCPU, 16 GB RAM, 350 GB local SSD with ≥ 3K IOPS for the default 7-day window; +≈40 GB per extra retention day; ≥ 32 GB RAM and horizontal scaling above ~500 req/s[OFF] prerequisites
HistoryDefault 7-day window. Longer history comes from a Galexie data lake ("connect a data lake")[OFF]
Health / metricsgetHealth (status, latest/oldest ledger; v27.1+ adds close times); Prometheus /metrics on the admin endpoint[OFF]/[3P]
Public Mainnet RPCSDF provides none; only Testnet and Futurenet[OFF]
QuickstartLocal and test only[OFF]

6. Stellar Asset Contract (SAC) and Soroban tokens

TopicBehaviourSource
IdentityOne SAC per Classic asset; the same asset and the same supply, not a wrapper. Contract ID is deterministic from asset + network[OFF]
DeploymentAnyone can deploy it. It is not needed for Classic accounts to use the asset[OFF]
AdminDefaults to the issuer; set_admin can hand it to a G account or a contract. Admin functions: mint, clawback, set_authorized, set_admin[OFF]
FlagsEnforces the issuer's Classic flags (auth required, revocable, clawback)[OFF]
Custom SAC admin caveatIf the issuer's signers stay active, they can still issue, claw back and change trustline flags directly, bypassing the admin contract. A contract-enforced cap therefore requires locking the issuer (master weight 0, no signers) after set_admin (irreversible)[OFF] custom-sac-admin
BalancesG accounts: int64 trustlines. Contract addresses: i128 contract data[OFF]
Production exampleUSDT0 on Stellar: a Classic asset whose SAC admin is a role-gated contract, with the issuer lockedSkill reference, re-verify

7. Indexing and data

OptionStatusFit
RPC getEvents / getTransactions / getLedgersOfficial; recent window only (default 7 days)Primary MVP source. Since CAP-67, every Classic payment, mint, burn, clawback and set_authorized is an event
Go Ingest SDK (go-stellar-sdk/ingest)Official; reads Captive Core, a Galexie data lake or RPCOur indexer library: typed ledger-meta processing, gap-free by ledger sequence
Galexie + CDPOfficial, v30.0.0; S3-compatible storage works, so self-hosted MinIO/Ceph is possibleOnly if we need more history than the RPC window or a replayable archive (decided later)
History archivesOfficial, publicLast-resort backfill
HorizonDeprecatedNot used
Hosted indexers (Hubble, etc.)Third-partyNot used for correctness

8. Implications for the Treasury and sequence design (preview)

  • One transaction per account per ledger means a single Treasury source account does ≈1 transaction per ledger. Batching up to 100 payments per transaction raises this to ≈100 settlements per ledger.
  • Channel accounts: N small fee/sequence accounts act as transaction sources while Treasury is the operation source. Treasury signs for its operations; the channel signs the envelope. This is the standard Stellar pattern for parallel submission from one asset holder.
  • The SequenceManager therefore manages a pool of channel accounts, with one in-flight transaction per channel and a strict time bound. Recovery after a crash: look up the hash; if it is not found and the ledger is past the time bound, the transaction can never apply. Re-read the sequence number from the chain, then rebuild.
  • Whether this is needed is measured in Stage 25 and not assumed.

9. Ownership of fees and reserves (preview, depends on Q-01)

AccountReserveFunded by
Issuer1 XLM + 0.5 per signerPlatform
Treasury1 XLM + 0.5 per trustline + signersPlatform
Channel accounts1 XLM eachPlatform
Per-customer account (if chosen)1 XLM + 0.5 per asset trustlineSponsored by a platform sponsor account (customer holds 0 XLM)

Fees: 100 stroops per operation at base, and more under surge. At the base fee, 1 M settlements cost ≈ 10 XLM.

10. Supply reconciliation (preview)

Outstanding supply of a Classic asset = Σ all trustline balances + claimable balances + liquidity-pool reserves + SAC contract balances. With AUTH_REQUIRED and no authorized liquidity pools or contracts, it equals Σ balances of the trustlines we authorized. Every one of those accounts is known to us, so the supply can be read exactly with getLedgerEntries and cross-checked against the indexer's running sum of mint/burn/clawback events.

11. Validator architecture

OptionAssessment
A. Self-hosted RPC (captive Core) ×2Meets the independence requirement; no quorum responsibilities. Recommended (as in the siblings)
B. + a non-validating watcher/archive CoreAdds a history archive we control; useful only if Galexie or long history is selected
C. ValidatorSDF's guidance expects organizations to run three validators plus a public history archive to be a reliable tier-1 participant [PROTO]; a quorum misconfiguration can halt or fork our node. No benefit for an asset issuer. Not recommended

A Stellar node cannot create Mainnet history while disconnected; brief §66 is correct.

12. Assumptions in the brief confirmed as correct

§16 (separate issuer and distribution), §30 (SELL is not a burn), §50 (no Ethereum states; Stellar has no reorgs), §52 (a timeout is not a failure), §60–61 (self-hosted RPC, Quickstart is dev only), §64 (no validator needed), §66 (no offline Mainnet history), §72 (no hosted indexer is needed).

Sources

On this page