@subwallet/extension-base 1.1.51-2 → 1.1.53-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/cjs/koni/api/tokens/evm/balance.js +1 -2
  2. package/cjs/koni/api/tokens/evm/transfer.js +3 -5
  3. package/cjs/koni/api/tokens/evm/web3.js +3 -3
  4. package/cjs/koni/background/handlers/Extension.js +5 -4
  5. package/cjs/koni/background/handlers/State.js +8 -71
  6. package/cjs/koni/background/subscription.js +3 -63
  7. package/cjs/packageInfo.js +1 -1
  8. package/cjs/services/balance-service/BalanceMapImpl.js +2 -2
  9. package/cjs/services/balance-service/helpers/index.js +27 -0
  10. package/cjs/services/balance-service/helpers/subscribe/evm.js +33 -15
  11. package/cjs/services/balance-service/helpers/subscribe/{balance.js → index.js} +46 -29
  12. package/cjs/services/balance-service/helpers/subscribe/substrate/equilibrium.js +34 -15
  13. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +157 -72
  14. package/cjs/services/balance-service/index.js +277 -75
  15. package/cjs/services/chain-service/constants.js +2 -1
  16. package/cjs/services/chain-service/health-check/utils/asset-info.js +1 -3
  17. package/cjs/services/chain-service/index.js +1 -9
  18. package/cjs/services/chain-service/utils/patch.js +1 -1
  19. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -2
  20. package/cjs/services/request-service/handler/ConnectWCRequestHandler.js +0 -1
  21. package/cjs/services/storage-service/DatabaseService.js +10 -1
  22. package/cjs/services/wallet-connect-service/helpers.js +1 -1
  23. package/cjs/services/wallet-connect-service/index.js +19 -0
  24. package/cjs/utils/asset.js +19 -0
  25. package/cjs/utils/eth/parseTransaction/index.js +1 -1
  26. package/cjs/utils/index.js +12 -0
  27. package/koni/api/tokens/evm/balance.d.ts +1 -1
  28. package/koni/api/tokens/evm/balance.js +1 -2
  29. package/koni/api/tokens/evm/transfer.d.ts +2 -2
  30. package/koni/api/tokens/evm/transfer.js +3 -5
  31. package/koni/api/tokens/evm/web3.d.ts +1 -1
  32. package/koni/api/tokens/evm/web3.js +2 -2
  33. package/koni/background/handlers/Extension.js +5 -4
  34. package/koni/background/handlers/State.d.ts +1 -12
  35. package/koni/background/handlers/State.js +9 -72
  36. package/koni/background/subscription.d.ts +1 -5
  37. package/koni/background/subscription.js +1 -60
  38. package/package.json +23 -13
  39. package/packageInfo.js +1 -1
  40. package/services/balance-service/BalanceMapImpl.js +1 -1
  41. package/services/balance-service/helpers/index.d.ts +2 -0
  42. package/services/balance-service/helpers/index.js +5 -0
  43. package/services/balance-service/helpers/subscribe/evm.d.ts +3 -5
  44. package/services/balance-service/helpers/subscribe/evm.js +31 -14
  45. package/services/balance-service/helpers/subscribe/{balance.d.ts → index.d.ts} +2 -2
  46. package/services/balance-service/helpers/subscribe/{balance.js → index.js} +41 -28
  47. package/services/balance-service/helpers/subscribe/substrate/equilibrium.d.ts +3 -4
  48. package/services/balance-service/helpers/subscribe/substrate/equilibrium.js +29 -13
  49. package/services/balance-service/helpers/subscribe/substrate/index.d.ts +2 -2
  50. package/services/balance-service/helpers/subscribe/substrate/index.js +144 -67
  51. package/services/balance-service/index.d.ts +64 -6
  52. package/services/balance-service/index.js +279 -77
  53. package/services/chain-service/constants.js +2 -1
  54. package/services/chain-service/health-check/utils/asset-info.js +1 -3
  55. package/services/chain-service/index.js +2 -10
  56. package/services/chain-service/utils/patch.js +1 -1
  57. package/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -2
  58. package/services/request-service/handler/ConnectWCRequestHandler.js +0 -1
  59. package/services/storage-service/DatabaseService.js +7 -1
  60. package/services/wallet-connect-service/helpers.js +1 -1
  61. package/services/wallet-connect-service/index.d.ts +1 -0
  62. package/services/wallet-connect-service/index.js +19 -1
  63. package/types/{balance.d.ts → balance/index.d.ts} +16 -0
  64. package/types/index.js +1 -1
  65. package/utils/asset.d.ts +2 -0
  66. package/utils/asset.js +12 -0
  67. package/utils/eth/parseTransaction/index.js +1 -1
  68. package/utils/index.d.ts +1 -0
  69. package/utils/index.js +1 -0
  70. /package/cjs/types/{balance.js → balance/index.js} +0 -0
  71. /package/types/{balance.js → balance/index.js} +0 -0
@@ -3,9 +3,8 @@
3
3
 
4
4
  import { _AssetType } from '@subwallet/chain-list/types';
5
5
  import { APIItemState } from '@subwallet/extension-base/background/KoniTypes';
6
- import { state } from '@subwallet/extension-base/koni/background/handlers';
7
6
  import { _getSubstrateGenesisHash, _isChainEvmCompatible, _isPureEvmChain } from '@subwallet/extension-base/services/chain-service/utils';
8
- import { categoryAddresses } from '@subwallet/extension-base/utils';
7
+ import { categoryAddresses, filterAssetsByChainAndType } from '@subwallet/extension-base/utils';
9
8
  import keyring from '@subwallet/ui-keyring';
10
9
  import { subscribeEVMBalance } from "./evm.js";
11
10
  import { subscribeSubstrateBalance } from "./substrate/index.js";
@@ -36,6 +35,8 @@ export const getAccountJsonByAddress = address => {
36
35
  return null;
37
36
  }
38
37
  };
38
+
39
+ /** Filter addresses to subscribe by chain info */
39
40
  const filterAddress = (addresses, chainInfo) => {
40
41
  const isEvmChain = _isChainEvmCompatible(chainInfo);
41
42
  const [substrateAddresses, evmAddresses] = categoryAddresses(addresses);
@@ -66,38 +67,50 @@ const filterAddress = (addresses, chainInfo) => {
66
67
  }
67
68
  };
68
69
 
69
- // main subscription
70
- export function subscribeBalance(addresses, chainInfoMap, substrateApiMap, evmApiMap, callback) {
70
+ // interface SubscribeBlanceOptions {
71
+ // addresses: string[];
72
+ // chains: string[];
73
+ // tokens: string[];
74
+ // chainInfoMap: Record<string, _ChainInfo>;
75
+ // substrateApiMap: Record<string, _SubstrateApi>;
76
+ // evmApiMap: Record<string, _EvmApi>;
77
+ // callback: (rs: BalanceItem[]) => void;
78
+ // }
79
+
80
+ // main subscription, use for multiple chains, multiple addresses and multiple tokens
81
+ export function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoMap, substrateApiMap, evmApiMap, callback) {
82
+ // Filter chain and token
83
+ const chainAssetMap = Object.fromEntries(Object.entries(_chainAssetMap).filter(([token]) => tokens.includes(token)));
84
+ const chainInfoMap = Object.fromEntries(Object.entries(_chainInfoMap).filter(([chain]) => chains.includes(chain)));
85
+
71
86
  // Looping over each chain
72
- const unsubList = Object.entries(chainInfoMap).map(async ([chainSlug, chainInfo]) => {
87
+ const unsubList = Object.values(chainInfoMap).map(async chainInfo => {
88
+ const chainSlug = chainInfo.slug;
73
89
  const [useAddresses, notSupportAddresses] = filterAddress(addresses, chainInfo);
74
90
  if (notSupportAddresses.length) {
75
- const tokens = state.chainService.getAssetByChainAndType(chainSlug, [_AssetType.NATIVE, _AssetType.ERC20, _AssetType.PSP22, _AssetType.LOCAL]);
76
- const assetSetting = await state.chainService.getAssetSettings();
77
- const filtered = Object.values(tokens).filter(({
78
- slug
79
- }) => {
80
- var _assetSetting$slug;
81
- return (_assetSetting$slug = assetSetting[slug]) === null || _assetSetting$slug === void 0 ? void 0 : _assetSetting$slug.visible;
82
- });
91
+ const tokens = filterAssetsByChainAndType(chainAssetMap, chainSlug, [_AssetType.NATIVE, _AssetType.ERC20, _AssetType.PSP22, _AssetType.LOCAL]);
83
92
  const now = new Date().getTime();
84
- notSupportAddresses.forEach(address => {
85
- const items = filtered.map(token => {
86
- return {
87
- address,
88
- tokenSlug: token.slug,
89
- free: '0',
90
- locked: '0',
91
- state: APIItemState.NOT_SUPPORT,
92
- timestamp: now
93
- };
94
- });
93
+ Object.values(tokens).forEach(token => {
94
+ const items = notSupportAddresses.map(address => ({
95
+ address,
96
+ tokenSlug: token.slug,
97
+ free: '0',
98
+ locked: '0',
99
+ state: APIItemState.NOT_SUPPORT,
100
+ timestamp: now
101
+ }));
95
102
  callback(items);
96
103
  });
97
104
  }
105
+ const evmApi = evmApiMap[chainSlug];
98
106
  if (_isPureEvmChain(chainInfo)) {
99
- const nativeTokenInfo = state.getNativeTokenInfo(chainSlug);
100
- return subscribeEVMBalance(chainSlug, useAddresses, evmApiMap, callback, nativeTokenInfo);
107
+ return subscribeEVMBalance({
108
+ addresses: useAddresses,
109
+ assetMap: chainAssetMap,
110
+ callback,
111
+ chainInfo,
112
+ evmApi
113
+ });
101
114
  }
102
115
 
103
116
  // if (!useAddresses || useAddresses.length === 0 || _PURE_EVM_CHAINS.indexOf(chainSlug) > -1) {
@@ -117,8 +130,8 @@ export function subscribeBalance(addresses, chainInfoMap, substrateApiMap, evmAp
117
130
  // return undefined;
118
131
  // }
119
132
 
120
- const networkAPI = await substrateApiMap[chainSlug].isReady;
121
- return subscribeSubstrateBalance(useAddresses, chainInfo, chainSlug, networkAPI, evmApiMap, callback);
133
+ const substrateApi = await substrateApiMap[chainSlug].isReady;
134
+ return subscribeSubstrateBalance(useAddresses, chainInfo, chainAssetMap, substrateApi, evmApi, callback);
122
135
  });
123
136
  return () => {
124
137
  unsubList.forEach(subProm => {
@@ -1,4 +1,3 @@
1
- import { BalanceItem } from '@subwallet/extension-base/types';
2
- import { ApiPromise } from '@polkadot/api';
3
- export declare function subscribeEquilibriumTokenBalance(addresses: string[], chain: string, api: ApiPromise, callBack: (rs: BalanceItem[]) => void, includeNativeToken?: boolean): Promise<() => void>;
4
- export declare function subscribeEqBalanceAccountPallet(addresses: string[], chain: string, api: ApiPromise, callBack: (rs: BalanceItem[]) => void, includeNativeToken?: boolean): Promise<() => void>;
1
+ import { SubscribeSubstratePalletBalance } from '@subwallet/extension-base/types';
2
+ export declare const subscribeEquilibriumTokenBalance: ({ addresses, assetMap, callback, chainInfo, includeNativeToken, substrateApi }: SubscribeSubstratePalletBalance) => Promise<() => void>;
3
+ export declare const subscribeEqBalanceAccountPallet: ({ addresses, assetMap, callback, chainInfo, includeNativeToken, substrateApi }: SubscribeSubstratePalletBalance) => Promise<() => void>;
@@ -3,15 +3,23 @@
3
3
 
4
4
  import { _AssetType } from '@subwallet/chain-list/types';
5
5
  import { APIItemState } from '@subwallet/extension-base/background/KoniTypes';
6
- import { state } from '@subwallet/extension-base/koni/background/handlers';
7
6
  import { _getTokenOnChainAssetId } from '@subwallet/extension-base/services/chain-service/utils';
7
+ import { filterAssetsByChainAndType } from '@subwallet/extension-base/utils';
8
8
  import BigN from 'bignumber.js';
9
9
  import { BN, BN_ZERO } from '@polkadot/util';
10
- export async function subscribeEquilibriumTokenBalance(addresses, chain, api, callBack, includeNativeToken) {
10
+ export const subscribeEquilibriumTokenBalance = async ({
11
+ addresses,
12
+ assetMap,
13
+ callback,
14
+ chainInfo,
15
+ includeNativeToken,
16
+ substrateApi
17
+ }) => {
18
+ const chain = chainInfo.slug;
11
19
  const tokenTypes = includeNativeToken ? [_AssetType.NATIVE, _AssetType.LOCAL] : [_AssetType.LOCAL];
12
- const tokenMap = state.getAssetByChainAndAsset(chain, tokenTypes);
20
+ const tokenMap = filterAssetsByChainAndType(assetMap, chain, tokenTypes);
13
21
  try {
14
- const unsub = await api.query.system.account.multi(addresses, balances => {
22
+ const unsub = await substrateApi.query.system.account.multi(addresses, balances => {
15
23
  // Equilibrium customizes the SystemAccount pallet
16
24
  Object.values(tokenMap).forEach(tokenInfo => {
17
25
  const assetId = _getTokenOnChainAssetId(tokenInfo);
@@ -32,7 +40,7 @@ export async function subscribeEquilibriumTokenBalance(addresses, chain, api, ca
32
40
  tokenSlug: tokenInfo.slug
33
41
  };
34
42
  });
35
- callBack(items);
43
+ callback(items);
36
44
  });
37
45
  });
38
46
  return () => {
@@ -50,22 +58,30 @@ export async function subscribeEquilibriumTokenBalance(addresses, chain, api, ca
50
58
  tokenSlug: tokenInfo.slug
51
59
  };
52
60
  });
53
- callBack(items);
61
+ callback(items);
54
62
  });
55
63
  return () => {
56
64
  // Empty
57
65
  };
58
66
  }
59
- }
67
+ };
60
68
 
61
69
  // eslint-disable-next-line @typescript-eslint/require-await
62
- export async function subscribeEqBalanceAccountPallet(addresses, chain, api, callBack, includeNativeToken) {
70
+ export const subscribeEqBalanceAccountPallet = async ({
71
+ addresses,
72
+ assetMap,
73
+ callback,
74
+ chainInfo,
75
+ includeNativeToken,
76
+ substrateApi
77
+ }) => {
78
+ const chain = chainInfo.slug;
63
79
  const tokenTypes = includeNativeToken ? [_AssetType.NATIVE, _AssetType.LOCAL] : [_AssetType.LOCAL];
64
- const tokenMap = state.getAssetByChainAndAsset(chain, tokenTypes);
80
+ const tokenMap = filterAssetsByChainAndType(assetMap, chain, tokenTypes);
65
81
  const unsubList = Object.values(tokenMap).map(async tokenInfo => {
66
82
  try {
67
83
  const assetId = _getTokenOnChainAssetId(tokenInfo);
68
- const unsub = await api.query.eqBalances.account.multi(addresses.map(address => [address, [assetId]]), balances => {
84
+ const unsub = await substrateApi.query.eqBalances.account.multi(addresses.map(address => [address, [assetId]]), balances => {
69
85
  const items = balances.map((balance, index) => {
70
86
  return {
71
87
  address: addresses[index],
@@ -76,7 +92,7 @@ export async function subscribeEqBalanceAccountPallet(addresses, chain, api, cal
76
92
  tokenSlug: tokenInfo.slug
77
93
  };
78
94
  });
79
- callBack(items);
95
+ callback(items);
80
96
  });
81
97
  return unsub;
82
98
  } catch (err) {
@@ -91,7 +107,7 @@ export async function subscribeEqBalanceAccountPallet(addresses, chain, api, cal
91
107
  tokenSlug: tokenInfo.slug
92
108
  };
93
109
  });
94
- callBack(items);
110
+ callback(items);
95
111
  return undefined;
96
112
  }
97
113
  });
@@ -102,4 +118,4 @@ export async function subscribeEqBalanceAccountPallet(addresses, chain, api, cal
102
118
  }).catch(console.error);
103
119
  });
104
120
  };
105
- }
121
+ };
@@ -1,4 +1,4 @@
1
- import { _ChainInfo } from '@subwallet/chain-list/types';
1
+ import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types';
2
2
  import { _EvmApi, _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
3
3
  import { BalanceItem } from '@subwallet/extension-base/types';
4
- export declare function subscribeSubstrateBalance(addresses: string[], chainInfo: _ChainInfo, chain: string, networkAPI: _SubstrateApi, evmApiMap: Record<string, _EvmApi>, callBack: (rs: BalanceItem[]) => void): Promise<() => void>;
4
+ export declare const subscribeSubstrateBalance: (addresses: string[], chainInfo: _ChainInfo, assetMap: Record<string, _ChainAsset>, substrateApi: _SubstrateApi, evmApi: _EvmApi, callback: (rs: BalanceItem[]) => void) => Promise<() => void>;
@@ -6,42 +6,63 @@ import { APIItemState } from '@subwallet/extension-base/background/KoniTypes';
6
6
  import { SUB_TOKEN_REFRESH_BALANCE_INTERVAL } from '@subwallet/extension-base/constants';
7
7
  import { getPSP22ContractPromise } from '@subwallet/extension-base/koni/api/tokens/wasm';
8
8
  import { getDefaultWeightV2 } from '@subwallet/extension-base/koni/api/tokens/wasm/utils';
9
- import { state } from '@subwallet/extension-base/koni/background/handlers';
10
- import { subscribeERC20Interval } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/evm';
11
9
  import { _BALANCE_CHAIN_GROUP, _MANTA_ZK_CHAIN_GROUP, _ZK_ASSET_PREFIX } from '@subwallet/extension-base/services/chain-service/constants';
12
10
  import { _checkSmartContractSupportByChain, _getChainNativeTokenSlug, _getContractAddressOfToken, _getTokenOnChainAssetId, _getTokenOnChainInfo, _getXcmAssetMultilocation, _isBridgedToken, _isChainEvmCompatible, _isSubstrateRelayChain } from '@subwallet/extension-base/services/chain-service/utils';
11
+ import { filterAssetsByChainAndType } from '@subwallet/extension-base/utils';
12
+ import { combineLatest, Observable } from 'rxjs';
13
13
  import { BN, BN_ZERO } from '@polkadot/util';
14
+ import { subscribeERC20Interval } from "../evm.js";
14
15
  import { subscribeEquilibriumTokenBalance } from "./equilibrium.js";
15
- export async function subscribeSubstrateBalance(addresses, chainInfo, chain, networkAPI, evmApiMap, callBack) {
16
+ export const subscribeSubstrateBalance = async (addresses, chainInfo, assetMap, substrateApi, evmApi, callback) => {
16
17
  let unsubNativeToken;
17
- if (!_BALANCE_CHAIN_GROUP.kintsugi.includes(chain) && !_BALANCE_CHAIN_GROUP.genshiro.includes(chain) && !_BALANCE_CHAIN_GROUP.equilibrium_parachain.includes(chain)) {
18
- unsubNativeToken = await subscribeWithSystemAccountPallet(addresses, chainInfo, networkAPI.api, callBack);
19
- }
20
18
  let unsubLocalToken;
21
19
  let unsubEvmContractToken;
22
20
  let unsubWasmContractToken;
23
21
  let unsubBridgedToken;
22
+ const chain = chainInfo.slug;
23
+ const baseParams = {
24
+ addresses,
25
+ chainInfo,
26
+ assetMap,
27
+ callback
28
+ };
29
+ const substrateParams = {
30
+ ...baseParams,
31
+ substrateApi: substrateApi.api
32
+ };
33
+ if (!_BALANCE_CHAIN_GROUP.kintsugi.includes(chain) && !_BALANCE_CHAIN_GROUP.genshiro.includes(chain) && !_BALANCE_CHAIN_GROUP.equilibrium_parachain.includes(chain)) {
34
+ unsubNativeToken = await subscribeWithSystemAccountPallet(substrateParams);
35
+ }
24
36
  try {
25
37
  if (_BALANCE_CHAIN_GROUP.bifrost.includes(chain)) {
26
- unsubLocalToken = await subscribeTokensAccountsPallet(addresses, chain, networkAPI.api, callBack);
38
+ unsubLocalToken = await subscribeTokensAccountsPallet(substrateParams);
27
39
  } else if (_BALANCE_CHAIN_GROUP.kintsugi.includes(chain)) {
28
- unsubLocalToken = await subscribeTokensAccountsPallet(addresses, chain, networkAPI.api, callBack, true);
40
+ unsubLocalToken = await subscribeTokensAccountsPallet({
41
+ ...substrateParams,
42
+ includeNativeToken: true
43
+ });
29
44
  } else if (_BALANCE_CHAIN_GROUP.statemine.includes(chain)) {
30
- unsubLocalToken = await subscribeAssetsAccountPallet(addresses, chain, networkAPI.api, callBack);
45
+ unsubLocalToken = await subscribeAssetsAccountPallet(substrateParams);
31
46
  } else if (_BALANCE_CHAIN_GROUP.genshiro.includes(chain) || _BALANCE_CHAIN_GROUP.equilibrium_parachain.includes(chain)) {
32
- unsubLocalToken = await subscribeEquilibriumTokenBalance(addresses, chain, networkAPI.api, callBack, true);
47
+ unsubLocalToken = await subscribeEquilibriumTokenBalance({
48
+ ...substrateParams,
49
+ includeNativeToken: true
50
+ });
33
51
  } else if (_BALANCE_CHAIN_GROUP.centrifuge.includes(chain)) {
34
- unsubLocalToken = await subscribeOrmlTokensPallet(addresses, chain, networkAPI.api, callBack);
52
+ unsubLocalToken = await subscribeOrmlTokensPallet(substrateParams);
35
53
  }
36
54
  if (_BALANCE_CHAIN_GROUP.supportBridged.includes(chain)) {
37
- unsubBridgedToken = await subscribeBridgedBalance(addresses, chain, networkAPI.api, callBack);
55
+ unsubBridgedToken = await subscribeBridgedBalance(substrateParams);
38
56
  }
39
57
  if (_isChainEvmCompatible(chainInfo)) {
40
- unsubEvmContractToken = subscribeERC20Interval(addresses, chain, evmApiMap, callBack);
58
+ unsubEvmContractToken = subscribeERC20Interval({
59
+ ...baseParams,
60
+ evmApi: evmApi
61
+ });
41
62
  }
42
63
  if (_checkSmartContractSupportByChain(chainInfo, _AssetType.PSP22)) {
43
64
  // Get sub-token for substrate-based chains
44
- unsubWasmContractToken = subscribePSP22Balance(addresses, chain, networkAPI.api, callBack);
65
+ unsubWasmContractToken = subscribePSP22Balance(substrateParams);
45
66
  }
46
67
  } catch (err) {
47
68
  console.warn(err);
@@ -53,31 +74,51 @@ export async function subscribeSubstrateBalance(addresses, chainInfo, chain, net
53
74
  unsubWasmContractToken && unsubWasmContractToken();
54
75
  unsubBridgedToken && unsubBridgedToken();
55
76
  };
56
- }
77
+ };
57
78
 
58
79
  // handler according to different logic
59
- async function subscribeWithSystemAccountPallet(addresses, chainInfo, networkAPI, callBack) {
80
+ // eslint-disable-next-line @typescript-eslint/require-await
81
+ const subscribeWithSystemAccountPallet = async ({
82
+ addresses,
83
+ callback,
84
+ chainInfo,
85
+ substrateApi
86
+ }) => {
60
87
  const chainNativeTokenSlug = _getChainNativeTokenSlug(chainInfo);
61
-
62
- // TODO: Need handle case error
63
- const unsub = await networkAPI.query.system.account.multi(addresses, async balances => {
64
- const pooledStakingBalances = [];
65
- if (_isSubstrateRelayChain(chainInfo) && networkAPI.query.nominationPools) {
66
- var _networkAPI$query$nom;
67
- const poolMemberDatas = await ((_networkAPI$query$nom = networkAPI.query.nominationPools.poolMembers) === null || _networkAPI$query$nom === void 0 ? void 0 : _networkAPI$query$nom.multi(addresses));
68
- if (poolMemberDatas) {
69
- for (const _poolMemberData of poolMemberDatas) {
70
- const poolMemberData = _poolMemberData.toPrimitive();
71
- if (poolMemberData) {
72
- let pooled = new BN(poolMemberData.points.toString());
73
- Object.entries(poolMemberData.unbondingEras).forEach(([, amount]) => {
74
- pooled = pooled.add(new BN(amount));
75
- });
76
- pooledStakingBalances.push(pooled);
77
- } else {
78
- pooledStakingBalances.push(BN_ZERO);
79
- }
88
+ const balanceSubscribe = substrateApi.rx.query.system.account.multi(addresses);
89
+ let poolSubscribe;
90
+ if (_isSubstrateRelayChain(chainInfo) && substrateApi.query.nominationPools) {
91
+ var _substrateApi$rx$quer;
92
+ poolSubscribe = (_substrateApi$rx$quer = substrateApi.rx.query.nominationPools.poolMembers) === null || _substrateApi$rx$quer === void 0 ? void 0 : _substrateApi$rx$quer.multi(addresses);
93
+ }
94
+ if (!poolSubscribe) {
95
+ poolSubscribe = new Observable(subscriber => {
96
+ subscriber.next(addresses.map(() => ({
97
+ toPrimitive() {
98
+ return null;
80
99
  }
100
+ })));
101
+ });
102
+ }
103
+ const subscription = combineLatest({
104
+ balances: balanceSubscribe,
105
+ pools: poolSubscribe
106
+ }).subscribe(({
107
+ balances: _balances,
108
+ pools: poolMemberDatas
109
+ }) => {
110
+ const balances = _balances;
111
+ const pooledStakingBalances = [];
112
+ for (const _poolMemberData of poolMemberDatas) {
113
+ const poolMemberData = _poolMemberData.toPrimitive();
114
+ if (poolMemberData) {
115
+ let pooled = new BN(poolMemberData.points.toString());
116
+ Object.entries(poolMemberData.unbondingEras).forEach(([, amount]) => {
117
+ pooled = pooled.add(new BN(amount));
118
+ });
119
+ pooledStakingBalances.push(pooled);
120
+ } else {
121
+ pooledStakingBalances.push(BN_ZERO);
81
122
  }
82
123
  }
83
124
  const items = balances.map((balance, index) => {
@@ -109,14 +150,21 @@ async function subscribeWithSystemAccountPallet(addresses, chainInfo, networkAPI
109
150
  }
110
151
  };
111
152
  });
112
- callBack(items);
153
+ callback(items);
113
154
  });
114
155
  return () => {
115
- unsub();
156
+ subscription.unsubscribe();
116
157
  };
117
- }
118
- async function subscribeBridgedBalance(addresses, chain, api, callBack) {
119
- const tokenMap = state.getAssetByChainAndAsset(chain, [_AssetType.LOCAL]);
158
+ };
159
+ const subscribeBridgedBalance = async ({
160
+ addresses,
161
+ assetMap,
162
+ callback,
163
+ chainInfo,
164
+ substrateApi
165
+ }) => {
166
+ const chain = chainInfo.slug;
167
+ const tokenMap = filterAssetsByChainAndType(assetMap, chain, [_AssetType.LOCAL]);
120
168
 
121
169
  // @ts-ignore
122
170
  const unsubList = await Promise.all(Object.values(tokenMap).map(async tokenInfo => {
@@ -124,7 +172,7 @@ async function subscribeBridgedBalance(addresses, chain, api, callBack) {
124
172
  const isBridgedToken = _isBridgedToken(tokenInfo);
125
173
  if (isBridgedToken) {
126
174
  const multiLocation = _getXcmAssetMultilocation(tokenInfo);
127
- return await api.query.foreignAssets.account.multi(addresses.map(address => [multiLocation, address]), balances => {
175
+ return await substrateApi.query.foreignAssets.account.multi(addresses.map(address => [multiLocation, address]), balances => {
128
176
  const items = balances.map((balance, index) => {
129
177
  const bdata = balance === null || balance === void 0 ? void 0 : balance.toHuman();
130
178
  let frozen = BN_ZERO;
@@ -154,7 +202,7 @@ async function subscribeBridgedBalance(addresses, chain, api, callBack) {
154
202
  }
155
203
  };
156
204
  });
157
- callBack(items);
205
+ callback(items);
158
206
  });
159
207
  }
160
208
  } catch (err) {
@@ -167,10 +215,20 @@ async function subscribeBridgedBalance(addresses, chain, api, callBack) {
167
215
  unsub && unsub();
168
216
  });
169
217
  };
170
- }
171
- function subscribePSP22Balance(addresses, chain, api, callBack) {
172
- let tokenList = {};
218
+ };
219
+ const subscribePSP22Balance = ({
220
+ addresses,
221
+ assetMap,
222
+ callback,
223
+ chainInfo,
224
+ substrateApi
225
+ }) => {
226
+ const chain = chainInfo.slug;
173
227
  const psp22ContractMap = {};
228
+ const tokenList = filterAssetsByChainAndType(assetMap, chain, [_AssetType.PSP22]);
229
+ Object.entries(tokenList).forEach(([slug, tokenInfo]) => {
230
+ psp22ContractMap[slug] = getPSP22ContractPromise(substrateApi, _getContractAddressOfToken(tokenInfo));
231
+ });
174
232
  const getTokenBalances = () => {
175
233
  Object.values(tokenList).map(async tokenInfo => {
176
234
  try {
@@ -179,7 +237,7 @@ function subscribePSP22Balance(addresses, chain, api, callBack) {
179
237
  try {
180
238
  var _balanceOf$output, _ref;
181
239
  const _balanceOf = await contract.query['psp22::balanceOf'](address, {
182
- gasLimit: getDefaultWeightV2(api)
240
+ gasLimit: getDefaultWeightV2(substrateApi)
183
241
  }, address);
184
242
  const balanceObj = _balanceOf === null || _balanceOf === void 0 ? void 0 : (_balanceOf$output = _balanceOf.output) === null || _balanceOf$output === void 0 ? void 0 : _balanceOf$output.toPrimitive();
185
243
  return {
@@ -200,26 +258,30 @@ function subscribePSP22Balance(addresses, chain, api, callBack) {
200
258
  };
201
259
  }
202
260
  }));
203
- callBack(balances);
261
+ callback(balances);
204
262
  } catch (err) {
205
263
  console.warn(tokenInfo.slug, err); // TODO: error createType
206
264
  }
207
265
  });
208
266
  };
209
267
 
210
- tokenList = state.getAssetByChainAndAsset(chain, [_AssetType.PSP22]);
211
- Object.entries(tokenList).forEach(([slug, tokenInfo]) => {
212
- psp22ContractMap[slug] = getPSP22ContractPromise(api, _getContractAddressOfToken(tokenInfo));
213
- });
214
268
  getTokenBalances();
215
269
  const interval = setInterval(getTokenBalances, SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
216
270
  return () => {
217
271
  clearInterval(interval);
218
272
  };
219
- }
220
- async function subscribeTokensAccountsPallet(addresses, chain, api, callBack, includeNativeToken) {
273
+ };
274
+ const subscribeTokensAccountsPallet = async ({
275
+ addresses,
276
+ assetMap,
277
+ callback,
278
+ chainInfo,
279
+ includeNativeToken,
280
+ substrateApi
281
+ }) => {
282
+ const chain = chainInfo.slug;
221
283
  const tokenTypes = includeNativeToken ? [_AssetType.NATIVE, _AssetType.LOCAL] : [_AssetType.LOCAL];
222
- const tokenMap = state.getAssetByChainAndAsset(chain, tokenTypes);
284
+ const tokenMap = filterAssetsByChainAndType(assetMap, chain, tokenTypes);
223
285
  const unsubList = await Promise.all(Object.values(tokenMap).map(async tokenInfo => {
224
286
  try {
225
287
  const onChainInfo = _getTokenOnChainInfo(tokenInfo);
@@ -227,7 +289,7 @@ async function subscribeTokensAccountsPallet(addresses, chain, api, callBack, in
227
289
 
228
290
  // Get Token Balance
229
291
  // @ts-ignore
230
- return await api.query.tokens.accounts.multi(addresses.map(address => [address, onChainInfo || assetId]), balances => {
292
+ return await substrateApi.query.tokens.accounts.multi(addresses.map(address => [address, onChainInfo || assetId]), balances => {
231
293
  const items = balances.map((balance, index) => {
232
294
  const tokenBalance = {
233
295
  reserved: balance.reserved || new BN(0),
@@ -249,7 +311,7 @@ async function subscribeTokensAccountsPallet(addresses, chain, api, callBack, in
249
311
  }
250
312
  };
251
313
  });
252
- callBack(items);
314
+ callback(items);
253
315
  });
254
316
  } catch (err) {
255
317
  console.warn(err);
@@ -261,9 +323,17 @@ async function subscribeTokensAccountsPallet(addresses, chain, api, callBack, in
261
323
  unsub && unsub();
262
324
  });
263
325
  };
264
- }
265
- async function subscribeAssetsAccountPallet(addresses, chain, api, callBack) {
266
- const tokenMap = state.getAssetByChainAndAsset(chain, [_AssetType.LOCAL]);
326
+ };
327
+ const subscribeAssetsAccountPallet = async ({
328
+ addresses,
329
+ assetMap,
330
+ callback,
331
+ chainInfo,
332
+ includeNativeToken,
333
+ substrateApi
334
+ }) => {
335
+ const chain = chainInfo.slug;
336
+ const tokenMap = filterAssetsByChainAndType(assetMap, chain, [_AssetType.LOCAL]);
267
337
  Object.values(tokenMap).forEach(token => {
268
338
  if (_MANTA_ZK_CHAIN_GROUP.includes(token.originChain) && token.symbol.startsWith(_ZK_ASSET_PREFIX)) {
269
339
  delete tokenMap[token.slug];
@@ -274,7 +344,7 @@ async function subscribeAssetsAccountPallet(addresses, chain, api, callBack) {
274
344
  const assetIndex = _getTokenOnChainAssetId(tokenInfo);
275
345
 
276
346
  // Get Token Balance
277
- return await api.query.assets.account.multi(addresses.map(address => [assetIndex, address]), balances => {
347
+ return await substrateApi.query.assets.account.multi(addresses.map(address => [assetIndex, address]), balances => {
278
348
  const items = balances.map((balance, index) => {
279
349
  const bdata = balance === null || balance === void 0 ? void 0 : balance.toPrimitive();
280
350
  let frozen = BN_ZERO;
@@ -303,7 +373,7 @@ async function subscribeAssetsAccountPallet(addresses, chain, api, callBack) {
303
373
  }
304
374
  };
305
375
  });
306
- callBack(items);
376
+ callback(items);
307
377
  });
308
378
  } catch (err) {
309
379
  console.warn(err);
@@ -315,19 +385,26 @@ async function subscribeAssetsAccountPallet(addresses, chain, api, callBack) {
315
385
  unsub && unsub();
316
386
  });
317
387
  };
318
- }
388
+ };
319
389
 
320
390
  // eslint-disable-next-line @typescript-eslint/require-await
321
- async function subscribeOrmlTokensPallet(addresses, chain, api, callBack) {
391
+ const subscribeOrmlTokensPallet = async ({
392
+ addresses,
393
+ assetMap,
394
+ callback,
395
+ chainInfo,
396
+ substrateApi
397
+ }) => {
398
+ const chain = chainInfo.slug;
322
399
  const tokenTypes = [_AssetType.LOCAL];
323
- const tokenMap = state.getAssetByChainAndAsset(chain, tokenTypes);
400
+ const tokenMap = filterAssetsByChainAndType(assetMap, chain, tokenTypes);
324
401
  const unsubList = Object.values(tokenMap).map(async tokenInfo => {
325
402
  try {
326
403
  const onChainInfo = _getTokenOnChainInfo(tokenInfo);
327
404
 
328
405
  // Get Token Balance
329
406
  // @ts-ignore
330
- const unsub = await api.query.ormlTokens.accounts.multi(addresses.map(address => [address, onChainInfo]), balances => {
407
+ const unsub = await substrateApi.query.ormlTokens.accounts.multi(addresses.map(address => [address, onChainInfo]), balances => {
331
408
  const items = balances.map((balance, index) => {
332
409
  const tokenBalance = {
333
410
  reserved: balance.reserved || new BN(0),
@@ -351,7 +428,7 @@ async function subscribeOrmlTokensPallet(addresses, chain, api, callBack) {
351
428
  }
352
429
  };
353
430
  });
354
- callBack(items);
431
+ callback(items);
355
432
  });
356
433
  return unsub;
357
434
  } catch (err) {
@@ -366,4 +443,4 @@ async function subscribeOrmlTokensPallet(addresses, chain, api, callBack) {
366
443
  }).catch(console.error);
367
444
  });
368
445
  };
369
- }
446
+ };