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