@subwallet/extension-base 1.3.67-0 → 1.3.68-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/background/KoniTypes.d.ts +12 -1
  2. package/cjs/constants/environment.js +1 -3
  3. package/cjs/constants/index.js +4 -1
  4. package/cjs/core/substrate/system-pallet.js +4 -0
  5. package/cjs/koni/api/nft/rari/index.js +1 -1
  6. package/cjs/koni/background/cron.js +16 -0
  7. package/cjs/koni/background/handlers/Extension.js +165 -89
  8. package/cjs/koni/background/handlers/State.js +25 -0
  9. package/cjs/packageInfo.js +1 -1
  10. package/cjs/services/balance-service/helpers/group.js +31 -2
  11. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +51 -13
  12. package/cjs/services/balance-service/helpers/subscribe/substrate/utils.js +69 -0
  13. package/cjs/services/balance-service/index.js +36 -11
  14. package/cjs/services/balance-service/transfer/smart-contract.js +2 -0
  15. package/cjs/services/chain-service/constants.js +8 -46
  16. package/cjs/services/chain-service/handler/EvmChainHandler.js +6 -3
  17. package/cjs/services/earning-service/handlers/base.js +7 -1
  18. package/cjs/services/nft-service/index.js +173 -0
  19. package/cjs/services/transaction-service/index.js +1 -1
  20. package/cjs/types/balance/index.js +26 -1
  21. package/cjs/utils/index.js +25 -2
  22. package/cjs/utils/setup-api-sdk.js +0 -5
  23. package/constants/environment.d.ts +0 -1
  24. package/constants/environment.js +0 -1
  25. package/constants/index.d.ts +1 -0
  26. package/constants/index.js +1 -0
  27. package/core/substrate/system-pallet.d.ts +1 -0
  28. package/core/substrate/system-pallet.js +3 -0
  29. package/core/substrate/types.d.ts +14 -0
  30. package/koni/api/nft/rari/index.js +1 -1
  31. package/koni/background/cron.d.ts +1 -0
  32. package/koni/background/cron.js +17 -1
  33. package/koni/background/handlers/Extension.d.ts +3 -0
  34. package/koni/background/handlers/Extension.js +87 -13
  35. package/koni/background/handlers/State.d.ts +4 -0
  36. package/koni/background/handlers/State.js +25 -0
  37. package/package.json +16 -6
  38. package/packageInfo.js +1 -1
  39. package/services/balance-service/helpers/group.js +31 -2
  40. package/services/balance-service/helpers/subscribe/substrate/index.js +51 -13
  41. package/services/balance-service/helpers/subscribe/substrate/utils.d.ts +7 -0
  42. package/services/balance-service/helpers/subscribe/substrate/utils.js +58 -0
  43. package/services/balance-service/index.d.ts +4 -2
  44. package/services/balance-service/index.js +26 -6
  45. package/services/balance-service/transfer/smart-contract.js +2 -0
  46. package/services/chain-service/constants.d.ts +5 -24
  47. package/services/chain-service/constants.js +6 -35
  48. package/services/chain-service/handler/EvmChainHandler.js +6 -3
  49. package/services/earning-service/handlers/base.js +7 -1
  50. package/services/nft-service/index.d.ts +9 -0
  51. package/services/nft-service/index.js +165 -0
  52. package/services/transaction-service/index.js +1 -1
  53. package/services/transaction-service/types.d.ts +2 -1
  54. package/types/balance/index.d.ts +14 -0
  55. package/types/balance/index.js +21 -1
  56. package/utils/index.js +25 -2
  57. package/utils/setup-api-sdk.js +1 -6
@@ -32,6 +32,7 @@ var _keyringService = require("@subwallet/extension-base/services/keyring-servic
32
32
  var _migrationService = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service"));
33
33
  var _mintCampaignService = _interopRequireDefault(require("@subwallet/extension-base/services/mint-campaign-service"));
34
34
  var _mktCampaignService = _interopRequireDefault(require("@subwallet/extension-base/services/mkt-campaign-service"));
35
+ var _nftService = _interopRequireDefault(require("@subwallet/extension-base/services/nft-service"));
35
36
  var _NotificationService = _interopRequireDefault(require("@subwallet/extension-base/services/notification-service/NotificationService"));
36
37
  var _priceService = require("@subwallet/extension-base/services/price-service");
37
38
  var _requestService = _interopRequireDefault(require("@subwallet/extension-base/services/request-service"));
@@ -121,6 +122,7 @@ class KoniState {
121
122
  this.migrationService = new _migrationService.default(this, this.eventService);
122
123
  this.campaignService = new _campaignService.default(this);
123
124
  this.mktCampaignService = new _mktCampaignService.default(this);
125
+ this.nftDetectionService = new _nftService.default(this);
124
126
  this.buyService = new _buyService.default(this);
125
127
  this.earningService = new _service.default(this);
126
128
  this.swapService = new _swapService.SwapService(this);
@@ -405,6 +407,29 @@ class KoniState {
405
407
  deleteNftCollection(chain, collectionId) {
406
408
  return this.dbService.deleteNftCollection(chain, collectionId);
407
409
  }
410
+ async handleDetectedNfts(address, nftItems) {
411
+ try {
412
+ const chainSlugs = this.activeChainSlugs;
413
+ const currentNfts = await this.dbService.getNft([address], chainSlugs);
414
+ const newNfts = nftItems.filter(n => !currentNfts.some(c => c.id === n.id));
415
+ for (const nft of newNfts) {
416
+ this.updateNftData(nft.chain, nft, address);
417
+ }
418
+ } catch (e) {
419
+ this.logger.warn('handleDetectedNfts error:', e);
420
+ }
421
+ }
422
+ async handleDetectedNftCollections(collections) {
423
+ try {
424
+ const currentCollections = await this.getNftCollection();
425
+ const newCollections = collections.filter(col => !currentCollections.some(c => c.collectionId === col.collectionId && c.chain === col.chain));
426
+ for (const col of newCollections) {
427
+ this.setNftCollection(col.chain, col);
428
+ }
429
+ } catch (e) {
430
+ this.logger.warn('handleDetectedNftCollections error:', e);
431
+ }
432
+ }
408
433
  cleanUpNfts(chain, owner, collectionId, nftIds, ownNothing) {
409
434
  this.dbService.cleanUpNft(chain, owner, collectionId, nftIds, ownNothing).catch(e => this.logger.warn(e));
410
435
  }
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.3.67-0'
16
+ version: '1.3.68-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -19,11 +19,40 @@ var _bignumber = _interopRequireDefault(require("bignumber.js"));
19
19
  */
20
20
  const groupBalance = (items, address, token) => {
21
21
  const states = items.map(item => item.state);
22
+ const sum = selector => _bignumber.default.sum.apply(null, items.map(selector)).toFixed();
23
+ const staking = sum(i => {
24
+ var _i$lockedDetails$stak, _i$lockedDetails;
25
+ return (_i$lockedDetails$stak = (_i$lockedDetails = i.lockedDetails) === null || _i$lockedDetails === void 0 ? void 0 : _i$lockedDetails.staking) !== null && _i$lockedDetails$stak !== void 0 ? _i$lockedDetails$stak : '0';
26
+ });
27
+ const governance = sum(i => {
28
+ var _i$lockedDetails$gove, _i$lockedDetails2;
29
+ return (_i$lockedDetails$gove = (_i$lockedDetails2 = i.lockedDetails) === null || _i$lockedDetails2 === void 0 ? void 0 : _i$lockedDetails2.governance) !== null && _i$lockedDetails$gove !== void 0 ? _i$lockedDetails$gove : '0';
30
+ });
31
+ const democracy = sum(i => {
32
+ var _i$lockedDetails$demo, _i$lockedDetails3;
33
+ return (_i$lockedDetails$demo = (_i$lockedDetails3 = i.lockedDetails) === null || _i$lockedDetails3 === void 0 ? void 0 : _i$lockedDetails3.democracy) !== null && _i$lockedDetails$demo !== void 0 ? _i$lockedDetails$demo : '0';
34
+ });
35
+ const reserved = sum(i => {
36
+ var _i$lockedDetails$rese, _i$lockedDetails4;
37
+ return (_i$lockedDetails$rese = (_i$lockedDetails4 = i.lockedDetails) === null || _i$lockedDetails4 === void 0 ? void 0 : _i$lockedDetails4.reserved) !== null && _i$lockedDetails$rese !== void 0 ? _i$lockedDetails$rese : '0';
38
+ });
39
+ const others = sum(i => {
40
+ var _i$lockedDetails$othe, _i$lockedDetails5;
41
+ return (_i$lockedDetails$othe = (_i$lockedDetails5 = i.lockedDetails) === null || _i$lockedDetails5 === void 0 ? void 0 : _i$lockedDetails5.others) !== null && _i$lockedDetails$othe !== void 0 ? _i$lockedDetails$othe : '0';
42
+ });
43
+ const hasLockedDetails = new _bignumber.default(staking).gt(0) || new _bignumber.default(governance).gt(0) || new _bignumber.default(democracy).gt(0) || new _bignumber.default(others).gt(0);
22
44
  return {
23
45
  address,
24
46
  tokenSlug: token,
25
- free: _bignumber.default.sum.apply(null, items.map(item => item.free)).toFixed(),
26
- locked: _bignumber.default.sum.apply(null, items.map(item => item.locked)).toFixed(),
47
+ free: sum(i => i.free),
48
+ locked: sum(i => i.locked),
49
+ lockedDetails: hasLockedDetails ? {
50
+ staking,
51
+ governance,
52
+ democracy,
53
+ reserved,
54
+ others
55
+ } : undefined,
27
56
  state: states.every(item => item === _KoniTypes.APIItemState.NOT_SUPPORT) ? _KoniTypes.APIItemState.NOT_SUPPORT : states.some(item => item === _KoniTypes.APIItemState.READY) ? _KoniTypes.APIItemState.READY : _KoniTypes.APIItemState.PENDING
28
57
  };
29
58
  };
@@ -25,6 +25,7 @@ var _rxjs = require("rxjs");
25
25
  var _evm = require("../evm");
26
26
  var _equilibrium = require("./equilibrium");
27
27
  var _gear = require("./gear");
28
+ var _utils4 = require("./utils");
28
29
  // Copyright 2019-2022 @subwallet/extension-base
29
30
  // SPDX-License-Identifier: Apache-2.0
30
31
 
@@ -116,7 +117,6 @@ const subscribeSubstrateBalance = async (addresses, chainInfo, assetMap, substra
116
117
  };
117
118
  };
118
119
 
119
- // handler according to different logic
120
120
  // eslint-disable-next-line @typescript-eslint/require-await
121
121
  exports.subscribeSubstrateBalance = subscribeSubstrateBalance;
122
122
  const subscribeWithSystemAccountPallet = async _ref => {
@@ -149,16 +149,10 @@ const subscribeWithSystemAccountPallet = async _ref => {
149
149
  const subscription = substrateApi.subscribeDataWithMulti(params, async rs => {
150
150
  const balances = rs[systemAccountKey];
151
151
  const poolMemberInfos = rs[poolMembersKey];
152
- let bittensorStakingBalances = new Array(addresses.length).fill(new _bignumber.default(0));
153
- if (_constants2._BALANCE_CHAIN_GROUP.bittensor.includes(chainInfo.slug)) {
154
- const rawData = await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkeys(addresses);
155
- const values = rawData.toPrimitive();
156
- bittensorStakingBalances = values.map(_ref2 => {
157
- let [, stakes] = _ref2;
158
- return stakes.filter(i => i.netuid === 0).reduce((previousValue, currentValue) => previousValue.plus(currentValue.stake), (0, _bignumber.default)(0));
159
- });
160
- }
161
- const items = balances.map((_balance, index) => {
152
+ const bittensorStakingBalances = await (0, _utils4.getSpecialStakingBalances)(chainInfo, addresses, substrateApi);
153
+
154
+ // Precompute totalLockedFromTransfer for each account to decide if need fetch locks/holds
155
+ const preItems = balances.map((_balance, index) => {
162
156
  const balanceInfo = _balance;
163
157
  const transferableBalance = (0, _systemPallet._getSystemPalletTransferable)(balanceInfo, (0, _utils2._getChainExistentialDeposit)(chainInfo), extrinsicType);
164
158
  const totalBalance = (0, _systemPallet._getSystemPalletTotalBalance)(balanceInfo);
@@ -168,14 +162,58 @@ const subscribeWithSystemAccountPallet = async _ref => {
168
162
  const nominationPoolBalance = poolMemberInfo ? (0, _nominationpoolsPallet._getTotalStakeInNominationPool)(poolMemberInfo) : BigInt(0);
169
163
  totalLockedFromTransfer += nominationPoolBalance;
170
164
  }
171
- const stakeValue = BigInt(bittensorStakingBalances[index].toString());
172
- totalLockedFromTransfer += stakeValue;
165
+ totalLockedFromTransfer += BigInt(bittensorStakingBalances[index].toString());
166
+ return {
167
+ index,
168
+ totalLockedFromTransfer,
169
+ balanceInfo
170
+ };
171
+ });
172
+
173
+ // Filter account's locked > 0
174
+ const accountsWithLocks = preItems.filter(i => i.totalLockedFromTransfer > 0).map(i => addresses[i.index]);
175
+ let locks = [];
176
+ let holds = [];
177
+ let freezes = [];
178
+
179
+ // Fetch locks/holds only for accounts that have locked balances
180
+ if (accountsWithLocks.length > 0) {
181
+ const [rawLocks, rawHolds, rawFreezes] = await Promise.all([substrateApi.api.query.balances.locks.multi(accountsWithLocks), substrateApi.api.query.balances.holds.multi(accountsWithLocks), substrateApi.api.query.balances.freezes.multi(accountsWithLocks)]);
182
+ locks = rawLocks.map(lockArr => lockArr.map(l => ({
183
+ id: l.id.toPrimitive(),
184
+ amount: l.amount.toString()
185
+ })));
186
+ holds = rawHolds.map(holdArr => holdArr.map(h => ({
187
+ id: h.id.toPrimitive(),
188
+ amount: h.amount.toString()
189
+ })));
190
+ freezes = rawFreezes.map(freezeArr => freezeArr.map(f => ({
191
+ id: f.id.toPrimitive(),
192
+ amount: f.amount.toString()
193
+ })));
194
+ }
195
+
196
+ // Map locks/holds back to original index
197
+ const items = preItems.map(_ref2 => {
198
+ let {
199
+ balanceInfo,
200
+ index,
201
+ totalLockedFromTransfer
202
+ } = _ref2;
203
+ const lockIndex = accountsWithLocks.indexOf(addresses[index]);
204
+ const lockItems = lockIndex >= 0 ? locks[lockIndex] || [] : [];
205
+ const holdItems = lockIndex >= 0 ? holds[lockIndex] || [] : [];
206
+ const freezeItems = lockIndex >= 0 ? freezes[lockIndex] || [] : [];
207
+ const allLockEntries = [...lockItems, ...holdItems, ...freezeItems];
208
+ const lockedDetails = (0, _utils4.buildLockedDetails)(allLockEntries, totalLockedFromTransfer, (0, _systemPallet._getSystemPalletReservedBalance)(balanceInfo), bittensorStakingBalances[index]);
209
+ const transferableBalance = (0, _systemPallet._getSystemPalletTransferable)(balanceInfo, (0, _utils2._getChainExistentialDeposit)(chainInfo), extrinsicType);
173
210
  return {
174
211
  address: addresses[index],
175
212
  tokenSlug: (0, _utils2._getChainNativeTokenSlug)(chainInfo),
176
213
  free: transferableBalance.toString(),
177
214
  locked: totalLockedFromTransfer.toString(),
178
215
  state: _KoniTypes.APIItemState.READY,
216
+ lockedDetails,
179
217
  metadata: balanceInfo
180
218
  };
181
219
  });
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.buildLockedDetails = buildLockedDetails;
8
+ exports.getSpecialStakingBalances = getSpecialStakingBalances;
9
+ var _constants = require("@subwallet/extension-base/services/chain-service/constants");
10
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
11
+ // Copyright 2019-2022 @subwallet/extension-base
12
+ // SPDX-License-Identifier: Apache-2.0
13
+
14
+ async function getSpecialStakingBalances(chainInfo, addresses, substrateApi) {
15
+ // Default: 0 for all addresses
16
+ let balances = new Array(addresses.length).fill(new _bignumber.default(0));
17
+
18
+ // --- Bittensor ----------------------------------------------------------------
19
+ if (_constants._BALANCE_CHAIN_GROUP.bittensor.includes(chainInfo.slug)) {
20
+ const rawData = await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkeys(addresses);
21
+ const values = rawData.toPrimitive();
22
+ balances = values.map(_ref => {
23
+ let [, stakes] = _ref;
24
+ return stakes.filter(i => i.netuid === 0).reduce((prev, curr) => prev.plus(curr.stake), (0, _bignumber.default)(0));
25
+ });
26
+ return balances;
27
+ }
28
+ return balances;
29
+ }
30
+
31
+ // handler according to different logic
32
+ const extractId = id => {
33
+ if (!id) {
34
+ return '';
35
+ }
36
+ if (typeof id === 'string') {
37
+ return id.replace(/\0/g, '').trim();
38
+ }
39
+ const keys = Object.keys(id);
40
+ return keys.length ? keys[0] : '';
41
+ };
42
+ function buildLockedDetails(item, totalLockedFromTransfer, reserved, externalStaking) {
43
+ let stakingBalance = externalStaking || new _bignumber.default(0);
44
+ let govBalance = new _bignumber.default(0);
45
+ let democracyBalance = new _bignumber.default(0);
46
+ const reservedBN = new _bignumber.default(reserved.toString());
47
+ for (const entry of item) {
48
+ const id = extractId(entry.id);
49
+ const amount = new _bignumber.default(String(entry.amount || 0));
50
+ if (_constants._BALANCE_LOCKED_ID_GROUP.staking.includes(id)) {
51
+ stakingBalance = stakingBalance.plus(amount);
52
+ } else if (_constants._BALANCE_LOCKED_ID_GROUP.gov.includes(id)) {
53
+ govBalance = govBalance.plus(amount);
54
+ } else if (_constants._BALANCE_LOCKED_ID_GROUP.democracy.includes(id)) {
55
+ democracyBalance = democracyBalance.plus(amount);
56
+ }
57
+ }
58
+
59
+ // others = total locked - max(staking, gov, democracy, reserved)
60
+ const maxMain = _bignumber.default.max(stakingBalance, govBalance, democracyBalance, reservedBN);
61
+ const others = new _bignumber.default(totalLockedFromTransfer.toString()).minus(maxMain);
62
+ return {
63
+ staking: stakingBalance.toFixed(),
64
+ governance: govBalance.toFixed(),
65
+ democracy: democracyBalance.toFixed(),
66
+ reserved: reservedBN.toFixed(),
67
+ others: others.gt(0) ? others.toFixed() : '0'
68
+ };
69
+ }
@@ -13,15 +13,17 @@ var _process = require("@subwallet/extension-base/services/balance-service/helpe
13
13
  var _types = require("@subwallet/extension-base/services/base/types");
14
14
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
15
15
  var _DetectAccountBalance = _interopRequireDefault(require("@subwallet/extension-base/stores/DetectAccountBalance"));
16
+ var _types2 = require("@subwallet/extension-base/types");
16
17
  var _utils2 = require("@subwallet/extension-base/utils");
17
18
  var _keyring = require("@subwallet/keyring");
18
- var _types2 = require("@subwallet/keyring/types");
19
+ var _types3 = require("@subwallet/keyring/types");
19
20
  var _uiKeyring = _interopRequireDefault(require("@subwallet/ui-keyring"));
20
21
  var _subwalletServicesSdk = _interopRequireDefault(require("@subwallet-monorepos/subwallet-services-sdk"));
21
22
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
22
23
  var _i18next = require("i18next");
23
24
  var _rxjs = require("rxjs");
24
25
  var _util = require("@polkadot/util");
26
+ var _constants2 = require("../chain-service/constants");
25
27
  var _acrossBridge = require("./transfer/xcm/acrossBridge");
26
28
  var _BalanceMapImpl = require("./BalanceMapImpl");
27
29
  var _helpers = require("./helpers");
@@ -182,7 +184,7 @@ class BalanceService {
182
184
 
183
185
  /** Subscribe token free balance of an address on chain */
184
186
  async subscribeBalance(address, chain, tokenSlug) {
185
- let balanceType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'transferable';
187
+ let balanceType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _types2.BalanceType.TRANSFERABLE;
186
188
  let extrinsicType = arguments.length > 4 ? arguments[4] : undefined;
187
189
  let callback = arguments.length > 5 ? arguments[5] : undefined;
188
190
  const chainInfo = this.state.chainService.getChainInfoByKey(chain);
@@ -217,9 +219,20 @@ class BalanceService {
217
219
  const rs = result[0];
218
220
  let value;
219
221
  switch (balanceType) {
220
- case 'total':
222
+ case _types2.BalanceType.TOTAL:
221
223
  value = new _bignumber.default(rs.free).plus(new _bignumber.default(rs.locked)).toFixed();
222
224
  break;
225
+ case _types2.BalanceType.TOTAL_MINUS_RESERVED:
226
+ if (_constants2._BALANCE_CHAIN_GROUP.notSupportGetBalanceByType.includes(chainInfo.slug)) {
227
+ // TODO: Currently Vara and Avail staking from nomination pools is not fully supported.
228
+ // Return `free` to avoid incorrect TOTAL_MINUS_RESERVED calculation.
229
+ // Improve later when full staking breakdown is available.
230
+ value = rs.free;
231
+ } else {
232
+ var _rs$lockedDetails, _rs$lockedDetails2;
233
+ value = new _bignumber.default(rs.free).plus(new _bignumber.default(rs.locked)).minus(_bignumber.default.max(new _bignumber.default(((_rs$lockedDetails = rs.lockedDetails) === null || _rs$lockedDetails === void 0 ? void 0 : _rs$lockedDetails.reserved) || 0), new _bignumber.default(((_rs$lockedDetails2 = rs.lockedDetails) === null || _rs$lockedDetails2 === void 0 ? void 0 : _rs$lockedDetails2.staking) || 0))).toFixed();
234
+ }
235
+ break;
223
236
  default:
224
237
  value = rs.free;
225
238
  }
@@ -251,10 +264,16 @@ class BalanceService {
251
264
  });
252
265
  }
253
266
  async subscribeTransferableBalance(address, chain, tokenSlug, extrinsicType, callback) {
254
- return this.subscribeBalance(address, chain, tokenSlug, 'transferable', extrinsicType, callback);
267
+ return this.subscribeBalance(address, chain, tokenSlug, _types2.BalanceType.TRANSFERABLE, extrinsicType, callback);
255
268
  }
256
269
  async subscribeTotalBalance(address, chain, tokenSlug, extrinsicType, callback) {
257
- return this.subscribeBalance(address, chain, tokenSlug, 'total', extrinsicType, callback);
270
+ return this.subscribeBalance(address, chain, tokenSlug, _types2.BalanceType.TOTAL, extrinsicType, callback);
271
+ }
272
+ async subscribeBalanceByType(address, chain, tokenSlug) {
273
+ let balanceType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _types2.BalanceType.TRANSFERABLE;
274
+ let extrinsicType = arguments.length > 4 ? arguments[4] : undefined;
275
+ let callback = arguments.length > 5 ? arguments[5] : undefined;
276
+ return this.subscribeBalance(address, chain, tokenSlug, balanceType, extrinsicType, callback);
258
277
  }
259
278
 
260
279
  /**
@@ -276,6 +295,12 @@ class BalanceService {
276
295
  const [, balance] = await this.subscribeTotalBalance(address, chain, tokenSlug, extrinsicType);
277
296
  return balance;
278
297
  }
298
+ async getBalanceByType(address, chain, tokenSlug) {
299
+ let balanceType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _types2.BalanceType.TRANSFERABLE;
300
+ let extrinsicType = arguments.length > 4 ? arguments[4] : undefined;
301
+ const [, balance] = await this.subscribeBalanceByType(address, chain, tokenSlug, balanceType, extrinsicType);
302
+ return balance;
303
+ }
279
304
 
280
305
  /** Remove balance from the subject object by addresses */
281
306
  removeBalanceByAddresses(addresses) {
@@ -447,7 +472,7 @@ class BalanceService {
447
472
  const assetMap = this.state.chainService.getAssetRegistry();
448
473
  const promiseList = addresses.map(address => {
449
474
  const type = (0, _keyring.getKeypairTypeByAddress)(address);
450
- const typeValid = [..._types2.SubstrateKeypairTypes, ..._types2.EthereumKeypairTypes].includes(type);
475
+ const typeValid = [..._types3.SubstrateKeypairTypes, ..._types3.EthereumKeypairTypes].includes(type);
451
476
  if (typeValid) {
452
477
  return this.state.subscanService.getMultiChainBalance(address).catch(e => {
453
478
  console.error(e);
@@ -459,9 +484,9 @@ class BalanceService {
459
484
  });
460
485
  const evmPromiseList = addresses.map(address => {
461
486
  const type = (0, _keyring.getKeypairTypeByAddress)(address);
462
- const typeValid = [..._types2.EthereumKeypairTypes].includes(type);
487
+ const typeValid = [..._types3.EthereumKeypairTypes].includes(type);
463
488
  if (typeValid) {
464
- return _subwalletServicesSdk.default.balanceDetectionApi.getSubWalletTokenBalance(address).catch(e => {
489
+ return _subwalletServicesSdk.default.balanceDetectionApi.getSwEvmTokenBalance(address).catch(e => {
465
490
  console.error(e);
466
491
  return null;
467
492
  });
@@ -641,7 +666,7 @@ class BalanceService {
641
666
  async evmDetectBalanceToken(addresses) {
642
667
  const assetMap = this.state.chainService.getAssetRegistry();
643
668
  const evmPromiseList = addresses.map(address => {
644
- return _subwalletServicesSdk.default.balanceDetectionApi.getSubWalletTokenBalance(address).catch(e => {
669
+ return _subwalletServicesSdk.default.balanceDetectionApi.getSwEvmTokenBalance(address).catch(e => {
645
670
  console.error(e);
646
671
  return null;
647
672
  });
@@ -748,8 +773,8 @@ class BalanceService {
748
773
  const assetSettings = await this.state.chainService.getAssetSettings();
749
774
  const assetMap = this.state.chainService.getAssetRegistry();
750
775
  const addresses = _uiKeyring.default.getPairs().map(account => account.address);
751
- const evmAddresses = addresses.filter(address => [..._types2.EthereumKeypairTypes].includes((0, _keyring.getKeypairTypeByAddress)(address)));
752
- const substrateAddresses = addresses.filter(address => [..._types2.SubstrateKeypairTypes].includes((0, _keyring.getKeypairTypeByAddress)(address)));
776
+ const evmAddresses = addresses.filter(address => [..._types3.EthereumKeypairTypes].includes((0, _keyring.getKeypairTypeByAddress)(address)));
777
+ const substrateAddresses = addresses.filter(address => [..._types3.SubstrateKeypairTypes].includes((0, _keyring.getKeypairTypeByAddress)(address)));
753
778
  const [nonZeroBalanceEvmToken, nonZeroBalanceSubstrateToken] = await Promise.all([this.evmDetectBalanceToken(evmAddresses), this.substrateDetectBalanceToken(substrateAddresses)]);
754
779
  const substrateDetectChain = this.substrateDetectBalanceChain();
755
780
  const evmDetectChain = await this.evmDetectBalanceChain();
@@ -173,7 +173,9 @@ async function getERC721Transaction(web3Api, chain, contractAddress, senderAddre
173
173
  const error = e;
174
174
  if (error.message.includes('transfer to non ERC721Receiver implementer')) {
175
175
  error.message = (0, _i18next.t)('bg.BALANCE.services.service.balance.transfer.smartContract.nftNotSupportedOnRecipient');
176
+ throw error;
176
177
  }
178
+ error.message = (0, _i18next.t)('bg.BALANCE.services.service.balance.transfer.smartContract.temporarilyNontransferableNFT');
177
179
  throw error;
178
180
  }
179
181
  const feeInfo = _feeInfo;
@@ -3,9 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BTC_SERVICE_TOKEN = exports._BITCOIN_TESTNET_NAME = exports._BITCOIN_TESTNET_CHAIN_SLUG = exports._BITCOIN_NAME = exports._BITCOIN_CHAIN_SLUG = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_MAX_RETRY = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
6
+ exports._ZK_ASSET_PREFIX = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._BTC_SERVICE_TOKEN = exports._BITCOIN_TESTNET_NAME = exports._BITCOIN_TESTNET_CHAIN_SLUG = exports._BITCOIN_NAME = exports._BITCOIN_CHAIN_SLUG = exports._BALANCE_LOCKED_ID_GROUP = exports._BALANCE_CHAIN_GROUP = exports._API_OPTIONS_CHAIN_GROUP = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
7
7
  var _chainList = require("@subwallet/chain-list");
8
- var _types = require("@subwallet/chain-list/types");
9
8
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
9
  // Copyright 2019-2022 @subwallet/extension-base
11
10
  // SPDX-License-Identifier: Apache-2.0
@@ -14,8 +13,6 @@ const API_AUTO_CONNECT_MS = 3000;
14
13
  exports.API_AUTO_CONNECT_MS = API_AUTO_CONNECT_MS;
15
14
  const API_CONNECT_TIMEOUT = 30000;
16
15
  exports.API_CONNECT_TIMEOUT = API_CONNECT_TIMEOUT;
17
- const API_MAX_RETRY = 2;
18
- exports.API_MAX_RETRY = API_MAX_RETRY;
19
16
  const _API_OPTIONS_CHAIN_GROUP = {
20
17
  acala: ['acala', 'karura', 'origintrail', 'kintsugi'],
21
18
  turing: ['turingStaging', 'turing'],
@@ -47,14 +44,16 @@ const _BALANCE_CHAIN_GROUP = {
47
44
  centrifuge: ['centrifuge'],
48
45
  supportBridged: ['rococo_assethub', 'statemint', 'statemine', 'polimec'],
49
46
  bittensor: ['bittensor', 'bittensor_testnet'],
50
- moonbeam: ['moonbeam', 'moonriver', 'moonbase']
47
+ moonbeam: ['moonbeam', 'moonriver', 'moonbase'],
48
+ notSupportGetBalanceByType: ['vara_network', 'vara_testnet', 'availTuringTest', 'avail_mainnet']
51
49
  };
52
50
  exports._BALANCE_CHAIN_GROUP = _BALANCE_CHAIN_GROUP;
53
- const _BALANCE_TOKEN_GROUP = {
54
- crab: ['CKTON', 'PKTON'],
55
- bitcountry: ['BIT']
51
+ const _BALANCE_LOCKED_ID_GROUP = {
52
+ staking: ['staking', 'delegatedStaking', 'pooledStaking', 'stkngdel', 'stk_stks', 'dappStaking', 'parachainStaking', 'appstakeappstake', 'collatorStaking'],
53
+ gov: ['pyconvot'],
54
+ democracy: ['democrac']
56
55
  };
57
- exports._BALANCE_TOKEN_GROUP = _BALANCE_TOKEN_GROUP;
56
+ exports._BALANCE_LOCKED_ID_GROUP = _BALANCE_LOCKED_ID_GROUP;
58
57
  const _NFT_CHAIN_GROUP = {
59
58
  acala: ['acala'],
60
59
  karura: ['karura'],
@@ -291,13 +290,10 @@ const _KNOWN_CHAIN_INFLATION_PARAMS = {
291
290
 
292
291
  // Send fund------------------------------------------------------------------------------------------------------------
293
292
  exports._KNOWN_CHAIN_INFLATION_PARAMS = _KNOWN_CHAIN_INFLATION_PARAMS;
294
- const _TRANSFER_NOT_SUPPORTED_CHAINS = ['subspace_gemini_3a', 'kulupu', 'joystream', 'equilibrium_parachain', 'genshiro_testnet', 'genshiro'];
295
- exports._TRANSFER_NOT_SUPPORTED_CHAINS = _TRANSFER_NOT_SUPPORTED_CHAINS;
296
293
  const _TRANSFER_CHAIN_GROUP = {
297
294
  acala: ['karura', 'acala', 'acala_testnet'],
298
295
  kintsugi: ['kintsugi', 'kintsugi_test', 'interlay', 'mangatax_para'],
299
296
  genshiro: ['genshiro_testnet', 'genshiro', 'equilibrium_parachain'],
300
- // crab: ['crab', 'pangolin'],
301
297
  bitcountry: ['pioneer', 'bitcountry'],
302
298
  statemine: ['statemint', 'statemine', 'darwinia2', 'astar', 'shiden', 'shibuya', 'parallel', 'liberland', 'liberlandTest', 'dentnet', 'dbcchain', 'westend_assethub', 'chainflip_assethub', 'origintrail', 'xode', 'paseo_assethub'],
303
299
  riochain: ['riochain'],
@@ -309,10 +305,6 @@ const _TRANSFER_CHAIN_GROUP = {
309
305
  truth: ['truth_network']
310
306
  };
311
307
  exports._TRANSFER_CHAIN_GROUP = _TRANSFER_CHAIN_GROUP;
312
- const _BALANCE_PARSING_CHAIN_GROUP = {
313
- bobabeam: ['bobabeam', 'bobabase']
314
- };
315
- exports._BALANCE_PARSING_CHAIN_GROUP = _BALANCE_PARSING_CHAIN_GROUP;
316
308
  const _MANTA_ZK_CHAIN_GROUP = ['calamari'];
317
309
  exports._MANTA_ZK_CHAIN_GROUP = _MANTA_ZK_CHAIN_GROUP;
318
310
  const _ZK_ASSET_PREFIX = 'zk';
@@ -321,21 +313,6 @@ const _DEFAULT_MANTA_ZK_CHAIN = 'calamari';
321
313
 
322
314
  // XCM------------------------------------------------------------------------------------------------------------------
323
315
  exports._DEFAULT_MANTA_ZK_CHAIN = _DEFAULT_MANTA_ZK_CHAIN;
324
- const _XCM_CHAIN_GROUP = {
325
- polkadotXcm: ['statemine', 'statemint', 'equilibrium_parachain', 'rococo_assethub', 'mythos', 'westend_assethub'],
326
- polkadotXcmSpecialCases: ['astar', 'shiden'],
327
- xcmPallet: ['polkadot', 'kusama', 'rococo', 'westend']
328
- // default is xTokens pallet
329
- };
330
- exports._XCM_CHAIN_GROUP = _XCM_CHAIN_GROUP;
331
- const _XCM_TYPE = {
332
- RP: `${_types._SubstrateChainType.RELAYCHAIN}-${_types._SubstrateChainType.PARACHAIN}`,
333
- // DMP
334
- PP: `${_types._SubstrateChainType.PARACHAIN}-${_types._SubstrateChainType.PARACHAIN}`,
335
- // HRMP
336
- PR: `${_types._SubstrateChainType.PARACHAIN}-${_types._SubstrateChainType.RELAYCHAIN}` // UMP
337
- };
338
- exports._XCM_TYPE = _XCM_TYPE;
339
316
  const _DEFAULT_ACTIVE_CHAINS = [..._chainList._DEFAULT_CHAINS, 'vara_network', 'ton'];
340
317
  exports._DEFAULT_ACTIVE_CHAINS = _DEFAULT_ACTIVE_CHAINS;
341
318
  const EVM_PASS_CONNECT_STATUS = {
@@ -351,10 +328,7 @@ const EVM_REFORMAT_DECIMALS = {
351
328
  };
352
329
  exports.EVM_REFORMAT_DECIMALS = EVM_REFORMAT_DECIMALS;
353
330
  const LATEST_CHAIN_DATA_FETCHING_INTERVAL = 120000;
354
-
355
- // TODO: review
356
331
  exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = LATEST_CHAIN_DATA_FETCHING_INTERVAL;
357
- const TARGET_BRANCH = process.env.NODE_ENV !== 'production' ? 'koni-dev' : 'master';
358
332
  const _BITCOIN_CHAIN_SLUG = 'bitcoin';
359
333
  exports._BITCOIN_CHAIN_SLUG = _BITCOIN_CHAIN_SLUG;
360
334
  const _BITCOIN_TESTNET_CHAIN_SLUG = 'bitcoinTestnet';
@@ -363,17 +337,5 @@ const _BITCOIN_NAME = 'Bitcoin';
363
337
  exports._BITCOIN_NAME = _BITCOIN_NAME;
364
338
  const _BITCOIN_TESTNET_NAME = 'Bitcoin Testnet';
365
339
  exports._BITCOIN_TESTNET_NAME = _BITCOIN_TESTNET_NAME;
366
- const _CHAIN_INFO_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/ChainInfo.json`;
367
- exports._CHAIN_INFO_SRC = _CHAIN_INFO_SRC;
368
- const _CHAIN_ASSET_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/ChainAsset.json`;
369
- exports._CHAIN_ASSET_SRC = _CHAIN_ASSET_SRC;
370
- const _ASSET_REF_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/AssetRef.json`;
371
- exports._ASSET_REF_SRC = _ASSET_REF_SRC;
372
- const _MULTI_CHAIN_ASSET_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/MultiChainAsset.json`;
373
- exports._MULTI_CHAIN_ASSET_SRC = _MULTI_CHAIN_ASSET_SRC;
374
- const _CHAIN_LOGO_MAP_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/ChainLogoMap.json`;
375
- exports._CHAIN_LOGO_MAP_SRC = _CHAIN_LOGO_MAP_SRC;
376
- const _ASSET_LOGO_MAP_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/AssetLogoMap.json`;
377
- exports._ASSET_LOGO_MAP_SRC = _ASSET_LOGO_MAP_SRC;
378
340
  const _BTC_SERVICE_TOKEN = process.env.BTC_SERVICE_TOKEN || '';
379
341
  exports._BTC_SERVICE_TOKEN = _BTC_SERVICE_TOKEN;
@@ -126,6 +126,9 @@ class EvmChainHandler extends _AbstractChainHandler.AbstractChainHandler {
126
126
  tokenContract.methods.symbol().call()]);
127
127
  name = _name;
128
128
  symbol = _symbol;
129
+ if (name === '') {
130
+ contractError = true;
131
+ }
129
132
  } else {
130
133
  tokenContract = new evmApi.api.eth.Contract(_utils._ERC20_ABI, contractAddress);
131
134
  const [_decimals, _symbol, _name] = await Promise.all([
@@ -138,9 +141,9 @@ class EvmChainHandler extends _AbstractChainHandler.AbstractChainHandler {
138
141
  name = _name;
139
142
  decimals = new _bignumber.default(_decimals).toNumber();
140
143
  symbol = _symbol;
141
- }
142
- if (name === '' || symbol === '') {
143
- contractError = true;
144
+ if (name === '' || symbol === '') {
145
+ contractError = true;
146
+ }
144
147
  }
145
148
  return {
146
149
  name,
@@ -8,6 +8,7 @@ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
8
8
  var _constants = require("@subwallet/extension-base/constants");
9
9
  var _constants2 = require("@subwallet/extension-base/services/earning-service/constants");
10
10
  var _utils = require("@subwallet/extension-base/services/inapp-notification-service/utils");
11
+ var _types = require("@subwallet/extension-base/types");
11
12
  var _utils2 = require("@subwallet/extension-base/utils");
12
13
  var _util = require("@polkadot/util");
13
14
  // Copyright 2019-2022 @subwallet/extension-base
@@ -162,7 +163,12 @@ class BasePoolHandler {
162
163
  }
163
164
  const nativeTokenInfo = this.state.chainService.getNativeTokenInfo(this.chain);
164
165
  // Use TRANSFER_BALANCE extrinsic in order to get transferable balanace without minus ED
165
- const nativeTokenBalance = await this.state.balanceService.getTransferableBalance(request.address, this.chain, undefined, _KoniTypes.ExtrinsicType.TRANSFER_BALANCE);
166
+ let nativeTokenBalance;
167
+ if ([_types.YieldPoolType.NATIVE_STAKING, _types.YieldPoolType.NOMINATION_POOL].includes(poolInfo.type)) {
168
+ nativeTokenBalance = await this.state.balanceService.getBalanceByType(request.address, this.chain, undefined, _types.BalanceType.TOTAL_MINUS_RESERVED, _KoniTypes.ExtrinsicType.TRANSFER_BALANCE);
169
+ } else {
170
+ nativeTokenBalance = await this.state.balanceService.getTransferableBalance(request.address, this.chain, undefined, _KoniTypes.ExtrinsicType.TRANSFER_BALANCE);
171
+ }
166
172
  const bnNativeTokenBalance = new _util.BN(nativeTokenBalance.value);
167
173
  const bnMinBalanceToJoin = new _util.BN(((_poolInfo$statistic2 = poolInfo.statistic) === null || _poolInfo$statistic2 === void 0 ? void 0 : (_poolInfo$statistic2$ = _poolInfo$statistic2.earningThreshold) === null || _poolInfo$statistic2$ === void 0 ? void 0 : _poolInfo$statistic2$.join) || '0').add(new _util.BN(poolInfo.metadata.maintainBalance));
168
174
  if (bnNativeTokenBalance.lte(bnMinBalanceToJoin)) {