Search Apps Documentation Source Content File Folder Download Copy Actions Download

tokenhub.gno

2.24 Kb · 85 lines
 1package tokenhub
 2
 3import (
 4	"chain/runtime"
 5
 6	"gno.land/p/demo/tokens/grc20"
 7	"gno.land/p/nt/fqname/v0"
 8	"gno.land/r/demo/defi/grc20reg"
 9
10	"gno.land/p/demo/tokens/grc1155"
11	"gno.land/p/demo/tokens/grc721"
12	"gno.land/p/nt/avl/v0"
13
14	"gno.land/r/leon/hor"
15)
16
17type GRC1155TokenInfo struct {
18	Collection grc1155.MultiTokenGetter
19	TokenID    string
20}
21
22var (
23	registeredTokens = avl.NewTree() // rlmPath[.slug] -> *grc20.Token
24	registeredNFTs   = avl.NewTree() // rlmPath[.slug] -> grc721.NFTGetter
25	registeredMTs    = avl.NewTree() // rlmPath[.slug] -> GRC1155TokenInfo
26)
27
28const pageSize = 10
29
30func init() {
31	hor.Register(cross, "Token Hub", "Registry for tokens and NFTs on gno.land")
32}
33
34// RegisterToken is a function that uses gno.land/r/demo/defi/grc20reg to register a token
35// RegisterToken registers a token in grc20reg with the given slug.
36// Returns the registry key that can be used to retrieve the token.
37func RegisterToken(cur realm, token *grc20.Token, slug string) string {
38	grc20reg.Register(cross, token, slug)
39	return fqname.Construct(runtime.CurrentRealm().PkgPath(), slug)
40}
41
42// RegisterNFT is a function that registers an NFT in an avl.Tree
43func RegisterNFT(cur realm, nftGetter grc721.NFTGetter, collection string, tokenId string) error {
44	nft := nftGetter()
45	_, ok := nft.(grc721.IGRC721CollectionMetadata)
46	if !ok {
47		return ErrNFTNotMetadata
48	}
49
50	nftOwner, err := nft.OwnerOf(grc721.TokenID(tokenId))
51
52	if err != nil {
53		return err
54	}
55	if !nftOwner.IsValid() {
56		return ErrNFTtokIDNotExists
57	}
58
59	rlmPath := runtime.PreviousRealm().PkgPath()
60	key := rlmPath + "." + collection + "." + tokenId
61
62	if registeredNFTs.Has(key) {
63		return ErrNFTAlreadyRegistered
64	}
65
66	registeredNFTs.Set(key, nftGetter)
67	return nil
68}
69
70// RegisterMultiToken is a function that registers a multi-token in an avl.Tree
71// The avl.Tree value is a struct defined in this realm. It contains not only the getter (like other token types) but also the tokenID
72func RegisterMultiToken(cur realm, mtGetter grc1155.MultiTokenGetter, tokenID string) error {
73	rlmPath := runtime.PreviousRealm().PkgPath()
74	key := rlmPath + "." + tokenID
75
76	if registeredMTs.Has(key) {
77		return ErrMTAlreadyRegistered
78	}
79
80	registeredMTs.Set(key, GRC1155TokenInfo{
81		Collection: mtGetter,
82		TokenID:    tokenID,
83	})
84	return nil
85}