Operations
Registering a Name
Name registration is performed by calling the appropriate BNSv2 contract function. The caller becomes the owner of the name.
High-level flow:
Check availability
Submit registration transaction
Pay required STX fee
Wait for confirmation
Name is assigned to caller principal
Path 1 — Preorder + Register (safe, prevents front-running):
Generate a salted hash of the fully-qualified name: hash160(name.namespace.salt)
Submit name-preorder with the hash and STX to burn
Wait at least 1 block
Submit name-register with the actual name, namespace, and salt
Contract verifies hash match, burns STX, mints NFT to caller
Path 2 — Fast Claim (single tx, vulnerable to front-running):
Submit name-claim-fast with name, namespace, and recipient
STX burned in one step, NFT minted immediately
Risk: name is visible in the mempool before confirmation, so it can be sniped For managed namespaces: Use
mng-name-preorder+mng-name-register(no STX burn, manager controls pricing).
Updating Records
Once a name is owned, the owner can update records via contract calls. Updates go through the zonefile-resolver contract via update-zonefile(name, namespace, new-zonefile). The caller must be either the name owner OR the namespace manager (for managed namespaces). Mention the 8KB limit.
Example record updates might include:
Setting a Stacks address
Updating profile metadata
Adding custom key-value pairs
Only the current owner can modify records.
Transferring a Name
Names are transferable digital assets. transfer(id, sender, recipient) on the BNS-V2 contract. For managed namespaces, use mng-transfer(id, sender, recipient), but only if manager transfers haven't been turned off via turn-off-manager-transfers .
The owner can:
Transfer ownership to another principal
Use a name inside other contracts
Integrate names into marketplaces or identity systems
Because ownership is native to Clarity, transfers are trustless.
Resolving a Name
Resolution involves querying BNSv2 contracts for a name’s stored record.
resolve-name(name, namespace) on zonefile-resolver
The corresponding BNSv2 SDK functions: resolveNameZonefile(), getNameInfo(), getPrimaryName().
Apps can:
Call the contract directly via RPC
Use SDK helpers
Use indexers for convenience
Resolution is deterministic and does not rely on centralized servers.
Pricing
Name prices are calculated based on:
Length of the name
Presence of vowels
Presence of non-alphabetic characters
Namespace-specific pricing functions
For managed namespaces the pricing will be handled directly by the namespace manager contract
NFT Integration
Each name is minted as an NFT, allowing:
Easy transfers of ownership
Integration with NFT marketplaces and other applications
Renewals
Names in unmanaged namespaces expire after lifetime blocks. Owners have a 5,000 block grace period (~34 days) after expiration to renew via name-renewal(namespace, name).
Renewal burns STX based on the current name price.
If not renewed within the grace period, the name becomes available for anyone to register.
Managed namespace names do NOT expire (renewal-height = 0).
Marketplace
BNSv2 has a native marketplace:
list-in-ustx(id, price, commission-trait), list a name for saleunlist-in-ustx(id), remove listingbuy-in-ustx(id, commission-trait), purchase a listed name Commission is handled via the SIP-009 commission trait.For managed namespaces, the manager contract must wrap these functions.
Setting a primary name
set-primary-name(id)on BNS-V2 lets an owner designate one of their names as their primary identity.This is what wallets and apps use for display.
Only one primary name per address.
Last updated
Was this helpful?