alice.nova. That makes a specific set of powers yours — and only yours, enforced on chain: where the name points, what it publishes, whether your address shows as a name, and whether the name moves. @sorandomains/holder is the SDK for exactly that set.
TxSigner shape matches wallet kits directly. Every call is simulated first (typed errors before any fee), and each operation below is authorized on chain against the current holder: if the name changes hands, the powers move with it, instantly.
Where your name points
lookup.resolve() prefers; the built-in target is the fallback every freshly issued name starts with. Both are generation-gated — records you wrote stop resolving the moment the name is no longer yours, so a past holder can never haunt a name.
Your profile
PROFILE_KEYS every Soran-aware wallet reads back with lookup.profile(). One transaction per key (a Soroban invocation carries one call), submitted sequentially — a mid-batch failure names the keys already written, and those stay valid. setText(name, key, value) writes any other Symbol-legal key. Text records are overwrite-only on chain — there’s no on-chain delete — so retract a record by clearing it: clearText(name, key) writes the empty value that standard readers (lookup.profile()) treat as unset.
Your address as a name
ForwardMismatch). The primary is a pointer the PrimaryName contract re-verifies on every read — it can never outlive the name it points at. Both are cleared with clearReverse(namespace) / clearPrimary().
Transferring your name
acceptNameTransfer with their own signer. Policy-gated: namespaces that forbid transfers answer NotTransferable, and expired names can’t be moved by their former holder at all.
Errors are typed
Contract rejections surface asHolderError with the contract’s own code and name — NotHolder, NameInactive, ForwardMismatch, NotTransferable — before any fee is spent. Failures that reached the network carry txHash; always re-check a hash before retrying.