package block import ( "strconv" "gno.land/p/demo/tokens/grc1155" "gno.land/p/nt/avl" ) var ( userTokenIndex = avl.NewTree() // address -> map[tid]bool ) // addUserToken adds a token ID to user's token list func addUserToken(user address, tid grc1155.TokenID) { userStr := user.String() // Get or create user's token map var tokensMap map[string]bool tokens, found := userTokenIndex.Get(userStr) if found { tokensMap = tokens.(map[string]bool) } else { tokensMap = make(map[string]bool) userTokenIndex.Set(userStr, tokensMap) } tidStr := string(tid) tokensMap[tidStr] = true } // addUserTokenBatch adds multiple token IDs to user's token list func addUserTokenBatch(user address, tids []grc1155.TokenID) { userStr := user.String() // Get or create user's token map var tokensMap map[string]bool tokens, found := userTokenIndex.Get(userStr) if found { tokensMap = tokens.(map[string]bool) } else { tokensMap = make(map[string]bool) userTokenIndex.Set(userStr, tokensMap) } for _, tid := range tids { tidStr := string(tid) tokensMap[tidStr] = true } } // removeUserToken removes a token ID from user's token list if balance is 0 func removeUserToken(user address, tid grc1155.TokenID) { balance := BalanceOf(user, tid) if balance != 0 { return } userStr := user.String() tokens, found := userTokenIndex.Get(userStr) if !found { return } tokensMap := tokens.(map[string]bool) tidStr := string(tid) delete(tokensMap, tidStr) // Remove user entry if no tokens left if len(tokensMap) == 0 { userTokenIndex.Remove(userStr) } } // removeUserTokenBatch removes multiple token IDs from user's token list func removeUserTokenBatch(user address, tids []grc1155.TokenID) { userStr := user.String() tokens, found := userTokenIndex.Get(userStr) if !found { return } tokensMap := tokens.(map[string]bool) for _, tid := range tids { balance := BalanceOf(user, tid) if balance != 0 { continue } tidStr := string(tid) delete(tokensMap, tidStr) } // Remove user entry if no tokens left if len(tokensMap) == 0 { userTokenIndex.Remove(userStr) } } // getUserTokens returns all token IDs owned by user func getUserTokens(user address) []string { userStr := user.String() tokens, found := userTokenIndex.Get(userStr) if !found { return []string{} } tokensMap := tokens.(map[string]bool) result := make([]string, 0, len(tokensMap)) for tid := range tokensMap { result = append(result, tid) } return result } // GetInventory returns all block tokens owned by user with their balances func GetInventory(user address) []map[string]string { result := []map[string]string{} // Get all token IDs owned by user tids := getUserTokens(user) for _, tid := range tids { balance, err := token.BalanceOf(user, grc1155.TokenID(tid)) if err != nil { continue } // Only include tokens with non-zero balance if balance > 0 { result = append(result, map[string]string{ "id": tid, "balance": strconv.FormatInt(balance, 10), }) } } return result }