@subwallet/extension-base 1.1.24-0 → 1.1.24-2
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 +2 -25
- package/cjs/constants/index.js +9 -3
- package/cjs/koni/api/staking/bonding/amplitude.js +6 -4
- package/cjs/koni/api/staking/bonding/astar.js +4 -0
- package/cjs/koni/api/staking/bonding/index.js +5 -0
- package/cjs/koni/api/staking/bonding/paraChain.js +9 -20
- package/cjs/koni/api/staking/bonding/relayChain.js +41 -23
- package/cjs/koni/api/staking/bonding/utils.js +67 -16
- 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/chain-service/constants.js +4 -3
- 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/amplitude.d.ts +3 -0
- package/koni/api/staking/bonding/amplitude.js +6 -4
- package/koni/api/staking/bonding/astar.d.ts +3 -0
- package/koni/api/staking/bonding/astar.js +4 -0
- package/koni/api/staking/bonding/index.d.ts +3 -0
- package/koni/api/staking/bonding/index.js +5 -0
- package/koni/api/staking/bonding/paraChain.d.ts +3 -0
- package/koni/api/staking/bonding/paraChain.js +9 -20
- package/koni/api/staking/bonding/relayChain.d.ts +3 -0
- package/koni/api/staking/bonding/relayChain.js +41 -24
- package/koni/api/staking/bonding/utils.d.ts +15 -2
- package/koni/api/staking/bonding/utils.js +69 -18
- 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 +40 -15
- 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/chain-service/constants.js +4 -3
- 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,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
|
+
}
|
|
@@ -6,8 +6,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.BalanceService = void 0;
|
|
7
7
|
var _BalanceError = require("@subwallet/extension-base/background/errors/BalanceError");
|
|
8
8
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
9
|
-
var
|
|
10
|
-
var
|
|
9
|
+
var _group = require("@subwallet/extension-base/services/balance-service/helpers/group");
|
|
10
|
+
var _evm = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/evm");
|
|
11
|
+
var _substrate = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/substrate");
|
|
11
12
|
var _constants = require("@subwallet/extension-base/services/chain-service/constants");
|
|
12
13
|
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
13
14
|
var _utils2 = require("@subwallet/extension-base/utils");
|
|
@@ -15,10 +16,17 @@ var _i18next = require("i18next");
|
|
|
15
16
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
16
17
|
// SPDX-License-Identifier: Apache-2.0
|
|
17
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Balance service
|
|
21
|
+
* @class
|
|
22
|
+
*/
|
|
18
23
|
class BalanceService {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
/**
|
|
25
|
+
* @constructor
|
|
26
|
+
* @param {KoniState} state - The state of extension.
|
|
27
|
+
*/
|
|
28
|
+
constructor(state) {
|
|
29
|
+
this.state = state;
|
|
22
30
|
// Todo: Load data from db to balanceSubject
|
|
23
31
|
// Todo: Start subscribe balance and data
|
|
24
32
|
// Todo: Listen change and apply to balanceSubject
|
|
@@ -29,9 +37,10 @@ class BalanceService {
|
|
|
29
37
|
// Todo: Move everything of fetching balance to this service
|
|
30
38
|
}
|
|
31
39
|
|
|
40
|
+
/* Subscribe token free balance on chain */
|
|
32
41
|
async subscribeTokenFreeBalance(address, chain, tokenSlug, callback) {
|
|
33
|
-
const chainInfo = this.chainService.getChainInfoByKey(chain);
|
|
34
|
-
const chainState = this.chainService.getChainStateByKey(chain);
|
|
42
|
+
const chainInfo = this.state.chainService.getChainInfoByKey(chain);
|
|
43
|
+
const chainState = this.state.chainService.getChainStateByKey(chain);
|
|
35
44
|
if (!chainInfo || !chainState || !chainState.active) {
|
|
36
45
|
return Promise.reject(new _BalanceError.BalanceError(_KoniTypes.BalanceErrorType.NETWORK_ERROR, (0, _i18next.t)('{{chain}} is inactive. Please enable network', {
|
|
37
46
|
replace: {
|
|
@@ -40,7 +49,7 @@ class BalanceService {
|
|
|
40
49
|
})));
|
|
41
50
|
}
|
|
42
51
|
const tSlug = tokenSlug || (0, _utils._getChainNativeTokenSlug)(chainInfo);
|
|
43
|
-
const tokenInfo = this.chainService.getAssetBySlug(tSlug);
|
|
52
|
+
const tokenInfo = this.state.chainService.getAssetBySlug(tSlug);
|
|
44
53
|
if (!tokenInfo) {
|
|
45
54
|
return Promise.reject(new _BalanceError.BalanceError(_KoniTypes.BalanceErrorType.TOKEN_ERROR, (0, _i18next.t)('Transfer is currently not available for this token: {{tSlug}}', {
|
|
46
55
|
replace: {
|
|
@@ -75,35 +84,51 @@ class BalanceService {
|
|
|
75
84
|
}, 9999);
|
|
76
85
|
});
|
|
77
86
|
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @public
|
|
90
|
+
* @async
|
|
91
|
+
* @function getTokenFreeBalance
|
|
92
|
+
* @desc Fetch free balance on chain
|
|
93
|
+
* @param {string} address - Address
|
|
94
|
+
* @param {string} chain - Slug of chain
|
|
95
|
+
* @param {string} [tokenSlug] - Slug of token
|
|
96
|
+
* @return {Promise<AmountData>} - Free token balance of address on chain
|
|
97
|
+
*/
|
|
78
98
|
async getTokenFreeBalance(address, chain, tokenSlug) {
|
|
79
99
|
const [, balance] = await this.subscribeTokenFreeBalance(address, chain, tokenSlug);
|
|
80
100
|
return balance;
|
|
81
101
|
}
|
|
82
|
-
subscribeBalance(addresses, chains,
|
|
102
|
+
subscribeBalance(addresses, chains, _callback) {
|
|
83
103
|
const [substrateAddresses, evmAddresses] = (0, _utils2.categoryAddresses)(addresses);
|
|
84
|
-
const chainInfoMap = this.chainService.getChainInfoMap();
|
|
85
|
-
const chainStateMap = this.chainService.getChainStateMap();
|
|
86
|
-
const substrateApiMap = this.chainService.getSubstrateApiMap();
|
|
87
|
-
const evmApiMap = this.chainService.getEvmApiMap();
|
|
104
|
+
const chainInfoMap = this.state.chainService.getChainInfoMap();
|
|
105
|
+
const chainStateMap = this.state.chainService.getChainStateMap();
|
|
106
|
+
const substrateApiMap = this.state.chainService.getSubstrateApiMap();
|
|
107
|
+
const evmApiMap = this.state.chainService.getEvmApiMap();
|
|
88
108
|
|
|
89
109
|
// Get data from chain or all chains
|
|
90
110
|
const chainList = chains || Object.keys(chainInfoMap);
|
|
91
111
|
// Filter active chain only
|
|
92
112
|
const useChainInfos = chainList.filter(c => chainStateMap[c] && chainStateMap[c].active).map(c => chainInfoMap[c]);
|
|
113
|
+
const callback = items => {
|
|
114
|
+
if (items.length) {
|
|
115
|
+
_callback((0, _group.groupBalance)(items, 'GROUPED', items[0].tokenSlug));
|
|
116
|
+
}
|
|
117
|
+
};
|
|
93
118
|
|
|
94
119
|
// Looping over each chain
|
|
95
120
|
const unsubList = useChainInfos.map(async chainInfo => {
|
|
96
121
|
const chainSlug = chainInfo.slug;
|
|
97
122
|
const useAddresses = (0, _utils._isChainEvmCompatible)(chainInfo) ? evmAddresses : substrateAddresses;
|
|
98
123
|
if ((0, _utils._isPureEvmChain)(chainInfo)) {
|
|
99
|
-
const nativeTokenInfo =
|
|
100
|
-
return (0,
|
|
124
|
+
const nativeTokenInfo = this.state.getNativeTokenInfo(chainSlug);
|
|
125
|
+
return (0, _evm.subscribeEVMBalance)(chainSlug, useAddresses, evmApiMap, callback, nativeTokenInfo);
|
|
101
126
|
}
|
|
102
127
|
if (!useAddresses || useAddresses.length === 0 || _constants._PURE_EVM_CHAINS.indexOf(chainSlug) > -1) {
|
|
103
128
|
return undefined;
|
|
104
129
|
}
|
|
105
130
|
const networkAPI = await substrateApiMap[chainSlug].isReady;
|
|
106
|
-
return (0,
|
|
131
|
+
return (0, _substrate.subscribeSubstrateBalance)(useAddresses, chainInfo, chainSlug, networkAPI, evmApiMap, callback);
|
|
107
132
|
});
|
|
108
133
|
return () => {
|
|
109
134
|
unsubList.forEach(subProm => {
|
|
@@ -66,13 +66,13 @@ const _NFT_CHAIN_GROUP = {
|
|
|
66
66
|
// Staking--------------------------------------------------------------------------------------------------------------
|
|
67
67
|
exports._NFT_CHAIN_GROUP = _NFT_CHAIN_GROUP;
|
|
68
68
|
const _STAKING_CHAIN_GROUP = {
|
|
69
|
-
relay: ['polkadot', 'kusama', 'aleph', 'polkadex', 'ternoa', 'ternoa_alphanet', 'alephTest', 'polkadexTest', 'westend', 'kate', 'edgeware', 'creditcoin', 'vara_network'],
|
|
69
|
+
relay: ['polkadot', 'kusama', 'aleph', 'polkadex', 'ternoa', 'ternoa_alphanet', 'alephTest', 'polkadexTest', 'westend', 'kate', 'edgeware', 'creditcoin', 'vara_network', 'goldberg_testnet'],
|
|
70
70
|
para: ['moonbeam', 'moonriver', 'moonbase', 'turing', 'turingStaging', 'bifrost', 'bifrost_testnet', 'calamari_test', 'calamari'],
|
|
71
71
|
astar: ['astar', 'shiden', 'shibuya'],
|
|
72
72
|
amplitude: ['amplitude', 'amplitude_test', 'kilt', 'kilt_peregrine', 'pendulum'],
|
|
73
73
|
// amplitude and kilt only share some common logic
|
|
74
74
|
kilt: ['kilt', 'kilt_peregrine'],
|
|
75
|
-
nominationPool: ['polkadot', 'kusama', 'westend', 'alephTest', 'aleph', 'kate', 'vara_network'],
|
|
75
|
+
nominationPool: ['polkadot', 'kusama', 'westend', 'alephTest', 'aleph', 'kate', 'vara_network', 'goldberg_testnet'],
|
|
76
76
|
bifrost: ['bifrost', 'bifrost_testnet'],
|
|
77
77
|
aleph: ['aleph', 'alephTest'],
|
|
78
78
|
// A0 has distinct tokenomics
|
|
@@ -109,7 +109,8 @@ const _STAKING_ERA_LENGTH_MAP = {
|
|
|
109
109
|
edgeware: 6,
|
|
110
110
|
kate: 6,
|
|
111
111
|
creditcoin: 24,
|
|
112
|
-
vara_network: 12
|
|
112
|
+
vara_network: 12,
|
|
113
|
+
goldberg_testnet: 24
|
|
113
114
|
};
|
|
114
115
|
exports._STAKING_ERA_LENGTH_MAP = _STAKING_ERA_LENGTH_MAP;
|
|
115
116
|
const _PARACHAIN_INFLATION_DISTRIBUTION = {
|
|
@@ -20,6 +20,12 @@ function paramJsonParse(item) {
|
|
|
20
20
|
return [];
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
+
function autoAddPublicKeyPrefix(publicKey) {
|
|
24
|
+
if (!publicKey.startsWith('0x')) {
|
|
25
|
+
return `0x${publicKey}`;
|
|
26
|
+
}
|
|
27
|
+
return publicKey;
|
|
28
|
+
}
|
|
23
29
|
function balanceTransferParserFunction(item) {
|
|
24
30
|
const params = paramJsonParse(item);
|
|
25
31
|
params.forEach(p => {
|
|
@@ -27,7 +33,7 @@ function balanceTransferParserFunction(item) {
|
|
|
27
33
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
28
34
|
const toPublicKey = p.value.id || p.value.Id;
|
|
29
35
|
if (toPublicKey) {
|
|
30
|
-
item.to = (0, _utilCrypto.encodeAddress)(toPublicKey, 42);
|
|
36
|
+
item.to = (0, _utilCrypto.encodeAddress)(autoAddPublicKeyPrefix(toPublicKey), 42);
|
|
31
37
|
}
|
|
32
38
|
} else if (p.name === 'value') {
|
|
33
39
|
if (item.amount) {
|
|
@@ -83,7 +83,7 @@ class HistoryService {
|
|
|
83
83
|
const excludeExtrinsicParserKeys = ['balances.transfer_all'];
|
|
84
84
|
|
|
85
85
|
// Note: fetchAllPossibleExtrinsicItems and fetchAllPossibleTransferItems-receive can run parallelly
|
|
86
|
-
//
|
|
86
|
+
// However, fetchAllPossibleTransferItems-sent must run after fetchAllPossibleExtrinsicItems,
|
|
87
87
|
// to avoid "duplicate Extrinsic Hash between items" problem
|
|
88
88
|
|
|
89
89
|
this.subscanService.fetchAllPossibleExtrinsicItems(chain, address, extrinsicItems => {
|
|
@@ -104,11 +104,12 @@ class HistoryService {
|
|
|
104
104
|
excludeTransferExtrinsicHash.push(x.extrinsic_hash);
|
|
105
105
|
}
|
|
106
106
|
});
|
|
107
|
-
this.subscanService.fetchAllPossibleTransferItems(chain, address, 'sent'
|
|
107
|
+
this.subscanService.fetchAllPossibleTransferItems(chain, address, 'sent').then(rsMap => {
|
|
108
108
|
const result = [];
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
Object.keys(rsMap).forEach(hash => {
|
|
110
|
+
// only push item that does not have same hash with another item
|
|
111
|
+
if (!excludeTransferExtrinsicHash.includes(hash) && rsMap[hash].length === 1) {
|
|
112
|
+
result.push((0, _subscanHistory.parseSubscanTransferData)(address, rsMap[hash][0], chainInfo));
|
|
112
113
|
}
|
|
113
114
|
});
|
|
114
115
|
this.addHistoryItems(result).catch(e => {
|
|
@@ -120,10 +121,13 @@ class HistoryService {
|
|
|
120
121
|
}).catch(e => {
|
|
121
122
|
console.log('fetchAllPossibleExtrinsicItems error', e);
|
|
122
123
|
});
|
|
123
|
-
this.subscanService.fetchAllPossibleTransferItems(chain, address, 'received'
|
|
124
|
+
this.subscanService.fetchAllPossibleTransferItems(chain, address, 'received').then(rsMap => {
|
|
124
125
|
const result = [];
|
|
125
|
-
|
|
126
|
-
|
|
126
|
+
Object.keys(rsMap).forEach(hash => {
|
|
127
|
+
// only push item that does not have same hash with another item
|
|
128
|
+
if (rsMap[hash].length === 1) {
|
|
129
|
+
result.push((0, _subscanHistory.parseSubscanTransferData)(address, rsMap[hash][0], chainInfo));
|
|
130
|
+
}
|
|
127
131
|
});
|
|
128
132
|
this.addHistoryItems(result).catch(e => {
|
|
129
133
|
console.log('addHistoryItems in fetchAllPossibleTransferItems-receive error', e);
|
|
@@ -14,7 +14,7 @@ class MigrateProvider extends _Base.default {
|
|
|
14
14
|
const state = this.state;
|
|
15
15
|
const chainState = state.getChainStateByKey(this.slug);
|
|
16
16
|
const chainInfo = state.getChainInfo(this.slug);
|
|
17
|
-
if (chainState.active && chainState.currentProvider === this.oldProvider) {
|
|
17
|
+
if (chainState && chainState.active && chainState.currentProvider === this.oldProvider) {
|
|
18
18
|
await state.upsertChainInfo({
|
|
19
19
|
mode: 'update',
|
|
20
20
|
chainEditInfo: {
|