@subwallet/extension-base 1.3.66-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 (81) 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/core/substrate/xcm-parser.js +0 -176
  6. package/cjs/koni/api/nft/rari/index.js +1 -1
  7. package/cjs/koni/background/cron.js +16 -0
  8. package/cjs/koni/background/handlers/Extension.js +166 -90
  9. package/cjs/koni/background/handlers/State.js +25 -0
  10. package/cjs/packageInfo.js +1 -1
  11. package/cjs/services/balance-service/helpers/group.js +31 -2
  12. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +51 -13
  13. package/cjs/services/balance-service/helpers/subscribe/substrate/utils.js +69 -0
  14. package/cjs/services/balance-service/index.js +36 -11
  15. package/cjs/services/balance-service/transfer/smart-contract.js +56 -23
  16. package/cjs/services/balance-service/transfer/xcm/index.js +30 -44
  17. package/cjs/services/balance-service/transfer/xcm/utils.js +53 -18
  18. package/cjs/services/chain-service/constants.js +8 -46
  19. package/cjs/services/chain-service/handler/EvmChainHandler.js +6 -3
  20. package/cjs/services/earning-service/handlers/base.js +7 -1
  21. package/cjs/services/nft-service/index.js +173 -0
  22. package/cjs/services/swap-service/handler/base-handler.js +18 -21
  23. package/cjs/services/transaction-service/index.js +1 -1
  24. package/cjs/types/balance/index.js +26 -1
  25. package/cjs/utils/fee/transfer.js +5 -2
  26. package/cjs/utils/index.js +25 -2
  27. package/cjs/utils/setup-api-sdk.js +0 -5
  28. package/constants/environment.d.ts +0 -1
  29. package/constants/environment.js +0 -1
  30. package/constants/index.d.ts +1 -0
  31. package/constants/index.js +1 -0
  32. package/core/substrate/system-pallet.d.ts +1 -0
  33. package/core/substrate/system-pallet.js +3 -0
  34. package/core/substrate/types.d.ts +14 -0
  35. package/core/substrate/xcm-parser.d.ts +1 -49
  36. package/core/substrate/xcm-parser.js +1 -173
  37. package/koni/api/nft/rari/index.js +1 -1
  38. package/koni/background/cron.d.ts +1 -0
  39. package/koni/background/cron.js +17 -1
  40. package/koni/background/handlers/Extension.d.ts +3 -0
  41. package/koni/background/handlers/Extension.js +88 -14
  42. package/koni/background/handlers/State.d.ts +4 -0
  43. package/koni/background/handlers/State.js +25 -0
  44. package/package.json +16 -21
  45. package/packageInfo.js +1 -1
  46. package/services/balance-service/helpers/group.js +31 -2
  47. package/services/balance-service/helpers/subscribe/substrate/index.js +51 -13
  48. package/services/balance-service/helpers/subscribe/substrate/utils.d.ts +7 -0
  49. package/services/balance-service/helpers/subscribe/substrate/utils.js +58 -0
  50. package/services/balance-service/index.d.ts +4 -2
  51. package/services/balance-service/index.js +26 -6
  52. package/services/balance-service/transfer/smart-contract.d.ts +4 -0
  53. package/services/balance-service/transfer/smart-contract.js +54 -23
  54. package/services/balance-service/transfer/xcm/index.d.ts +2 -2
  55. package/services/balance-service/transfer/xcm/index.js +18 -32
  56. package/services/balance-service/transfer/xcm/utils.d.ts +1 -2
  57. package/services/balance-service/transfer/xcm/utils.js +51 -15
  58. package/services/chain-service/constants.d.ts +5 -24
  59. package/services/chain-service/constants.js +6 -35
  60. package/services/chain-service/handler/EvmChainHandler.js +6 -3
  61. package/services/earning-service/handlers/base.js +7 -1
  62. package/services/nft-service/index.d.ts +9 -0
  63. package/services/nft-service/index.js +165 -0
  64. package/services/swap-service/handler/base-handler.d.ts +0 -1
  65. package/services/swap-service/handler/base-handler.js +19 -22
  66. package/services/transaction-service/index.js +1 -1
  67. package/services/transaction-service/types.d.ts +2 -1
  68. package/types/balance/index.d.ts +14 -0
  69. package/types/balance/index.js +21 -1
  70. package/utils/fee/transfer.js +6 -3
  71. package/utils/index.js +25 -2
  72. package/utils/setup-api-sdk.js +1 -6
  73. package/cjs/services/balance-service/transfer/xcm/polkadotXcm.js +0 -30
  74. package/cjs/services/balance-service/transfer/xcm/xTokens.js +0 -32
  75. package/cjs/services/balance-service/transfer/xcm/xcmPallet.js +0 -23
  76. package/services/balance-service/transfer/xcm/polkadotXcm.d.ts +0 -3
  77. package/services/balance-service/transfer/xcm/polkadotXcm.js +0 -24
  78. package/services/balance-service/transfer/xcm/xTokens.d.ts +0 -3
  79. package/services/balance-service/transfer/xcm/xTokens.js +0 -26
  80. package/services/balance-service/transfer/xcm/xcmPallet.d.ts +0 -3
  81. package/services/balance-service/transfer/xcm/xcmPallet.js +0 -17
@@ -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.66-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();
@@ -4,6 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ exports.gasSettingsForEWC = void 0;
7
8
  exports.getERC20TransactionObject = getERC20TransactionObject;
8
9
  exports.getERC721Transaction = getERC721Transaction;
9
10
  exports.getEVMTransactionObject = getEVMTransactionObject;
@@ -19,6 +20,12 @@ var _i18next = require("i18next");
19
20
  // Copyright 2019-2022 @subwallet/extension-base
20
21
  // SPDX-License-Identifier: Apache-2.0
21
22
 
23
+ // hot fix gas settings for Energy Web Chain
24
+ const gasSettingsForEWC = {
25
+ gasLimit: 4900000,
26
+ maxFeePerGas: '10000000'
27
+ };
28
+ exports.gasSettingsForEWC = gasSettingsForEWC;
22
29
  async function getEVMTransactionObject(props) {
23
30
  const {
24
31
  chain,
@@ -33,10 +40,18 @@ async function getEVMTransactionObject(props) {
33
40
  transferAll,
34
41
  value
35
42
  } = props;
43
+ const isEnergyWebChain = chain === 'energy_web_chain'; // hot fix gas settings for Energy Web Chain
44
+
36
45
  const feeCustom = _feeCustom;
37
46
  const feeInfo = _feeInfo;
38
47
  const feeCombine = (0, _utils3.combineEthFee)(feeInfo, feeOption, feeCustom);
39
48
  let errorOnEstimateFee = '';
49
+ if (isEnergyWebChain) {
50
+ feeCombine.maxFeePerGas = gasSettingsForEWC.maxFeePerGas;
51
+ if (!feeCombine.maxPriorityFeePerGas || new _bignumber.default(feeCombine.maxPriorityFeePerGas).gt(feeCombine.maxFeePerGas)) {
52
+ feeCombine.maxPriorityFeePerGas = gasSettingsForEWC.maxFeePerGas;
53
+ }
54
+ }
40
55
  const transactionObject = {
41
56
  to,
42
57
  value,
@@ -44,16 +59,21 @@ async function getEVMTransactionObject(props) {
44
59
  data,
45
60
  ...feeCombine
46
61
  };
47
- const gasEstimate = await evmApi.api.eth.estimateGas(transactionObject).catch(e => {
48
- console.log('Cannot estimate fee with native transfer on', chain, e);
49
- if (fallbackFee) {
50
- errorOnEstimateFee = e.message;
51
- return 21000;
52
- } else {
53
- throw Error('Unable to estimate fee for this transaction. Edit fee and try again.');
54
- }
55
- });
56
- const gasLimit = Math.floor(gasEstimate * 1.1); // 10% buffer for fluctuations
62
+ let gasLimit;
63
+ if (isEnergyWebChain) {
64
+ gasLimit = gasSettingsForEWC.gasLimit;
65
+ } else {
66
+ const gasEstimate = await evmApi.api.eth.estimateGas(transactionObject).catch(e => {
67
+ console.log('Cannot estimate fee with native transfer on', chain, e);
68
+ if (fallbackFee) {
69
+ errorOnEstimateFee = e.message;
70
+ return 21000;
71
+ } else {
72
+ throw Error('Unable to estimate fee for this transaction. Edit fee and try again.');
73
+ }
74
+ });
75
+ gasLimit = Math.floor(gasEstimate * 1.1); // 10% buffer for fluctuations
76
+ }
57
77
 
58
78
  transactionObject.gas = gasLimit;
59
79
  let estimateFee;
@@ -84,6 +104,8 @@ async function getERC20TransactionObject(props) {
84
104
  transferAll,
85
105
  value
86
106
  } = props;
107
+ const isEnergyWebChain = chain === 'energy_web_chain'; // hot fix gas settings for Energy Web Chain
108
+
87
109
  const erc20Contract = (0, _web.getERC20Contract)(assetAddress, evmApi);
88
110
  const feeCustom = _feeCustom;
89
111
  let freeAmount = new _bignumber.default(0);
@@ -99,21 +121,30 @@ async function getERC20TransactionObject(props) {
99
121
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
100
122
  return erc20Contract.methods.transfer(to, transferValue).encodeABI();
101
123
  }
102
- const transferData = generateTransferData(to, transferValue);
103
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
104
- const gasLimit = await erc20Contract.methods.transfer(to, transferValue).estimateGas({
105
- from
106
- }).catch(e => {
107
- console.log('Cannot estimate fee with token contract', assetAddress, chain, e);
108
- if (fallbackFee) {
109
- errorOnEstimateFee = e.message;
110
- return 70000;
111
- } else {
112
- throw Error('Unable to estimate fee for this transaction. Edit fee and try again.');
113
- }
114
- });
115
124
  const feeInfo = _feeInfo;
116
125
  const feeCombine = (0, _utils3.combineEthFee)(feeInfo, feeOption, feeCustom);
126
+ const transferData = generateTransferData(to, transferValue);
127
+ let gasLimit;
128
+ if (isEnergyWebChain) {
129
+ gasLimit = gasSettingsForEWC.gasLimit;
130
+ feeCombine.maxFeePerGas = gasSettingsForEWC.maxFeePerGas;
131
+ if (!feeCombine.maxPriorityFeePerGas || new _bignumber.default(feeCombine.maxPriorityFeePerGas).gt(feeCombine.maxFeePerGas)) {
132
+ feeCombine.maxPriorityFeePerGas = gasSettingsForEWC.maxFeePerGas;
133
+ }
134
+ } else {
135
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
136
+ gasLimit = await erc20Contract.methods.transfer(to, transferValue).estimateGas({
137
+ from
138
+ }).catch(e => {
139
+ console.log('Cannot estimate fee with token contract', assetAddress, chain, e);
140
+ if (fallbackFee) {
141
+ errorOnEstimateFee = e.message;
142
+ return 70000;
143
+ } else {
144
+ throw Error('Unable to estimate fee for this transaction. Edit fee and try again.');
145
+ }
146
+ });
147
+ }
117
148
  const transactionObject = {
118
149
  gas: gasLimit,
119
150
  from,
@@ -142,7 +173,9 @@ async function getERC721Transaction(web3Api, chain, contractAddress, senderAddre
142
173
  const error = e;
143
174
  if (error.message.includes('transfer to non ERC721Receiver implementer')) {
144
175
  error.message = (0, _i18next.t)('bg.BALANCE.services.service.balance.transfer.smartContract.nftNotSupportedOnRecipient');
176
+ throw error;
145
177
  }
178
+ error.message = (0, _i18next.t)('bg.BALANCE.services.service.balance.transfer.smartContract.temporarilyNontransferableNFT');
146
179
  throw error;
147
180
  }
148
181
  const feeInfo = _feeInfo;