Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

Community realm. Read the code first. Community realm, deployed by its author. Read the code before you interact or send coins.

v5 state

Back to all declarations

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 string

Value

"Gnotchi gnomes"

collectionSymbol

untyped string

Value

"GNOME"

adminAddress

untyped string

Value

"g1nq99m3h9ed7vqve6ajpr3qwy2ls252m8jnundm"

numEyes

int64

Value

10

numNoses

int64

Value

8

hourSeconds

int64

Value

3600

daySeconds

int64

Value

86400

numPlots

untyped bigint

// acorns.plots

Value

(3 <untyped> bigint)

plantCost

int64

// acorns.plantCost

Value

1

feedCost

int64

// acorns.feedCost

Value

1

acornsStart

int64

Value

10

meterMax

int64

Value

10

patCheer

int64

Value

3

hungryAtOrBelow

int64

Value

2

growHours

int64

Value

24

patCooldownHours

int64

Value

12

tinkerCost

int64

Value

5

levelBase

int64

Value

50

levelStep

int64

Value

25

sulkyPenaltyPct

int64

Value

10

harvestPerPlot

int64

Value

3

feedBelly

int64

Value

4

bellyDropEveryHours

int64

Value

3

cheerDropEveryHours

int64

Value

6

dailyCareCap

int64

Value

60

acornReserve

int64

Value

2

happyBonusPct

int64

Value

10

happyWindowHours

int64

Value

2

sulkyAfterHours

int64

Value

72

maxLevel

int64

Value

20

typeAtLevel

int64

Value

5

xpPat

int64

Value

5

xpFeed

int64

Value

5

xpHarvestPerPlot

int64

Value

10

xpTinkerTask

int64

Value

15

maxActionsPerCall

untyped bigint

Value

(32 <untyped> bigint)

maxBackfillHours

int64

Value

48

caredWindowDays

uint

Value

64

maxGnomesPageSize

untyped bigint

Value

(100 <untyped> bigint)

maxListingsPageSize

untyped bigint

Value

(100 <untyped> bigint)

ugnotDenom

untyped string

Value

"ugnot"

maxPriceUgnot

int64

Value

1000000000000000

maxFeeRateBps

int64

Value

10000

maxListingDays

int64

Value

30

moodHungry

untyped string

Value

"hungry"

moodSulky

untyped string

Value

"sulky"

moodHappy

untyped string

Value

"happy"

moodContent

untyped string

Value

"content"

actionPat

untyped string

Value

"pat"

actionFeed

untyped string

Value

"feed"

actionPlant

untyped string

Value

"plant"

actionHarvest

untyped string

Value

"harvest"

actionTinker

untyped string

Value

"tinker"

typeGardener

untyped string

Value

"gardener"

typeExplorer

untyped string

Value

"explorer"

typeTinkerer

untyped string

Value

"tinkerer"

batchCap

int64

Value

24

numNamedEditions

untyped bigint

Value

(3 <untyped> bigint)

lockCaredDays

int64

Value

30

pinOffsetSeconds

int64

Value

60

pinOffsetRounds

int64

pinOffsetRounds 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]string

hatOptions / 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).

Open
OID
05066e…5f85:4
hatOptions details

Inspect array

eyesWeights

[10]int64

eyesWeights: 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.

Open
OID
05066e…5f85:8
eyesWeights details

Inspect array

noseWeights

[8]int64

noseWeights: 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.

Open
OID
05066e…5f85:10
noseWeights details

Inspect array

namedEditionOrder

[3]string

namedEditionOrder: 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.

Open
OID
05066e…5f85:12
namedEditionOrder details

Inspect array

genesisGnomeName

untyped string

genesisGnomeName: 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

type

plot: 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

type

gnome 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

type

listing: 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

type

feeConfig: unchanged from v4.

Value

v5.feeConfig

pendingClaim

type

pendingClaim 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

nextID

v0.ID

Value

<zero>

balances

*v0.Tree

// owner address -> int64 acorns, per PLAYER, exactly as v4

Open
OID
05066e…5f85:32
balances details

Inspect pointer

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

transferGate

string

Value

""

assertFeeConfig

func(cfg v5.feeConfig, realmAddr .uverse.address)

assertFeeConfig: unchanged from v4's own gate.

Open
OID
05066e…5f85:70
assertFeeConfig details

Inspect func

saleGateExtension

type

saleGateExtension: 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.

Open
OID
05066e…5f85:71
AdminAllow details

Inspect func

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.

Open
OID
05066e…5f85:72
AdminDisallow details

Inspect func

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).

Open
OID
05066e…5f85:73
Claim details

Inspect func

pendingClaimFor

func(claimant .uverse.address) *v5.pendingClaim

pendingClaimFor looks up claimant's pending roll, shared by both Settle and SettleWithSignature so the "no pending claim" message and lookup logic exist exactly once.

Open
OID
05066e…5f85:74
pendingClaimFor details

Inspect func

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.

Open
OID
05066e…5f85:75
Settle details

Inspect func

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).

Open
OID
05066e…5f85:76
SettleWithSignature details

Inspect func

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.

Open
OID
05066e…5f85:77
settleCore details

Inspect func

fnv64a

func(s string) uint64

fnv64a 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.

Open
OID
05066e…5f85:78
fnv64a details

Inspect func

seedFor

func(randomnessHex string, claimant .uverse.address, purpose string) uint64

seedFor 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.

Open
OID
05066e…5f85:79
seedFor details

Inspect func

drawWeighted

func(weights []int64, totalWeight int64, seed uint64) int

drawWeighted 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.

Open
OID
05066e…5f85:80
drawWeighted details

Inspect func

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".

Open
OID
05066e…5f85:81
Wake details

Inspect func

saveAction

type

Value

v5.saveAction

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).

Open
OID
05066e…5f85:84
List details

Inspect func

Cancel

func(tokenID string)

Cancel withdraws the caller's own listing on tokenID. Only the seller who created it may.

Open
OID
05066e…5f85:85
Cancel details

Inspect func

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.

Open
OID
05066e…5f85:86
Buy details

Inspect func

Listing

func(tokenID string) (seller .uverse.address, priceUgnot int64, buyer .uverse.address, listedAtUnix int64, expiresAtUnix int64, feeUgnot int64, totalUgnot int64, found bool)
Open
OID
05066e…5f85:87
Listing details

Inspect func

ListingsPage

func(offset int, limit int) []string
Open
OID
05066e…5f85:89
ListingsPage details

Inspect func

QuoteFee

func(priceUgnot int64) (feeUgnot int64, totalUgnot int64)
Open
OID
05066e…5f85:90
QuoteFee details

Inspect func

Provenance

func(tokenID string) (adoptedAtUnix int64, acquiredAtUnix int64, saleCount int64, found bool)
Open
OID
05066e…5f85:92
Provenance details

Inspect func

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.

Open
OID
05066e…5f85:93
GnomeByToken details

Inspect func

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).

Open
OID
05066e…5f85:94
ActiveGnome details

Inspect func

OwnerTokens

func(addr .uverse.address) []string

OwnerTokens 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.

Open
OID
05066e…5f85:95
OwnerTokens details

Inspect func

TokensPage

func(offset int, limit int) []string

TokensPage: 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.

Open
OID
05066e…5f85:96
TokensPage details

Inspect func

GardenState

func(tokenID string) (plantedAtCsv string, readyAtCsv string, readyCount int64, found bool)
Open
OID
05066e…5f85:97
GardenState details

Inspect func

CareState

func(tokenID string) (belly int64, cheer int64, acorns int64, totalXp int64, lastPatAtUnix int64, lastHappyEventAtUnix int64, lastActionAtUnix int64, found bool)
Open
OID
05066e…5f85:98
CareState details

Inspect func

MeterState

func(tokenID string) (belly int64, bellyAtUnix int64, cheer int64, cheerAtUnix int64, found bool)
Open
OID
05066e…5f85:99
MeterState details

Inspect func

Progress

func(tokenID string) (xpGarden int64, xpTinker int64, harvestCount int64, lastTinkerAtUnix int64, caredDayCount int64, dailyCareXpSpent int64, dailyCareDay int64, found bool)
Open
OID
05066e…5f85:100
Progress details

Inspect func

CaredDays

func(tokenID string) (daysCsv string, found bool)
Open
OID
05066e…5f85:101
CaredDays details

Inspect func

Mood

func(tokenID string) (mood string, found bool)
Open
OID
05066e…5f85:102
Mood details

Inspect func

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.

Open
OID
05066e…5f85:103
IsLocked details

Inspect func

CollectionInfo

func() (name string, symbol string)
Open
OID
05066e…5f85:104
CollectionInfo details

Inspect func

BalanceOf

func(addr .uverse.address) int64
Open
OID
05066e…5f85:106
BalanceOf details

Inspect func

OwnerOfToken

func(tokenID string) (owner .uverse.address, found bool)
Open
OID
05066e…5f85:107
OwnerOfToken details

Inspect func

Acorns

func(addr .uverse.address) (acorns int64, found bool)
Open
OID
05066e…5f85:109
Acorns details

Inspect func

EyesCount

func(id int64) int64
Open
OID
05066e…5f85:110
EyesCount details

Inspect func

NoseCount

func(id int64) int64
Open
OID
05066e…5f85:111
NoseCount details

Inspect func

HatCount

func(hat string) int64
Open
OID
05066e…5f85:112
HatCount details

Inspect func

CoatCount

func(coat string) int64
Open
OID
05066e…5f85:113
CoatCount details

Inspect func

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.)

Open
OID
05066e…5f85:114
CharacterOwner details

Inspect func

IsAllowlisted

func(addr .uverse.address) bool
Open
OID
05066e…5f85:115
IsAllowlisted details

Inspect func

HasRolled

func(addr .uverse.address) bool
Open
OID
05066e…5f85:116
HasRolled details

Inspect func

PendingClaim

func(addr .uverse.address) (round int64, claimedAtUnix int64, found bool)
Open
OID
05066e…5f85:117
PendingClaim details

Inspect func

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".

Open
OID
05066e…5f85:118
BatchStatus details

Inspect func

GenesisTokenID

func() string
Open
OID
05066e…5f85:119
GenesisTokenID details

Inspect func

AdminState

func() (admin .uverse.address, frozen bool)
Open
OID
05066e…5f85:120
AdminState details

Inspect func

LastWakeDay

func(addr .uverse.address) (day int64, found bool)
Open
OID
05066e…5f85:121
LastWakeDay details

Inspect func

gnomeByTokenID

func(tokenID string) (*v5.gnome, bool)
Open
OID
05066e…5f85:123
gnomeByTokenID details

Inspect func

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.

Open
OID
05066e…5f85:124
activeGnomeForAddr details

Inspect func

ownerOfToken

func(tokenID string) (owner .uverse.address, found bool)
Open
OID
05066e…5f85:125
ownerOfToken details

Inspect func

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).

Open
OID
05066e…5f85:126
addOwnerToken details

Inspect func

removeOwnerToken

func(addr .uverse.address, tokenID string)
Open
OID
05066e…5f85:127
removeOwnerToken details

Inspect func

balanceOf

func(addr .uverse.address) int64
Open
OID
05066e…5f85:128
balanceOf details

Inspect func

setBalance

func(addr .uverse.address, v int64)
Open
OID
05066e…5f85:129
setBalance details

Inspect func

grantStartingPurseIfNew

func(addr .uverse.address)
Open
OID
05066e…5f85:130
grantStartingPurseIfNew details

Inspect func

feeFor

func(priceUgnot int64) int64
Open
OID
05066e…5f85:131
feeFor details

Inspect func

exactUgnot

func(send chain.Coins, want int64) bool
Open
OID
05066e…5f85:132
exactUgnot details

Inspect func

coinsString

func(c chain.Coins) string
Open
OID
05066e…5f85:133
coinsString details

Inspect func

listingFor

func(tokenID string) (*v5.listing, bool)
Open
OID
05066e…5f85:134
listingFor details

Inspect func

lowerASCII

func(s string) string

lowerASCII: v4's own helper, unchanged -- ASCII-only on purpose (see v4's own comment on why not strings.ToLower).

Open
OID
05066e…5f85:135
lowerASCII details

Inspect func

anyPlotPlanted

func(g *v5.gnome) bool
Open
OID
05066e…5f85:136
anyPlotPlanted details

Inspect func

eyesCount

func(id int64) int64
Open
OID
05066e…5f85:137
eyesCount details

Inspect func

noseCount

func(id int64) int64
Open
OID
05066e…5f85:138
noseCount details

Inspect func

hatCount

func(hat string) int64
Open
OID
05066e…5f85:139
hatCount details

Inspect func

coatCount

func(coat string) int64
Open
OID
05066e…5f85:140
coatCount details

Inspect func

parseActions

func(raw string) []v5.saveAction
Open
OID
05066e…5f85:141
parseActions details

Inspect func

quoteAction

func(part string) string
Open
OID
05066e…5f85:142
quoteAction details

Inspect func

parseUnixField

func(s string, part string) int64
Open
OID
05066e…5f85:143
parseUnixField details

Inspect func

parsePlotField

func(s string, part string) int
Open
OID
05066e…5f85:144
parsePlotField details

Inspect func

dayNumber

func(unixSeconds int64) int64
Open
OID
05066e…5f85:145
dayNumber details

Inspect func

recordCaredDay

func(g *v5.gnome, day int64) banked bool

recordCaredDay 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.

Open
OID
05066e…5f85:146
recordCaredDay details

Inspect func

caredDaysCsv

func(g *v5.gnome) string
Open
OID
05066e…5f85:147
caredDaysCsv details

Inspect func

meterNow

func(value int64, setAt int64, now int64, dropEveryHours int64) int64
Open
OID
05066e…5f85:148
meterNow details

Inspect func

clampMeter

func(v int64) int64
Open
OID
05066e…5f85:149
clampMeter details

Inspect func

canPat

func(lastPatAt int64, now int64, cooldownHours int64) bool
Open
OID
05066e…5f85:150
canPat details

Inspect func

moodNow

func(belly int64, lastPatAt int64, lastHappyEventAt int64, adoptedAt int64, now int64, hungryThreshold int64) string
Open
OID
05066e…5f85:151
moodNow details

Inspect func

xpToNext

func(level int64) int64
Open
OID
05066e…5f85:152
xpToNext details

Inspect func

totalXpForLevel

func(level int64) int64
Open
OID
05066e…5f85:153
totalXpForLevel details

Inspect func

levelFromXp

func(totalXp int64) int64
Open
OID
05066e…5f85:154
levelFromXp details

Inspect func
saleFeeRecipient : untyped string ="g1ylpe9juk8cafgf9rt09wzuz85ug2lyfk5metyv"
saleFeeRateBps : int64 =500
saleFeeFloorUgnot : int64 =1000000
collectionName : untyped string ="Gnotchi gnomes"
collectionSymbol : untyped string ="GNOME"
adminAddress : untyped string ="g1nq99m3h9ed7vqve6ajpr3qwy2ls252m8jnundm"
numEyes : int64 =10
numNoses : int64 =8
hourSeconds : int64 =3600
daySeconds : int64 =86400
numPlots : untyped bigint =(3 <untyped> bigint)
plantCost : int64 =1
feedCost : int64 =1
acornsStart : int64 =10
meterMax : int64 =10
patCheer : int64 =3
hungryAtOrBelow : int64 =2
growHours : int64 =24
patCooldownHours : int64 =12
tinkerCost : int64 =5
levelBase : int64 =50
levelStep : int64 =25
sulkyPenaltyPct : int64 =10
harvestPerPlot : int64 =3
feedBelly : int64 =4
bellyDropEveryHours : int64 =3
cheerDropEveryHours : int64 =6
dailyCareCap : int64 =60
acornReserve : int64 =2
happyBonusPct : int64 =10
happyWindowHours : int64 =2
sulkyAfterHours : int64 =72
maxLevel : int64 =20
typeAtLevel : int64 =5
xpPat : int64 =5
xpFeed : int64 =5
xpHarvestPerPlot : int64 =10
xpTinkerTask : int64 =15
maxActionsPerCall : untyped bigint =(32 <untyped> bigint)
maxBackfillHours : int64 =48
caredWindowDays : uint =64
maxGnomesPageSize : untyped bigint =(100 <untyped> bigint)
maxListingsPageSize : untyped bigint =(100 <untyped> bigint)
ugnotDenom : untyped string ="ugnot"
maxPriceUgnot : int64 =1000000000000000
maxFeeRateBps : int64 =10000
maxListingDays : int64 =30
moodHungry : untyped string ="hungry"
moodSulky : untyped string ="sulky"
moodHappy : untyped string ="happy"
moodContent : untyped string ="content"
actionPat : untyped string ="pat"
actionFeed : untyped string ="feed"
actionPlant : untyped string ="plant"
actionHarvest : untyped string ="harvest"
actionTinker : untyped string ="tinker"
typeGardener : untyped string ="gardener"
typeExplorer : untyped string ="explorer"
typeTinkerer : untyped string ="tinkerer"
batchCap : int64 =24
numNamedEditions : untyped bigint =(3 <untyped> bigint)
lockCaredDays : int64 =30
pinOffsetSeconds : int64 =60
pinOffsetRounds : int64 =20
hatOptions : [4]string Inspect
coatOptions : [4]string Inspect
eyesWeights : [10]int64 Inspect
noseWeights : [8]int64 Inspect
namedEditionOrder : [3]string Inspect
genesisGnomeName : untyped string ="Genesis"
plot : type =v5.plot
gnome : type =v5.gnome
listing : type =v5.listing
feeConfig : type =v5.feeConfig
pendingClaim : type =v5.pendingClaim
token : *v0.Token Inspect
ledger : *v0.PrivateLedger Inspect
nextID : v0.ID =<zero>
gnomes : *v0.Tree Inspect
ownerTokens : *v0.Tree Inspect
activeToken : *v0.Tree Inspect
lastWakeDay : *v0.Tree Inspect
lastCaredDayForOwner : *v0.Tree Inspect
balances : *v0.Tree Inspect
listings : *v0.Tree Inspect
allowlist : *v0.Tree Inspect
hasRolled : *v0.Tree Inspect
pendingClaims : *v0.Tree Inspect
eyesCounts : *v0.Tree Inspect
noseCounts : *v0.Tree Inspect
hatCounts : *v0.Tree Inspect
coatCounts : *v0.Tree Inspect
characterOwner : *v0.Tree Inspect
mintedCount : int64 =1
settledCount : int64 =1
genesisTokenID : string ="0000001"
rulesFrozen : bool =true
fee : v5.feeConfig Inspect
transferGate : string =""
init.99 : func() Inspect
assertFeeConfig : func(cfg v5.feeConfig, realmAddr .uverse.address) Inspect
saleGateExtension : type =v5.saleGateExtension
AdminAllow : func(addr .uverse.address) Inspect
AdminDisallow : func(addr .uverse.address) Inspect
Claim : func() Inspect
pendingClaimFor : func(claimant .uverse.address) *v5.pendingClaim Inspect
Settle : func(claimant .uverse.address) Inspect
SettleWithSignature : func(claimant .uverse.address, sigHex string) Inspect
settleCore : func(claimant .uverse.address, pc *v5.pendingClaim) Inspect
fnv64a : func(s string) uint64 Inspect
seedFor : func(randomnessHex string, claimant .uverse.address, purpose string) uint64 Inspect
drawWeighted : func(weights []int64, totalWeight int64, seed uint64) int Inspect
Wake : func(tokenID string) Inspect
saveAction : type =v5.saveAction
SaveDay : func(actionsRaw string) Inspect
ChooseType : func(kind string) Inspect
List : func(tokenID string, priceUgnot int64, buyer .uverse.address, days int64) Inspect
Cancel : func(tokenID string) Inspect
Buy : func(tokenID string) Inspect
Listing : func(tokenID string) (seller .uverse.address, priceUgnot int64, buyer .uverse.address, listedAtUnix int64, expiresAtUnix int64, feeUgnot int64, totalUgnot int64, found bool) Inspect
TotalListings : func() int64 Inspect
ListingsPage : func(offset int, limit int) []string Inspect
QuoteFee : func(priceUgnot int64) (feeUgnot int64, totalUgnot int64) Inspect
FeeRules : func() string Inspect
Provenance : func(tokenID string) (adoptedAtUnix int64, acquiredAtUnix int64, saleCount int64, found bool) Inspect
GnomeByToken : func(tokenID string) (hat string, coat string, eyes int64, nose int64, character string, level int64, gnomeType string, adoptedAtUnix int64, found bool) Inspect
ActiveGnome : func(addr .uverse.address) (tokenID string, found bool) Inspect
OwnerTokens : func(addr .uverse.address) []string Inspect
TokensPage : func(offset int, limit int) []string Inspect
GardenState : func(tokenID string) (plantedAtCsv string, readyAtCsv string, readyCount int64, found bool) Inspect
CareState : func(tokenID string) (belly int64, cheer int64, acorns int64, totalXp int64, lastPatAtUnix int64, lastHappyEventAtUnix int64, lastActionAtUnix int64, found bool) Inspect
MeterState : func(tokenID string) (belly int64, bellyAtUnix int64, cheer int64, cheerAtUnix int64, found bool) Inspect
Progress : func(tokenID string) (xpGarden int64, xpTinker int64, harvestCount int64, lastTinkerAtUnix int64, caredDayCount int64, dailyCareXpSpent int64, dailyCareDay int64, found bool) Inspect
CaredDays : func(tokenID string) (daysCsv string, found bool) Inspect
Mood : func(tokenID string) (mood string, found bool) Inspect
IsLocked : func(tokenID string) (locked bool, found bool) Inspect
CollectionInfo : func() (name string, symbol string) Inspect
TotalSupply : func() int64 Inspect
BalanceOf : func(addr .uverse.address) int64 Inspect
OwnerOfToken : func(tokenID string) (owner .uverse.address, found bool) Inspect
TotalGnomes : func() int64 Inspect
Acorns : func(addr .uverse.address) (acorns int64, found bool) Inspect
EyesCount : func(id int64) int64 Inspect
NoseCount : func(id int64) int64 Inspect
HatCount : func(hat string) int64 Inspect
CoatCount : func(coat string) int64 Inspect
CharacterOwner : func(name string) (tokenID string, found bool) Inspect
IsAllowlisted : func(addr .uverse.address) bool Inspect
HasRolled : func(addr .uverse.address) bool Inspect
PendingClaim : func(addr .uverse.address) (round int64, claimedAtUnix int64, found bool) Inspect
BatchStatus : func() (mintedSoFar int64, settledSoFar int64, batchCapOut int64, namedMinted int64, namedCapOut int64) Inspect
GenesisTokenID : func() string Inspect
AdminState : func() (admin .uverse.address, frozen bool) Inspect
LastWakeDay : func(addr .uverse.address) (day int64, found bool) Inspect
Render : func(path string) string Inspect
gnomeByTokenID : func(tokenID string) (*v5.gnome, bool) Inspect
activeGnomeForAddr : func(addr .uverse.address) (tid string, g *v5.gnome, found bool) Inspect
ownerOfToken : func(tokenID string) (owner .uverse.address, found bool) Inspect
addOwnerToken : func(addr .uverse.address, tokenID string) Inspect
removeOwnerToken : func(addr .uverse.address, tokenID string) Inspect
balanceOf : func(addr .uverse.address) int64 Inspect
setBalance : func(addr .uverse.address, v int64) Inspect
grantStartingPurseIfNew : func(addr .uverse.address) Inspect
feeFor : func(priceUgnot int64) int64 Inspect
exactUgnot : func(send chain.Coins, want int64) bool Inspect
coinsString : func(c chain.Coins) string Inspect
listingFor : func(tokenID string) (*v5.listing, bool) Inspect
lowerASCII : func(s string) string Inspect
anyPlotPlanted : func(g *v5.gnome) bool Inspect
eyesCount : func(id int64) int64 Inspect
noseCount : func(id int64) int64 Inspect
hatCount : func(hat string) int64 Inspect
coatCount : func(coat string) int64 Inspect
parseActions : func(raw string) []v5.saveAction Inspect
quoteAction : func(part string) string Inspect
parseUnixField : func(s string, part string) int64 Inspect
parsePlotField : func(s string, part string) int Inspect
dayNumber : func(unixSeconds int64) int64 Inspect
recordCaredDay : func(g *v5.gnome, day int64) banked bool Inspect
caredDaysCsv : func(g *v5.gnome) string Inspect
meterNow : func(value int64, setAt int64, now int64, dropEveryHours int64) int64 Inspect
clampMeter : func(v int64) int64 Inspect
canPat : func(lastPatAt int64, now int64, cooldownHours int64) bool Inspect
moodNow : func(belly int64, lastPatAt int64, lastHappyEventAt int64, adoptedAt int64, now int64, hungryThreshold int64) string Inspect
xpToNext : func(level int64) int64 Inspect
totalXpForLevel : func(level int64) int64 Inspect
levelFromXp : func(totalXp int64) int64 Inspect