Skip to main content
The replay harness answers a narrow question: if you index this fixture, do you store what the ledger supports? It runs every fixture that has expected_indexed through two small indexers and compares what each produces with the fixture’s expectations:
  • naive derives effects from the transaction envelope. It’s written to make exactly the mistakes that show up in real indexers: muxed IDs through Number(), fees and payers from the envelope, trustlines only from changeTrust.
  • reference derives effects from ledger metadata, the way the hardening guide says to.

Results

The naive indexer is wrong on every case, in all three ways an indexer can be wrong:
  • Incorrect on the muxed payment: it stores 1764988090084626400.
  • Incorrect on the fee-bump: it records 46,341 stroops (the bid) paid by the inner source.
  • Dropped on both SAC trustlines: no changeTrust, so as far as it’s concerned no trustline exists.
The reference indexer gets all four right. It also records feeMetaDebit on the fee-bump (46,340 stroops) to show that reading fees from balance deltas over-counts Soroban fees. See Fees.

Why two toy indexers?

Because the point isn’t the indexers, it’s the scoring. The harness shows that the corpus discriminates: a fixture that both indexers passed would be decoration. Every fixture with indexed expectations here separates a known-wrong reading from a known-right one. For scoring a real indexer, see the wallet-backend pilot and Replaying into your indexer.