1// v0 - Unaudited: This is an initial version that has not yet been formally audited.2// Use in production at your own risk.3//4// Package skins is the catalog of plane skins of gnofly, a multiplayer plane5// game, and the tokens of the skins sold. Every skin bought is a GRC7216// token on gno.land/p/nt/grc721/v0, one per buyer and design.7//8// The tokens are soulbound: there is no TransferFrom, no Approve and no9// SetApprovalForAll, and the token object is not exported, so nothing can10// move a skin away from its buyer. Its owner can Burn it, which gives back11// the storage deposit (not the price).12//13// Supply is unlimited by default; an admin can cap a design. Classic, the14// look every pilot flies by default, is free and is not a token.15//16// Writers:17//18// - anyone buys a skin with its price attached (Buy), and burns their own19// (Burn);20// - the admins of the game realm edit the catalog (SetSkin, SetSkinListed).21//22// The realm keeps no roles and no money: admins and treasury are those of23// gno.land/r/g1t2kg2vtr3fukg43eujkn6x53gfdyakhngt4sfd/gnofly/game/v0, and every24// sale is forwarded to the treasury in the same transaction.25//26// A token stores only its owner (the ledger), its design and an entry in the27// buyer's list: no metadata record and no URI. TokenURI is computed from the28// design. Reads are plain functions meant for vm/qeval: CatalogJSON, SkinsOf,29// OwnerOf, SkinOf, TokenURI, Render.30package skins31BalanceOf(addr string) (int64, interface {Error func() string})
Burn(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, id int64)
Buy(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, skinID string) int64
CatalogJSON() string
OwnerOf(tid string) (string, interface {Error func() string})
Render(path string) string
SetSkin(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, id string, name string, model string, pilot string, body string, wing string, accent string, price int64, maxSupply int64)
SetSkinListed(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, id string, listed bool)
SkinOf(id int64) string
SkinsOf(addr string) string
TokenMetadata(tid string) (string, interface {Error func() string})
TokenURI(tid string) (string, interface {Error func() string})
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.
vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.