Skip to main content
Reviewed and confirmed by a Stellar Core engineer on 14 November 2026.
This guide is for anyone writing code that turns Stellar ledger data into records: indexers, explorers, wallets, custody systems, analytics pipelines. It applies in any language. Where a rule can be checked mechanically in Go, istravex-lint does it. Every rule cites something you can check yourself: a fixture in the corpus, a lint rule, or a measured result in corpus/results/. Nothing here is “best practice” by assertion.

The one idea underneath all of it

The envelope says what a transaction asked for. LedgerCloseMeta says what happened. When they disagree, the metadata is right.
Most of the rules are that idea applied to a specific field.

The rules

1. Effects from metadata

Participants, balances and created entries come from meta, not the envelope.

2. Fees

Who paid, how much, and why fee changes over-count Soroban fees.

3. 64-bit integers

Muxed IDs, amounts, limits and TOIDs all exceed 2^53.

4. Muxed accounts

Keep the account and the ID; expect fee-bump wrapping.

5. Signed-payload signers

Store the full P… key, payload included.

6. SAC trustlines

Trustlines and accounts created without classic operations.

7. Untrusted strings

Memo text isn’t validated UTF-8.

8. Bounded recursion

Walkers over ScVal and auth trees need a depth limit.

9. Consensus data only

Diagnostic events differ between nodes. Never index them.
Short on time? Start with the checklist.

Does following it work?

The replay harness measures it. An indexer that reads effects from the envelope gets all four indexed cases wrong: two incorrect, two dropped. One that follows these rules gets all four right. stellar/wallet-backend, which already follows them, gets all six fixtures right.