The three models
The glyphs are Soran’s shorthand and appear across the console, lookup pages, and status surfaces. A fourth glyph, ◇ cold, is not an ownership state at all — it marks a name whose storage entry has been archived while ownership is unaffected. See the two clocks.
Which model a name carries is the namespace’s policy, chosen by its operator. A wallet issuing free usernames typically issues permanent names; a staff directory issues reclaimable ones; a registrar-style paid namespace issues timed ones. As an integrator you don’t choose — you read and display.
Reclaimable, honestly
Reclaimable is a legitimate model — a company issuingbola.acme to an employee should be able to reclaim it when they leave. What Soran refuses is undisclosed reclaimability. The reclaimable flag lives in the namespace’s on-chain policy, so a receiving wallet can render “reclaimable by issuer” next to the name before anyone saves it as a payment contact.
Two hard rules follow:
- No downgrade after issuance. A namespace cannot issue names as permanent and later flip to reclaimable. Policy is fixed at construction; the only post-hoc change is the one-way door below.
- Platform revocation does not exist. Only the issuer, only if policy says so. Soran has no code path to revoke any name or namespace — see the trust model.
Timed names
Under a timed policy every name carriesexpires_at, visible to anyone who resolves it. The issuer renews to extend it — renewal is a namespace-owner action on chain, typically triggered by the holder’s payment through the issuer’s flow. Availability is derived solely from expires_at, so an expired name becomes reissuable exactly when the timestamp says and not before. A sale or transfer of a timed name conveys “until the date shown” — nothing more.
make_permanent: the one-way door
A namespace operator can upgrade their guarantee — once, irreversibly:
- Only always-permanent policies qualify. A namespace whose policy ever issued finite terms is refused — its existing names would still lapse and become reissuable, so calling it “permanent” would be a lie the contract declines to tell.
- Only clean, audited code qualifies. The immutable Registry pins the audited Registrar and Resolver Wasm hashes at construction. It attests which Registrar it deployed for the namespace and records — irreversibly — whether that code was ever upgraded. An upgraded contract can’t regain eligibility by restoring the original code: the taint records history, not current state.
- The lock is atomic.
make_permanentand the Registry’s resolver lock happen in one transaction; if any check fails, nothing changes.
Verifying permanence yourself
Permanence is a claim anyone can check, without trusting Soran’s servers. The SDK bundles the reads:trustworthy: true means the namespace’s resolution path is immutable: audited code, clean provenance, locked pointer. For high-value flows — large payments, purchases on the marketplace — check it before trusting a resolution. Underneath, these are four plain Registry reads (resolver_locked, resolver_tainted, resolver_of, attested_resolver_of) you can reproduce against any RPC.
Display guidance
- Show the glyph and model wherever a name gates a decision: send confirmations, contact lists, purchase screens.
- Treat ◔ reclaimable as “the issuer controls this identity” — fine for a username, wrong for a long-lived payment contact.
- For ◐ timed names, show the date. “Until 2027-03-01” is honest; a bare checkmark isn’t.