• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

hicommonwealth / commonwealth / 16647103923

31 Jul 2025 10:57AM UTC coverage: 38.735% (-0.4%) from 39.148%
16647103923

push

github

web-flow
Skip the Token Allocation Lifecycle tests for now (#12705)

1861 of 5176 branches covered (35.95%)

Branch coverage included in aggregate %.

3290 of 8122 relevant lines covered (40.51%)

35.04 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

1.67
/libs/model/src/services/tokenBalanceCache/tokenBalanceCache.ts
1
import { logger, stats } from '@hicommonwealth/core';
2
import { BalanceSourceType } from '@hicommonwealth/shared';
3
import { getCosmosBalances, getEvmBalances } from './providers';
4
import { getSolanaBalances } from './providers/getSolanaBalances';
5
import { getSuiBalances } from './providers/getSuiBalances';
6
import {
7
  Balances,
8
  GetBalancesOptions,
9
  GetCosmosBalancesOptions,
10
  GetErcBalanceOptions,
11
  GetEvmBalancesOptions,
12
  GetSPLBalancesOptions,
13
  GetSuiNativeBalanceOptions,
14
  GetSuiNftBalanceOptions,
15
  GetSuiTokenBalanceOptions,
16
} from './types';
17

18
const log = logger(import.meta);
28✔
19

20
/**
21
 * This is the main function through which all balances should be fetched.
22
 * This function supports all balance sources and is fully compatible with Redis caching.
23
 */
24
export async function getBalances(
25
  options: GetBalancesOptions,
26
  ttl?: number,
27
): Promise<Balances> {
28
  if (options.addresses.length === 0) return {};
×
29

30
  let balances: Balances = {};
×
31

32
  try {
×
33
    if (
×
34
      options.balanceSourceType === BalanceSourceType.CosmosNative ||
×
35
      options.balanceSourceType === BalanceSourceType.CW20 ||
36
      options.balanceSourceType === BalanceSourceType.CW721
37
    ) {
38
      balances = await getCosmosBalances(options, ttl);
×
39
    } else if (
×
40
      options.balanceSourceType == BalanceSourceType.SPL ||
×
41
      options.balanceSourceType == BalanceSourceType.SOLNFT
42
    ) {
43
      balances = await getSolanaBalances(options, ttl);
×
44
    } else if (
×
45
      options.balanceSourceType === BalanceSourceType.SuiNative ||
×
46
      options.balanceSourceType === BalanceSourceType.SuiToken ||
47
      options.balanceSourceType === BalanceSourceType.SuiNFT
48
    ) {
49
      balances = await getSuiBalances(
×
50
        options as
51
          | GetSuiNativeBalanceOptions
52
          | GetSuiTokenBalanceOptions
53
          | GetSuiNftBalanceOptions,
54
        ttl,
55
      );
56
    } else {
57
      balances = await getEvmBalances(options as GetEvmBalancesOptions, ttl);
×
58
    }
59
  } catch (e) {
60
    const chainId =
61
      options.balanceSourceType === BalanceSourceType.SPL
×
62
        ? 'solana'
63
        : options.balanceSourceType === BalanceSourceType.SuiNative ||
×
64
            options.balanceSourceType === BalanceSourceType.SuiToken ||
65
            options.balanceSourceType === BalanceSourceType.SuiNFT
66
          ? (
67
              options as
68
                | GetSuiNativeBalanceOptions
69
                | GetSuiTokenBalanceOptions
70
                | GetSuiNftBalanceOptions
71
            ).sourceOptions.suiNetwork
72
          : (options as GetEvmBalancesOptions).sourceOptions.evmChainId ||
×
73
            (options as GetCosmosBalancesOptions).sourceOptions.cosmosChainId;
74

75
    const contractAddress =
76
      (options as GetSPLBalancesOptions).mintAddress ||
×
77
      (options as GetErcBalanceOptions).sourceOptions.contractAddress ||
78
      (options as GetSuiNativeBalanceOptions).sourceOptions.objectId ||
79
      (options.balanceSourceType === BalanceSourceType.SuiToken
×
80
        ? (options as GetSuiTokenBalanceOptions).sourceOptions.coinType
81
        : options.balanceSourceType === BalanceSourceType.SuiNFT
×
82
          ? (options as GetSuiNftBalanceOptions).sourceOptions.collectionId
83
          : undefined);
84

85
    const msg =
86
      `Failed to fetch balance(s) for ${options.addresses.length} address(es)` +
×
87
      `on chain ${chainId}${contractAddress ? ' for contract ' : ''}${
×
88
        contractAddress || ''
×
89
      }`;
90

91
    log.error(msg, e instanceof Error ? e : undefined, {
×
92
      fingerprint: `TBC: ${chainId} - ${contractAddress}`,
93
      addresses: options.addresses.slice(0, 5),
94
      contractAddress: (options as GetErcBalanceOptions).sourceOptions
95
        ?.contractAddress,
96
      evmChainId: (options as GetEvmBalancesOptions).sourceOptions?.evmChainId,
97
      cosmosChainId: (options as GetCosmosBalancesOptions).sourceOptions
98
        ?.cosmosChainId,
99
      suiNetwork: (
100
        options as
101
          | GetSuiNativeBalanceOptions
102
          | GetSuiTokenBalanceOptions
103
          | GetSuiNftBalanceOptions
104
      ).sourceOptions?.suiNetwork,
105
      objectId: (options as GetSuiNativeBalanceOptions).sourceOptions?.objectId,
106
      coinType:
107
        options.balanceSourceType === BalanceSourceType.SuiToken
×
108
          ? (options as GetSuiTokenBalanceOptions).sourceOptions.coinType
109
          : undefined,
110
      collectionId:
111
        options.balanceSourceType === BalanceSourceType.SuiNFT
×
112
          ? (options as GetSuiNftBalanceOptions).sourceOptions.collectionId
113
          : undefined,
114
    });
115
  }
116

117
  stats().incrementBy(
×
118
    'tbc.successful.balance.fetch',
119
    Object.keys(balances).length,
120
    {
121
      balance_source_type: options.balanceSourceType,
122
    },
123
  );
124
  return balances;
×
125
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc