@subwallet/extension-base 1.1.51-1 → 1.1.52-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.
- package/background/KoniTypes.d.ts +1 -0
- package/cjs/koni/api/tokens/evm/balance.js +1 -2
- package/cjs/koni/api/tokens/evm/transfer.js +3 -5
- package/cjs/koni/api/tokens/evm/web3.js +3 -3
- package/cjs/koni/background/handlers/Extension.js +5 -4
- package/cjs/koni/background/handlers/State.js +21 -122
- package/cjs/koni/background/subscription.js +3 -63
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/BalanceMapImpl.js +2 -2
- package/cjs/services/balance-service/helpers/index.js +27 -0
- package/cjs/services/balance-service/helpers/subscribe/evm.js +33 -15
- package/cjs/services/balance-service/helpers/subscribe/{balance.js → index.js} +46 -29
- package/cjs/services/balance-service/helpers/subscribe/substrate/equilibrium.js +34 -15
- package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +156 -72
- package/cjs/services/balance-service/index.js +371 -44
- package/cjs/services/chain-service/constants.js +2 -1
- package/cjs/services/chain-service/health-check/utils/asset-info.js +1 -3
- package/cjs/services/chain-service/index.js +60 -26
- package/cjs/services/chain-service/utils/index.js +10 -2
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -2
- package/cjs/services/earning-service/handlers/native-staking/para-chain.js +1 -1
- package/cjs/services/migration-service/scripts/AutoEnableChainsTokens.js +1 -1
- package/cjs/services/storage-service/DatabaseService.js +10 -1
- package/cjs/stores/DetectAccountBalance.js +18 -0
- package/cjs/utils/asset.js +19 -0
- package/cjs/utils/index.js +12 -0
- package/koni/api/tokens/evm/balance.d.ts +1 -1
- package/koni/api/tokens/evm/balance.js +1 -2
- package/koni/api/tokens/evm/transfer.d.ts +2 -2
- package/koni/api/tokens/evm/transfer.js +3 -5
- package/koni/api/tokens/evm/web3.d.ts +1 -1
- package/koni/api/tokens/evm/web3.js +2 -2
- package/koni/background/handlers/Extension.js +5 -4
- package/koni/background/handlers/State.d.ts +2 -13
- package/koni/background/handlers/State.js +21 -121
- package/koni/background/subscription.d.ts +1 -5
- package/koni/background/subscription.js +1 -60
- package/package.json +28 -13
- package/packageInfo.js +1 -1
- package/services/balance-service/BalanceMapImpl.js +1 -1
- package/services/balance-service/helpers/index.d.ts +2 -0
- package/services/balance-service/helpers/index.js +5 -0
- package/services/balance-service/helpers/subscribe/evm.d.ts +3 -5
- package/services/balance-service/helpers/subscribe/evm.js +31 -14
- package/services/balance-service/helpers/subscribe/{balance.d.ts → index.d.ts} +2 -2
- package/services/balance-service/helpers/subscribe/{balance.js → index.js} +41 -28
- package/services/balance-service/helpers/subscribe/substrate/equilibrium.d.ts +3 -4
- package/services/balance-service/helpers/subscribe/substrate/equilibrium.js +29 -13
- package/services/balance-service/helpers/subscribe/substrate/index.d.ts +2 -2
- package/services/balance-service/helpers/subscribe/substrate/index.js +143 -67
- package/services/balance-service/index.d.ts +71 -4
- package/services/balance-service/index.js +372 -46
- package/services/chain-service/constants.js +2 -1
- package/services/chain-service/health-check/utils/asset-info.js +1 -3
- package/services/chain-service/index.d.ts +2 -1
- package/services/chain-service/index.js +61 -27
- package/services/chain-service/types.d.ts +1 -0
- package/services/chain-service/utils/index.js +10 -2
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -2
- package/services/earning-service/handlers/native-staking/para-chain.js +1 -1
- package/services/migration-service/scripts/AutoEnableChainsTokens.js +1 -1
- package/services/storage-service/DatabaseService.js +7 -1
- package/services/storage-service/databases/index.d.ts +1 -0
- package/stores/DetectAccountBalance.d.ts +5 -0
- package/stores/DetectAccountBalance.js +10 -0
- package/types/{balance.d.ts → balance/index.d.ts} +16 -0
- package/types/index.js +1 -1
- package/utils/asset.d.ts +2 -0
- package/utils/asset.js +12 -0
- package/utils/index.d.ts +1 -0
- package/utils/index.js +1 -0
- /package/cjs/types/{balance.js → balance/index.js} +0 -0
- /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
|
-
//
|
|
70
|
-
|
|
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.
|
|
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 =
|
|
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
|
-
|
|
85
|
-
const items =
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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
|
|
121
|
-
return subscribeSubstrateBalance(useAddresses, chainInfo,
|
|
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 {
|
|
2
|
-
|
|
3
|
-
export declare
|
|
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
|
|
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 =
|
|
20
|
+
const tokenMap = filterAssetsByChainAndType(assetMap, chain, tokenTypes);
|
|
13
21
|
try {
|
|
14
|
-
const unsub = await
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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(
|
|
38
|
+
unsubLocalToken = await subscribeTokensAccountsPallet(substrateParams);
|
|
27
39
|
} else if (_BALANCE_CHAIN_GROUP.kintsugi.includes(chain)) {
|
|
28
|
-
unsubLocalToken = await subscribeTokensAccountsPallet(
|
|
40
|
+
unsubLocalToken = await subscribeTokensAccountsPallet({
|
|
41
|
+
...substrateParams,
|
|
42
|
+
includeNativeToken: true
|
|
43
|
+
});
|
|
29
44
|
} else if (_BALANCE_CHAIN_GROUP.statemine.includes(chain)) {
|
|
30
|
-
unsubLocalToken = await subscribeAssetsAccountPallet(
|
|
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(
|
|
47
|
+
unsubLocalToken = await subscribeEquilibriumTokenBalance({
|
|
48
|
+
...substrateParams,
|
|
49
|
+
includeNativeToken: true
|
|
50
|
+
});
|
|
33
51
|
} else if (_BALANCE_CHAIN_GROUP.centrifuge.includes(chain)) {
|
|
34
|
-
unsubLocalToken = await subscribeOrmlTokensPallet(
|
|
52
|
+
unsubLocalToken = await subscribeOrmlTokensPallet(substrateParams);
|
|
35
53
|
}
|
|
36
54
|
if (_BALANCE_CHAIN_GROUP.supportBridged.includes(chain)) {
|
|
37
|
-
unsubBridgedToken = await subscribeBridgedBalance(
|
|
55
|
+
unsubBridgedToken = await subscribeBridgedBalance(substrateParams);
|
|
38
56
|
}
|
|
39
57
|
if (_isChainEvmCompatible(chainInfo)) {
|
|
40
|
-
unsubEvmContractToken = subscribeERC20Interval(
|
|
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(
|
|
65
|
+
unsubWasmContractToken = subscribePSP22Balance(substrateParams);
|
|
45
66
|
}
|
|
46
67
|
} catch (err) {
|
|
47
68
|
console.warn(err);
|
|
@@ -53,31 +74,50 @@ 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
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
+
} else {
|
|
94
|
+
poolSubscribe = new Observable(subscriber => {
|
|
95
|
+
subscriber.next(addresses.map(() => ({
|
|
96
|
+
toPrimitive() {
|
|
97
|
+
return null;
|
|
80
98
|
}
|
|
99
|
+
})));
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const subscription = combineLatest({
|
|
103
|
+
balances: balanceSubscribe,
|
|
104
|
+
pools: poolSubscribe
|
|
105
|
+
}).subscribe(({
|
|
106
|
+
balances: _balances,
|
|
107
|
+
pools: poolMemberDatas
|
|
108
|
+
}) => {
|
|
109
|
+
const balances = _balances;
|
|
110
|
+
const pooledStakingBalances = [];
|
|
111
|
+
for (const _poolMemberData of poolMemberDatas) {
|
|
112
|
+
const poolMemberData = _poolMemberData.toPrimitive();
|
|
113
|
+
if (poolMemberData) {
|
|
114
|
+
let pooled = new BN(poolMemberData.points.toString());
|
|
115
|
+
Object.entries(poolMemberData.unbondingEras).forEach(([, amount]) => {
|
|
116
|
+
pooled = pooled.add(new BN(amount));
|
|
117
|
+
});
|
|
118
|
+
pooledStakingBalances.push(pooled);
|
|
119
|
+
} else {
|
|
120
|
+
pooledStakingBalances.push(BN_ZERO);
|
|
81
121
|
}
|
|
82
122
|
}
|
|
83
123
|
const items = balances.map((balance, index) => {
|
|
@@ -109,14 +149,21 @@ async function subscribeWithSystemAccountPallet(addresses, chainInfo, networkAPI
|
|
|
109
149
|
}
|
|
110
150
|
};
|
|
111
151
|
});
|
|
112
|
-
|
|
152
|
+
callback(items);
|
|
113
153
|
});
|
|
114
154
|
return () => {
|
|
115
|
-
|
|
155
|
+
subscription.unsubscribe();
|
|
116
156
|
};
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
|
|
157
|
+
};
|
|
158
|
+
const subscribeBridgedBalance = async ({
|
|
159
|
+
addresses,
|
|
160
|
+
assetMap,
|
|
161
|
+
callback,
|
|
162
|
+
chainInfo,
|
|
163
|
+
substrateApi
|
|
164
|
+
}) => {
|
|
165
|
+
const chain = chainInfo.slug;
|
|
166
|
+
const tokenMap = filterAssetsByChainAndType(assetMap, chain, [_AssetType.LOCAL]);
|
|
120
167
|
|
|
121
168
|
// @ts-ignore
|
|
122
169
|
const unsubList = await Promise.all(Object.values(tokenMap).map(async tokenInfo => {
|
|
@@ -124,7 +171,7 @@ async function subscribeBridgedBalance(addresses, chain, api, callBack) {
|
|
|
124
171
|
const isBridgedToken = _isBridgedToken(tokenInfo);
|
|
125
172
|
if (isBridgedToken) {
|
|
126
173
|
const multiLocation = _getXcmAssetMultilocation(tokenInfo);
|
|
127
|
-
return await
|
|
174
|
+
return await substrateApi.query.foreignAssets.account.multi(addresses.map(address => [multiLocation, address]), balances => {
|
|
128
175
|
const items = balances.map((balance, index) => {
|
|
129
176
|
const bdata = balance === null || balance === void 0 ? void 0 : balance.toHuman();
|
|
130
177
|
let frozen = BN_ZERO;
|
|
@@ -154,7 +201,7 @@ async function subscribeBridgedBalance(addresses, chain, api, callBack) {
|
|
|
154
201
|
}
|
|
155
202
|
};
|
|
156
203
|
});
|
|
157
|
-
|
|
204
|
+
callback(items);
|
|
158
205
|
});
|
|
159
206
|
}
|
|
160
207
|
} catch (err) {
|
|
@@ -167,10 +214,20 @@ async function subscribeBridgedBalance(addresses, chain, api, callBack) {
|
|
|
167
214
|
unsub && unsub();
|
|
168
215
|
});
|
|
169
216
|
};
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
|
|
217
|
+
};
|
|
218
|
+
const subscribePSP22Balance = ({
|
|
219
|
+
addresses,
|
|
220
|
+
assetMap,
|
|
221
|
+
callback,
|
|
222
|
+
chainInfo,
|
|
223
|
+
substrateApi
|
|
224
|
+
}) => {
|
|
225
|
+
const chain = chainInfo.slug;
|
|
173
226
|
const psp22ContractMap = {};
|
|
227
|
+
const tokenList = filterAssetsByChainAndType(assetMap, chain, [_AssetType.PSP22]);
|
|
228
|
+
Object.entries(tokenList).forEach(([slug, tokenInfo]) => {
|
|
229
|
+
psp22ContractMap[slug] = getPSP22ContractPromise(substrateApi, _getContractAddressOfToken(tokenInfo));
|
|
230
|
+
});
|
|
174
231
|
const getTokenBalances = () => {
|
|
175
232
|
Object.values(tokenList).map(async tokenInfo => {
|
|
176
233
|
try {
|
|
@@ -179,7 +236,7 @@ function subscribePSP22Balance(addresses, chain, api, callBack) {
|
|
|
179
236
|
try {
|
|
180
237
|
var _balanceOf$output, _ref;
|
|
181
238
|
const _balanceOf = await contract.query['psp22::balanceOf'](address, {
|
|
182
|
-
gasLimit: getDefaultWeightV2(
|
|
239
|
+
gasLimit: getDefaultWeightV2(substrateApi)
|
|
183
240
|
}, address);
|
|
184
241
|
const balanceObj = _balanceOf === null || _balanceOf === void 0 ? void 0 : (_balanceOf$output = _balanceOf.output) === null || _balanceOf$output === void 0 ? void 0 : _balanceOf$output.toPrimitive();
|
|
185
242
|
return {
|
|
@@ -200,26 +257,30 @@ function subscribePSP22Balance(addresses, chain, api, callBack) {
|
|
|
200
257
|
};
|
|
201
258
|
}
|
|
202
259
|
}));
|
|
203
|
-
|
|
260
|
+
callback(balances);
|
|
204
261
|
} catch (err) {
|
|
205
262
|
console.warn(tokenInfo.slug, err); // TODO: error createType
|
|
206
263
|
}
|
|
207
264
|
});
|
|
208
265
|
};
|
|
209
266
|
|
|
210
|
-
tokenList = state.getAssetByChainAndAsset(chain, [_AssetType.PSP22]);
|
|
211
|
-
Object.entries(tokenList).forEach(([slug, tokenInfo]) => {
|
|
212
|
-
psp22ContractMap[slug] = getPSP22ContractPromise(api, _getContractAddressOfToken(tokenInfo));
|
|
213
|
-
});
|
|
214
267
|
getTokenBalances();
|
|
215
268
|
const interval = setInterval(getTokenBalances, SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
|
|
216
269
|
return () => {
|
|
217
270
|
clearInterval(interval);
|
|
218
271
|
};
|
|
219
|
-
}
|
|
220
|
-
|
|
272
|
+
};
|
|
273
|
+
const subscribeTokensAccountsPallet = async ({
|
|
274
|
+
addresses,
|
|
275
|
+
assetMap,
|
|
276
|
+
callback,
|
|
277
|
+
chainInfo,
|
|
278
|
+
includeNativeToken,
|
|
279
|
+
substrateApi
|
|
280
|
+
}) => {
|
|
281
|
+
const chain = chainInfo.slug;
|
|
221
282
|
const tokenTypes = includeNativeToken ? [_AssetType.NATIVE, _AssetType.LOCAL] : [_AssetType.LOCAL];
|
|
222
|
-
const tokenMap =
|
|
283
|
+
const tokenMap = filterAssetsByChainAndType(assetMap, chain, tokenTypes);
|
|
223
284
|
const unsubList = await Promise.all(Object.values(tokenMap).map(async tokenInfo => {
|
|
224
285
|
try {
|
|
225
286
|
const onChainInfo = _getTokenOnChainInfo(tokenInfo);
|
|
@@ -227,7 +288,7 @@ async function subscribeTokensAccountsPallet(addresses, chain, api, callBack, in
|
|
|
227
288
|
|
|
228
289
|
// Get Token Balance
|
|
229
290
|
// @ts-ignore
|
|
230
|
-
return await
|
|
291
|
+
return await substrateApi.query.tokens.accounts.multi(addresses.map(address => [address, onChainInfo || assetId]), balances => {
|
|
231
292
|
const items = balances.map((balance, index) => {
|
|
232
293
|
const tokenBalance = {
|
|
233
294
|
reserved: balance.reserved || new BN(0),
|
|
@@ -249,7 +310,7 @@ async function subscribeTokensAccountsPallet(addresses, chain, api, callBack, in
|
|
|
249
310
|
}
|
|
250
311
|
};
|
|
251
312
|
});
|
|
252
|
-
|
|
313
|
+
callback(items);
|
|
253
314
|
});
|
|
254
315
|
} catch (err) {
|
|
255
316
|
console.warn(err);
|
|
@@ -261,9 +322,17 @@ async function subscribeTokensAccountsPallet(addresses, chain, api, callBack, in
|
|
|
261
322
|
unsub && unsub();
|
|
262
323
|
});
|
|
263
324
|
};
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
|
|
325
|
+
};
|
|
326
|
+
const subscribeAssetsAccountPallet = async ({
|
|
327
|
+
addresses,
|
|
328
|
+
assetMap,
|
|
329
|
+
callback,
|
|
330
|
+
chainInfo,
|
|
331
|
+
includeNativeToken,
|
|
332
|
+
substrateApi
|
|
333
|
+
}) => {
|
|
334
|
+
const chain = chainInfo.slug;
|
|
335
|
+
const tokenMap = filterAssetsByChainAndType(assetMap, chain, [_AssetType.LOCAL]);
|
|
267
336
|
Object.values(tokenMap).forEach(token => {
|
|
268
337
|
if (_MANTA_ZK_CHAIN_GROUP.includes(token.originChain) && token.symbol.startsWith(_ZK_ASSET_PREFIX)) {
|
|
269
338
|
delete tokenMap[token.slug];
|
|
@@ -274,7 +343,7 @@ async function subscribeAssetsAccountPallet(addresses, chain, api, callBack) {
|
|
|
274
343
|
const assetIndex = _getTokenOnChainAssetId(tokenInfo);
|
|
275
344
|
|
|
276
345
|
// Get Token Balance
|
|
277
|
-
return await
|
|
346
|
+
return await substrateApi.query.assets.account.multi(addresses.map(address => [assetIndex, address]), balances => {
|
|
278
347
|
const items = balances.map((balance, index) => {
|
|
279
348
|
const bdata = balance === null || balance === void 0 ? void 0 : balance.toPrimitive();
|
|
280
349
|
let frozen = BN_ZERO;
|
|
@@ -303,7 +372,7 @@ async function subscribeAssetsAccountPallet(addresses, chain, api, callBack) {
|
|
|
303
372
|
}
|
|
304
373
|
};
|
|
305
374
|
});
|
|
306
|
-
|
|
375
|
+
callback(items);
|
|
307
376
|
});
|
|
308
377
|
} catch (err) {
|
|
309
378
|
console.warn(err);
|
|
@@ -315,19 +384,26 @@ async function subscribeAssetsAccountPallet(addresses, chain, api, callBack) {
|
|
|
315
384
|
unsub && unsub();
|
|
316
385
|
});
|
|
317
386
|
};
|
|
318
|
-
}
|
|
387
|
+
};
|
|
319
388
|
|
|
320
389
|
// eslint-disable-next-line @typescript-eslint/require-await
|
|
321
|
-
|
|
390
|
+
const subscribeOrmlTokensPallet = async ({
|
|
391
|
+
addresses,
|
|
392
|
+
assetMap,
|
|
393
|
+
callback,
|
|
394
|
+
chainInfo,
|
|
395
|
+
substrateApi
|
|
396
|
+
}) => {
|
|
397
|
+
const chain = chainInfo.slug;
|
|
322
398
|
const tokenTypes = [_AssetType.LOCAL];
|
|
323
|
-
const tokenMap =
|
|
399
|
+
const tokenMap = filterAssetsByChainAndType(assetMap, chain, tokenTypes);
|
|
324
400
|
const unsubList = Object.values(tokenMap).map(async tokenInfo => {
|
|
325
401
|
try {
|
|
326
402
|
const onChainInfo = _getTokenOnChainInfo(tokenInfo);
|
|
327
403
|
|
|
328
404
|
// Get Token Balance
|
|
329
405
|
// @ts-ignore
|
|
330
|
-
const unsub = await
|
|
406
|
+
const unsub = await substrateApi.query.ormlTokens.accounts.multi(addresses.map(address => [address, onChainInfo]), balances => {
|
|
331
407
|
const items = balances.map((balance, index) => {
|
|
332
408
|
const tokenBalance = {
|
|
333
409
|
reserved: balance.reserved || new BN(0),
|
|
@@ -351,7 +427,7 @@ async function subscribeOrmlTokensPallet(addresses, chain, api, callBack) {
|
|
|
351
427
|
}
|
|
352
428
|
};
|
|
353
429
|
});
|
|
354
|
-
|
|
430
|
+
callback(items);
|
|
355
431
|
});
|
|
356
432
|
return unsub;
|
|
357
433
|
} catch (err) {
|
|
@@ -366,4 +442,4 @@ async function subscribeOrmlTokensPallet(addresses, chain, api, callBack) {
|
|
|
366
442
|
}).catch(console.error);
|
|
367
443
|
});
|
|
368
444
|
};
|
|
369
|
-
}
|
|
445
|
+
};
|