gingernft.gno
2.97 Kb · 87 lines
1package gingernft
2import (
3 "chain/runtime"
4 "errors"
5 "strconv"
6 "strings"
7 "gno.land/p/nt/ufmt/v0"
8)
9var nft = NewBasicNFT("Lord Ginge Genesis", "GINGE")
10func Mint(_ realm, metadataURI string) string {
11 prev := runtime.PreviousRealm()
12 require(prev.IsUser(), "Mint from a user wallet only, no intermediary realms.")
13 caller := prev.Address()
14 require(metadataURI != "", "metadataURI is required.")
15 require(len(metadataURI) <= 300000, "metadataURI too long (max 300000 chars).")
16 tid := TokenID(strconv.FormatInt(nft.TokenCount()+1, 10))
17 checkErr(nft.Mint(caller, tid))
18 _, err := nft.SetTokenURI(tid, TokenURI(metadataURI))
19 checkErr(err)
20 return tid.String()
21}
22func TransferFrom(_ realm, from, to address, tid string) error {
23 require(runtime.PreviousRealm().IsUser(), "user wallets only")
24 return nft.TransferFrom(from, to, TokenID(tid))
25}
26func Approve(_ realm, to address, tid string) error {
27 require(runtime.PreviousRealm().IsUser(), "user wallets only")
28 return nft.Approve(to, TokenID(tid))
29}
30func SetApprovalForAll(_ realm, operator address, approved bool) error {
31 require(runtime.PreviousRealm().IsUser(), "user wallets only")
32 return nft.SetApprovalForAll(operator, approved)
33}
34func SetTokenURI(_ realm, tid, metadataURI string) error {
35 require(runtime.PreviousRealm().IsUser(), "user wallets only")
36 require(len(metadataURI) <= 300000, "metadataURI too long (max 300000 chars).")
37 _, err := nft.SetTokenURI(TokenID(tid), TokenURI(metadataURI))
38 return err
39}
40func Burn(_ realm, tid string) error {
41 prev := runtime.PreviousRealm()
42 require(prev.IsUser(), "user wallets only")
43 owner, err := nft.OwnerOf(TokenID(tid))
44 if err != nil {
45 return err
46 }
47 if owner != prev.Address() {
48 return errors.New("only the token owner can burn it")
49 }
50 return nft.Burn(TokenID(tid))
51}
52func Name() string { return nft.Name() }
53func Symbol() string { return nft.Symbol() }
54func TokenCount() int64 { return nft.TokenCount() }
55func BalanceOf(owner address) (int64, error) { return nft.BalanceOf(owner) }
56func OwnerOf(tid string) (address, error) { return nft.OwnerOf(TokenID(tid)) }
57func GetTokenURI(tid string) (string, error) { return nft.TokenURI(TokenID(tid)) }
58func Render(path string) string {
59 if path != "" {
60 return "404 — try the home page."
61 }
62 var sb strings.Builder
63 sb.WriteString("# Lord Ginge Genesis\n\n")
64 sb.WriteString(ufmt.Sprintf("Open-mint GRC721 collection · **%d minted**\n\n", nft.TokenCount()))
65 sb.WriteString("Mint by calling `Mint(metadataURI)` — the NFT goes straight to your own wallet.\n")
66 sb.WriteString("Metadata is stored in each token's URI as `data:application/json;base64,...`.\n\n")
67 var i int64
68 for i = 1; i <= nft.TokenCount(); i++ {
69 tid := strconv.FormatInt(i, 10)
70 owner, err := nft.OwnerOf(TokenID(tid))
71 if err != nil {
72 continue
73 }
74 sb.WriteString(ufmt.Sprintf("- **#%s** — owner `%s`\n", tid, owner.String()))
75 }
76 return sb.String()
77}
78func require(cond bool, msg string) {
79 if !cond {
80 panic(msg)
81 }
82}
83func checkErr(err error) {
84 if err != nil {
85 panic(err)
86 }
87}