CollectionName
untyped stringValue
"GNO Gems"
CollectionSymbol
untyped stringValue
"GEMS"
realmRelPath
untyped stringValue
"/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/gems/stable"
summaryPageSize
untyped bigintValue
(10 <untyped> bigint)
gnowebListLimit
untyped bigintValue
(10 <untyped> bigint)
pageWindow
untyped bigintValue
(2 <untyped> bigint)
tokenPageImageSize
untyped stringValue
"420"
RevealDelayBlocks
untyped bigintValue
(5 <untyped> bigint)
token
*v0.Token- OID
- 0dba17…eec4:111
token details
ledger
*v0.PrivateLedger// private: only this realm mints, burns and moves tokens
- OID
- 0dba17…eec4:113
ledger details
collectionOwner
.uverse.addressValue
<gnolang.StringValue>
approvedVersion
stringValue
"gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/gems/v1"
mintPriceUgnot
int64// 100 GNOT, per request
Value
100000000
whitelistBps
v0.Tree- OID
- 0dba17…eec4:9
whitelistBps details
royaltyBps
int64Value
500
royaltyRecipient
.uverse.addressValue
<gnolang.StringValue>
mintedIDs
[]v0.TokenID- OID
- 0dba17…eec4:3941
mintedIDs details
mintedTraitCombos
v0.Tree// combo key -> true
- OID
- 0dba17…eec4:14
mintedTraitCombos details
tokenComboKeys
v0.Tree// tid.String() -> comboKey string
- OID
- 0dba17…eec4:16
tokenComboKeys details
mintCountByWallet
v0.Tree// address.String() -> int64
- OID
- 0dba17…eec4:18
mintCountByWallet details
mintingOpenMirror
boolValue
true
maxMintsPerWalletMirror
int64Value
0
burnedRecords
v0.Tree// tid.String() -> burnRecord
- OID
- 0dba17…eec4:22
burnedRecords details
burnedIDs
[]v0.TokenID- OID
- 0dba17…eec4:3150
burnedIDs details
claimRecords
[]stable.claimRecord- OID
- 0dba17…eec4:3975
claimRecords details
sealedData
v0.Tree// tid.String() -> traitPreset
- OID
- 0dba17…eec4:26
sealedData details
mintHeight
v0.Tree// tid.String() -> int64
- OID
- 0dba17…eec4:28
mintHeight details
sealedImage
stringValue
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNzAiIGhlaWdodD0iMTcwIiB2aWV3Qm94PSIwIDAgMTcwIDE3MCI+PHJlY3Qgd2lkdGg9IjE3MCIgaGVpZ2h0PSIxNzAiIGZpbGw9IiMwYTBiMTAiLz48Y2lyY2xlIGN4PSI4NSIgY3k9Ijc4IiByPSIzNCIgZmlsbD0ibm"...
traitPreset
typetraitPreset is one token's locked-in trait selection -- everything gemsartfab needs to render the real image once revealed. Owned here (not imported from whichever realm minted it) since stable is the one place this needs to survive any future mint-mechanics version swap.
Value
stable.traitPreset
claimRecord
typeValue
stable.claimRecord
burnRecord
typeburnRecord keeps a burned token's compact trait selection, not its expanded name/description/attribute strings: the text is rebuilt on read (traitOnlyMetadata), so a burn frees more storage deposit.
Value
stable.burnRecord
init.31
func()- OID
- 0dba17…eec4:30
init.31 details
Trait
typeMetadata/Trait: the shape every reader here builds (grc721/v0 keeps no metadata of its own). Never stored per token -- see currentMetadata.
Value
stable.Trait
Metadata
typeValue
stable.Metadata
Name
func() string- OID
- 0dba17…eec4:32
Name details
Symbol
func() string- OID
- 0dba17…eec4:33
Symbol details
TokenCount
func() int64- OID
- 0dba17…eec4:34
TokenCount details
TokenID
func() string- OID
- 0dba17…eec4:35
TokenID details
GetName
func() stringGetName/GetSymbol: the Teller-style names some tools look for.
- OID
- 0dba17…eec4:36
GetName details
GetSymbol
func() string- OID
- 0dba17…eec4:37
GetSymbol details
OwnerOf
func(tid v0.TokenID) (.uverse.address, .uverse.error)- OID
- 0dba17…eec4:38
OwnerOf details
BalanceOf
func(owner .uverse.address) (int64, .uverse.error)- OID
- 0dba17…eec4:39
BalanceOf details
GetApproved
func(tid v0.TokenID) (.uverse.address, .uverse.error)- OID
- 0dba17…eec4:40
GetApproved details
IsApprovedForAll
func(owner .uverse.address, operator .uverse.address) bool- OID
- 0dba17…eec4:41
IsApprovedForAll details
ApprovedVersion
func() string- OID
- 0dba17…eec4:42
ApprovedVersion details
Owner
func() .uverse.address- OID
- 0dba17…eec4:43
Owner details
MintPrice
func() int64- OID
- 0dba17…eec4:44
MintPrice details
MintedIDs
func() []v0.TokenID- OID
- 0dba17…eec4:45
MintedIDs details
TotalBurned
func() int64- OID
- 0dba17…eec4:46
TotalBurned details
MintingOpen
func() bool- OID
- 0dba17…eec4:47
MintingOpen details
MaxMintsPerWallet
func() int64- OID
- 0dba17…eec4:48
MaxMintsPerWallet details
MintsByWallet
func(owner .uverse.address) int64- OID
- 0dba17…eec4:49
MintsByWallet details
IsTraitComboAvailable
func(comboKey string) bool- OID
- 0dba17…eec4:50
IsTraitComboAvailable details
WhitelistBps
func(wallet .uverse.address) (bps int64, ok bool)- OID
- 0dba17…eec4:51
WhitelistBps details
WhitelistCount
func() int64- OID
- 0dba17…eec4:52
WhitelistCount details
WhitelistEntry
func(index int) (wallet string, bps int64)- OID
- 0dba17…eec4:53
WhitelistEntry details
EffectivePrice
func(caller .uverse.address) int64- OID
- 0dba17…eec4:54
EffectivePrice details
RoyaltyInfo
func(tid v0.TokenID, salePrice int64) (.uverse.address, int64, .uverse.error)- OID
- 0dba17…eec4:55
RoyaltyInfo details
RoyaltyBps
func() int64- OID
- 0dba17…eec4:56
RoyaltyBps details
RoyaltyRecipient
func() .uverse.address- OID
- 0dba17…eec4:57
RoyaltyRecipient details
callerAddress
func() .uverse.address- OID
- 0dba17…eec4:58
callerAddress details
assertOwner
func()- OID
- 0dba17…eec4:59
assertOwner details
SetApprovedVersion
func(pkgpath string)- OID
- 0dba17…eec4:60
SetApprovedVersion details
SetMintPrice
func(ugnot int64)- OID
- 0dba17…eec4:61
SetMintPrice details
AddToWhitelist
func(wallet .uverse.address, bps int64)- OID
- 0dba17…eec4:62
AddToWhitelist details
AddToWhitelistBatch
func(walletsCSV string, bps int64)- OID
- 0dba17…eec4:63
AddToWhitelistBatch details
RemoveFromWhitelist
func(wallet .uverse.address)- OID
- 0dba17…eec4:64
RemoveFromWhitelist details
SetRoyaltyBps
func(bps int64)- OID
- 0dba17…eec4:65
SetRoyaltyBps details
SetRoyaltyRecipient
func(recipient .uverse.address)- OID
- 0dba17…eec4:66
SetRoyaltyRecipient details
assertCallerIsApprovedVersion
func()- OID
- 0dba17…eec4:67
assertCallerIsApprovedVersion details
RecordMint
func(to .uverse.address, payer .uverse.address, tid v0.TokenID, chainName string, shapeIdx int, colorIdx int, metal string, active bool, comboKey string, rarity string) v0.TokenIDRecordMint: the ENTIRE point of this v2 candidate. Unlike the real gems6/stable's own RecordMint, this does NOT take a full, rendered grc721.Metadata -- it takes the raw trait fields instead, and writes a small fixed-size SEALED placeholder to nft's own storage. The real image is never computed here, or anywhere, during a mint transaction -- see currentMetadata for where it actually happens (a plain read, unbound by any tx-level gas-wanted). Only the approved version realm may call this. Reserves comboKey atomically with the mint, same authoritative-check role the real stable's RecordMint plays.
- OID
- 0dba17…eec4:68
RecordMint details
ClaimCount
func() int64- OID
- 0dba17…eec4:69
ClaimCount details
ClaimAt
func(index int) (wallet .uverse.address, bps int64, mintHeight_ int64, tid string)- OID
- 0dba17…eec4:70
ClaimAt details
ReportMintingOpen
func(open bool)- OID
- 0dba17…eec4:71
ReportMintingOpen details
ReportMaxMintsPerWallet
func(max int64)- OID
- 0dba17…eec4:72
ReportMaxMintsPerWallet details
Age
func(tid v0.TokenID) int64Age returns real blocks elapsed since tid was minted, or -1 if it doesn't exist / was never sealed.
- OID
- 0dba17…eec4:73
Age details
IsRevealed
func(tid v0.TokenID) boolIsRevealed reports whether tid's real metadata is visible yet.
- OID
- 0dba17…eec4:74
IsRevealed details
currentMetadata
func(tid v0.TokenID) (stable.Metadata, .uverse.error)currentMetadata is what every reader-facing function below actually returns: nft's own stored (sealed) metadata before reveal, or the real image assembled fresh from gemsartfab after -- computed on this plain read, never inside a mint or any other gas-metered write. This is the one addition to the real gems6/stable's own read path.
- OID
- 0dba17…eec4:75
currentMetadata details
sealedMetadata
func() stable.MetadatasealedMetadata: what every token shows until its reveal block, the one shared placeholder image (not per-token storage).
- OID
- 0dba17…eec4:76
sealedMetadata details
listRow
func(tid v0.TokenID) (name string, image string)listRow is one gnoweb table row's name and image: the name from the traits (no render), the image the art's thumbnail render once revealed, the shared sealed placeholder before.
- OID
- 0dba17…eec4:77
listRow details
assembledMetadata
func(tid v0.TokenID, tp stable.traitPreset) stable.Metadata- OID
- 0dba17…eec4:78
assembledMetadata details
article
func(word string) stringarticle is "An" before a vowel sound (Amethyst, Imperial, Orange), else "A".
- OID
- 0dba17…eec4:79
article details
gemDisplayName
func(colorName string, stone string, shape string, metal string, chain string) string- OID
- 0dba17…eec4:80
gemDisplayName details
colorNameFor
func(stone string, colorIdx int) stringcolorNameFor looks up a stone's colorIdx-th color name from gemsart.ColorPaletteCSV ("hex:name;hex:name;...") -- a cheap parse, not a render. Kept in sync with gemsart.RenderTokenSVG's own internal colorForStone by construction (same palette source), without ever calling RenderTokenSVG itself.
- OID
- 0dba17…eec4:81
colorNameFor details
traitOnlyMetadata
func(tp stable.traitPreset) stable.MetadatatraitOnlyMetadata builds the archived record straight from tp's raw fields -- no gemsart.RenderTokenSVG call, so no image, ever. This is what Burn archives: the burn record was never meant to keep the picture (see Burn's own comment), so there's no reason to pay the render cost to build one just to immediately discard it.
- OID
- 0dba17…eec4:82
traitOnlyMetadata details
TokenURI
func(tid v0.TokenID) (string, .uverse.error)TokenURI is the token's image itself, as a data URI: the sealed placeholder until the reveal block, then the full art. Adena puts it straight into an \<img>, which also runs the art's CSS animation.
- OID
- 0dba17…eec4:83
TokenURI details
TokenMetadata
func(tid v0.TokenID) (string, .uverse.error)TokenMetadata is the metadata as a JSON string in the camelCase shape Adena reads (name, description, backgroundColor, attributes of {traitType, value}). No image in it, so it costs no render: the image is TokenURI.
- OID
- 0dba17…eec4:84
TokenMetadata details
TokenJSON
func(tid v0.TokenID) (string, .uverse.error)TokenJSON is the classic OpenSea-style metadata (snake\_case keys, the image inline) as a base64 JSON data URI, for marketplaces that expect a tokenURI of that shape.
- OID
- 0dba17…eec4:85
TokenJSON details
jsonEscape
func(s string) string- OID
- 0dba17…eec4:86
jsonEscape details
metadataJSON
func(m stable.Metadata, traitKey string, bgKey string) string- OID
- 0dba17…eec4:87
metadataJSON details
Approve
func(to .uverse.address, tid v0.TokenID)- OID
- 0dba17…eec4:88
Approve details
SetApprovalForAll
func(operator .uverse.address, approved bool)- OID
- 0dba17…eec4:89
SetApprovalForAll details
TransferFrom
func(from .uverse.address, to .uverse.address, tid v0.TokenID)- OID
- 0dba17…eec4:90
TransferFrom details
SafeTransferFrom
func(from .uverse.address, to .uverse.address, tid v0.TokenID)SafeTransferFrom: kept for the standard signature. grc721/v0 has no receiver-contract hook, so it is TransferFrom.
- OID
- 0dba17…eec4:91
SafeTransferFrom details
Burn
func(tid v0.TokenID)Burn destroys a token. Caller must be its current owner. Archives the real trait combination as text -- always the real traits, even if burned before the reveal delay passed, since sealedData already has them regardless of whether TokenURI has started showing them publicly yet. Deliberately never renders or stores an image: the archive was only ever a text record (see BurnedTokenSummary/ renderMintedListPage's own "Burned" row), so calling gemsart.RenderTokenSVG here just to immediately discard its output was pure waste -- confirmed live, a burn on an already-revealed token cost ~165M gas, almost entirely that one re-render, roughly the same cost the whole reveal-delay design exists to avoid paying on mint. Releases the trait combo AND the reveal bookkeeping (sealedData/ mintHeight) -- maximizes the real storage-deposit refund, same reasoning the real gems6/stable's own Burn already documents.
- OID
- 0dba17…eec4:92
Burn details
traitsToCSV
func(attrs []stable.Trait) string- OID
- 0dba17…eec4:93
traitsToCSV details
TokenSummary
func(tid v0.TokenID) (string, .uverse.error)- OID
- 0dba17…eec4:94
TokenSummary details
thumbSummary
func(tid v0.TokenID) (string, .uverse.error)thumbSummary is TokenSummary with the art's thumbnail render and the metadata built from the traits, so a page of them stays well under the query gas ceiling.
- OID
- 0dba17…eec4:95
thumbSummary details
tokenSummary
func(tid v0.TokenID, thumb bool) (string, .uverse.error)- OID
- 0dba17…eec4:96
tokenSummary details
CollectionSummary
func(page int) string- OID
- 0dba17…eec4:97
CollectionSummary details
walletScanChunk
untyped bigintwalletScanChunk bounds how many ids one WalletSummary call scans; walletRenderCap bounds how many of the caller's OWN tokens it renders. The second bound is the one that matters: every matched token is a full SVG render (TokenSummary -> currentMetadata -> gemsart), and one vm/qeval has a fixed gas budget -- a wallet holding 30 pieces made the unbounded version fail outright with "out of gas in location: CPUCycles" on Pearl (2026-09-16), taking the mint page's "Your minted Gems" panel down for exactly the collectors who care most. A client pages by calling again with the returned nextIdx until it reaches the collection size, same protocol as before; it just gets more, smaller pages for a big holder.
Value
(100 <untyped> bigint)
walletRenderCap
untyped bigintwalletScanChunk bounds how many ids one WalletSummary call scans; walletRenderCap bounds how many of the caller's OWN tokens it renders. The second bound is the one that matters: every matched token is a full SVG render (TokenSummary -> currentMetadata -> gemsart), and one vm/qeval has a fixed gas budget -- a wallet holding 30 pieces made the unbounded version fail outright with "out of gas in location: CPUCycles" on Pearl (2026-09-16), taking the mint page's "Your minted Gems" panel down for exactly the collectors who care most. A client pages by calling again with the returned nextIdx until it reaches the collection size, same protocol as before; it just gets more, smaller pages for a big holder.
Value
(10 <untyped> bigint)
WalletSummary
func(owner .uverse.address, startIdx int64) (summary string, nextIdx int64)- OID
- 0dba17…eec4:98
WalletSummary details
BurnedTokenSummary
func(tid v0.TokenID) (string, .uverse.error)- OID
- 0dba17…eec4:99
BurnedTokenSummary details
bigTokenImage
func(image string) string- OID
- 0dba17…eec4:100
bigTokenImage details
shortAddr
func(a string) stringshortAddr is how lists show an address: g1 + 4 characters … last 4.
- OID
- 0dba17…eec4:101
shortAddr details
renderMintedListPage
func(b *strings.Builder, page int)- OID
- 0dba17…eec4:102
renderMintedListPage details
renderPageLinks
func(b *strings.Builder, page int, totalPages int, linkBase string)- OID
- 0dba17…eec4:103
renderPageLinks details
renderBurnedListPage
func(b *strings.Builder, page int)- OID
- 0dba17…eec4:104
renderBurnedListPage details
renderBurnedTokenPage
func(tid v0.TokenID) stringrenderBurnedTokenPage is the token route for an id that no longer exists. If it was burned, its archived record -- name, traits, who burned it, at what block -- is shown: the minted list links every burned row here, and stablev3 answered that link with a 404, which read as a broken site (found in the 2026-09-15 Pearl test run). Anything else really is a 404.
- OID
- 0dba17…eec4:105
renderBurnedTokenPage details
gnotString
func(ugnot int64) stringgnotString: ugnot as GNOT, trailing zeros trimmed (100000000 -> "100", 1500000 -> "1.5").
- OID
- 0dba17…eec4:106
gnotString details
bpsPercent
func(bps int64) stringbpsPercent: basis points as a percentage (500 -> "5%", 250 -> "2.5%"). ufmt ignores zero-padding, so "%d.%02d" printed 500 as "5.0%".
- OID
- 0dba17…eec4:107
bpsPercent details
render404
func() string- OID
- 0dba17…eec4:108
render404 details
Render
func(path string) string- OID
- 0dba17…eec4:109
Render details
checkErr
func(err .uverse.error)- OID
- 0dba17…eec4:110