Open your name in the app
Find your name through Soran’s lookup and open its public record. You can inspect the holder, ownership conditions and receiving instructions without signing in to the operator console. Choose Manage this name in Payment and identity, then Connect your wallet. The holder can change Stellar payment instructions. The wallet controlling the receiving address can choose its display and primary names. Network addresses and Subnames have their own management controls on the same page. The app’s wallet editing flow uses a classic G account. A name held by a C contract needs an integration that supplies that contract’s authorization; connecting its fee-paying G wallet does not make the G wallet the holder. Profile fields use the Holder SDK or a configured MCP integration. The examples below use Holder 0.10.0. Check release status for package and namespace contract requirements.Connect your wallet
walletSigner implements publicKey() and signTransaction(xdr, options). A backend can use keypairSigner with a securely supplied secret. Keep signing keys out of frontend configuration.
This example uses a classic G transaction-source account. For a contract-held name, supply the Holder SDK’s contractWallet adapter as well as a G transaction payer. The C wallet authorizes supported actions using the format its deployed __check_auth accepts. M destinations are payment routes, not signer identities.
Claim a username
- Read
claimQuotefor the current price, receiving treasury, admission rules and ownership terms. - Build a request with
createClaimIntentand review the complete receiving destination. - Authorize
claim. Issuance, fee, destination and receipt succeed together.
alice.nova is separate from applying for the top-level namespace nova.
Both G accounts and C contract wallets can claim on compatible Registrars. C claiming requires contract_claim_version() == 1; choosing a C receiving destination alone does not make that contract the claimant or upgrade an older Registrar.
Address and memo together
In the app, enter the complete destination under Payment and identity. Choose Add a memo if the recipient requires one, enter its exact type and value, then choose Sign & update. After confirmation, check the refreshed payment instructions. From code, usesetPayment to update the address and memo together:
none. After configuration, missing or invalid payment state fails instead of reverting to an ordinary address.
Choose the right write method
Read the effective address and memo with Lookup’s
resolvePayment.
G supports none, id, text and hash memos. M and C support none only. Pass the full M address to setPayment; its exact base G and u64 ID are stored through set_muxed. The ID never becomes a transaction memo. See destination examples and exact constraints.
Profile records
UsesetProfile to publish standard fields such as your avatar, description, website and social handles, including on a subname you control. It submits one transaction per key, in order; earlier confirmed writes remain if a later field fails. The current holder authorizes the records, while the information itself is self-published. Published MCP 0.10.0 also supports these writes on ordinary names and subnames through a configured local signer; hosted MCP is read-only.
clearText retracts a field by writing an empty value; it does not erase blockchain history. Standard profile readers treat empty text as unset. Payment memos use setPayment, not text records. Follow Publish your profile for the complete example and read-back step.
Network addresses
Publish a separate address for each additional network your namespace enables. The app’s Network addresses section and the SDK’ssetChainAddress manage these records. Stellar continues to use setPayment.
These are mainnet destination addresses, even when Soran’s naming contracts are on Stellar testnet. Follow Add network addresses to save and verify them.
Subnames
When your namespace enables subnames, you can create one child level under a name you hold, such asshop.alice.nova. The parent holder controls each child’s receiving instructions and profile. A different receiving wallet does not gain ownership.
Use Create and manage subnames for the app flow and SDK examples. The existing setPayment, setRecord, profile and display-name methods accept child names. Claiming, setAddress, individual name transfers and renewals remain operations on ordinary name.namespace names.
Account display names
In the name’s Display name controls, choose Set as display name, then optionally Set as primary name. The receiving wallet must authorize these choices. In code:clearReverse(namespace) and clearPrimary() to remove account elections. G/C elections do not distinguish customer memos on a shared account. Changing the payment destination to M can invalidate a previous G/C election; use the M methods below for that exact route.
Muxed display names
M elections require a configuredlookupId and Lookup capability muxed_identity_version() == 1, available on the current testnet deployment. A custom Registry or passphrase does not inherit an unrelated Lookup pin.
The signer must control the base G account. A customer who receives an exchange deposit M address cannot sign for the exchange.
- Make the active name resolve to the exact M address with
setPayment. - Elect the namespace reverse name with
setReverseMuxed. - Optionally elect that same verified reverse name as Primary with
setPrimaryMuxed.
"0" is distinct from the base G account. A transfer or reissue advances generation and requires a fresh election.
Setting or clearing a display name in Lookup or Primary pays network costs and any required record or instance storage rent. These calls do not renew shared Wasm code. Your transaction’s fee payer still pays for the write; this update does not automatically sponsor it. Check the simulated fee before signing.
Operators can maintain existing elections with the contract’s permissionless touch_reverse_muxed and touch_primary_muxed calls. A touch maintains the existing record and instance and renews code by at most 17,280 ledgers per call, paid by its transaction’s fee payer. It does not create an election or make stale proof valid. See the contract ABI and stored records.
Name transfer
For an ordinary name such asalice.nova, the current holder proposes a transfer:
The explicit intent binds the pending proposal, sender, recipient, generation and expiry. Acceptance preserves the name’s expiry and advances generation. Namespace transfer policy and name activity gates apply.
Changing the parent name’s ownership invalidates its existing subnames. They cannot be transferred independently; the new holder recreates the children they want.
To withdraw a pending proposal, call
me.cancelNameTransfer("alice.nova") instead. Transferring one name is separate from transferring its namespace.
Renew a finite name
ReadrenewalPreview(name) before authorizing renewal. It returns the exact generation and stored destination, including active: false for an expired name. This preview does not make an expired name resolve for payments.
Use renewName with a RenewIntent binding the holder, generation, existing expiry, immutable term and accepted new-expiry bounds.
Zero-term names and stale generations are ineligible. Renewal preserves generation and reactivates its stored receiving instructions. Owner reclaim rights still follow namespace policy.
An eligible grace period delays reissue; it does not keep an expired name resolving or transferable. Enabling grace protects expiries at or after activation, not names already expired then. A reserved name cannot be renewed by the old holder once it becomes reissuable. Read the current Registrar’s grace settings before relying on a renewal window.
Subnames have no separate renewal. Renewing the same parent ownership restores its valid subnames; a reissued parent does not restore the former holder’s children.
See the exact lifecycle ABI before constructing a transfer or renewal intent.
Errors and uncertain submissions
Simulation catches many permission/policy failures before signing. Existing Holder methods useHolderError; native methods use NativeClaimError with kind, optional contract code/name and txHash. A transaction that reached the network can carry that recovery hash. Check uncertain inclusion before retrying. Preflight success does not guarantee later submission success or remove its network fee.