getters.gno
5.89 Kb ยท 211 lines
1package tokenhub
2
3import (
4 "std"
5 "strings"
6
7 "gno.land/p/demo/grc/grc1155"
8 "gno.land/p/demo/grc/grc20"
9 "gno.land/p/demo/grc/grc721"
10 "gno.land/p/demo/ufmt"
11 "gno.land/r/demo/grc20reg"
12 "gno.land/r/sys/users"
13)
14
15// GetUserTokenBalances returns a string of all the grc20 tokens the user owns
16func GetUserTokenBalances(userNameOrAddress string) string {
17 return getTokenBalances(userNameOrAddress, false)
18}
19
20// GetUserTokenBalancesNonZero returns a string of all the grc20 tokens the user owns, but only the ones that have a balance greater than 0
21func GetUserTokenBalancesNonZero(userNameOrAddress string) string {
22 return getTokenBalances(userNameOrAddress, true)
23}
24
25// GetUserNFTBalances returns a string of all the NFTs the user owns
26func GetUserNFTBalances(userNameOrAddress string) string {
27 return getNFTBalances(userNameOrAddress)
28}
29
30// GetUserMultiTokenBalances returns a string of all the multi-tokens the user owns
31func GetUserMultiTokenBalances(userNameOrAddress string) string {
32 return getMultiTokenBalances(userNameOrAddress, false)
33}
34
35// GetUserMultiTokenBalancesNonZero returns a string of all the multi-tokens the user owns, but only the ones that have a balance greater than 0
36func GetUserMultiTokenBalancesNonZero(userNameOrAddress string) string {
37 return getMultiTokenBalances(userNameOrAddress, true)
38}
39
40// GetToken returns a token instance for a given key
41func GetToken(key string) *grc20.Token {
42 return grc20reg.Get(key)
43}
44
45// MustGetToken returns a token instance for a given key, panics if the token is not found
46func MustGetToken(key string) *grc20.Token {
47 return grc20reg.MustGet(key)
48}
49
50// GetNFT returns an NFT instance for a given key
51func GetNFT(key string) grc721.IGRC721 {
52 nftGetter, ok := registeredNFTs.Get(key)
53 if !ok {
54 return nil
55 }
56 return (nftGetter.(grc721.NFTGetter))()
57}
58
59// MustGetNFT returns an NFT instance for a given key, panics if the NFT is not found
60func MustGetNFT(key string) grc721.IGRC721 {
61 nftGetter := GetNFT(key)
62 if nftGetter == nil {
63 panic("unknown NFT: " + key)
64 }
65 return nftGetter
66}
67
68// GetMultiToken returns a multi-token instance for a given key
69func GetMultiToken(key string) grc1155.IGRC1155 {
70 info, ok := registeredMTs.Get(key)
71 if !ok {
72 return nil
73 }
74 mt := info.(GRC1155TokenInfo).Collection
75 return mt()
76}
77
78// MustGetMultiToken returns a multi-token instance for a given key, panics if the multi-token is not found
79func MustGetMultiToken(key string) grc1155.IGRC1155 {
80 info := GetMultiToken(key)
81 if info == nil {
82 panic("unknown multi-token: " + key)
83 }
84 return info
85}
86
87// GetAllNFTs returns a string of all the NFTs registered
88func GetAllNFTs() string {
89 var out string
90 registeredNFTs.Iterate("", "", func(key string, value interface{}) bool {
91 out += ufmt.Sprintf("NFT:%s,", key)
92 return false
93 })
94 return out
95}
96
97// GetAllTokens returns a string of all the tokens registered
98func GetAllTokens() string {
99 var out string
100 grc20reg.GetRegistry().Iterate("", "", func(key string, value interface{}) bool {
101 out += "Token:" + key + ","
102 return false
103 })
104 return out
105}
106
107// GetAllTokenWithDetails returns a string of all the tokens registered with their details
108func GetAllTokenWithDetails() string {
109 var out string
110 grc20reg.GetRegistry().Iterate("", "", func(key string, value interface{}) bool {
111 token := value.(*grc20.Token)
112 out += ufmt.Sprintf("Token:%s,Name:%s,Symbol:%s,Decimals:%d;", key, token.GetName(), token.GetSymbol(), token.GetDecimals())
113 return false
114 })
115 return out
116}
117
118// GetAllMultiTokens returns a string of all the multi-tokens registered
119func GetAllMultiTokens() string {
120 var out string
121 registeredMTs.Iterate("", "", func(key string, value interface{}) bool {
122 out += "MultiToken:" + key + ","
123 return false
124 })
125 return out
126}
127
128// GetAllRegistered returns a string of all the registered tokens, NFTs and multi-tokens
129func GetAllRegistered() string {
130 return GetAllNFTs() + GetAllTokens() + GetAllMultiTokens()
131}
132
133// getNFTBalances returns a string of all the NFTs the user owns
134func getNFTBalances(input string) string {
135 addr := getAddressForUsername(input)
136 if !addr.IsValid() {
137 panic("invalid address or username: " + input)
138 }
139 var out string
140
141 registeredNFTs.Iterate("", "", func(key string, value interface{}) bool {
142 nftGetter := value.(grc721.NFTGetter)
143 nft := nftGetter()
144 key_parts := strings.Split(key, ".")
145 owner, err := nft.OwnerOf(grc721.TokenID(key_parts[len(key_parts)-1]))
146 if err == nil && addr == owner { // show only the nfts owner owns
147 out += "NFT:" + key + ","
148 }
149 return false
150 })
151
152 return out
153}
154
155// getTokenBalances returns a string of all the tokens the user owns
156func getTokenBalances(input string, nonZero bool) string {
157
158 addr := getAddressForUsername(input)
159 if !addr.IsValid() {
160 panic("invalid address or username: " + input)
161 }
162 var out string
163 grc20reg.GetRegistry().Iterate("", "", func(key string, value interface{}) bool {
164
165 token := value.(*grc20.Token)
166 balance := token.BalanceOf(addr)
167 if !nonZero || balance > 0 {
168 out += ufmt.Sprintf("Token:%s:%d,", key, balance)
169 }
170 return false
171 })
172
173 return out
174}
175
176// getMultiTokenBalances returns a string of all the multi-tokens the user owns
177func getMultiTokenBalances(input string, nonZero bool) string {
178 addr := getAddressForUsername(input)
179 if !addr.IsValid() {
180 panic("invalid address or username: " + input)
181 }
182 var out string
183
184 registeredMTs.Iterate("", "", func(key string, value interface{}) bool {
185 info := value.(GRC1155TokenInfo)
186 mt := info.Collection()
187 balance, err := mt.BalanceOf(addr, grc1155.TokenID(info.TokenID))
188 if err == nil {
189 if !nonZero || balance > 0 {
190 out += ufmt.Sprintf("MultiToken:%s:%d,", key, balance)
191 }
192 }
193 return false
194 })
195
196 return out
197}
198
199// getAddressForUsername returns an address for a given username or address
200func getAddressForUsername(addrOrName string) std.Address {
201 addr := std.Address(addrOrName)
202 if addr.IsValid() {
203 return addr
204 }
205
206 if userData, _ := users.ResolveName(addrOrName); userData != nil {
207 return userData.Addr()
208 }
209
210 return ""
211}