Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}