Renderer
typeRenderer draws one token for wallets. Implemented by the view realm.
Value
v1.Renderer
rendererPath
stringValue
"gno.land/r/nym-mnsrehearsal001/nsview/v1"
renderer
v1.ledgerArt- OID
- 058c22…fb3a:114
renderer details
RegisterRenderer
func(r v1.Renderer)RegisterRenderer is called BY the approved view realm, handing over the object that draws. Refused from anywhere else.
- OID
- 0b2cde…6e5f:5
RegisterRenderer details
registerRenderer
func(callerPath string, r v1.Renderer)- OID
- 0b2cde…6e5f:7
registerRenderer details
ClearRenderer
func()ClearRenderer withdraws the art at once, approval included, so the realm that drew it cannot simply register again: approving one takes the timelock. Admin, recovery or guardian.
- OID
- 0b2cde…6e5f:8
ClearRenderer details
clearRenderer
func(caller .uverse.address)- OID
- 0b2cde…6e5f:9
clearRenderer details
RendererPath
func() string- OID
- 0b2cde…6e5f:10
RendererPath details
HasRenderer
func() bool- OID
- 0b2cde…6e5f:11
HasRenderer details
TokenURI
func(tid string) (string, .uverse.error)TokenURI is the token's image, as a data: URI, for a token that exists. A renderer that answers nothing gets the built-in card instead: an empty \<img src> is a broken picture in every wallet.
- OID
- 0b2cde…6e5f:12
TokenURI details
TokenMetadata
func(tid string) (string, .uverse.error)TokenMetadata is the token's metadata as a camelCase JSON string, the shape Adena reads. The image is not in it; that is TokenURI.
- OID
- 0b2cde…6e5f:13
TokenMetadata details
builtinImage
func(tid string) stringTHE BUILT-IN CARD, for when no view is registered: the name, plainly. Deliberately plain and deliberately free of anything that could go stale. No URL — a domain this realm named could lapse and be bought by somebody else, and the link would then live in every wallet forever — and no colours or claims that a policy change could make wrong.
- OID
- 0b2cde…6e5f:14
builtinImage details
builtinMetadata
func(tid string) string- OID
- 0b2cde…6e5f:15
builtinMetadata details
escapeXML
func(s string) string- OID
- 0b2cde…6e5f:16
escapeXML details
escapeJSON
func(s string) string- OID
- 0b2cde…6e5f:17
escapeJSON details
maxTimelock
int64Value
2592000
executeWindow
int64Value
1209600
maxPathLen
untyped bigintValue
(256 <untyped> bigint)
kindAdmin
untyped stringValue
"admin"
kindRecovery
untyped stringValue
"recovery"
kindTrust
untyped stringValue
"trust"
kindDelay
untyped stringValue
"delay"
kindRenderer
untyped stringValue
"renderer"
pendingOp
typeValue
v1.pendingOp
admin
.uverse.addressValue
<gnolang.StringValue>
recovery
.uverse.addressValue
<gnolang.StringValue>
guardian
.uverse.addressValue
<gnolang.StringValue>
timelockDelay
int64Value
600
pending
v0.Tree- OID
- 0b2cde…6e5f:23
pending details
vetoes
v0.Tree- OID
- 0b2cde…6e5f:317
vetoes details
veto
typeValue
v1.veto
isAdmin
func(a .uverse.address) bool- OID
- 0b2cde…6e5f:26
isAdmin details
isRecovery
func(a .uverse.address) bool- OID
- 0b2cde…6e5f:28
isRecovery details
isGuardian
func(a .uverse.address) bool- OID
- 0b2cde…6e5f:29
isGuardian details
assertAdmin
func(caller .uverse.address)- OID
- 0b2cde…6e5f:30
assertAdmin details
assertAdminOrRecovery
func(caller .uverse.address)- OID
- 0b2cde…6e5f:31
assertAdminOrRecovery details
assertCanRevoke
func(caller .uverse.address)- OID
- 0b2cde…6e5f:32
assertCanRevoke details
isRealmPath
func(p string) boolisRealmPath accepts only a realm package path on this chain. A registry or a view proves what it is by BEING that realm, and its address is derived from the path here, so a wallet can never be trusted (nsdata audit L-4): no wallet address is the hash of a realm path. Ephemeral \`maketx run\` realms (gno.land/e/...), pure packages (/p/) and sub-realm paths (with ':') are refused with it.
- OID
- 0b2cde…6e5f:33
isRealmPath details
liveOp
func(kind string, now int64) *v1.pendingOpliveOp is the pending change of one kind, or nil — an expired one is treated as absent everywhere, so it can be neither executed nor used to block a new proposal.
- OID
- 0b2cde…6e5f:34
liveOp details
canCancel
func(op *v1.pendingOp, caller .uverse.address) boolcanCancel: recovery may cancel anything; the admin what the admin proposed; the guardian the admin's GRANTS — a registry, the art, the timelock — and never a rotation. A hot key able to block rotations could, with recovery lost, block the one change that replaces recovery (and with it, the guardian) for good.
- OID
- 0b2cde…6e5f:35
canCancel details
delayFor
func(kind string, caller .uverse.address) int64delayFor is the wait a proposal gets. An admin replacing RECOVERY waits twice the timelock: it is the one move by which a stolen admin key could eventually take the root role, so it gets the longest window for recovery to see it and cancel it. The case it exists for — recovery lost — only costs a slower replacement.
- OID
- 0b2cde…6e5f:36
delayFor details
evicting
func(now int64) boolevicting reports a live rotation of the admin that recovery proposed — recovery replacing a key it no longer trusts. While admin and recovery are still one key, at the deploy, nothing is an eviction.
- OID
- 0b2cde…6e5f:37
evicting details
byTheAdminAlone
func(a .uverse.address) boolbyTheAdminAlone: proposed by the admin, and the admin is not also recovery.
- OID
- 0b2cde…6e5f:38
byTheAdminAlone details
vetoedUntil
func(kind string, now int64) int64vetoedUntil is when the admin may propose \`kind\` again, or 0.
- OID
- 0b2cde…6e5f:39
vetoedUntil details
dropVetoesBy
func(by .uverse.address)dropVetoesBy lifts the vetoes one key sent: a guardian replaced or stood down, perhaps because it was stolen, does not keep the admin shut out.
- OID
- 0b2cde…6e5f:40
dropVetoesBy details
dropProposalsOf
func(who .uverse.address, reason string)dropProposalsOf removes every pending change \`who\` proposed: the admin's plans, the moment recovery proposes to evict it.
- OID
- 0b2cde…6e5f:41
dropProposalsOf details
setPending
func(caller .uverse.address, op *v1.pendingOp, now int64)- OID
- 0b2cde…6e5f:42
setPending details
proposeTrust
func(caller .uverse.address, pkgPath string, now int64)- OID
- 0b2cde…6e5f:43
proposeTrust details
proposeRenderer
func(caller .uverse.address, pkgPath string, now int64)- OID
- 0b2cde…6e5f:44
proposeRenderer details
proposeDelay
func(caller .uverse.address, seconds int64, now int64)proposeDelay bounds the value before anything is computed from it, so no input can wrap (nsdata audit L-3), and the proposal shows the value it would set, so a monitor can tell "to zero" from "up".
- OID
- 0b2cde…6e5f:45
proposeDelay details
proposeAdmin
func(caller .uverse.address, next .uverse.address, now int64)- OID
- 0b2cde…6e5f:46
proposeAdmin details
proposeRecovery
func(caller .uverse.address, next .uverse.address, now int64)- OID
- 0b2cde…6e5f:47
proposeRecovery details
cancelPending
func(caller .uverse.address, kind string, now int64)- OID
- 0b2cde…6e5f:48
cancelPending details
executePending
func(caller .uverse.address, kind string, now int64)- OID
- 0b2cde…6e5f:49
executePending details
dropOrphans
func()dropOrphans removes every pending change whose proposer no longer holds a role. Called after each rotation; see the note at the top.
- OID
- 0b2cde…6e5f:50
dropOrphans details
untrust
func(caller .uverse.address, registry .uverse.address)- OID
- 0b2cde…6e5f:51
untrust details
setGuardian
func(caller .uverse.address, g .uverse.address)setGuardian takes recovery, to seat a guardian as much as to replace or stand down a live one — otherwise the first move of a thief holding the admin key would be to point the guardian at themselves, disarming the emergency stop; and seating an EMPTY seat with its own bot left the thief a key that outlived its eviction, untrusting the registry and vetoing the new admin's grants, removable only by recovery (re-audit 2026-10-16, L-4). The deploy seats it while its key still holds recovery. The address must be real (nsdata audit I-4).
- OID
- 0b2cde…6e5f:52
setGuardian details
clearGuardian
func(caller .uverse.address)- OID
- 0b2cde…6e5f:53
clearGuardian details
ProposeTrust
func(pkgPath string)ProposeTrust starts trusting a registry, by package path, after the timelock. Admin only.
- OID
- 0b2cde…6e5f:54
ProposeTrust details
ProposeRenderer
func(pkgPath string)ProposeRenderer approves a view realm to draw the art, after the timelock. Admin only. The realm then registers itself (art.gno).
- OID
- 0b2cde…6e5f:55
ProposeRenderer details
ProposeTimelockDelay
func(seconds int64)ProposeTimelockDelay changes the timelock, after the current one. Admin only.
- OID
- 0b2cde…6e5f:56
ProposeTimelockDelay details
ProposeAdminTransfer
func(next .uverse.address)ProposeAdminTransfer rotates the admin after the timelock. Admin or recovery; when recovery proposes it, the admin cannot cancel it.
- OID
- 0b2cde…6e5f:57
ProposeAdminTransfer details
ProposeRecoveryTransfer
func(next .uverse.address)ProposeRecoveryTransfer rotates recovery after the timelock — twice the timelock when the admin proposes it. Admin or recovery; recovery can cancel either, so a stolen admin key cannot take it.
- OID
- 0b2cde…6e5f:58
ProposeRecoveryTransfer details
CancelPending
func(kind string)- OID
- 0b2cde…6e5f:59
CancelPending details
ExecutePending
func(kind string)ExecutePending applies a matured change. Anyone may call it.
- OID
- 0b2cde…6e5f:60
ExecutePending details
Untrust
func(registry .uverse.address)Untrust withdraws a registry's power to mint and burn, at once. Admin, recovery or guardian: removing a power is the safe direction, and a registry that has gone wrong must be stoppable in one transaction.
- OID
- 0b2cde…6e5f:61
Untrust details
SetGuardian
func(g .uverse.address)- OID
- 0b2cde…6e5f:62
SetGuardian details
ClearGuardian
func()- OID
- 0b2cde…6e5f:63
ClearGuardian details
Admin
func() .uverse.address- OID
- 0b2cde…6e5f:64
Admin details
Recovery
func() .uverse.address- OID
- 0b2cde…6e5f:65
Recovery details
Guardian
func() .uverse.address- OID
- 0b2cde…6e5f:66
Guardian details
TimelockDelay
func() int64- OID
- 0b2cde…6e5f:67
TimelockDelay details
PendingAdmin
func() .uverse.address- OID
- 0b2cde…6e5f:68
PendingAdmin details
GetPending
func(kind string) (target string, executableAt int64, expiresAt int64, proposer .uverse.address)- OID
- 0b2cde…6e5f:69
GetPending details
ListPending
func() stringListPending names the kinds with a live pending change, comma-separated.
- OID
- 0b2cde…6e5f:70
ListPending details
IsTrusted
func(registry .uverse.address) bool- OID
- 0b2cde…6e5f:71
IsTrusted details
Trusted
func() stringTrusted lists every address that may mint or burn, comma-separated. nsdata compares this with its own address before adopting tokens, so the format is part of the contract: addresses only, no spaces.
- OID
- 0b2cde…6e5f:72
Trusted details
TrustedPath
func(registry .uverse.address) stringTrustedPath reports the package path a registry was trusted as, or "".
- OID
- 0b2cde…6e5f:73
TrustedPath details
collectionName
untyped stringValue
"Meme Name Service"
collectionSymbol
untyped stringValue
"MNS"
genesisRegistry
untyped stringValue
"gno.land/r/nym-mnsrehearsal001/nsdata/v1"
genesisView
untyped stringValue
"gno.land/r/nym-mnsrehearsal001/nsview/v1"
token
*v0.Token- OID
- 0b2cde…6e5f:117
token details
ledger
*v0.PrivateLedger- OID
- 0b2cde…6e5f:119
ledger details
trusted
v0.Tree- OID
- 0b2cde…6e5f:77
trusted details
locks
v0.Tree- OID
- 0b2cde…6e5f:79
locks details
epochs
v0.Tree- OID
- 0b2cde…6e5f:81
epochs details
lastSeq
int64Value
9
maxLockBit
untyped bigintBits a lock value may use. Eight is plenty for a registry and keeps a caller from storing arbitrary integers in a realm that cannot be patched to reject them later.
Value
(7 <untyped> bigint)
validLockBits
func(b int) boolvalidLockBits is the range check, alone, so it can be tested directly.
- OID
- 0b2cde…6e5f:83
validLockBits details
validLockBit
func(bit int) boolvalidLockBit checks a bit INDEX, for SetLock. Separate from validLockBits, which checks a whole mask, because confusing the two is exactly the bug SetLock shipped with for one commit.
- OID
- 0b2cde…6e5f:85
validLockBit details
lockBitsOf
func(tid string) int- OID
- 0b2cde…6e5f:86
lockBitsOf details
bump
func(tid string)- OID
- 0b2cde…6e5f:87
bump details
holds
typeTHE HOLDS AND THE EPOCH LIVE IN THE LEDGER'S OWN HOOKS. grc721/v0 calls an issuer-registered extension on every mint, transfer and burn, after the ledger write and before the event, and a panic in a hook aborts the movement. So the two rules this realm exists to keep are enforced at the one place EVERY movement passes through — not in the wrappers below, which merely repeat the hold check to give a clearer error first. Why that matters in a realm that never hands out a Teller: it makes the rules a property of the ledger rather than of whichever entry point a future reader adds or a marketplace finds. A transfer that reaches the ledger by any route moves the epoch, and a held token does not move. Approvals do not pass through a hook, so Approve checks the hold itself. The type is unexported and the only instance is attached to the private ledger, so no other realm can reach these methods.
Value
v1.holds
init.94
func()- OID
- 0b2cde…6e5f:88
init.94 details
assertNoSend
func()COINS SENT HERE ARE DESTROYED, SO REFUSE THEM. This realm has no banker, no withdrawal and no sweep, and it can never gain one — that is the whole premise of freezing it. Anything attached to a call would sit at its address until the chain ends. Checked only for a direct user call: when another realm calls in, any coins the user attached went to THAT realm, not to this one, and refusing them here would break legitimate registry calls.
- OID
- 0b2cde…6e5f:89
assertNoSend details
assertTrusted
func(caller .uverse.address)assertTrusted is the whole security model for minting. A caller that can mint can invent a name, and a name is the product. So this is checked against the REALM address of the caller rather than an address it hands us — a registry proves what it is by being it. Only package paths can be trusted (governance.gno), so a wallet can never be in this set.
- OID
- 0b2cde…6e5f:90
assertTrusted details
Mint
func(to .uverse.address, tid string, lockBits int)Mint creates a token, optionally already held in place. \`lockBits\` is the hold it starts with — a free-tier name is minted locked so there is never an instant in which it could be approved and sold before the registry got round to locking it (nothing runs between the ledger write and the line that sets the bits). Zero for an ordinary paid name.
- OID
- 0b2cde…6e5f:91
Mint details
Burn
func(tid string)Burn destroys a token. Reachable only by a trusted registry, which calls it when a name lapses past its grace period and is reclaimed. NOT reachable by the holder. A GRC-721 that lets an owner burn is correct for collectibles and wrong here: the token is a lease on a name, and destroying it would leave the registry holding a record for a name whose token no longer exists. Letting go of a name is letting it expire. The hold and the epoch are cleared by the burn hook (holds.OnBurn), the per-token approval by the ledger itself.
- OID
- 0b2cde…6e5f:92
Burn details
SetLock
func(tid string, bit int, on bool)SetLock turns one hold bit on or off. Trusted registry only. The registry decides what a bit means; this realm only guarantees that while any bit is set, nothing moves the token.
- OID
- 0b2cde…6e5f:93
SetLock details
assertUnlocked
func(tid string)- OID
- 0b2cde…6e5f:94
assertUnlocked details
LockBits
func(tid string) intLockBits reports the current hold; 0 means free to move.
- OID
- 0b2cde…6e5f:95
LockBits details
IsLocked
func(tid string) bool- OID
- 0b2cde…6e5f:96
IsLocked details
Epoch
func(tid string) int64Epoch reports the ownership epoch of a token, or 0 for one that does not exist. See epochs.
- OID
- 0b2cde…6e5f:97
Epoch details
Approve
func(to .uverse.address, tid string)Approve grants (or, to the empty address, withdraws) the per-token approval. Refused while the token is held: approvals do not pass through a ledger hook, so this is the one place the hold is checked.
- OID
- 0b2cde…6e5f:98
Approve details
RevokeApproval
func(tid string)RevokeApproval withdraws a token's per-token approval. grc721/v0 revokes by approving the empty address; this keeps the named entry point the site and tools already call, and allows it while the token is held — withdrawing a permission is the safe direction. The owner, or an operator acting for the owner, the same two callers Approve accepts.
- OID
- 0b2cde…6e5f:99
RevokeApproval details
SetApprovalForAll
func(operator .uverse.address, approved bool)- OID
- 0b2cde…6e5f:100
SetApprovalForAll details
TransferFrom
func(from .uverse.address, to .uverse.address, tid string)TransferFrom carries NO expiry check, and that is a deliberate reversal of what nslogic once did. Refusing to transfer an expired token is an anti-scam measure, and it belongs in the REGISTRY, not here: this realm does not know what expiry is and must not learn, because the moment it holds policy it stops being the small frozen thing it exists to be. The registry keeps the rule by refusing to RESOLVE an expired name. A buyer can still acquire a worthless token from a careless seller, which is true of every NFT on every chain, and the marketplace disclaimers say so. The hold is checked here for a clear error and again by the ledger hook, which also moves the epoch.
- OID
- 0b2cde…6e5f:101
TransferFrom details
SafeTransferFrom
func(from .uverse.address, to .uverse.address, tid string)SafeTransferFrom is kept for the standard signature. grc721/v0 has no receiver hook (gno has no contract-receiver registry to check), so it is TransferFrom — as the vendored version effectively was, its receiver check being a stub that always said yes.
- OID
- 0b2cde…6e5f:102
SafeTransferFrom details
OwnerOf
func(tid string) .uverse.address- OID
- 0b2cde…6e5f:103
OwnerOf details
Exists
func(tid string) bool- OID
- 0b2cde…6e5f:104
Exists details
BalanceOf
func(owner .uverse.address) int64- OID
- 0b2cde…6e5f:105
BalanceOf details
GetApproved
func(tid string) .uverse.address- OID
- 0b2cde…6e5f:106
GetApproved details
IsApprovedForAll
func(owner .uverse.address, operator .uverse.address) bool- OID
- 0b2cde…6e5f:107
IsApprovedForAll details
Name
func() string- OID
- 0b2cde…6e5f:108
Name details
Symbol
func() string- OID
- 0b2cde…6e5f:109
Symbol details
GetName
func() string- OID
- 0b2cde…6e5f:110
GetName details
GetSymbol
func() string- OID
- 0b2cde…6e5f:111
GetSymbol details
TokenCount
func() int64- OID
- 0b2cde…6e5f:112
TokenCount details
TotalSupply
func() int64- OID
- 0b2cde…6e5f:113
TotalSupply details
ID
func() stringID is the collection id wallets and indexers key on: "\<this realm's path>.MNS.0000000".
- OID
- 0b2cde…6e5f:114
ID details
Render
func(path string) stringRender builds its string by concatenation rather than with ufmt. NO DEPENDENCIES THIS REALM DOES NOT ABSOLUTELY NEED. It is meant to be deployed once and never replaced, so every import is a permanent commitment to somebody else's package. grc721/v0 (with avl and seqid, which it already depends on) is here because it IS the thing this realm is; a formatter, for one page of text, is not worth that.
- OID
- 0b2cde…6e5f:115
Render details
itoa
func(n int64) stringitoa, because importing a package to print one number would outlast every reason we had for wanting it.
- OID
- 0b2cde…6e5f:116