1package adcol23import (4 "chain"5 "chain/banker"6 "chain/runtime/unsafe"7 "strconv"8 "strings"910 "gno.land/p/nt/grc721/metadata/v0"11 "gno.land/p/nt/grc721/v0"12 "gno.land/p/nt/avl/v0"13 "gno.land/p/nt/seqid/v0"14 "gno.land/r/g1n4pl5uc4yt5r96m9w6fmdznx3x0jyg8l6arhmt/bazaar/factory"15)1617const (18 maxNameLen = 6419 maxImageLen = 20020 maxSupplyBound = 1_000_00021 maxRoyaltyBps = 100022 nativeDenom = "ugnot"23 publicOrigin = "https://bazaar-gno.vercel.app"24 dropAddCap = 2025 dropSlotHardCap = 1000026 minSlugLen = 227)2829type item struct {30 id int31 name string32 image string33 owner address34 seller address35 price int6436 listed bool37 rarity string38 traits string39 revealed bool40 slot int41}4243type dropSlot struct {44 name string45 image string46 rarity string47 traits string48}4950var (51 items avl.Tree52 dropSlots avl.Tree53 token *grc721.Token54 ledger *grc721.PrivateLedger55 metaView *metadata.Metadata56 metaLed *metadata.Ledger57 tokenSeq seqid.ID58 nextID int59 minted int60 loaded int61 maxSupply int62 mintPrice int6463 royaltyBps int64 paused bool65 inited bool66 creator address67 self address68 colName string69 colSymbol string70 colCover string71 slug string72)7374func Init(cur realm, name, symbol, cover string, maxSupplyN int, mintPriceUgnot int64, royalty int64) {75 if !cur.Previous().IsUserCall() {76 panic("col: EOA only")77 }78 if !cur.IsCurrent() {79 panic("col: spoofed realm")80 }81 if len(symbol) < 1 || len(symbol) > grc721.MaxSymbolLen {82 panic("col: symbol")83 }84 pathSlug := lastElem(cur.PkgPath())85 if !validPkgName(pathSlug) {86 panic("col: slug")87 }88 if maxSupplyN < 0 || maxSupplyN > maxSupplyBound {89 panic("col: maxSupply")90 }91 if mintPriceUgnot < 0 {92 panic("col: mintPrice")93 }94 if royalty < 0 || royalty > maxRoyaltyBps {95 panic("col: royalty")96 }97 if !validName(name) {98 panic("col: name")99 }100 if !validImage(cover) {101 panic("col: cover")102 }103 if inited {104 panic("col: already initialized")105 }106 slug = pathSlug107 reservedWho := factory.ReservedCreator(slug)108 takeLaunchFee(cur)109 tok, led := grc721.NewToken(name, symbol, tokenSeq.Next(), cur)110 token = tok111 ledger = led112 metaView, metaLed = metadata.NewMetadata(led)113 creator = cur.Previous().Address()114 self = cur.Address()115 colName = name116 colSymbol = symbol117 colCover = cover118 maxSupply = maxSupplyN119 mintPrice = mintPriceUgnot120 royaltyBps = int(royalty)121 items = avl.Tree{}122 dropSlots = avl.Tree{}123 loaded = 0124 inited = true125 if reservedWho == "" {126 factory.CreditLaunchFee(cross(cur))127 }128 factory.Register(cross(cur), name, symbol, cover, maxSupplyN, mintPriceUgnot, royalty)129 chain.Emit("Init", "creator", creator.String(), "slug", slug)130}131132func Mint(cur realm, name, imageURL string) int {133 caller := requireUser(cur)134 if caller != creator {135 panic("col: not creator")136 }137 id := mintTo(cur, caller, name, imageURL)138 writeTokenMeta(id)139 chain.Emit("Mint", "id", strconv.Itoa(id), "owner", caller.String())140 return id141}142143func PublicMint(cur realm) int {144 caller := requireUser(cur)145 takeExact(mintPrice)146 name := colName + " #" + strconv.Itoa(minted+1)147 image := publicImage()148 var slot *dropSlot149 slotIndex := -1150 if loaded > 0 {151 if minted >= loaded {152 panic("col: no slot")153 }154 v := dropSlots.Get(slotKey(minted))155 if v == nil {156 panic("col: no slot")157 }158 slot = v.(*dropSlot)159 name = slot.name160 image = slot.image161 slotIndex = minted162 }163 id := mintTo(cur, caller, name, image)164 if slot != nil {165 applySlot(id, slot, slotIndex)166 }167 writeTokenMeta(id)168 if mintPrice > 0 {169 bk := banker.NewBanker(banker.BankerTypeRealmSend, cur)170 bk.SendCoins(self, creator, chain.Coins{{Denom: nativeDenom, Amount: mintPrice}})171 }172 chain.Emit("PublicMint", "id", strconv.Itoa(id), "n", strconv.Itoa(minted))173 return id174}175176func AddDropItems(cur realm, blob string) {177 caller := requireUser(cur)178 if caller != creator {179 panic("col: not creator")180 }181 lines := splitDropLines(blob)182 if len(lines) < 1 || len(lines) > dropAddCap {183 panic("col: slots")184 }185 if loaded+len(lines) > slotCap() {186 panic("col: slots")187 }188 for _, line := range lines {189 name, image, rarity, traits := parseDropLine(line)190 if !validName(name) {191 panic("col: name")192 }193 if !validImage(image) {194 panic("col: image")195 }196 if !validRarity(rarity) {197 panic("col: rarity")198 }199 if !validTraits(traits) {200 panic("col: traits")201 }202 dropSlots.Set(slotKey(loaded), &dropSlot{name: name, image: image, rarity: rarity, traits: traits})203 loaded++204 }205 chain.Emit("AddDropItems", "slug", slug, "loaded", strconv.Itoa(loaded))206}207208func ListDropSlots() string {209 requireInit()210 out := ""211 for i := 0; i < loaded; i++ {212 v := dropSlots.Get(slotKey(i))213 if v == nil {214 continue215 }216 s := v.(*dropSlot)217 if out != "" {218 out += "\n"219 }220 out += strconv.Itoa(i) + "|" + s.name + "|" + s.image + "|" + s.rarity + "|" + s.traits221 }222 return out223}224225func LoadedOf() int {226 requireInit()227 return loaded228}229230func PauseMint(cur realm) {231 caller := requireUser(cur)232 if caller != creator {233 panic("col: not creator")234 }235 paused = true236 chain.Emit("PauseMint", "slug", slug)237}238239func ResumeMint(cur realm) {240 caller := requireUser(cur)241 if caller != creator {242 panic("col: not creator")243 }244 paused = false245 chain.Emit("ResumeMint", "slug", slug)246}247248func OwnerOf(tid string) string {249 return mustItem(parseTid(tid)).owner.String()250}251252func GrcName() string {253 requireInit()254 return token.GetName()255}256257func GrcSymbol() string {258 requireInit()259 return token.GetSymbol()260}261262func GrcBalanceOf(addr string) int64 {263 requireInit()264 who := address(addr)265 if !who.IsValid() {266 return 0267 }268 n, err := token.BalanceOf(who)269 if err != nil {270 return 0271 }272 return n273}274275func GrcOwnerOf(id int) string {276 requireInit()277 owner, err := token.OwnerOf(itemTid(id))278 if err != nil {279 panic("col: owner")280 }281 return owner.String()282}283284func Name() string {285 return GrcName()286}287288func Symbol() string {289 return GrcSymbol()290}291292func BalanceOf(addr string) int64 {293 return GrcBalanceOf(addr)294}295296func TokenURI(tid string) string {297 id := parseTid(tid)298 mustItem(id)299 if metaView != nil {300 u, err := metaView.TokenURI(itemTid(id))301 if err == nil && u != "" {302 return u303 }304 }305 return tokenJSON(mustItem(id))306}307308func guardUnlisted(id int) {309 if mustItem(id).listed {310 panic("col: listed")311 }312}313314func Approve(cur realm, to, tid string) {315 caller := requireUser(cur)316 id := parseTid(tid)317 guardUnlisted(id)318 who := address(to)319 if to != "" && !who.IsValid() {320 panic("col: addr")321 }322 if err := ledger.Approve(caller, who, itemTid(id)); err != nil {323 panic("col: approve")324 }325}326327func SetApprovalForAll(cur realm, operator string, approved bool) {328 caller := requireUser(cur)329 op := address(operator)330 if !op.IsValid() {331 panic("col: addr")332 }333 if err := ledger.SetApprovalForAll(caller, op, approved); err != nil {334 panic("col: approve")335 }336}337338func TransferFrom(cur realm, from, to, tid string) {339 caller := requireUser(cur)340 id := parseTid(tid)341 guardUnlisted(id)342 src := address(from)343 dst := address(to)344 if !src.IsValid() || !dst.IsValid() {345 panic("col: addr")346 }347 if err := ledger.TransferFrom(caller, src, dst, itemTid(id)); err != nil {348 panic("col: transfer")349 }350 it := mustItem(id)351 it.owner = dst352 items.Set(itemKey(id), it)353}354355func GetApproved(id int) string {356 requireInit()357 who, err := token.GetApproved(itemTid(id))358 if err != nil {359 return ""360 }361 return who.String()362}363364func IsApprovedForAll(owner, operator string) bool {365 requireInit()366 a := address(owner)367 b := address(operator)368 if !a.IsValid() || !b.IsValid() {369 return false370 }371 return token.IsApprovedForAll(a, b)372}373374func TotalSupply() int64 {375 requireInit()376 return token.TotalSupply()377}378379func SellerOf(id int) address {380 return mustItem(id).seller381}382383func PriceOf(id int) int64 {384 return mustItem(id).price385}386387func NameOf(id int) string {388 return mustItem(id).name389}390391func ImageOf(id int) string {392 return mustItem(id).image393}394395func Listed(id int) bool {396 return mustItem(id).listed397}398399func NextID() int {400 return nextID401}402403func CollectionOf(_ int) string {404 requireInit()405 return slug406}407408func ItemLine(id int) string {409 it := mustItem(id)410 return strconv.Itoa(it.id) + "|" + it.name + "|" + it.owner.String() + "|" + it.seller.String() + "|" + strconv.FormatInt(it.price, 10) + "|" + strconv.FormatBool(it.listed) + "|" + it.image + "|" + slug + "|" + it.rarity + "|" + it.traits + "|" + strconv.FormatBool(it.revealed) + "|" + strconv.Itoa(it.slot)411}412413func ListOpen() string {414 requireInit()415 out := ""416 n := 0417 items.Iterate("", "", func(_ string, value any) bool {418 it := value.(*item)419 if !it.listed {420 return false421 }422 if n >= 50 {423 return true424 }425 if out != "" {426 out += "\n"427 }428 out += ItemLine(it.id)429 n++430 return false431 })432 return out433}434435func TokensOf(owner string) string {436 requireInit()437 who := address(owner)438 if !who.IsValid() {439 return ""440 }441 out := ""442 items.Iterate("", "", func(_ string, value any) bool {443 it := value.(*item)444 if it.owner != who {445 return false446 }447 if out != "" {448 out += ","449 }450 out += strconv.Itoa(it.id)451 return false452 })453 return out454}455456func TokenOfOwnerByIndex(owner string, index int64) string {457 requireInit()458 who := address(owner)459 if !who.IsValid() {460 panic("col: addr")461 }462 if index < 0 {463 panic("col: index")464 }465 var n int64466 found := ""467 items.Iterate("", "", func(_ string, value any) bool {468 it := value.(*item)469 if it.owner != who {470 return false471 }472 if n == index {473 found = strconv.Itoa(it.id)474 return true475 }476 n++477 return false478 })479 if found == "" {480 panic("col: index")481 }482 return found483}484485func TokenByIndex(index int64) string {486 requireInit()487 if index < 0 {488 panic("col: index")489 }490 var n int64491 found := ""492 items.Iterate("", "", func(_ string, value any) bool {493 if n == index {494 found = strconv.Itoa(value.(*item).id)495 return true496 }497 n++498 return false499 })500 if found == "" {501 panic("col: index")502 }503 return found504}505506func Creator() string {507 requireInit()508 return creator.String()509}510511func MintPrice() int64 {512 requireInit()513 return mintPrice514}515516func MaxSupply() int {517 requireInit()518 return maxSupply519}520521func Minted() int {522 requireInit()523 return minted524}525526func RoyaltyBps() int {527 requireInit()528 return royaltyBps529}530531func SetRoyalty(cur realm, bps int) {532 caller := requireUser(cur)533 if caller != creator {534 panic("col: not creator")535 }536 if minted != 0 {537 panic("col: minted")538 }539 if bps < 0 || bps > maxRoyaltyBps {540 panic("col: royalty")541 }542 royaltyBps = bps543 factory.NoteRoyalty(cross(cur), bps)544 chain.Emit("SetRoyalty", "slug", slug, "bps", strconv.Itoa(bps))545}546547func RarityOf(id int) string {548 return mustItem(id).rarity549}550551func TraitsOf(id int) string {552 return mustItem(id).traits553}554555func Render(_ string) string {556 if !inited {557 return "# Collection\n\nCall Init first.\n"558 }559 out := "# " + colName + " ($" + colSymbol + ")\n\n"560 out += "- minted: " + strconv.Itoa(minted) + "\n"561 out += "- mint price: " + strconv.FormatInt(mintPrice, 10) + " ugnot\n\n"562 open := ListOpen()563 if open == "" {564 out += "_No open listings._\n"565 } else {566 out += "```\n" + open + "\n```\n"567 }568 return out569}570571func mintTo(cur realm, caller address, name, imageURL string) int {572 requireInit()573 if !cur.IsCurrent() {574 panic("col: spoofed realm")575 }576 if paused {577 panic("col: paused")578 }579 if maxSupply > 0 && minted >= maxSupply {580 panic("col: sold out")581 }582 if !validName(name) {583 panic("col: name")584 }585 if !validImage(imageURL) {586 panic("col: image")587 }588 nextID++589 id := nextID590 it := &item{591 id: id,592 name: name,593 image: imageURL,594 owner: caller,595 rarity: rarityOf(id),596 revealed: true,597 slot: -1,598 }599 items.Set(itemKey(id), it)600 err := ledger.Mint(caller, itemTid(id))601 if err != nil {602 panic("col: mint")603 }604 minted++605 factory.NoteMinted(cross(cur), minted)606 return id607}608609func takeLaunchFee(cur realm) {610 fee := factory.LaunchFee()611 who := factory.ReservedCreator(lastElem(cur.PkgPath()))612 if who != "" && who == cur.Previous().Address().String() {613 takeExact(0)614 return615 }616 takeExact(fee)617 if fee > 0 {618 bk := banker.NewBanker(banker.BankerTypeRealmSend, cur)619 bk.SendCoins(cur.Address(), factory.Address(), chain.Coins{{Denom: nativeDenom, Amount: fee}})620 }621}622623func takeExact(want int64) {624 sent := unsafe.OriginSend()625 if want == 0 {626 if len(sent) != 0 {627 panic("col: extra denoms")628 }629 return630 }631 if len(sent) != 1 || sent[0].Denom != nativeDenom || sent[0].Amount != want {632 panic("col: wrong payment")633 }634}635636func publicImage() string {637 img := "/samples/" + slug + "-0" + strconv.Itoa(minted+1) + ".png"638 if validImage(img) {639 return img640 }641 return colCover642}643644func requireInit() {645 if !inited {646 panic("col: call Init first")647 }648}649650func requireUser(cur realm) address {651 requireInit()652 if !cur.IsCurrent() {653 panic("col: spoofed realm")654 }655 if !cur.Previous().IsUserCall() {656 panic("col: EOA only")657 }658 return cur.Previous().Address()659}660661func itemTid(id int) grc721.TokenID {662 return grc721.TokenID(strconv.Itoa(id))663}664665func parseTid(tid string) int {666 id, err := strconv.Atoi(tid)667 if err != nil || id < 1 {668 panic("col: tid")669 }670 return id671}672673func mustItem(id int) *item {674 v := items.Get(itemKey(id))675 if v == nil {676 panic("col: unknown item")677 }678 return v.(*item)679}680681func itemKey(id int) string {682 return strconv.Itoa(id)683}684685func lastElem(pkg string) string {686 i := strings.LastIndex(pkg, "/")687 if i < 0 || i+1 >= len(pkg) {688 panic("col: pkg")689 }690 return pkg[i+1:]691}692693func slotKey(i int) string {694 return strconv.Itoa(i)695}696697func slotCap() int {698 if maxSupply > 0 {699 return maxSupply700 }701 return dropSlotHardCap702}703704func applySlot(id int, s *dropSlot, slotIndex int) {705 it := mustItem(id)706 it.name = s.name707 it.image = s.image708 if s.rarity != "" {709 it.rarity = s.rarity710 }711 it.traits = s.traits712 it.revealed = true713 it.slot = slotIndex714 items.Set(itemKey(id), it)715}716717func writeTokenMeta(id int) {718 it := mustItem(id)719 uri := tokenJSON(it)720 if metaLed == nil {721 return722 }723 if err := metaLed.SetTokenURI(itemTid(id), uri); err != nil {724 panic("col: tokenURI")725 }726 if err := metaLed.SetTokenMetadata(itemTid(id), metadata.Data{727 Name: it.name,728 Description: colName + " #" + strconv.Itoa(id),729 Image: absImage(it.image),730 Attributes: traitAttrs(it),731 }); err != nil {732 panic("col: metadata")733 }734}735736func tokenJSON(it *item) string {737 attrs := ""738 for _, tr := range traitAttrs(it) {739 if attrs != "" {740 attrs += ","741 }742 attrs += `{"trait_type":` + jsonStr(tr.TraitType) + `,"value":` + jsonStr(tr.Value) + `}`743 }744 body := `{"name":` + jsonStr(it.name) + `,"description":` + jsonStr(colName+" #"+strconv.Itoa(it.id)) + `,"image":` + jsonStr(absImage(it.image)) + `,"attributes":[` + attrs + `]}`745 return "data:application/json;charset=utf-8," + pctURI(body)746}747748func traitAttrs(it *item) []metadata.Trait {749 out := []metadata.Trait{}750 if it.rarity != "" {751 out = append(out, metadata.Trait{TraitType: "Rarity", Value: it.rarity})752 }753 for _, part := range strings.Split(it.traits, ";") {754 part = strings.TrimSpace(part)755 colon := strings.Index(part, ":")756 if colon <= 0 || colon >= len(part)-1 {757 continue758 }759 key := strings.TrimSpace(part[:colon])760 val := strings.TrimSpace(part[colon+1:])761 if key == "" || val == "" {762 continue763 }764 out = append(out, metadata.Trait{TraitType: key, Value: val})765 }766 return out767}768769func absImage(u string) string {770 if u == "" {771 return u772 }773 if strings.HasPrefix(u, "https://") || strings.HasPrefix(u, "http://") || strings.HasPrefix(u, "ipfs://") {774 return u775 }776 if strings.HasPrefix(u, "/") {777 return publicOrigin + u778 }779 return u780}781782func jsonStr(s string) string {783 out := `"`784 for _, r := range s {785 switch r {786 case '"':787 out += `\"`788 case '\\':789 out += `\\`790 case '\n':791 out += `\n`792 case '\r':793 out += `\r`794 case '\t':795 out += `\t`796 default:797 if r < 0x20 {798 out += `\u00`799 hex := "0123456789abcdef"800 out += string([]byte{hex[r>>4], hex[r&15]})801 } else {802 out += string(r)803 }804 }805 }806 return out + `"`807}808809func pctURI(s string) string {810 out := ""811 for i := 0; i < len(s); i++ {812 c := s[i]813 if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '.' || c == '~' {814 out += string(c)815 continue816 }817 hex := "0123456789ABCDEF"818 out += "%"819 out += string([]byte{hex[c>>4], hex[c&15]})820 }821 return out822}823824func splitDropLines(blob string) []string {825 raw := strings.Split(blob, "\n")826 out := make([]string, 0, len(raw))827 for _, line := range raw {828 line = strings.TrimSpace(line)829 if line == "" {830 continue831 }832 out = append(out, line)833 }834 return out835}836837func parseDropLine(line string) (string, string, string, string) {838 parts := strings.Split(line, "|")839 name := ""840 image := ""841 rarity := ""842 traits := ""843 if len(parts) > 0 {844 name = strings.TrimSpace(parts[0])845 }846 if len(parts) > 1 {847 image = strings.TrimSpace(parts[1])848 }849 if len(parts) > 2 {850 rarity = strings.TrimSpace(parts[2])851 }852 if len(parts) > 3 {853 traits = strings.TrimSpace(parts[3])854 }855 return name, image, rarity, traits856}857858func validRarity(s string) bool {859 if s == "" {860 return true861 }862 return s == "Common" || s == "Uncommon" || s == "Rare" || s == "Epic" || s == "Legendary"863}864865func validTraits(s string) bool {866 if s == "" {867 return true868 }869 if len(s) > 200 {870 return false871 }872 if strings.ContainsAny(s, "\n\r|") {873 return false874 }875 n := 0876 for _, part := range strings.Split(s, ";") {877 part = strings.TrimSpace(part)878 if part == "" {879 continue880 }881 colon := strings.Index(part, ":")882 if colon <= 0 || colon >= len(part)-1 {883 return false884 }885 key := strings.TrimSpace(part[:colon])886 val := strings.TrimSpace(part[colon+1:])887 if key == "" || val == "" {888 return false889 }890 if !asciiSet(key, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 _-") {891 return false892 }893 if !asciiSet(val, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 _-") {894 return false895 }896 n++897 if n > 8 {898 return false899 }900 }901 return n >= 1902}903904func validPkgName(s string) bool {905 if len(s) < minSlugLen || len(s) > grc721.MaxSymbolLen {906 return false907 }908 if s[0] < 'a' || s[0] > 'z' {909 return false910 }911 return asciiSet(s, "abcdefghijklmnopqrstuvwxyz0123456789")912}913914func rarityOf(id int) string {915 r := id % 10916 if r == 0 {917 return "Legendary"918 }919 if r == 1 {920 return "Common"921 }922 if r == 2 {923 return "Uncommon"924 }925 if r == 3 {926 return "Rare"927 }928 if r == 4 {929 return "Epic"930 }931 if r <= 7 {932 return "Uncommon"933 }934 return "Common"935}936937func validName(name string) bool {938 if len(name) < 1 || len(name) > maxNameLen {939 return false940 }941 if strings.ContainsAny(name, "\n\r|\t\"\\") {942 return false943 }944 for _, r := range name {945 if r < 0x20 {946 return false947 }948 }949 return true950}951952func validImage(u string) bool {953 if u == "" {954 return true955 }956 if len(u) > maxImageLen {957 return false958 }959 if strings.ContainsAny(u, " \t\n\r|<>\"'`") {960 return false961 }962 if strings.HasPrefix(u, "https://") || strings.HasPrefix(u, "http://") {963 return true964 }965 const prefix = "/samples/"966 if !strings.HasPrefix(u, prefix) {967 return false968 }969 rest := u[len(prefix):]970 if rest == "" {971 return false972 }973 return asciiSet(rest, "abcdefghijklmnopqrstuvwxyz0123456789._-")974}975976func asciiSet(s, allowed string) bool {977 for i := 0; i < len(s); i++ {978 if !strings.ContainsRune(allowed, rune(s[i])) {979 return false980 }981 }982 return true983}984AddDropItems(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}, blob string)
Approve(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}, to string, tid string)
BalanceOf(addr string) 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}, id int)
Cancel(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 int)
CollectionOf(int) string
Creator() string
GetApproved(id int) string
GrcBalanceOf(addr string) int64
GrcName() string
GrcOwnerOf(id int) string
GrcSymbol() string
ImageOf(id int) string
Init(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}, name string, symbol string, cover string, maxSupplyN int, mintPriceUgnot int64, royalty int64)
IsApprovedForAll(owner string, operator string) bool
ItemLine(id int) string
List(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 int, priceUgnot int64)
ListDropSlots() string
Listed(id int) bool
ListOpen() string
LoadedOf() int
MaxSupply() int
Mint(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}, name string, imageURL string) int
Minted() int
MintPrice() int64
Name() string
NameOf(id int) string
NextID() int
OwnerOf(tid string) string
PauseMint(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})
PriceOf(id int) int64
ProtocolBps() int64
PublicMint(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}) int
RarityOf(id int) string
Render(string) string
ResumeMint(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})
RoyaltyBps() int
SellerOf(id int) string
SetApprovalForAll(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}, operator string, approved bool)
SetRoyalty(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}, bps int)
Symbol() string
TokenByIndex(index int64) string
TokenOfOwnerByIndex(owner string, index int64) string
TokensOf(owner string) string
TokenURI(tid string) string
TotalSupply() int64
TraitsOf(id int) string
Transfer(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}, to string, id int)
TransferFrom(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}, from string, to string, tid string)
UpdatePrice(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 int, priceUgnot int64)
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.