saleFeeRecipient
untyped string// gnotchi-opponent, v4's choice
Value
"g1ylpe9juk8cafgf9rt09wzuz85ug2lyfk5metyv"
saleFeeRateBps
int64// 5% of the declared price
Value
500
saleFeeFloorUgnot
int64// 1 GNOT flat minimum per sale
Value
1000000
collectionName
untyped stringValue
"Gnotchi gnomes"
collectionSymbol
untyped stringValue
"GNOME"
adminAddress
untyped stringValue
"g1nq99m3h9ed7vqve6ajpr3qwy2ls252m8jnundm"
numEyes
int64Value
10
numNoses
int64Value
8
hourSeconds
int64Value
3600
daySeconds
int64Value
86400
numPlots
untyped bigint// acorns.plots
Value
(3 <untyped> bigint)
plantCost
int64// acorns.plantCost
Value
1
feedCost
int64// acorns.feedCost
Value
1
acornsStart
int64Value
10
meterMax
int64Value
10
patCheer
int64Value
3
hungryAtOrBelow
int64Value
2
growHours
int64Value
24
patCooldownHours
int64Value
12
tinkerCost
int64Value
5
levelBase
int64Value
50
levelStep
int64Value
25
sulkyPenaltyPct
int64Value
10
harvestPerPlot
int64Value
3
feedBelly
int64Value
4
bellyDropEveryHours
int64Value
3
cheerDropEveryHours
int64Value
6
dailyCareCap
int64Value
60
acornReserve
int64Value
2
happyBonusPct
int64Value
10
happyWindowHours
int64Value
2
sulkyAfterHours
int64Value
72
maxLevel
int64Value
20
typeAtLevel
int64Value
5
xpPat
int64Value
5
xpFeed
int64Value
5
xpHarvestPerPlot
int64Value
10
xpTinkerTask
int64Value
15
maxActionsPerCall
untyped bigintValue
(32 <untyped> bigint)
maxBackfillHours
int64Value
48
caredWindowDays
uintValue
64
maxGnomesPageSize
untyped bigintValue
(100 <untyped> bigint)
maxListingsPageSize
untyped bigintValue
(100 <untyped> bigint)
ugnotDenom
untyped stringValue
"ugnot"
maxPriceUgnot
int64Value
1000000000000000
maxFeeRateBps
int64Value
10000
maxListingDays
int64Value
30
moodHungry
untyped stringValue
"hungry"
moodSulky
untyped stringValue
"sulky"
moodHappy
untyped stringValue
"happy"
moodContent
untyped stringValue
"content"
actionPat
untyped stringValue
"pat"
actionFeed
untyped stringValue
"feed"
actionPlant
untyped stringValue
"plant"
actionHarvest
untyped stringValue
"harvest"
actionTinker
untyped stringValue
"tinker"
typeGardener
untyped stringValue
"gardener"
typeExplorer
untyped stringValue
"explorer"
typeTinkerer
untyped stringValue
"tinkerer"
batchCap
int64Value
24
numNamedEditions
untyped bigintValue
(3 <untyped> bigint)
lockCaredDays
int64Value
30
pinOffsetSeconds
int64Value
60
pinOffsetRounds
int64pinOffsetRounds is a const expression over an imported const (beacon.PeriodSeconds), which Gno permits across package boundaries exactly as it would within one; TestPinOffsetIsTwentyRounds pins the arithmetic rather than trusting the comment above.
Value
20
hatOptions
[4]stringhatOptions / coatOptions: v4's validHats/validCoats catalogue, as an ORDERED array rather than a set, because Settle needs to draw a POSITION, not merely validate one. Order is frozen the moment this realm deploys, exactly as v4's own numEyes/numNoses ordering is frozen -- a part may be redrawn; it may never be reordered, removed or renumbered (v4's own comment on this).
- OID
- 05066e…5f85:4
hatOptions details
coatOptions
[4]string- OID
- 05066e…5f85:6
coatOptions details
eyesWeights
[10]int64eyesWeights: ECONOMY.md section 3, verbatim -- "eyes across 4 colours at 15%, 3 at 9%, 2 at 5%, 1 at 3%" -- 4+3+2+1 = 10 entries = numEyes, and 4\*15+3\*9+2\*5+1\*3 = 100. TestWeightTablesSumToOneHundred pins the sum rather than trusting the arithmetic in this comment; drawWeighted's own fallback additionally makes a drift here fail safe, not silently.
- OID
- 05066e…5f85:8
eyesWeights details
noseWeights
[8]int64noseWeights: ECONOMY.md section 3 says only "nose similar across 8 shapes" and gives no exact percentages -- BATCH-ONE.md section 4a names this directly as real work nobody has done yet. This is a SHAPE-FAITHFUL INTERPRETATION, not a transcription: four tiers of two shapes each, 20/20/15/15/10/10/5/5, the same big-gap-then-smaller-gaps shape eyesWeights has, scaled to 8 entries and summing to 100. Flagged here, not quietly presented as sourced, so the owner or a future author can replace it with real numbers the moment ECONOMY.md section 3 gets them.
- OID
- 05066e…5f85:10
noseWeights details
namedEditionOrder
[3]stringnamedEditionOrder: BATCH-ONE.md section 7's three names, in the fixed order Settle's namedPick indexes into. The order carries no meaning -- it is not a ranking -- it only has to be fixed, which it is, forever, the moment this realm deploys.
- OID
- 05066e…5f85:12
namedEditionOrder details
genesisGnomeName
untyped stringgenesisGnomeName: DECISIONS.md 2026-10-15 settles the MECHANISM (minted to this realm's own address, non-transferable, never listable, separate from the batch) but never settles a NAME anywhere in this project's documents. Placeholder, named as one; change it freely before deploying, it is read by nothing else in this file.
Value
"Genesis"
plot
typeplot: unchanged from v4. plantedAt == 0 is the empty state; readyAt is stored, not computed, so a future change to growHours (there is none possible in this file, but the shape is kept for the day a v6 adds tuning back) could never reach backwards into an already-planted plot.
Value
v5.plot
gnome
typegnome is the whole persisted pet. EVERY FIELD HERE HAS AN EXPORTED READER -- v4's own rule, carried over verbatim: a realm cannot grow a second chance at this after deploy. NOT HERE, DELIBERATELY: a name (see the package doc's "out of scope" section) and a hat/coat the OWNER chose (nothing is chosen any more; hat/coat are ROLLED exactly as eyes/nose are, and are exactly as permanent as eyes/nose always were in v4 -- there has never been a function anywhere in this family of realms that changes a gnome's hat or coat after mint). character is "" for every ordinary gnome and one of namedEditionOrder's three strings for a named one-of-one. eyes/nose/hat/coat are the sentinel -1/-1/""/"" for a named edition: its look is NOT a point in the ordinary 1,280-look space, it is BATCH-ONE.md section 6's own new art (Hob's crown and gold coat, Thistle's helmet and axe, Wick's lantern), which this contract does not need to know the pixels of -- only that Character(tokenID) names it, so the app can render the right thing. A named edition's parts are therefore never counted in eyesCounts/noseCounts/hatCounts/coatCounts: it is already as rare as a thing can be, at cap one, counted instead through characterOwner.
Value
v5.gnome
listing
typelisting: unchanged in shape from v4, now simply one of possibly SEVERAL a single owner may have standing at once (mint one, hold many) -- listings is still keyed by tokenID, which was always the right key for this and needed no change.
Value
v5.listing
feeConfig
typefeeConfig: unchanged from v4.
Value
v5.feeConfig
pendingClaim
typependingClaim is the record Claim writes and Settle consumes: the permanent, irrevocable fact that this address spent its one roll, and the future drand round it is waiting on.
Value
v5.pendingClaim
token
*v0.Token- OID
- 05066e…5f85:156
token details
ledger
*v0.PrivateLedger- OID
- 05066e…5f85:158
ledger details
nextID
v0.IDValue
<zero>
gnomes
*v0.Tree// tokenID -> \*gnome
- OID
- 05066e…5f85:17
gnomes details
ownerTokens
*v0.Tree- OID
- 05066e…5f85:20
ownerTokens details
activeToken
*v0.Tree- OID
- 05066e…5f85:23
activeToken details
lastWakeDay
*v0.Tree- OID
- 05066e…5f85:26
lastWakeDay details
lastCaredDayForOwner
*v0.Tree- OID
- 05066e…5f85:29
lastCaredDayForOwner details
balances
*v0.Tree// owner address -> int64 acorns, per PLAYER, exactly as v4
- OID
- 05066e…5f85:32
balances details
listings
*v0.Tree// tokenID -> \*listing
- OID
- 05066e…5f85:35
listings details
allowlist
*v0.Tree- OID
- 05066e…5f85:38
allowlist details
hasRolled
*v0.Tree- OID
- 05066e…5f85:41
hasRolled details
pendingClaims
*v0.Tree- OID
- 05066e…5f85:44
pendingClaims details
eyesCounts
*v0.Tree- OID
- 05066e…5f85:47
eyesCounts details
noseCounts
*v0.Tree- OID
- 05066e…5f85:50
noseCounts details
hatCounts
*v0.Tree- OID
- 05066e…5f85:53
hatCounts details
coatCounts
*v0.Tree- OID
- 05066e…5f85:56
coatCounts details
characterOwner
*v0.Tree- OID
- 05066e…5f85:59
characterOwner details
mintedCount
int64// reservations made by Claim, gates batchCap; never decremented
Value
1
settledCount
int64// completions made by Settle; informational only, see BatchStatus
Value
1
genesisTokenID
string// set exactly once, in init()
Value
"0000001"
rulesFrozen
bool// always true: there are no rules to freeze or unfreeze in v5. See AdminState.
Value
true
fee
v5.feeConfig- OID
- 05066e…5f85:155
fee details
transferGate
stringValue
""
init.99
func()- OID
- 05066e…5f85:68
init.99 details
assertFeeConfig
func(cfg v5.feeConfig, realmAddr .uverse.address)assertFeeConfig: unchanged from v4's own gate.
- OID
- 05066e…5f85:70
assertFeeConfig details
saleGateExtension
typesaleGateExtension: v4's shape, plus the genesis refusal. Panics on every transfer except the one Buy is performing right now, and ALWAYS panics for genesisTokenID regardless of transferGate -- there is no path, including a future bug in Buy, by which the genesis gnome should ever be transferable, so this checks it first and unconditionally.
Value
v5.saleGateExtension
AdminAllow
func(addr .uverse.address)AdminAllow adds addr to the allowlist, so it may call Claim. Adding an address a second time is a harmless no-op. Adding an address that has already rolled changes nothing -- hasRolled is checked independently and is permanent regardless of allowlist state.
- OID
- 05066e…5f85:71
AdminAllow details
AdminDisallow
func(addr .uverse.address)AdminDisallow removes addr from the allowlist. It does NOT, and cannot, undo a roll already spent: hasRolled is a separate, permanent record, and this function never touches it. Removing an address that was never allowed, or that has already claimed, is a harmless no-op.
- OID
- 05066e…5f85:72
AdminDisallow details
Claim
func()Claim spends the caller's one-and-only roll on this realm and pins a drand round that does not exist yet. It mints NOTHING -- Settle does that, once the pinned round is actually published -- because the whole point of this split is that the result must not be computable, by anyone, including this transaction's own caller, at the moment the roll becomes irrevocable (MINT.md section 10.2: gno.land has no on-chain entropy at all, so anything decidable inside one transaction is decidable by the caller before broadcasting it). WALLET-ONLY, the same reasoning as v4's Adopt: a gnome minted to a realm's address could never be recovered, so a batching, sponsor or multicall realm must never be able to spend a roll on anyone's behalf. The \`gnokey maketx run\` shape is refused by the identical gate, for the identical reason (IsUserCall is false for both).
- OID
- 05066e…5f85:73
Claim details
pendingClaimFor
func(claimant .uverse.address) *v5.pendingClaimpendingClaimFor looks up claimant's pending roll, shared by both Settle and SettleWithSignature so the "no pending claim" message and lookup logic exist exactly once.
- OID
- 05066e…5f85:74
pendingClaimFor details
Settle
func(claimant .uverse.address)Settle computes and permanently mints the result of claimant's pending roll, once the round Claim pinned has actually been published to the beacon by SOMEBODY -- another claimant's own SettleWithSignature, a relay, anyone. It does not publish anything itself; call SettleWithSignature instead if the round is not published yet and the caller has its signature to offer. ANYONE may call this -- the claimant themself, the project's own relayer, a stranger -- because by the time it can succeed at all, nothing is left to decide: the drand signature for the pinned round either exists publicly or it does not, and the parts this mints are a pure function of (that signature, the claimant's own address), fixed the instant the round is published, not the instant Settle happens to be called. Simulating this call before calling it for real previews a fact, not a choice -- exactly the property MINT.md section 10.5 names as the whole fix: "reading the result afterward is a free query, same as any other realm read." Refuses coins for the same reason every other non-paying function here does: there is no banker to return them, and this is a free, permissionless computation, never a payment.
- OID
- 05066e…5f85:75
Settle details
SettleWithSignature
func(claimant .uverse.address, sigHex string)SettleWithSignature is Settle, plus: if claimant's pinned round has not been published yet, this function publishes it ITSELF first, in this same transaction, using sigHex -- the round's drand signature, which the caller's own app fetches read-only from drand's public API ([https://api.drand.sh/](https://api.drand.sh/)\<chain>/public/\<round> or any mirror) and passes straight through unmodified. This is the function a player's app should call once it has fetched a signature; Settle (above) remains for a caller with no signature to offer, or that already knows (or does not care) that somebody else has published the round. SAFE EITHER WAY THE ROUND TURNS OUT TO BE, which is the one property this function exists to guarantee and the live chain fact its shape is built around (see the package doc): beacon/v2's own Publish PANICS, not no-ops, when the round is already published, so this function checks beacon.Published first and only calls Publish if that check says no. If the round was published by someone else (another claimant's own SettleWithSignature, a relay, anyone) between the moment the caller fetched sigHex and the moment this transaction lands, sigHex is simply never used -- this function still succeeds, exactly as Settle would have. A bad sigHex, by contrast, is a real failure: beacon.Publish rejects it with its own "beacon: invalid signature" panic, which aborts this whole call (and the claim stays pending, to be retried with a correct signature or left for Settle once someone else relays it). Refuses coins for the same reason Settle does and every non-paying function here does: there is no banker to return them, and this is a free, permissionless computation -- the only payment anywhere in this call is the ordinary GNOT gas the caller's own transaction spends, to the network, never to this project (MINT.md section 14).
- OID
- 05066e…5f85:76
SettleWithSignature details
settleCore
func(claimant .uverse.address, pc *v5.pendingClaim)settleCore is Settle's and SettleWithSignature's shared tail: the draw, the mint, and every write that follows, once the caller above has already confirmed the pinned round is published. Takes no \`cur realm\` because it makes no cross-realm call of its own -- beacon.Randomness and beacon.Published below are plain reads, not crossing functions, exactly as they always were before this change.
- OID
- 05066e…5f85:77
settleCore details
fnv64a
func(s string) uint64fnv64a is a plain, non-cryptographic 64-bit FNV-1a hash. IT IS NOT THE SOURCE OF UNPREDICTABILITY HERE -- drand's signature for a not-yet-existent round is, exactly as MINT.md section 10.5 designs. This exists only to DECORRELATE independent draws (two different claimants sharing a pinned round, or one claimant's own eyes-draw from their own nose-draw) from a single public drand value, the same category of use math/rand's PCG(0,0) would be fine for once combined with a secure external seed -- see MINT.md section 10.5's own list of unsafe constructions for why math/rand ALONE is not used, and note this is never alone: every call site below mixes in beacon.Randomness(pc.round), which is the only thing doing real work.
- OID
- 05066e…5f85:78
fnv64a details
seedFor
func(randomnessHex string, claimant .uverse.address, purpose string) uint64seedFor derives one independent-looking 64-bit value from the published drand randomness, the claimant's own address, and a purpose string -- so a single drand round can safely drive several unrelated draws (which named edition, which eyes, which nose, which hat/coat) for several different simultaneous claimants without any of them correlating with each other.
- OID
- 05066e…5f85:79
seedFor details
drawWeighted
func(weights []int64, totalWeight int64, seed uint64) intdrawWeighted picks an index into weights (which TestWeightTablesSumToOneHundred pins as summing to totalWeight) using seed as the source of randomness -- a plain cumulative-sum bucket walk, MINT.md section 10.5's own recommendation for what Settle should do ("a simple, bounded index... easy to audit"), applied to a weight table instead of a published array, which is the same shape of arithmetic.
- OID
- 05066e…5f85:80
drawWeighted details
Wake
func(tokenID string)Wake makes tokenID the caller's awake gnome. Free, and limited to once per UTC day -- the same day-boundary discipline SaveDay's own dailyCareDay already uses, chosen over a GNOT fee for the reason MINT.md section 2a gives: "a cost that cannot be bought, only lived".
- OID
- 05066e…5f85:81
Wake details
saveAction
typeValue
v5.saveAction
SaveDay
func(actionsRaw string)- OID
- 05066e…5f85:82
SaveDay details
ChooseType
func(kind string)- OID
- 05066e…5f85:83
ChooseType details
List
func(tokenID string, priceUgnot int64, buyer .uverse.address, days int64)List offers tokenID, which the caller must own, for sale. The lock: a named one-of-one (character != "") cannot be listed until it has lockCaredDays cared days; an ordinary gnome has no such restriction, trading from the moment it is minted (MINT.md section 12/13).
- OID
- 05066e…5f85:84
List details
Cancel
func(tokenID string)Cancel withdraws the caller's own listing on tokenID. Only the seller who created it may.
- OID
- 05066e…5f85:85
Cancel details
Buy
func(tokenID string)Buy purchases the listed gnome tokenID. v4's validate-then-commit shape, unchanged, MINUS the one-gnome-per-address refusal: MINT.md section 2a removes the hold cap from Buy specifically, and only from Buy -- Claim's hasRolled gate is the cap that still matters, and this function never touches it.
- OID
- 05066e…5f85:86
Buy details
Listing
func(tokenID string) (seller .uverse.address, priceUgnot int64, buyer .uverse.address, listedAtUnix int64, expiresAtUnix int64, feeUgnot int64, totalUgnot int64, found bool)- OID
- 05066e…5f85:87
Listing details
TotalListings
func() int64- OID
- 05066e…5f85:88
TotalListings details
ListingsPage
func(offset int, limit int) []string- OID
- 05066e…5f85:89
ListingsPage details
QuoteFee
func(priceUgnot int64) (feeUgnot int64, totalUgnot int64)- OID
- 05066e…5f85:90
QuoteFee details
FeeRules
func() string- OID
- 05066e…5f85:91
FeeRules details
Provenance
func(tokenID string) (adoptedAtUnix int64, acquiredAtUnix int64, saleCount int64, found bool)- OID
- 05066e…5f85:92
Provenance details
GnomeByToken
func(tokenID string) (hat string, coat string, eyes int64, nose int64, character string, level int64, gnomeType string, adoptedAtUnix int64, found bool)GnomeByToken: the basic facts for one token -- hat, coat, eyes, nose, character (empty for an ordinary gnome), level, calling and the moment it was minted.
- OID
- 05066e…5f85:93
GnomeByToken details
ActiveGnome
func(addr .uverse.address) (tokenID string, found bool)ActiveGnome returns the tokenID that is awake for addr right now, or found=false if nothing is (never claimed or bought a gnome, or sold the only one and has not Woken another since).
- OID
- 05066e…5f85:94
ActiveGnome details
OwnerTokens
func(addr .uverse.address) []stringOwnerTokens returns every tokenID addr currently holds, in no particular order. Unbounded and unpaginated deliberately: batchCap is 24 and the genesis gnome is permanently unreachable to any wallet, so no address can ever hold more than batchCap tokens, which is a small, fixed upper bound this call is always safely within.
- OID
- 05066e…5f85:95
OwnerTokens details
TokensPage
func(offset int, limit int) []stringTokensPage: the global token enumerator, hollowmere/v1's own pattern (TotalClaimants/ ClaimantsPage) applied here, because v4's own missing-enumerator lesson (DECISIONS.md:780-791, arena/v1 shipping with no challenge inbox and no way to ever add one) is unavailable to fix after deploy and twenty lines now is cheaper than "unavailable forever" later.
- OID
- 05066e…5f85:96
TokensPage details
GardenState
func(tokenID string) (plantedAtCsv string, readyAtCsv string, readyCount int64, found bool)- OID
- 05066e…5f85:97
GardenState details
CareState
func(tokenID string) (belly int64, cheer int64, acorns int64, totalXp int64, lastPatAtUnix int64, lastHappyEventAtUnix int64, lastActionAtUnix int64, found bool)- OID
- 05066e…5f85:98
CareState details
MeterState
func(tokenID string) (belly int64, bellyAtUnix int64, cheer int64, cheerAtUnix int64, found bool)- OID
- 05066e…5f85:99
MeterState details
Progress
func(tokenID string) (xpGarden int64, xpTinker int64, harvestCount int64, lastTinkerAtUnix int64, caredDayCount int64, dailyCareXpSpent int64, dailyCareDay int64, found bool)- OID
- 05066e…5f85:100
Progress details
CaredDays
func(tokenID string) (daysCsv string, found bool)- OID
- 05066e…5f85:101
CaredDays details
Mood
func(tokenID string) (mood string, found bool)- OID
- 05066e…5f85:102
Mood details
IsLocked
func(tokenID string) (locked bool, found bool)IsLocked reports whether tokenID is currently refused by List's lockCaredDays check -- true only for a named one-of-one with fewer than lockCaredDays cared days; false for every ordinary gnome, always, and false for a named one-of-one once it has enough cared days.
- OID
- 05066e…5f85:103
IsLocked details
CollectionInfo
func() (name string, symbol string)- OID
- 05066e…5f85:104
CollectionInfo details
TotalSupply
func() int64- OID
- 05066e…5f85:105
TotalSupply details
BalanceOf
func(addr .uverse.address) int64- OID
- 05066e…5f85:106
BalanceOf details
OwnerOfToken
func(tokenID string) (owner .uverse.address, found bool)- OID
- 05066e…5f85:107
OwnerOfToken details
TotalGnomes
func() int64- OID
- 05066e…5f85:108
TotalGnomes details
Acorns
func(addr .uverse.address) (acorns int64, found bool)- OID
- 05066e…5f85:109
Acorns details
EyesCount
func(id int64) int64- OID
- 05066e…5f85:110
EyesCount details
NoseCount
func(id int64) int64- OID
- 05066e…5f85:111
NoseCount details
HatCount
func(hat string) int64- OID
- 05066e…5f85:112
HatCount details
CoatCount
func(coat string) int64- OID
- 05066e…5f85:113
CoatCount details
CharacterOwner
func(name string) (tokenID string, found bool)CharacterOwner resolves one of the three named one-of-ones, or the genesis gnome under its own name "genesis", to its tokenID, once minted. (Second-audit-pass nitpick: an earlier version of this comment said only "one of the three named one-of-ones", which stopped being true the moment init() registered "genesis" here too -- see init()'s own comment for why that registration is safe and never touches the three editions' cap.)
- OID
- 05066e…5f85:114
CharacterOwner details
IsAllowlisted
func(addr .uverse.address) bool- OID
- 05066e…5f85:115
IsAllowlisted details
HasRolled
func(addr .uverse.address) bool- OID
- 05066e…5f85:116
HasRolled details
PendingClaim
func(addr .uverse.address) (round int64, claimedAtUnix int64, found bool)- OID
- 05066e…5f85:117
PendingClaim details
BatchStatus
func() (mintedSoFar int64, settledSoFar int64, batchCapOut int64, namedMinted int64, namedCapOut int64)BatchStatus: mintedCount is reservations made by Claim (gates batchCap); settledCount is completions made by Settle (always \<= mintedCount, the gap being pending, unsettled claims); namedMinted is how many of the three named one-of-ones have actually been minted so far -- read live off characterOwner rather than a separate counter, so there is only ever one source of truth for "has this edition been taken".
- OID
- 05066e…5f85:118
BatchStatus details
GenesisTokenID
func() string- OID
- 05066e…5f85:119
GenesisTokenID details
AdminState
func() (admin .uverse.address, frozen bool)- OID
- 05066e…5f85:120
AdminState details
LastWakeDay
func(addr .uverse.address) (day int64, found bool)- OID
- 05066e…5f85:121
LastWakeDay details
Render
func(path string) string- OID
- 05066e…5f85:122
Render details
gnomeByTokenID
func(tokenID string) (*v5.gnome, bool)- OID
- 05066e…5f85:123
gnomeByTokenID details
activeGnomeForAddr
func(addr .uverse.address) (tid string, g *v5.gnome, found bool)activeGnomeForAddr resolves addr's AWAKE gnome, if any. This is the one and only lookup SaveDay and ChooseType use -- there is deliberately no "the gnome for this address" any more.
- OID
- 05066e…5f85:124
activeGnomeForAddr details
ownerOfToken
func(tokenID string) (owner .uverse.address, found bool)- OID
- 05066e…5f85:125
ownerOfToken details
addOwnerToken
func(addr .uverse.address, tokenID string)addOwnerToken / removeOwnerToken: the hold-many index. ownerTokens stores a \*\[]string per owner so repeated appends mutate one allocation rather than replacing the tree entry every time; removal does a linear scan, which is fine at this realm's permanent, tiny upper bound (batchCap = 24 tokens that will ever exist, minus the one permanently unreachable genesis gnome, so no owner's slice is ever longer than 24 entries for the whole life of this realm).
- OID
- 05066e…5f85:126
addOwnerToken details
removeOwnerToken
func(addr .uverse.address, tokenID string)- OID
- 05066e…5f85:127
removeOwnerToken details
balanceOf
func(addr .uverse.address) int64- OID
- 05066e…5f85:128
balanceOf details
setBalance
func(addr .uverse.address, v int64)- OID
- 05066e…5f85:129
setBalance details
grantStartingPurseIfNew
func(addr .uverse.address)- OID
- 05066e…5f85:130
grantStartingPurseIfNew details
feeFor
func(priceUgnot int64) int64- OID
- 05066e…5f85:131
feeFor details
exactUgnot
func(send chain.Coins, want int64) bool- OID
- 05066e…5f85:132
exactUgnot details
coinsString
func(c chain.Coins) string- OID
- 05066e…5f85:133
coinsString details
listingFor
func(tokenID string) (*v5.listing, bool)- OID
- 05066e…5f85:134
listingFor details
lowerASCII
func(s string) stringlowerASCII: v4's own helper, unchanged -- ASCII-only on purpose (see v4's own comment on why not strings.ToLower).
- OID
- 05066e…5f85:135
lowerASCII details
anyPlotPlanted
func(g *v5.gnome) bool- OID
- 05066e…5f85:136
anyPlotPlanted details
eyesCount
func(id int64) int64- OID
- 05066e…5f85:137
eyesCount details
noseCount
func(id int64) int64- OID
- 05066e…5f85:138
noseCount details
hatCount
func(hat string) int64- OID
- 05066e…5f85:139
hatCount details
coatCount
func(coat string) int64- OID
- 05066e…5f85:140
coatCount details
parseActions
func(raw string) []v5.saveAction- OID
- 05066e…5f85:141
parseActions details
quoteAction
func(part string) string- OID
- 05066e…5f85:142
quoteAction details
parseUnixField
func(s string, part string) int64- OID
- 05066e…5f85:143
parseUnixField details
parsePlotField
func(s string, part string) int- OID
- 05066e…5f85:144
parsePlotField details
dayNumber
func(unixSeconds int64) int64- OID
- 05066e…5f85:145
dayNumber details
recordCaredDay
func(g *v5.gnome, day int64) banked boolrecordCaredDay reports, via banked, whether it actually incremented g.caredDayCount -- false on the no-op branch (day == g.lastCaredDay already, e.g. a second SaveDay call the same UTC day, or a token bought mid-day that the SELLER had already banked that exact day for before the sale). SaveDay's own caller-scoped gate (lastCaredDayForOwner) depends on this: it must only spend the owner's one-bank-per-day allowance on a call that actually banked something, never on a no-op -- a gno-auditor re-audit found that an unconditional advance let a buyer's SaveDay on a token the seller had already banked that day silently consume the buyer's own allowance for the rest of that day, denying an otherwise fully legitimate cared day on a DIFFERENT, genuinely active token later the same day. See the call site in SaveDay.
- OID
- 05066e…5f85:146
recordCaredDay details
caredDaysCsv
func(g *v5.gnome) string- OID
- 05066e…5f85:147
caredDaysCsv details
meterNow
func(value int64, setAt int64, now int64, dropEveryHours int64) int64- OID
- 05066e…5f85:148
meterNow details
clampMeter
func(v int64) int64- OID
- 05066e…5f85:149
clampMeter details
canPat
func(lastPatAt int64, now int64, cooldownHours int64) bool- OID
- 05066e…5f85:150
canPat details
moodNow
func(belly int64, lastPatAt int64, lastHappyEventAt int64, adoptedAt int64, now int64, hungryThreshold int64) string- OID
- 05066e…5f85:151
moodNow details
xpToNext
func(level int64) int64- OID
- 05066e…5f85:152
xpToNext details
totalXpForLevel
func(level int64) int64- OID
- 05066e…5f85:153
totalXpForLevel details
levelFromXp
func(totalXp int64) int64- OID
- 05066e…5f85:154