fabric-samples/token-sdk/owner/service/balance.go
Arne Rutjes 99a1f49da0 add token sdk sample application
Signed-off-by: Arne Rutjes <arne123@gmail.com>
2023-10-10 09:00:23 -04:00

69 lines
1.8 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package service
import (
"strconv"
"github.com/hyperledger-labs/fabric-token-sdk/token"
"github.com/hyperledger-labs/fabric-token-sdk/token/services/ttx"
"github.com/pkg/errors"
)
// SERVICE
type BalanceByWallet map[string]ValueByTokenType
type ValueByTokenType map[string]int64
// GetAllBalances returns a map of all wallets with their balances per token type
func (s TokenService) GetAllBalances() (walletBalance BalanceByWallet, err error) {
walletBalance = make(BalanceByWallet)
wm := token.GetManagementService(s.FSC).WalletManager()
wallets, err := wm.OwnerWalletIDs()
if err != nil {
return walletBalance, errors.Wrap(err, "can't get list of wallets")
}
logger.Infof("getting balances for %v", wallets)
for _, w := range wallets {
b, err := s.GetBalance(w, "")
if err != nil {
logger.Error(err)
return walletBalance, err
}
walletBalance[w] = b
}
return
}
// GetBalance returns the balances per token type of a wallet
func (s TokenService) GetBalance(wallet string, tokenType string) (typeVal ValueByTokenType, err error) {
typeVal = make(ValueByTokenType)
// Tokens owned by identities in this wallet will be listed
if wallet == "" {
return typeVal, errors.New("no wallet id provided")
}
w := ttx.GetWallet(s.FSC, wallet)
if w == nil {
return nil, errors.Errorf("wallet not found: %s", wallet)
}
unspentTokens, err := w.ListUnspentTokens(ttx.WithType(tokenType))
if len(unspentTokens.Tokens) == 0 {
return typeVal, nil
}
// Add the value of all unspent tokens in the wallet
for _, token := range unspentTokens.Tokens {
val, err := strconv.ParseInt(token.Quantity, 0, 64)
if err != nil {
return typeVal, errors.Wrap(err, "Error parsing token "+token.Id.String())
}
typeVal[token.Type] += val
}
return
}