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}