@subwallet/extension-base 1.1.24-0 → 1.1.24-1
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 -25
- package/cjs/constants/index.js +9 -3
- package/cjs/koni/api/staking/bonding/index.js +1 -0
- package/cjs/koni/api/tokens/evm/balance.js +5 -1
- package/cjs/koni/api/tokens/evm/transfer.js +8 -4
- package/cjs/koni/background/cron.js +2 -2
- package/cjs/koni/background/handlers/Extension.js +5 -5
- package/cjs/koni/background/handlers/Mobile.js +1 -1
- package/cjs/koni/background/handlers/State.js +123 -44
- package/cjs/koni/background/subscription.js +2 -2
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/group.js +53 -0
- package/cjs/services/balance-service/helpers/subscribe/balance.js +111 -0
- package/cjs/services/balance-service/helpers/subscribe/evm.js +95 -0
- package/cjs/services/balance-service/helpers/subscribe/substrate/equilibrium.js +113 -0
- package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +324 -0
- package/cjs/services/balance-service/index.js +41 -16
- package/cjs/services/history-service/helpers/subscan-extrinsic-parser-helper.js +7 -1
- package/cjs/services/history-service/index.js +12 -8
- package/cjs/services/migration-service/scripts/MigrateProvider.js +1 -1
- package/cjs/services/storage-service/DatabaseService.js +7 -2
- package/cjs/services/storage-service/db-stores/Balance.js +9 -9
- package/cjs/services/subscan-service/index.js +66 -22
- package/cjs/services/transaction-service/index.js +4 -3
- package/cjs/types/balance.js +1 -0
- package/cjs/types/index.js +11 -0
- package/cjs/utils/{address.js → account.js} +32 -2
- package/cjs/utils/eth.js +7 -2
- package/cjs/utils/index.js +12 -0
- package/constants/index.d.ts +2 -0
- package/constants/index.js +2 -0
- package/koni/api/staking/bonding/index.js +1 -0
- package/koni/api/tokens/evm/balance.js +5 -1
- package/koni/api/tokens/evm/transfer.d.ts +1 -1
- package/koni/api/tokens/evm/transfer.js +8 -4
- package/koni/background/cron.js +3 -3
- package/koni/background/handlers/Extension.js +5 -5
- package/koni/background/handlers/Mobile.js +1 -1
- package/koni/background/handlers/State.d.ts +6 -4
- package/koni/background/handlers/State.js +111 -33
- package/koni/background/subscription.js +2 -2
- package/package.json +39 -14
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/group.d.ts +9 -0
- package/services/balance-service/helpers/group.js +46 -0
- package/services/balance-service/helpers/subscribe/balance.d.ts +4 -0
- package/services/balance-service/helpers/subscribe/balance.js +103 -0
- package/services/balance-service/helpers/subscribe/evm.d.ts +5 -0
- package/services/balance-service/helpers/subscribe/evm.js +87 -0
- package/services/balance-service/helpers/subscribe/substrate/equilibrium.d.ts +4 -0
- package/services/balance-service/helpers/subscribe/substrate/equilibrium.js +105 -0
- package/services/balance-service/helpers/subscribe/substrate/index.d.ts +4 -0
- package/services/balance-service/helpers/subscribe/substrate/index.js +316 -0
- package/services/balance-service/index.d.ts +24 -5
- package/services/balance-service/index.js +40 -14
- package/services/history-service/helpers/subscan-extrinsic-parser-helper.js +7 -1
- package/services/history-service/index.js +12 -8
- package/services/migration-service/scripts/MigrateProvider.js +1 -1
- package/services/storage-service/DatabaseService.d.ts +4 -2
- package/services/storage-service/DatabaseService.js +7 -2
- package/services/storage-service/databases/index.d.ts +2 -1
- package/services/storage-service/db-stores/Balance.d.ts +2 -2
- package/services/storage-service/db-stores/Balance.js +9 -9
- package/services/subscan-service/index.d.ts +11 -5
- package/services/subscan-service/index.js +66 -26
- package/services/subscan-service/types.d.ts +4 -0
- package/services/transaction-service/index.js +5 -4
- package/types/balance.d.ts +40 -0
- package/types/balance.js +1 -0
- package/types/index.d.ts +1 -0
- package/types/index.js +1 -0
- package/utils/account.d.ts +15 -0
- package/utils/{address.js → account.js} +28 -0
- package/utils/eth.d.ts +1 -0
- package/utils/eth.js +4 -0
- package/utils/index.d.ts +1 -0
- package/utils/index.js +1 -0
- package/cjs/koni/api/dotsama/balance.js +0 -464
- package/koni/api/dotsama/balance.d.ts +0 -6
- package/koni/api/dotsama/balance.js +0 -451
- package/utils/address.d.ts +0 -5
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.subscribeBalance = subscribeBalance;
|
|
7
|
+
var _types = require("@subwallet/chain-list/types");
|
|
8
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
9
|
+
var _handlers = require("@subwallet/extension-base/koni/background/handlers");
|
|
10
|
+
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
11
|
+
var _utils2 = require("@subwallet/extension-base/utils");
|
|
12
|
+
var _account = require("@subwallet/extension-base/utils/account");
|
|
13
|
+
var _evm = require("./evm");
|
|
14
|
+
var _substrate = require("./substrate");
|
|
15
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
16
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
17
|
+
|
|
18
|
+
const filterAddress = (addresses, chainInfo) => {
|
|
19
|
+
const isEvmChain = (0, _utils._isChainEvmCompatible)(chainInfo);
|
|
20
|
+
const [substrateAddresses, evmAddresses] = (0, _utils2.categoryAddresses)(addresses);
|
|
21
|
+
if (isEvmChain) {
|
|
22
|
+
return [evmAddresses, []];
|
|
23
|
+
} else {
|
|
24
|
+
const fetchList = [];
|
|
25
|
+
const unfetchList = [];
|
|
26
|
+
substrateAddresses.forEach(address => {
|
|
27
|
+
const account = (0, _account.getAccountJsonByAddress)(address);
|
|
28
|
+
if (account) {
|
|
29
|
+
if (account.isHardware) {
|
|
30
|
+
const availGen = account.availableGenesisHashes || [];
|
|
31
|
+
const gen = (0, _utils._getSubstrateGenesisHash)(chainInfo);
|
|
32
|
+
if (availGen.includes(gen)) {
|
|
33
|
+
fetchList.push(address);
|
|
34
|
+
} else {
|
|
35
|
+
unfetchList.push(address);
|
|
36
|
+
}
|
|
37
|
+
} else {
|
|
38
|
+
fetchList.push(address);
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
fetchList.push(address);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
return [fetchList, [...unfetchList, ...evmAddresses]];
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// main subscription
|
|
49
|
+
function subscribeBalance(addresses, chainInfoMap, substrateApiMap, evmApiMap, callback) {
|
|
50
|
+
// Looping over each chain
|
|
51
|
+
const unsubList = Object.entries(chainInfoMap).map(async _ref => {
|
|
52
|
+
let [chainSlug, chainInfo] = _ref;
|
|
53
|
+
const [useAddresses, notSupportAddresses] = filterAddress(addresses, chainInfo);
|
|
54
|
+
if (notSupportAddresses.length) {
|
|
55
|
+
const tokens = _handlers.state.chainService.getAssetByChainAndType(chainSlug, [_types._AssetType.NATIVE, _types._AssetType.ERC20, _types._AssetType.PSP22, _types._AssetType.LOCAL]);
|
|
56
|
+
const assetSetting = await _handlers.state.chainService.getAssetSettings();
|
|
57
|
+
const filtered = Object.values(tokens).filter(_ref2 => {
|
|
58
|
+
var _assetSetting$slug;
|
|
59
|
+
let {
|
|
60
|
+
slug
|
|
61
|
+
} = _ref2;
|
|
62
|
+
return (_assetSetting$slug = assetSetting[slug]) === null || _assetSetting$slug === void 0 ? void 0 : _assetSetting$slug.visible;
|
|
63
|
+
});
|
|
64
|
+
const now = new Date().getTime();
|
|
65
|
+
notSupportAddresses.forEach(address => {
|
|
66
|
+
const items = filtered.map(token => {
|
|
67
|
+
return {
|
|
68
|
+
address,
|
|
69
|
+
tokenSlug: token.slug,
|
|
70
|
+
free: '0',
|
|
71
|
+
locked: '0',
|
|
72
|
+
state: _KoniTypes.APIItemState.NOT_SUPPORT,
|
|
73
|
+
timestamp: now
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
callback(items);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if ((0, _utils._isPureEvmChain)(chainInfo)) {
|
|
80
|
+
const nativeTokenInfo = _handlers.state.getNativeTokenInfo(chainSlug);
|
|
81
|
+
return (0, _evm.subscribeEVMBalance)(chainSlug, useAddresses, evmApiMap, callback, nativeTokenInfo);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// if (!useAddresses || useAddresses.length === 0 || _PURE_EVM_CHAINS.indexOf(chainSlug) > -1) {
|
|
85
|
+
// const fungibleTokensByChain = state.chainService.getFungibleTokensByChain(chainSlug, true);
|
|
86
|
+
// const now = new Date().getTime();
|
|
87
|
+
//
|
|
88
|
+
// Object.values(fungibleTokensByChain).map((token) => {
|
|
89
|
+
// return {
|
|
90
|
+
// tokenSlug: token.slug,
|
|
91
|
+
// free: '0',
|
|
92
|
+
// locked: '0',
|
|
93
|
+
// state: APIItemState.READY,
|
|
94
|
+
// timestamp: now
|
|
95
|
+
// } as BalanceItem;
|
|
96
|
+
// }).forEach(callback);
|
|
97
|
+
//
|
|
98
|
+
// return undefined;
|
|
99
|
+
// }
|
|
100
|
+
|
|
101
|
+
const networkAPI = await substrateApiMap[chainSlug].isReady;
|
|
102
|
+
return (0, _substrate.subscribeSubstrateBalance)(useAddresses, chainInfo, chainSlug, networkAPI, evmApiMap, callback);
|
|
103
|
+
});
|
|
104
|
+
return () => {
|
|
105
|
+
unsubList.forEach(subProm => {
|
|
106
|
+
subProm.then(unsub => {
|
|
107
|
+
unsub && unsub();
|
|
108
|
+
}).catch(console.error);
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.subscribeERC20Interval = subscribeERC20Interval;
|
|
7
|
+
exports.subscribeEVMBalance = subscribeEVMBalance;
|
|
8
|
+
var _types = require("@subwallet/chain-list/types");
|
|
9
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
10
|
+
var _constants = require("@subwallet/extension-base/constants");
|
|
11
|
+
var _balance = require("@subwallet/extension-base/koni/api/tokens/evm/balance");
|
|
12
|
+
var _web = require("@subwallet/extension-base/koni/api/tokens/evm/web3");
|
|
13
|
+
var _handlers = require("@subwallet/extension-base/koni/background/handlers");
|
|
14
|
+
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
15
|
+
var _util = require("@polkadot/util");
|
|
16
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
17
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
18
|
+
|
|
19
|
+
function subscribeERC20Interval(addresses, chain, evmApiMap, callBack) {
|
|
20
|
+
let tokenList = {};
|
|
21
|
+
const erc20ContractMap = {};
|
|
22
|
+
const getTokenBalances = () => {
|
|
23
|
+
Object.values(tokenList).map(async tokenInfo => {
|
|
24
|
+
try {
|
|
25
|
+
const contract = erc20ContractMap[tokenInfo.slug];
|
|
26
|
+
const balances = await Promise.all(addresses.map(async address => {
|
|
27
|
+
try {
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
29
|
+
return await contract.methods.balanceOf(address).call();
|
|
30
|
+
} catch (e) {
|
|
31
|
+
console.error(`Error on get balance of account ${address} for token ${tokenInfo.slug}`, e);
|
|
32
|
+
return '0';
|
|
33
|
+
}
|
|
34
|
+
}));
|
|
35
|
+
const items = balances.map((balance, index) => {
|
|
36
|
+
return {
|
|
37
|
+
address: addresses[index],
|
|
38
|
+
tokenSlug: tokenInfo.slug,
|
|
39
|
+
free: new _util.BN(balance || 0).toString(),
|
|
40
|
+
locked: '0',
|
|
41
|
+
state: _KoniTypes.APIItemState.READY
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
callBack(items);
|
|
45
|
+
} catch (err) {
|
|
46
|
+
console.log(tokenInfo.slug, err);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
tokenList = _handlers.state.getAssetByChainAndAsset(chain, [_types._AssetType.ERC20]);
|
|
51
|
+
Object.entries(tokenList).forEach(_ref => {
|
|
52
|
+
let [slug, tokenInfo] = _ref;
|
|
53
|
+
erc20ContractMap[slug] = (0, _web.getERC20Contract)(chain, (0, _utils._getContractAddressOfToken)(tokenInfo), evmApiMap);
|
|
54
|
+
});
|
|
55
|
+
getTokenBalances();
|
|
56
|
+
const interval = setInterval(getTokenBalances, _constants.SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
|
|
57
|
+
return () => {
|
|
58
|
+
clearInterval(interval);
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function subscribeEVMBalance(chain, addresses, evmApiMap, callback, tokenInfo) {
|
|
62
|
+
function getBalance() {
|
|
63
|
+
(0, _balance.getEVMBalance)(chain, addresses, evmApiMap).then(balances => {
|
|
64
|
+
return balances.map((balance, index) => {
|
|
65
|
+
return {
|
|
66
|
+
address: addresses[index],
|
|
67
|
+
tokenSlug: tokenInfo.slug,
|
|
68
|
+
state: _KoniTypes.APIItemState.READY,
|
|
69
|
+
free: new _util.BN(balance || '0').toString(),
|
|
70
|
+
locked: '0'
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
}).catch(e => {
|
|
74
|
+
console.error(`Error on get native balance with token ${tokenInfo.slug}`, e);
|
|
75
|
+
return addresses.map(address => {
|
|
76
|
+
return {
|
|
77
|
+
address: address,
|
|
78
|
+
tokenSlug: tokenInfo.slug,
|
|
79
|
+
state: _KoniTypes.APIItemState.READY,
|
|
80
|
+
free: '0',
|
|
81
|
+
locked: '0'
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
}).then(items => {
|
|
85
|
+
callback(items);
|
|
86
|
+
}).catch(console.error);
|
|
87
|
+
}
|
|
88
|
+
getBalance();
|
|
89
|
+
const interval = setInterval(getBalance, _constants.ASTAR_REFRESH_BALANCE_INTERVAL);
|
|
90
|
+
const unsub2 = subscribeERC20Interval(addresses, chain, evmApiMap, callback);
|
|
91
|
+
return () => {
|
|
92
|
+
clearInterval(interval);
|
|
93
|
+
unsub2 && unsub2();
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.subscribeEqBalanceAccountPallet = subscribeEqBalanceAccountPallet;
|
|
8
|
+
exports.subscribeEquilibriumTokenBalance = subscribeEquilibriumTokenBalance;
|
|
9
|
+
var _types = require("@subwallet/chain-list/types");
|
|
10
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
11
|
+
var _handlers = require("@subwallet/extension-base/koni/background/handlers");
|
|
12
|
+
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
13
|
+
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
14
|
+
var _util = require("@polkadot/util");
|
|
15
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
16
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
17
|
+
|
|
18
|
+
async function subscribeEquilibriumTokenBalance(addresses, chain, api, callBack, includeNativeToken) {
|
|
19
|
+
const tokenTypes = includeNativeToken ? [_types._AssetType.NATIVE, _types._AssetType.LOCAL] : [_types._AssetType.LOCAL];
|
|
20
|
+
const tokenMap = _handlers.state.getAssetByChainAndAsset(chain, tokenTypes);
|
|
21
|
+
try {
|
|
22
|
+
const unsub = await api.query.system.account.multi(addresses, balances => {
|
|
23
|
+
// Equilibrium customizes the SystemAccount pallet
|
|
24
|
+
Object.values(tokenMap).forEach(tokenInfo => {
|
|
25
|
+
const assetId = (0, _utils._getTokenOnChainAssetId)(tokenInfo);
|
|
26
|
+
const items = balances.map((balance, index) => {
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
28
|
+
const balancesData = JSON.parse(balance.data.toString());
|
|
29
|
+
const balanceList = balancesData.v0.balance;
|
|
30
|
+
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
const freeTokenBalance = balanceList.find(data => data[0] === parseInt(assetId));
|
|
33
|
+
const bnFreeTokenBalance = freeTokenBalance ? new _util.BN(new _bignumber.default(freeTokenBalance[1].positive).toString()) : _util.BN_ZERO;
|
|
34
|
+
return {
|
|
35
|
+
address: addresses[index],
|
|
36
|
+
free: bnFreeTokenBalance.toString(),
|
|
37
|
+
locked: '0',
|
|
38
|
+
// Equilibrium doesn't show locked balance
|
|
39
|
+
state: _KoniTypes.APIItemState.READY,
|
|
40
|
+
tokenSlug: tokenInfo.slug
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
callBack(items);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
return () => {
|
|
47
|
+
unsub();
|
|
48
|
+
};
|
|
49
|
+
} catch (e) {
|
|
50
|
+
Object.values(tokenMap).forEach(tokenInfo => {
|
|
51
|
+
const items = addresses.map(address => {
|
|
52
|
+
return {
|
|
53
|
+
address: address,
|
|
54
|
+
free: '0',
|
|
55
|
+
locked: '0',
|
|
56
|
+
// Equilibrium doesn't show locked balance
|
|
57
|
+
state: _KoniTypes.APIItemState.READY,
|
|
58
|
+
tokenSlug: tokenInfo.slug
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
callBack(items);
|
|
62
|
+
});
|
|
63
|
+
return () => {
|
|
64
|
+
// Empty
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
70
|
+
async function subscribeEqBalanceAccountPallet(addresses, chain, api, callBack, includeNativeToken) {
|
|
71
|
+
const tokenTypes = includeNativeToken ? [_types._AssetType.NATIVE, _types._AssetType.LOCAL] : [_types._AssetType.LOCAL];
|
|
72
|
+
const tokenMap = _handlers.state.getAssetByChainAndAsset(chain, tokenTypes);
|
|
73
|
+
const unsubList = Object.values(tokenMap).map(async tokenInfo => {
|
|
74
|
+
try {
|
|
75
|
+
const assetId = (0, _utils._getTokenOnChainAssetId)(tokenInfo);
|
|
76
|
+
const unsub = await api.query.eqBalances.account.multi(addresses.map(address => [address, [assetId]]), balances => {
|
|
77
|
+
const items = balances.map((balance, index) => {
|
|
78
|
+
return {
|
|
79
|
+
address: addresses[index],
|
|
80
|
+
free: balance.asPositive.toString(),
|
|
81
|
+
locked: '0',
|
|
82
|
+
// Equilibrium doesn't show locked balance
|
|
83
|
+
state: _KoniTypes.APIItemState.READY,
|
|
84
|
+
tokenSlug: tokenInfo.slug
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
callBack(items);
|
|
88
|
+
});
|
|
89
|
+
return unsub;
|
|
90
|
+
} catch (err) {
|
|
91
|
+
console.warn(err);
|
|
92
|
+
const items = addresses.map(address => {
|
|
93
|
+
return {
|
|
94
|
+
address: address,
|
|
95
|
+
free: '0',
|
|
96
|
+
locked: '0',
|
|
97
|
+
// Equilibrium doesn't show locked balance
|
|
98
|
+
state: _KoniTypes.APIItemState.READY,
|
|
99
|
+
tokenSlug: tokenInfo.slug
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
callBack(items);
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
return () => {
|
|
107
|
+
unsubList.forEach(subProm => {
|
|
108
|
+
subProm.then(unsub => {
|
|
109
|
+
unsub && unsub();
|
|
110
|
+
}).catch(console.error);
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.subscribeSubstrateBalance = subscribeSubstrateBalance;
|
|
7
|
+
var _types = require("@subwallet/chain-list/types");
|
|
8
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
9
|
+
var _constants = require("@subwallet/extension-base/constants");
|
|
10
|
+
var _wasm = require("@subwallet/extension-base/koni/api/tokens/wasm");
|
|
11
|
+
var _utils = require("@subwallet/extension-base/koni/api/tokens/wasm/utils");
|
|
12
|
+
var _handlers = require("@subwallet/extension-base/koni/background/handlers");
|
|
13
|
+
var _evm = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/evm");
|
|
14
|
+
var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
|
|
15
|
+
var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
|
|
16
|
+
var _util = require("@polkadot/util");
|
|
17
|
+
var _equilibrium = require("./equilibrium");
|
|
18
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
19
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
20
|
+
|
|
21
|
+
async function subscribeSubstrateBalance(addresses, chainInfo, chain, networkAPI, evmApiMap, callBack) {
|
|
22
|
+
let unsubNativeToken;
|
|
23
|
+
if (!_constants2._BALANCE_CHAIN_GROUP.kintsugi.includes(chain) && !_constants2._BALANCE_CHAIN_GROUP.genshiro.includes(chain) && !_constants2._BALANCE_CHAIN_GROUP.equilibrium_parachain.includes(chain)) {
|
|
24
|
+
unsubNativeToken = await subscribeWithSystemAccountPallet(addresses, chainInfo, networkAPI.api, callBack);
|
|
25
|
+
}
|
|
26
|
+
let unsubLocalToken;
|
|
27
|
+
let unsubEvmContractToken;
|
|
28
|
+
let unsubWasmContractToken;
|
|
29
|
+
try {
|
|
30
|
+
if (_constants2._BALANCE_CHAIN_GROUP.bifrost.includes(chain)) {
|
|
31
|
+
unsubLocalToken = await subscribeTokensAccountsPallet(addresses, chain, networkAPI.api, callBack);
|
|
32
|
+
} else if (_constants2._BALANCE_CHAIN_GROUP.kintsugi.includes(chain)) {
|
|
33
|
+
unsubLocalToken = await subscribeTokensAccountsPallet(addresses, chain, networkAPI.api, callBack, true);
|
|
34
|
+
} else if (_constants2._BALANCE_CHAIN_GROUP.statemine.includes(chain)) {
|
|
35
|
+
unsubLocalToken = await subscribeAssetsAccountPallet(addresses, chain, networkAPI.api, callBack);
|
|
36
|
+
} else if (_constants2._BALANCE_CHAIN_GROUP.genshiro.includes(chain)) {
|
|
37
|
+
unsubLocalToken = await (0, _equilibrium.subscribeEqBalanceAccountPallet)(addresses, chain, networkAPI.api, callBack, true);
|
|
38
|
+
} else if (_constants2._BALANCE_CHAIN_GROUP.equilibrium_parachain.includes(chain)) {
|
|
39
|
+
unsubLocalToken = await (0, _equilibrium.subscribeEquilibriumTokenBalance)(addresses, chain, networkAPI.api, callBack, true);
|
|
40
|
+
} else if (_constants2._BALANCE_CHAIN_GROUP.centrifuge.includes(chain)) {
|
|
41
|
+
unsubLocalToken = await subscribeOrmlTokensPallet(addresses, chain, networkAPI.api, callBack);
|
|
42
|
+
}
|
|
43
|
+
if ((0, _utils2._isChainEvmCompatible)(chainInfo)) {
|
|
44
|
+
unsubEvmContractToken = (0, _evm.subscribeERC20Interval)(addresses, chain, evmApiMap, callBack);
|
|
45
|
+
}
|
|
46
|
+
if ((0, _utils2._checkSmartContractSupportByChain)(chainInfo, _types._AssetType.PSP22)) {
|
|
47
|
+
// Get sub-token for substrate-based chains
|
|
48
|
+
unsubWasmContractToken = subscribePSP22Balance(addresses, chain, networkAPI.api, callBack);
|
|
49
|
+
}
|
|
50
|
+
} catch (err) {
|
|
51
|
+
console.warn(err);
|
|
52
|
+
}
|
|
53
|
+
return () => {
|
|
54
|
+
unsubNativeToken && unsubNativeToken();
|
|
55
|
+
unsubLocalToken && unsubLocalToken();
|
|
56
|
+
unsubEvmContractToken && unsubEvmContractToken();
|
|
57
|
+
unsubWasmContractToken && unsubWasmContractToken();
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// handler according to different logic
|
|
62
|
+
async function subscribeWithSystemAccountPallet(addresses, chainInfo, networkAPI, callBack) {
|
|
63
|
+
const chainNativeTokenSlug = (0, _utils2._getChainNativeTokenSlug)(chainInfo);
|
|
64
|
+
|
|
65
|
+
// TODO: Need handle case error
|
|
66
|
+
const unsub = await networkAPI.query.system.account.multi(addresses, async balances => {
|
|
67
|
+
const pooledStakingBalances = [];
|
|
68
|
+
if ((0, _utils2._isSubstrateRelayChain)(chainInfo) && networkAPI.query.nominationPools) {
|
|
69
|
+
var _networkAPI$query$nom;
|
|
70
|
+
const poolMemberDatas = await ((_networkAPI$query$nom = networkAPI.query.nominationPools.poolMembers) === null || _networkAPI$query$nom === void 0 ? void 0 : _networkAPI$query$nom.multi(addresses));
|
|
71
|
+
if (poolMemberDatas) {
|
|
72
|
+
for (const _poolMemberData of poolMemberDatas) {
|
|
73
|
+
const poolMemberData = _poolMemberData.toPrimitive();
|
|
74
|
+
if (poolMemberData) {
|
|
75
|
+
let pooled = new _util.BN(poolMemberData.points.toString());
|
|
76
|
+
Object.entries(poolMemberData.unbondingEras).forEach(_ref => {
|
|
77
|
+
let [, amount] = _ref;
|
|
78
|
+
pooled = pooled.add(new _util.BN(amount));
|
|
79
|
+
});
|
|
80
|
+
pooledStakingBalances.push(pooled);
|
|
81
|
+
} else {
|
|
82
|
+
pooledStakingBalances.push(_util.BN_ZERO);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const items = balances.map((balance, index) => {
|
|
88
|
+
var _balance$data, _balance$data$free, _balance$data2, _balance$data2$reserv, _balance$data3, _balance$data3$miscFr, _balance$data4, _balance$data4$frozen, _balance$data5, _balance$data5$feeFro;
|
|
89
|
+
let total = ((_balance$data = balance.data) === null || _balance$data === void 0 ? void 0 : (_balance$data$free = _balance$data.free) === null || _balance$data$free === void 0 ? void 0 : _balance$data$free.toBn()) || new _util.BN(0);
|
|
90
|
+
const reserved = ((_balance$data2 = balance.data) === null || _balance$data2 === void 0 ? void 0 : (_balance$data2$reserv = _balance$data2.reserved) === null || _balance$data2$reserv === void 0 ? void 0 : _balance$data2$reserv.toBn()) || new _util.BN(0);
|
|
91
|
+
// @ts-ignore
|
|
92
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
93
|
+
const miscFrozen = ((_balance$data3 = balance.data) === null || _balance$data3 === void 0 ? void 0 : (_balance$data3$miscFr = _balance$data3.miscFrozen) === null || _balance$data3$miscFr === void 0 ? void 0 : _balance$data3$miscFr.toBn()) || (balance === null || balance === void 0 ? void 0 : (_balance$data4 = balance.data) === null || _balance$data4 === void 0 ? void 0 : (_balance$data4$frozen = _balance$data4.frozen) === null || _balance$data4$frozen === void 0 ? void 0 : _balance$data4$frozen.toBn()) || new _util.BN(0);
|
|
94
|
+
const feeFrozen = ((_balance$data5 = balance.data) === null || _balance$data5 === void 0 ? void 0 : (_balance$data5$feeFro = _balance$data5.feeFrozen) === null || _balance$data5$feeFro === void 0 ? void 0 : _balance$data5$feeFro.toBn()) || new _util.BN(0);
|
|
95
|
+
let locked = reserved.add(miscFrozen);
|
|
96
|
+
total = total.add(reserved);
|
|
97
|
+
const pooledStakingBalance = pooledStakingBalances[index] || _util.BN_ZERO;
|
|
98
|
+
if (pooledStakingBalance.gt(_util.BN_ZERO)) {
|
|
99
|
+
total = total.add(pooledStakingBalance);
|
|
100
|
+
locked = locked.add(pooledStakingBalance);
|
|
101
|
+
}
|
|
102
|
+
const free = total.sub(locked);
|
|
103
|
+
return {
|
|
104
|
+
address: addresses[index],
|
|
105
|
+
tokenSlug: chainNativeTokenSlug,
|
|
106
|
+
free: free.gte(_util.BN_ZERO) ? free.toString() : '0',
|
|
107
|
+
locked: locked.toString(),
|
|
108
|
+
state: _KoniTypes.APIItemState.READY,
|
|
109
|
+
substrateInfo: {
|
|
110
|
+
miscFrozen: miscFrozen.toString(),
|
|
111
|
+
reserved: reserved.toString(),
|
|
112
|
+
feeFrozen: feeFrozen.toString()
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
callBack(items);
|
|
117
|
+
});
|
|
118
|
+
return () => {
|
|
119
|
+
unsub();
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function subscribePSP22Balance(addresses, chain, api, callBack) {
|
|
123
|
+
let tokenList = {};
|
|
124
|
+
const psp22ContractMap = {};
|
|
125
|
+
const getTokenBalances = () => {
|
|
126
|
+
Object.values(tokenList).map(async tokenInfo => {
|
|
127
|
+
try {
|
|
128
|
+
const contract = psp22ContractMap[tokenInfo.slug];
|
|
129
|
+
const balances = await Promise.all(addresses.map(async address => {
|
|
130
|
+
try {
|
|
131
|
+
var _balanceOf$output, _ref2;
|
|
132
|
+
const _balanceOf = await contract.query['psp22::balanceOf'](address, {
|
|
133
|
+
gasLimit: (0, _utils.getDefaultWeightV2)(api)
|
|
134
|
+
}, address);
|
|
135
|
+
const balanceObj = _balanceOf === null || _balanceOf === void 0 ? void 0 : (_balanceOf$output = _balanceOf.output) === null || _balanceOf$output === void 0 ? void 0 : _balanceOf$output.toPrimitive();
|
|
136
|
+
return {
|
|
137
|
+
address: address,
|
|
138
|
+
tokenSlug: tokenInfo.slug,
|
|
139
|
+
free: _balanceOf.output ? (_ref2 = balanceObj.ok) !== null && _ref2 !== void 0 ? _ref2 : balanceObj.Ok : '0',
|
|
140
|
+
locked: '0',
|
|
141
|
+
state: _KoniTypes.APIItemState.READY
|
|
142
|
+
};
|
|
143
|
+
} catch (err) {
|
|
144
|
+
console.error(`Error on get balance of account ${address} for token ${tokenInfo.slug}`, err);
|
|
145
|
+
return {
|
|
146
|
+
address: address,
|
|
147
|
+
tokenSlug: tokenInfo.slug,
|
|
148
|
+
free: '0',
|
|
149
|
+
locked: '0',
|
|
150
|
+
state: _KoniTypes.APIItemState.READY
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}));
|
|
154
|
+
callBack(balances);
|
|
155
|
+
} catch (err) {
|
|
156
|
+
console.warn(tokenInfo.slug, err); // TODO: error createType
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
tokenList = _handlers.state.getAssetByChainAndAsset(chain, [_types._AssetType.PSP22]);
|
|
162
|
+
Object.entries(tokenList).forEach(_ref3 => {
|
|
163
|
+
let [slug, tokenInfo] = _ref3;
|
|
164
|
+
psp22ContractMap[slug] = (0, _wasm.getPSP22ContractPromise)(api, (0, _utils2._getContractAddressOfToken)(tokenInfo));
|
|
165
|
+
});
|
|
166
|
+
getTokenBalances();
|
|
167
|
+
const interval = setInterval(getTokenBalances, _constants.SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
|
|
168
|
+
return () => {
|
|
169
|
+
clearInterval(interval);
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
async function subscribeTokensAccountsPallet(addresses, chain, api, callBack, includeNativeToken) {
|
|
173
|
+
const tokenTypes = includeNativeToken ? [_types._AssetType.NATIVE, _types._AssetType.LOCAL] : [_types._AssetType.LOCAL];
|
|
174
|
+
const tokenMap = _handlers.state.getAssetByChainAndAsset(chain, tokenTypes);
|
|
175
|
+
const unsubList = await Promise.all(Object.values(tokenMap).map(async tokenInfo => {
|
|
176
|
+
try {
|
|
177
|
+
const onChainInfo = (0, _utils2._getTokenOnChainInfo)(tokenInfo);
|
|
178
|
+
const assetId = (0, _utils2._getTokenOnChainAssetId)(tokenInfo);
|
|
179
|
+
|
|
180
|
+
// Get Token Balance
|
|
181
|
+
// @ts-ignore
|
|
182
|
+
return await api.query.tokens.accounts.multi(addresses.map(address => [address, onChainInfo || assetId]), balances => {
|
|
183
|
+
const items = balances.map((balance, index) => {
|
|
184
|
+
const tokenBalance = {
|
|
185
|
+
reserved: balance.reserved || new _util.BN(0),
|
|
186
|
+
frozen: balance.frozen || new _util.BN(0),
|
|
187
|
+
free: balance.free || new _util.BN(0) // free is actually total balance
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
const freeBalance = tokenBalance.free.sub(tokenBalance.frozen);
|
|
191
|
+
const lockedBalance = tokenBalance.frozen.add(tokenBalance.reserved);
|
|
192
|
+
return {
|
|
193
|
+
address: addresses[index],
|
|
194
|
+
tokenSlug: tokenInfo.slug,
|
|
195
|
+
state: _KoniTypes.APIItemState.READY,
|
|
196
|
+
free: freeBalance.toString(),
|
|
197
|
+
locked: lockedBalance.toString(),
|
|
198
|
+
substrateInfo: {
|
|
199
|
+
reserved: tokenBalance.reserved.toString(),
|
|
200
|
+
miscFrozen: tokenBalance.frozen.toString()
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
});
|
|
204
|
+
callBack(items);
|
|
205
|
+
});
|
|
206
|
+
} catch (err) {
|
|
207
|
+
console.warn(err);
|
|
208
|
+
}
|
|
209
|
+
return undefined;
|
|
210
|
+
}));
|
|
211
|
+
return () => {
|
|
212
|
+
unsubList.forEach(unsub => {
|
|
213
|
+
unsub && unsub();
|
|
214
|
+
});
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
async function subscribeAssetsAccountPallet(addresses, chain, api, callBack) {
|
|
218
|
+
const tokenMap = _handlers.state.getAssetByChainAndAsset(chain, [_types._AssetType.LOCAL]);
|
|
219
|
+
Object.values(tokenMap).forEach(token => {
|
|
220
|
+
if (_constants2._MANTA_ZK_CHAIN_GROUP.includes(token.originChain) && token.symbol.startsWith(_constants2._ZK_ASSET_PREFIX)) {
|
|
221
|
+
delete tokenMap[token.slug];
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
const unsubList = await Promise.all(Object.values(tokenMap).map(async tokenInfo => {
|
|
225
|
+
try {
|
|
226
|
+
const assetIndex = (0, _utils2._getTokenOnChainAssetId)(tokenInfo);
|
|
227
|
+
|
|
228
|
+
// Get Token Balance
|
|
229
|
+
return await api.query.assets.account.multi(addresses.map(address => [assetIndex, address]), balances => {
|
|
230
|
+
const items = balances.map((balance, index) => {
|
|
231
|
+
// @ts-ignore
|
|
232
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-assignment
|
|
233
|
+
const bdata = balance === null || balance === void 0 ? void 0 : balance.toHuman();
|
|
234
|
+
let frozen = _util.BN_ZERO;
|
|
235
|
+
let total = _util.BN_ZERO;
|
|
236
|
+
if (bdata) {
|
|
237
|
+
// @ts-ignore
|
|
238
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-argument
|
|
239
|
+
const addressBalance = new _util.BN(String(bdata === null || bdata === void 0 ? void 0 : bdata.balance).replaceAll(',', '') || '0');
|
|
240
|
+
|
|
241
|
+
// @ts-ignore
|
|
242
|
+
if (bdata !== null && bdata !== void 0 && bdata.isFrozen) {
|
|
243
|
+
frozen = addressBalance;
|
|
244
|
+
} else {
|
|
245
|
+
total = addressBalance;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
const free = total.sub(frozen);
|
|
249
|
+
return {
|
|
250
|
+
address: addresses[index],
|
|
251
|
+
tokenSlug: tokenInfo.slug,
|
|
252
|
+
free: free.toString(),
|
|
253
|
+
locked: frozen.toString(),
|
|
254
|
+
state: _KoniTypes.APIItemState.READY,
|
|
255
|
+
substrateInfo: {
|
|
256
|
+
miscFrozen: frozen.toString(),
|
|
257
|
+
reserved: '0'
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
});
|
|
261
|
+
callBack(items);
|
|
262
|
+
});
|
|
263
|
+
} catch (err) {
|
|
264
|
+
console.warn(err);
|
|
265
|
+
}
|
|
266
|
+
return undefined;
|
|
267
|
+
}));
|
|
268
|
+
return () => {
|
|
269
|
+
unsubList.forEach(unsub => {
|
|
270
|
+
unsub && unsub();
|
|
271
|
+
});
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
276
|
+
async function subscribeOrmlTokensPallet(addresses, chain, api, callBack) {
|
|
277
|
+
const tokenTypes = [_types._AssetType.LOCAL];
|
|
278
|
+
const tokenMap = _handlers.state.getAssetByChainAndAsset(chain, tokenTypes);
|
|
279
|
+
const unsubList = Object.values(tokenMap).map(async tokenInfo => {
|
|
280
|
+
try {
|
|
281
|
+
const onChainInfo = (0, _utils2._getTokenOnChainInfo)(tokenInfo);
|
|
282
|
+
|
|
283
|
+
// Get Token Balance
|
|
284
|
+
// @ts-ignore
|
|
285
|
+
const unsub = await api.query.ormlTokens.accounts.multi(addresses.map(address => [address, onChainInfo]), balances => {
|
|
286
|
+
const items = balances.map((balance, index) => {
|
|
287
|
+
const tokenBalance = {
|
|
288
|
+
reserved: balance.reserved || new _util.BN(0),
|
|
289
|
+
frozen: balance.frozen || new _util.BN(0),
|
|
290
|
+
free: balance.free || new _util.BN(0) // free is actually total balance
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
// free balance = total balance - frozen misc
|
|
294
|
+
// locked balance = reserved + frozen misc
|
|
295
|
+
const freeBalance = tokenBalance.free.sub(tokenBalance.frozen);
|
|
296
|
+
const lockedBalance = tokenBalance.frozen.add(tokenBalance.reserved);
|
|
297
|
+
return {
|
|
298
|
+
address: addresses[index],
|
|
299
|
+
tokenSlug: tokenInfo.slug,
|
|
300
|
+
state: _KoniTypes.APIItemState.READY,
|
|
301
|
+
free: freeBalance.toString(),
|
|
302
|
+
locked: lockedBalance.toString(),
|
|
303
|
+
substrateInfo: {
|
|
304
|
+
reserved: tokenBalance.reserved.toString(),
|
|
305
|
+
miscFrozen: tokenBalance.frozen.toString()
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
});
|
|
309
|
+
callBack(items);
|
|
310
|
+
});
|
|
311
|
+
return unsub;
|
|
312
|
+
} catch (err) {
|
|
313
|
+
console.warn(err);
|
|
314
|
+
return undefined;
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
return () => {
|
|
318
|
+
unsubList.forEach(subProm => {
|
|
319
|
+
subProm.then(unsub => {
|
|
320
|
+
unsub && unsub();
|
|
321
|
+
}).catch(console.error);
|
|
322
|
+
});
|
|
323
|
+
};
|
|
324
|
+
}
|