Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}