Your contract expires. You just don't know when.
Soroban state runs on a timer measured in ledgers, about five seconds each, and nothing tells you it is running out.
The thesis
One entry. Every contract built from that Wasm. They fail together.
Soroban keeps a contract's compiled code in a ledger entry of its own, and every contract deployed from that same code points at that one entry. So a contract's own state can be healthy until December while the code it runs expires in October — and an archived code entry stops every contract built from it until something pays to restore it.
The real expiry is therefore the earliest entry, which is rarely the obvious one, and it is shared by every contract built from the same Wasm. That is the failure this exists to catch: a fleet of contracts reported healthy right up until they stop together.
of the rent
98%
is that one shared code entry — 8,116,648 of 8,264,289 stroops, across all four of guinea-pig A's entries. Scanning only its instance and code, the same entry is 99%: identical rent, different denominator. The scope travels with the number.
What the tool actually prints
The honest parts are the persuasive parts
A real scan of guinea-pig A. It reports what it read, says that a single-contract scan cannot settle whether the code entry is shared, and says that storage it was not given keys for is unread.
Captured on 2026-09-12 and committed at docs/evidence/2026-09-12-w2-review/scan-a-human.txt. Its ledger numbers are from that day; the dashboard reads the chain now. The published package, 0.2.0, labels two things differently: the approx: line reads expires ~:, and the last line of a scan also names the warning threshold.
What it is for
One of ours expired, and we watched it happen.
Guinea-pig B was calibrated once on 5 September and then left alone — no extension, no watch, nothing keeping it alive. It declined on schedule and its instance entry is archived. Its timeline stays up after the event, because a record of what happened is evidence and not a status display.
guinea-pig B · instance
expired
- on
- 21 September 2026
- at ledger
- 4,793,687
The four kinds of entry
Three are recoverable. One is not.
The shared code entry above is one of four kinds, and they do not end the same way. Which kind an entry is decides whether running out is a bill or a burial.
instance
The contract's own state pointer.
archived
code
The compiled Wasm. Every contract built from it shares this one entry.
archived
persistent
Durable stored values.
archived
temporary
Disposable stored values. Gone permanently, with no restore.
deleted
Read from the network's own configuration: a temporary entry's minimum is 720 ledgers, about an hour. Our own temporary entry had 688 left when it was first sampled.
How it works
Scan, watch, extend
Scan
Read a contract's entries through Soroban RPC: what remains, what expires first, what it costs to keep alive, and whether the code entry is shared — or whether that cannot be determined.
Watch
Each entry you configure is read against two thresholds: seven days for a warning, one day to act. Email alerts for those thresholds are written but not switched on yet.
Extend
Evergreen has no authority over your contract. Extending a TTL needs no permission from anyone — it is a property of the chain, not a promise from us. It can pay rent, and nothing else.
Ready to see what expires first in your Soroban contracts?
Open the dashboard, run the CLI against any contract, or read the evidence we recorded doing it. Stellar testnet. You need no key and no account to scan; an account is optional, and what it does today is written down.
npx @evergreen-stellar/cli@0.2.0 scan <contract-id>