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}