@subwallet/extension-base 1.1.44-0 → 1.1.46-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 (30) hide show
  1. package/cjs/constants/index.js +4 -1
  2. package/cjs/koni/background/handlers/Extension.js +4 -4
  3. package/cjs/packageInfo.js +1 -1
  4. package/cjs/services/chain-service/constants.js +5 -3
  5. package/cjs/services/chain-service/index.js +5 -5
  6. package/cjs/services/earning-service/constants/chains.js +1 -1
  7. package/cjs/services/earning-service/service.js +1 -1
  8. package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js +5 -1
  9. package/cjs/services/migration-service/scripts/databases/AutoEnableSomeTokens.js +30 -0
  10. package/cjs/services/migration-service/scripts/databases/MigrateAssetSetting.js +2 -1
  11. package/cjs/services/migration-service/scripts/index.js +3 -1
  12. package/cjs/services/request-service/handler/AuthRequestHandler.js +59 -21
  13. package/cjs/services/transaction-service/utils.js +3 -0
  14. package/constants/index.d.ts +1 -0
  15. package/constants/index.js +1 -0
  16. package/koni/background/handlers/Extension.js +6 -6
  17. package/package.json +11 -6
  18. package/packageInfo.js +1 -1
  19. package/services/chain-service/constants.js +5 -3
  20. package/services/chain-service/index.js +5 -5
  21. package/services/earning-service/constants/chains.js +1 -1
  22. package/services/earning-service/service.js +1 -1
  23. package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js +5 -1
  24. package/services/migration-service/scripts/databases/AutoEnableSomeTokens.d.ts +4 -0
  25. package/services/migration-service/scripts/databases/AutoEnableSomeTokens.js +22 -0
  26. package/services/migration-service/scripts/databases/MigrateAssetSetting.js +2 -1
  27. package/services/migration-service/scripts/index.js +3 -1
  28. package/services/request-service/handler/AuthRequestHandler.d.ts +1 -0
  29. package/services/request-service/handler/AuthRequestHandler.js +54 -20
  30. package/services/transaction-service/utils.js +3 -0
@@ -29,12 +29,13 @@ var _exportNames = {
29
29
  IGNORE_GET_SUBSTRATE_FEATURES_LIST: true,
30
30
  IGNORE_QR_SIGNER: true,
31
31
  XCM_MIN_AMOUNT_RATIO: true,
32
+ XCM_FEE_RATIO: true,
32
33
  GAS_PRICE_RATIO: true,
33
34
  NETWORK_MULTI_GAS_FEE: true,
34
35
  ORDINAL_COLLECTION: true,
35
36
  ORDINAL_METHODS: true
36
37
  };
37
- exports.XCM_MIN_AMOUNT_RATIO = exports.SUB_TOKEN_REFRESH_BALANCE_INTERVAL = exports.ORDINAL_METHODS = exports.ORDINAL_COLLECTION = exports.NETWORK_MULTI_GAS_FEE = exports.MANTA_PAY_BALANCE_INTERVAL = exports.IGNORE_QR_SIGNER = exports.IGNORE_GET_SUBSTRATE_FEATURES_LIST = exports.GAS_PRICE_RATIO = exports.CRON_SYNC_MANTA_PAY = exports.CRON_REFRESH_STAKING_REWARD_INTERVAL = exports.CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL = exports.CRON_REFRESH_PRICE_INTERVAL = exports.CRON_REFRESH_NFT_INTERVAL = exports.CRON_REFRESH_HISTORY_INTERVAL = exports.CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL = exports.CRON_REFRESH_CHAIN_STAKING_METADATA = exports.CRON_REFRESH_CHAIN_NOMINATOR_METADATA = exports.CRON_RECOVER_HISTORY_INTERVAL = exports.CRON_GET_API_MAP_STATUS = exports.CRON_AUTO_RECOVER_WEB3_INTERVAL = exports.CRON_AUTO_RECOVER_DOTSAMA_INTERVAL = exports.BASE_SECOND_INTERVAL = exports.BASE_MINUTE_INTERVAL = exports.ASTAR_REFRESH_BALANCE_INTERVAL = exports.ALL_NETWORK_KEY = exports.ALL_GENESIS_HASH = exports.ALL_ACCOUNT_KEY = exports.ACALA_REFRESH_CROWDLOAN_INTERVAL = void 0;
38
+ exports.XCM_MIN_AMOUNT_RATIO = exports.XCM_FEE_RATIO = exports.SUB_TOKEN_REFRESH_BALANCE_INTERVAL = exports.ORDINAL_METHODS = exports.ORDINAL_COLLECTION = exports.NETWORK_MULTI_GAS_FEE = exports.MANTA_PAY_BALANCE_INTERVAL = exports.IGNORE_QR_SIGNER = exports.IGNORE_GET_SUBSTRATE_FEATURES_LIST = exports.GAS_PRICE_RATIO = exports.CRON_SYNC_MANTA_PAY = exports.CRON_REFRESH_STAKING_REWARD_INTERVAL = exports.CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL = exports.CRON_REFRESH_PRICE_INTERVAL = exports.CRON_REFRESH_NFT_INTERVAL = exports.CRON_REFRESH_HISTORY_INTERVAL = exports.CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL = exports.CRON_REFRESH_CHAIN_STAKING_METADATA = exports.CRON_REFRESH_CHAIN_NOMINATOR_METADATA = exports.CRON_RECOVER_HISTORY_INTERVAL = exports.CRON_GET_API_MAP_STATUS = exports.CRON_AUTO_RECOVER_WEB3_INTERVAL = exports.CRON_AUTO_RECOVER_DOTSAMA_INTERVAL = exports.BASE_SECOND_INTERVAL = exports.BASE_MINUTE_INTERVAL = exports.ASTAR_REFRESH_BALANCE_INTERVAL = exports.ALL_NETWORK_KEY = exports.ALL_GENESIS_HASH = exports.ALL_ACCOUNT_KEY = exports.ACALA_REFRESH_CROWDLOAN_INTERVAL = void 0;
38
39
  var _staking = require("./staking");
39
40
  Object.keys(_staking).forEach(function (key) {
40
41
  if (key === "default" || key === "__esModule") return;
@@ -112,6 +113,8 @@ const IGNORE_QR_SIGNER = [];
112
113
  exports.IGNORE_QR_SIGNER = IGNORE_QR_SIGNER;
113
114
  const XCM_MIN_AMOUNT_RATIO = 1.2;
114
115
  exports.XCM_MIN_AMOUNT_RATIO = XCM_MIN_AMOUNT_RATIO;
116
+ const XCM_FEE_RATIO = 1.2;
117
+ exports.XCM_FEE_RATIO = XCM_FEE_RATIO;
115
118
  const GAS_PRICE_RATIO = 1 + 2 / 100;
116
119
  exports.GAS_PRICE_RATIO = GAS_PRICE_RATIO;
117
120
  const NETWORK_MULTI_GAS_FEE = ['*'];
@@ -1936,7 +1936,7 @@ class KoniExtension {
1936
1936
  } else {
1937
1937
  const substrateApi = this.#koniState.chainService.getSubstrateApi(networkKey);
1938
1938
  let estimatedFee;
1939
- let maxTransferable = new _util.BN(freeBalance.value);
1939
+ let maxTransferable = new _bignumber.default(freeBalance.value);
1940
1940
  try {
1941
1941
  if (isXcmTransfer) {
1942
1942
  const chainInfoMap = this.#koniState.chainService.getChainInfoMap();
@@ -1944,7 +1944,7 @@ class KoniExtension {
1944
1944
  if (!destinationTokenInfo) {
1945
1945
  estimatedFee = '0';
1946
1946
  } else {
1947
- maxTransferable = maxTransferable.sub(new _util.BN(tokenInfo.minAmount || '0'));
1947
+ maxTransferable = maxTransferable.minus(new _bignumber.default(tokenInfo.minAmount || '0').multipliedBy(_constants.XCM_FEE_RATIO));
1948
1948
  const desChainInfo = chainInfoMap[destChain];
1949
1949
  const orgChainInfo = chainInfoMap[networkKey];
1950
1950
  const recipient = !(0, _utilCrypto.isEthereumAddress)(address) && (0, _utils2._isChainEvmCompatible)(desChainInfo) && !(0, _utils2._isChainEvmCompatible)(orgChainInfo) ? (0, _util.u8aToHex)((0, _utilCrypto.addressToEvm)(address)) : address;
@@ -2001,10 +2001,10 @@ class KoniExtension {
2001
2001
  estimatedFee = '0';
2002
2002
  console.warn('Unable to estimate fee', e);
2003
2003
  }
2004
- maxTransferable = maxTransferable.sub(new _util.BN(estimatedFee));
2004
+ maxTransferable = maxTransferable.minus(new _bignumber.default(estimatedFee));
2005
2005
  return {
2006
2006
  ...freeBalance,
2007
- value: maxTransferable.gt(_util.BN_ZERO) ? maxTransferable.toString() || '0' : '0'
2007
+ value: maxTransferable.gt(_utils4.BN_ZERO) ? maxTransferable.toString() || '0' : '0'
2008
2008
  };
2009
2009
  }
2010
2010
  }
@@ -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.1.44-0'
16
+ version: '1.1.46-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -40,7 +40,7 @@ const _BALANCE_CHAIN_GROUP = {
40
40
  genshiro: ['genshiro_testnet', 'genshiro'],
41
41
  equilibrium_parachain: ['equilibrium_parachain'],
42
42
  bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry', 'bifrost_dot', 'hydradx_main', 'pendulum', 'amplitude', 'continuum_network'],
43
- statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel', 'calamari', 'manta_network', 'rococo_assethub', 'liberlandTest', 'liberland', 'dentnet', 'pangolin'],
43
+ statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel', 'calamari', 'manta_network', 'rococo_assethub', 'liberlandTest', 'liberland', 'dentnet', 'pangolin', 'crust', 'phala'],
44
44
  kusama: ['kusama', 'kintsugi', 'kintsugi_test', 'interlay', 'acala', 'statemint', 'karura', 'bifrost'],
45
45
  // perhaps there are some runtime updates
46
46
  centrifuge: ['centrifuge'],
@@ -100,7 +100,8 @@ const _STAKING_ERA_LENGTH_MAP = {
100
100
  vara_network: 12,
101
101
  goldberg_testnet: 24,
102
102
  manta_network: 6,
103
- krest_network: 4
103
+ krest_network: 4,
104
+ polimec: 6
104
105
  };
105
106
  exports._STAKING_ERA_LENGTH_MAP = _STAKING_ERA_LENGTH_MAP;
106
107
  const _EXPECTED_BLOCK_TIME = {
@@ -117,7 +118,8 @@ const _EXPECTED_BLOCK_TIME = {
117
118
  edgeware: 6,
118
119
  creditcoin: 12,
119
120
  vara_network: 3,
120
- goldberg_testnet: 20
121
+ goldberg_testnet: 20,
122
+ polimec: 12
121
123
  };
122
124
  exports._EXPECTED_BLOCK_TIME = _EXPECTED_BLOCK_TIME;
123
125
  const _PARACHAIN_INFLATION_DISTRIBUTION = {
@@ -1518,15 +1518,15 @@ class ChainService {
1518
1518
  const chainInfoMap = this.getChainInfoMap();
1519
1519
  Object.values(chainInfoMap).forEach(i => {
1520
1520
  var _i$extraInfo;
1521
- if (!((_i$extraInfo = i.extraInfo) !== null && _i$extraInfo !== void 0 && _i$extraInfo.subscanSlug)) {
1521
+ const subscanSlug = i.slug === 'goldberg_testnet' ? 'avail-testnet' : (_i$extraInfo = i.extraInfo) === null || _i$extraInfo === void 0 ? void 0 : _i$extraInfo.subscanSlug; // Hotfix for Goldberg testnet
1522
+
1523
+ if (!subscanSlug) {
1522
1524
  return;
1523
1525
  }
1524
1526
  if (!reverse) {
1525
- var _i$extraInfo2;
1526
- result[i.slug] = (_i$extraInfo2 = i.extraInfo) === null || _i$extraInfo2 === void 0 ? void 0 : _i$extraInfo2.subscanSlug;
1527
+ result[i.slug] = subscanSlug;
1527
1528
  } else {
1528
- var _i$extraInfo3;
1529
- result[(_i$extraInfo3 = i.extraInfo) === null || _i$extraInfo3 === void 0 ? void 0 : _i$extraInfo3.subscanSlug] = i.slug;
1529
+ result[subscanSlug] = i.slug;
1530
1530
  }
1531
1531
  });
1532
1532
  return result;
@@ -9,7 +9,7 @@ exports._STAKING_CHAIN_GROUP = exports.ST_LIQUID_TOKEN_ABI = exports.MANTA_VALID
9
9
 
10
10
  const _STAKING_CHAIN_GROUP = {
11
11
  relay: ['polkadot', 'kusama', 'aleph', 'polkadex', 'ternoa', 'alephTest', 'polkadexTest', 'westend', 'kate', 'edgeware', 'creditcoin', 'vara_network', 'goldberg_testnet'],
12
- para: ['moonbeam', 'moonriver', 'moonbase', 'turing', 'turingStaging', 'bifrost', 'bifrost_testnet', 'calamari_test', 'calamari', 'manta_network'],
12
+ para: ['moonbeam', 'moonriver', 'moonbase', 'turing', 'turingStaging', 'bifrost', 'bifrost_testnet', 'calamari_test', 'calamari', 'manta_network', 'polimec'],
13
13
  astar: ['astar', 'shiden', 'shibuya'],
14
14
  amplitude: ['amplitude', 'amplitude_test', 'kilt', 'kilt_peregrine', 'pendulum', 'krest_network'],
15
15
  // amplitude and kilt only share some common logic
@@ -277,7 +277,7 @@ class EarningService {
277
277
  const unsubList = [];
278
278
  for (const handler of Object.values(this.handlers)) {
279
279
  // Force subscribe onchain data
280
- const forceSubscribe = handler.type === _types2.YieldPoolType.LIQUID_STAKING || handler.type === _types2.YieldPoolType.LENDING;
280
+ const forceSubscribe = handler.type === _types2.YieldPoolType.LIQUID_STAKING || handler.type === _types2.YieldPoolType.LENDING || !onlineData[handler.slug];
281
281
  if (!this.useOnlineCacheOnly || forceSubscribe) {
282
282
  handler.subscribePoolInfo(callback).then(unsub => {
283
283
  if (!cancel) {
@@ -29,7 +29,8 @@ class MigrateTransactionHistoryBySymbol extends _Base.default {
29
29
  'pangolin-LOCAL-CKTON': 'pangolin-LOCAL-PKTON',
30
30
  'zeta_test-NATIVE-aZETA': 'zeta_test-NATIVE-ZETA',
31
31
  'origintrail-NATIVE-OTP': 'origintrail-NATIVE-NEURO',
32
- 'moonbeam-LOCAL-xciBTC': 'moonbeam-LOCAL-xcIBTC'
32
+ 'moonbeam-LOCAL-xciBTC': 'moonbeam-LOCAL-xcIBTC',
33
+ 'tomochain-NATIVE-TOMO': 'tomochain-NATIVE-VIC'
33
34
  };
34
35
  const allTxs = [];
35
36
  await Promise.all(Object.entries(changeSlugsMap).map(async (_ref, i) => {
@@ -50,6 +51,9 @@ class MigrateTransactionHistoryBySymbol extends _Base.default {
50
51
  if (transaction.amount && transaction.amount.symbol === oldSymbolSlug) {
51
52
  transaction.amount.symbol = newSymbolSlug;
52
53
  }
54
+ if (transaction.fee && transaction.fee.symbol === oldSymbolSlug) {
55
+ transaction.fee.symbol = newSymbolSlug;
56
+ }
53
57
  }
54
58
  }
55
59
  allTxs.push(...filterTransactions);
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _Base = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/Base"));
9
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ class AutoEnableSomeTokens extends _Base.default {
13
+ async run() {
14
+ try {
15
+ const slugs = ['statemint-NATIVE-DOT', 'statemint-LOCAL-DED', 'statemint-LOCAL-PINK', 'moonbeam-LOCAL-xcDOT', 'moonbeam-LOCAL-xcPINK'];
16
+ const migratedAssetSetting = {};
17
+ for (const slug of slugs) {
18
+ migratedAssetSetting[slug] = {
19
+ visible: true
20
+ };
21
+ await this.state.chainService.updateAssetSetting(slug, {
22
+ visible: true
23
+ }, true);
24
+ }
25
+ } catch (e) {
26
+ console.error(e);
27
+ }
28
+ }
29
+ }
30
+ exports.default = AutoEnableSomeTokens;
@@ -28,7 +28,8 @@ class MigrateAssetSetting extends _Base.default {
28
28
  'pangolin-LOCAL-CKTON': 'pangolin-LOCAL-PKTON',
29
29
  'zeta_test-NATIVE-aZETA': 'zeta_test-NATIVE-ZETA',
30
30
  'origintrail-NATIVE-OTP': 'origintrail-NATIVE-NEURO',
31
- 'moonbeam-LOCAL-xciBTC': 'moonbeam-LOCAL-xcIBTC'
31
+ 'moonbeam-LOCAL-xciBTC': 'moonbeam-LOCAL-xcIBTC',
32
+ 'tomochain-NATIVE-TOMO': 'tomochain-NATIVE-VIC'
32
33
  };
33
34
  const assetSetting = await this.state.chainService.getAssetSettings();
34
35
  const migratedAssetSetting = {};
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = exports.EVERYTIME = void 0;
8
+ var _AutoEnableSomeTokens = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/databases/AutoEnableSomeTokens"));
8
9
  var _DeleteEarningData = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/DeleteEarningData"));
9
10
  var _MigrateTransactionHistoryBySymbol = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/MigrateTransactionHistoryBySymbol"));
10
11
  var _MigrateAssetSetting = _interopRequireDefault(require("./databases/MigrateAssetSetting"));
@@ -55,7 +56,8 @@ var _default = {
55
56
  '1.1.28-01': _MigrateEarningVersion.default,
56
57
  '1.1.41-01': _DeleteChainStaking.default,
57
58
  '1.1.44-01': _MigrateAssetSetting.default,
58
- '1.1.44-02': _MigrateTransactionHistoryBySymbol.default
59
+ '1.1.45-01': _MigrateTransactionHistoryBySymbol.default,
60
+ '1.1.46-01': _AutoEnableSomeTokens.default
59
61
  // [`${EVERYTIME}-1.1.42-02`]: MigrateTransactionHistoryBySymbol
60
62
  // [`${EVERYTIME}-1`]: AutoEnableChainsTokens
61
63
  };
@@ -11,7 +11,6 @@ var _Authorize = _interopRequireDefault(require("@subwallet/extension-base/store
11
11
  var _utils2 = require("@subwallet/extension-base/utils");
12
12
  var _getId = require("@subwallet/extension-base/utils/getId");
13
13
  var _rxjs = require("rxjs");
14
- var _util = require("@polkadot/util");
15
14
  var _utilCrypto = require("@polkadot/util-crypto");
16
15
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
17
16
  // SPDX-License-Identifier: Apache-2.0
@@ -212,17 +211,58 @@ class AuthRequestHandler {
212
211
  }
213
212
  };
214
213
  };
214
+ authorizePromiseMap = {};
215
215
  async authorizeUrlV2(url, request) {
216
216
  let authList = await this.getAuthList();
217
- const accountAuthType = request.accountAuthType || 'substrate';
217
+ let accountAuthType = request.accountAuthType || 'substrate';
218
218
  request.accountAuthType = accountAuthType;
219
219
  if (!authList) {
220
220
  authList = {};
221
221
  }
222
+ const id = (0, _getId.getId)();
223
+ const promiseHandler = (0, _utils2.createPromiseHandler)();
224
+ const {
225
+ promise,
226
+ reject,
227
+ resolve
228
+ } = promiseHandler;
222
229
  const idStr = (0, _utils2.stripUrl)(url);
230
+ const isExistedAuthBothBefore = Object.entries(this.authorizeUrlSubject.value).find(_ref3 => {
231
+ let [key, data] = _ref3;
232
+ return key === idStr && data.accountAuthType === 'both';
233
+ });
234
+ if (isExistedAuthBothBefore) {
235
+ return true;
236
+ }
237
+
238
+ // Add promise to the map
239
+ this.authorizePromiseMap[id] = promiseHandler;
240
+ // Remove promise from the map after finish
241
+ promise.finally(() => {
242
+ delete this.authorizePromiseMap[id];
243
+ });
244
+
223
245
  // Do not enqueue duplicate authorization requests.
224
- const isDuplicate = Object.values(this.#authRequestsV2).some(_request => _request.idStr === idStr && _request.accountAuthType === request.accountAuthType);
225
- (0, _util.assert)(!isDuplicate, 'The source {{url}} has a pending authorization request'.replace('{{url}}', url));
246
+ const mergeKeys = [];
247
+ Object.entries(this.#authRequestsV2).forEach(_ref4 => {
248
+ let [key, _request] = _ref4;
249
+ if (_request.idStr === idStr) {
250
+ if (_request.accountAuthType !== request.accountAuthType) {
251
+ request.accountAuthType = 'both';
252
+ accountAuthType = 'both';
253
+ }
254
+ mergeKeys.push(key);
255
+ }
256
+ });
257
+
258
+ // Resolve with current promise
259
+ if (mergeKeys.length > 0) {
260
+ mergeKeys.forEach(key => {
261
+ delete this.#authRequestsV2[key];
262
+ const backupHandler = this.authorizePromiseMap[key];
263
+ promise.then(backupHandler.resolve).catch(backupHandler.reject);
264
+ });
265
+ }
226
266
  const existedAuth = authList[idStr];
227
267
  const existedAccountAuthType = existedAuth === null || existedAuth === void 0 ? void 0 : existedAuth.accountAuthType;
228
268
  const confirmAnotherType = existedAccountAuthType !== 'both' && existedAccountAuthType !== request.accountAuthType;
@@ -236,8 +276,8 @@ class AuthRequestHandler {
236
276
  if (inBlackList) {
237
277
  throw new Error('The source {{url}} is not allowed to interact with this extension'.replace('{{url}}', url));
238
278
  }
239
- request.allowedAccounts = Object.entries(existedAuth.isAllowedMap).map(_ref3 => {
240
- let [address, allowed] = _ref3;
279
+ request.allowedAccounts = Object.entries(existedAuth.isAllowedMap).map(_ref5 => {
280
+ let [address, allowed] = _ref5;
241
281
  return allowed ? address : '';
242
282
  }).filter(item => item !== '');
243
283
  let allowedListByRequestType = [...request.allowedAccounts];
@@ -270,21 +310,19 @@ class AuthRequestHandler {
270
310
  return true;
271
311
  }
272
312
  }
273
- return new Promise((resolve, reject) => {
274
- const id = (0, _getId.getId)();
275
- this.#authRequestsV2[id] = {
276
- ...this.authCompleteV2(id, url, resolve, reject),
277
- id,
278
- idStr,
279
- request,
280
- url,
281
- accountAuthType: accountAuthType
282
- };
283
- this.updateIconAuthV2();
284
- if (Object.keys(this.#authRequestsV2).length < 2) {
285
- this.#requestService.popupOpen();
286
- }
287
- });
313
+ this.#authRequestsV2[id] = {
314
+ ...this.authCompleteV2(id, url, resolve, reject),
315
+ id,
316
+ idStr,
317
+ request,
318
+ url,
319
+ accountAuthType: accountAuthType
320
+ };
321
+ this.updateIconAuthV2();
322
+ if (Object.keys(this.#authRequestsV2).length < 2 && !(mergeKeys.length > 0 && mergeKeys[mergeKeys.length - 1] !== id)) {
323
+ this.#requestService.popupOpen();
324
+ }
325
+ return promise;
288
326
  }
289
327
  getAuthRequestV2(id) {
290
328
  return this.#authRequestsV2[id];
@@ -28,6 +28,9 @@ function getBlockExplorerAccountRoute(explorerLink) {
28
28
  if (explorerLink.includes('3dpscan.io')) {
29
29
  return 'account';
30
30
  }
31
+ if (explorerLink.includes('explorer.polimec.org')) {
32
+ return 'account';
33
+ }
31
34
  return 'address';
32
35
  }
33
36
  function getBlockExplorerTxRoute(chainInfo) {
@@ -23,6 +23,7 @@ export declare const ALL_GENESIS_HASH: null;
23
23
  export declare const IGNORE_GET_SUBSTRATE_FEATURES_LIST: string[];
24
24
  export declare const IGNORE_QR_SIGNER: string[];
25
25
  export declare const XCM_MIN_AMOUNT_RATIO = 1.2;
26
+ export declare const XCM_FEE_RATIO = 1.2;
26
27
  export declare const GAS_PRICE_RATIO: number;
27
28
  export declare const NETWORK_MULTI_GAS_FEE: string[];
28
29
  export declare const ORDINAL_COLLECTION = "__Ordinal__";
@@ -26,6 +26,7 @@ export const ALL_GENESIS_HASH = null;
26
26
  export const IGNORE_GET_SUBSTRATE_FEATURES_LIST = ['astarEvm', 'ethereum', 'ethereum_goerli', 'binance', 'binance_test', 'boba_rinkeby', 'boba', 'bobabase', 'bobabeam'];
27
27
  export const IGNORE_QR_SIGNER = [];
28
28
  export const XCM_MIN_AMOUNT_RATIO = 1.2;
29
+ export const XCM_FEE_RATIO = 1.2;
29
30
  export const GAS_PRICE_RATIO = 1 + 2 / 100;
30
31
  export const NETWORK_MULTI_GAS_FEE = ['*'];
31
32
  export const ORDINAL_COLLECTION = '__Ordinal__';
@@ -10,7 +10,7 @@ import { withErrorLog } from '@subwallet/extension-base/background/handlers/help
10
10
  import { createSubscription } from '@subwallet/extension-base/background/handlers/subscriptions';
11
11
  import { AccountExternalErrorCode, BasicTxErrorType, BasicTxWarningCode, CampaignDataType, ChainType, ExternalRequestPromiseStatus, ExtrinsicType, MantaPayEnableMessage, StakingTxErrorType, StakingType, TransferTxErrorType } from '@subwallet/extension-base/background/KoniTypes';
12
12
  import { TransactionWarning } from '@subwallet/extension-base/background/warnings/TransactionWarning';
13
- import { ALL_ACCOUNT_KEY, ALL_GENESIS_HASH, XCM_MIN_AMOUNT_RATIO } from '@subwallet/extension-base/constants';
13
+ import { ALL_ACCOUNT_KEY, ALL_GENESIS_HASH, XCM_FEE_RATIO, XCM_MIN_AMOUNT_RATIO } from '@subwallet/extension-base/constants';
14
14
  import { ALLOWED_PATH } from '@subwallet/extension-base/defaults';
15
15
  import { resolveAzeroAddressToDomain, resolveAzeroDomainToAddress } from '@subwallet/extension-base/koni/api/dotsama/domain';
16
16
  import { parseSubstrateTransaction } from '@subwallet/extension-base/koni/api/dotsama/parseTransaction';
@@ -33,7 +33,7 @@ import { WALLET_CONNECT_EIP155_NAMESPACE } from '@subwallet/extension-base/servi
33
33
  import { isProposalExpired, isSupportWalletConnectChain, isSupportWalletConnectNamespace } from '@subwallet/extension-base/services/wallet-connect-service/helpers';
34
34
  import { AccountsStore } from '@subwallet/extension-base/stores';
35
35
  import { YieldPoolType } from '@subwallet/extension-base/types';
36
- import { convertSubjectInfoToAddresses, createTransactionFromRLP, isSameAddress, reformatAddress, signatureToHex, uniqueStringArray } from '@subwallet/extension-base/utils';
36
+ import { BN_ZERO, convertSubjectInfoToAddresses, createTransactionFromRLP, isSameAddress, reformatAddress, signatureToHex, uniqueStringArray } from '@subwallet/extension-base/utils';
37
37
  import { parseContractInput, parseEvmRlp } from '@subwallet/extension-base/utils/eth/parseTransaction';
38
38
  import { balanceFormatter, formatNumber } from '@subwallet/extension-base/utils/number';
39
39
  import { createPair } from '@subwallet/keyring';
@@ -42,7 +42,7 @@ import { getSdkError } from '@walletconnect/utils';
42
42
  import BigN from 'bignumber.js';
43
43
  import { t } from 'i18next';
44
44
  import { TypeRegistry } from '@polkadot/types';
45
- import { assert, BN, BN_ZERO, hexStripPrefix, hexToU8a, isAscii, isHex, u8aToHex, u8aToString } from '@polkadot/util';
45
+ import { assert, BN, hexStripPrefix, hexToU8a, isAscii, isHex, u8aToHex, u8aToString } from '@polkadot/util';
46
46
  import { addressToEvm, base64Decode, decodeAddress, isAddress, isEthereumAddress, jsonDecrypt, keyExtractSuri, mnemonicGenerate, mnemonicValidate } from '@polkadot/util-crypto';
47
47
  const ETH_DERIVE_DEFAULT = '/m/44\'/60\'/0\'/0/0';
48
48
  function getSuri(seed, type) {
@@ -1878,7 +1878,7 @@ export default class KoniExtension {
1878
1878
  } else {
1879
1879
  const substrateApi = this.#koniState.chainService.getSubstrateApi(networkKey);
1880
1880
  let estimatedFee;
1881
- let maxTransferable = new BN(freeBalance.value);
1881
+ let maxTransferable = new BigN(freeBalance.value);
1882
1882
  try {
1883
1883
  if (isXcmTransfer) {
1884
1884
  const chainInfoMap = this.#koniState.chainService.getChainInfoMap();
@@ -1886,7 +1886,7 @@ export default class KoniExtension {
1886
1886
  if (!destinationTokenInfo) {
1887
1887
  estimatedFee = '0';
1888
1888
  } else {
1889
- maxTransferable = maxTransferable.sub(new BN(tokenInfo.minAmount || '0'));
1889
+ maxTransferable = maxTransferable.minus(new BigN(tokenInfo.minAmount || '0').multipliedBy(XCM_FEE_RATIO));
1890
1890
  const desChainInfo = chainInfoMap[destChain];
1891
1891
  const orgChainInfo = chainInfoMap[networkKey];
1892
1892
  const recipient = !isEthereumAddress(address) && _isChainEvmCompatible(desChainInfo) && !_isChainEvmCompatible(orgChainInfo) ? u8aToHex(addressToEvm(address)) : address;
@@ -1943,7 +1943,7 @@ export default class KoniExtension {
1943
1943
  estimatedFee = '0';
1944
1944
  console.warn('Unable to estimate fee', e);
1945
1945
  }
1946
- maxTransferable = maxTransferable.sub(new BN(estimatedFee));
1946
+ maxTransferable = maxTransferable.minus(new BigN(estimatedFee));
1947
1947
  return {
1948
1948
  ...freeBalance,
1949
1949
  value: maxTransferable.gt(BN_ZERO) ? maxTransferable.toString() || '0' : '0'
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "./cjs/detectPackage.js"
18
18
  ],
19
19
  "type": "module",
20
- "version": "1.1.44-0",
20
+ "version": "1.1.46-0",
21
21
  "main": "./cjs/index.js",
22
22
  "module": "./index.js",
23
23
  "types": "./index.d.ts",
@@ -935,6 +935,11 @@
935
935
  "require": "./cjs/services/migration-service/scripts/ClearOldStorage.js",
936
936
  "default": "./services/migration-service/scripts/ClearOldStorage.js"
937
937
  },
938
+ "./services/migration-service/scripts/databases/AutoEnableSomeTokens": {
939
+ "types": "./services/migration-service/scripts/databases/AutoEnableSomeTokens.d.ts",
940
+ "require": "./cjs/services/migration-service/scripts/databases/AutoEnableSomeTokens.js",
941
+ "default": "./services/migration-service/scripts/databases/AutoEnableSomeTokens.js"
942
+ },
938
943
  "./services/migration-service/scripts/databases/MigrateAssetSetting": {
939
944
  "types": "./services/migration-service/scripts/databases/MigrateAssetSetting.d.ts",
940
945
  "require": "./cjs/services/migration-service/scripts/databases/MigrateAssetSetting.js",
@@ -1791,11 +1796,11 @@
1791
1796
  "@reduxjs/toolkit": "^1.9.1",
1792
1797
  "@sora-substrate/type-definitions": "^1.17.7",
1793
1798
  "@substrate/connect": "^0.7.26",
1794
- "@subwallet/chain-list": "0.2.45",
1795
- "@subwallet/extension-base": "^1.1.44-0",
1796
- "@subwallet/extension-chains": "^1.1.44-0",
1797
- "@subwallet/extension-dapp": "^1.1.44-0",
1798
- "@subwallet/extension-inject": "^1.1.44-0",
1799
+ "@subwallet/chain-list": "0.2.51",
1800
+ "@subwallet/extension-base": "^1.1.46-0",
1801
+ "@subwallet/extension-chains": "^1.1.46-0",
1802
+ "@subwallet/extension-dapp": "^1.1.46-0",
1803
+ "@subwallet/extension-inject": "^1.1.46-0",
1799
1804
  "@subwallet/keyring": "^0.1.3",
1800
1805
  "@subwallet/ui-keyring": "^0.1.3",
1801
1806
  "@walletconnect/sign-client": "^2.8.4",
package/packageInfo.js CHANGED
@@ -7,5 +7,5 @@ export const packageInfo = {
7
7
  name: '@subwallet/extension-base',
8
8
  path: (import.meta && import.meta.url) ? new URL(import.meta.url).pathname.substring(0, new URL(import.meta.url).pathname.lastIndexOf('/') + 1) : 'auto',
9
9
  type: 'esm',
10
- version: '1.1.44-0'
10
+ version: '1.1.46-0'
11
11
  };
@@ -29,7 +29,7 @@ export const _BALANCE_CHAIN_GROUP = {
29
29
  genshiro: ['genshiro_testnet', 'genshiro'],
30
30
  equilibrium_parachain: ['equilibrium_parachain'],
31
31
  bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry', 'bifrost_dot', 'hydradx_main', 'pendulum', 'amplitude', 'continuum_network'],
32
- statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel', 'calamari', 'manta_network', 'rococo_assethub', 'liberlandTest', 'liberland', 'dentnet', 'pangolin'],
32
+ statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel', 'calamari', 'manta_network', 'rococo_assethub', 'liberlandTest', 'liberland', 'dentnet', 'pangolin', 'crust', 'phala'],
33
33
  kusama: ['kusama', 'kintsugi', 'kintsugi_test', 'interlay', 'acala', 'statemint', 'karura', 'bifrost'],
34
34
  // perhaps there are some runtime updates
35
35
  centrifuge: ['centrifuge'],
@@ -87,7 +87,8 @@ export const _STAKING_ERA_LENGTH_MAP = {
87
87
  vara_network: 12,
88
88
  goldberg_testnet: 24,
89
89
  manta_network: 6,
90
- krest_network: 4
90
+ krest_network: 4,
91
+ polimec: 6
91
92
  };
92
93
  export const _EXPECTED_BLOCK_TIME = {
93
94
  // in seconds
@@ -103,7 +104,8 @@ export const _EXPECTED_BLOCK_TIME = {
103
104
  edgeware: 6,
104
105
  creditcoin: 12,
105
106
  vara_network: 3,
106
- goldberg_testnet: 20
107
+ goldberg_testnet: 20,
108
+ polimec: 12
107
109
  };
108
110
  export const _PARACHAIN_INFLATION_DISTRIBUTION = {
109
111
  moonbeam: {
@@ -1497,15 +1497,15 @@ export class ChainService {
1497
1497
  const chainInfoMap = this.getChainInfoMap();
1498
1498
  Object.values(chainInfoMap).forEach(i => {
1499
1499
  var _i$extraInfo;
1500
- if (!((_i$extraInfo = i.extraInfo) !== null && _i$extraInfo !== void 0 && _i$extraInfo.subscanSlug)) {
1500
+ const subscanSlug = i.slug === 'goldberg_testnet' ? 'avail-testnet' : (_i$extraInfo = i.extraInfo) === null || _i$extraInfo === void 0 ? void 0 : _i$extraInfo.subscanSlug; // Hotfix for Goldberg testnet
1501
+
1502
+ if (!subscanSlug) {
1501
1503
  return;
1502
1504
  }
1503
1505
  if (!reverse) {
1504
- var _i$extraInfo2;
1505
- result[i.slug] = (_i$extraInfo2 = i.extraInfo) === null || _i$extraInfo2 === void 0 ? void 0 : _i$extraInfo2.subscanSlug;
1506
+ result[i.slug] = subscanSlug;
1506
1507
  } else {
1507
- var _i$extraInfo3;
1508
- result[(_i$extraInfo3 = i.extraInfo) === null || _i$extraInfo3 === void 0 ? void 0 : _i$extraInfo3.subscanSlug] = i.slug;
1508
+ result[subscanSlug] = i.slug;
1509
1509
  }
1510
1510
  });
1511
1511
  return result;
@@ -3,7 +3,7 @@
3
3
 
4
4
  export const _STAKING_CHAIN_GROUP = {
5
5
  relay: ['polkadot', 'kusama', 'aleph', 'polkadex', 'ternoa', 'alephTest', 'polkadexTest', 'westend', 'kate', 'edgeware', 'creditcoin', 'vara_network', 'goldberg_testnet'],
6
- para: ['moonbeam', 'moonriver', 'moonbase', 'turing', 'turingStaging', 'bifrost', 'bifrost_testnet', 'calamari_test', 'calamari', 'manta_network'],
6
+ para: ['moonbeam', 'moonriver', 'moonbase', 'turing', 'turingStaging', 'bifrost', 'bifrost_testnet', 'calamari_test', 'calamari', 'manta_network', 'polimec'],
7
7
  astar: ['astar', 'shiden', 'shibuya'],
8
8
  amplitude: ['amplitude', 'amplitude_test', 'kilt', 'kilt_peregrine', 'pendulum', 'krest_network'],
9
9
  // amplitude and kilt only share some common logic
@@ -270,7 +270,7 @@ export default class EarningService {
270
270
  const unsubList = [];
271
271
  for (const handler of Object.values(this.handlers)) {
272
272
  // Force subscribe onchain data
273
- const forceSubscribe = handler.type === YieldPoolType.LIQUID_STAKING || handler.type === YieldPoolType.LENDING;
273
+ const forceSubscribe = handler.type === YieldPoolType.LIQUID_STAKING || handler.type === YieldPoolType.LENDING || !onlineData[handler.slug];
274
274
  if (!this.useOnlineCacheOnly || forceSubscribe) {
275
275
  handler.subscribePoolInfo(callback).then(unsub => {
276
276
  if (!cancel) {
@@ -22,7 +22,8 @@ export default class MigrateTransactionHistoryBySymbol extends BaseMigrationJob
22
22
  'pangolin-LOCAL-CKTON': 'pangolin-LOCAL-PKTON',
23
23
  'zeta_test-NATIVE-aZETA': 'zeta_test-NATIVE-ZETA',
24
24
  'origintrail-NATIVE-OTP': 'origintrail-NATIVE-NEURO',
25
- 'moonbeam-LOCAL-xciBTC': 'moonbeam-LOCAL-xcIBTC'
25
+ 'moonbeam-LOCAL-xciBTC': 'moonbeam-LOCAL-xcIBTC',
26
+ 'tomochain-NATIVE-TOMO': 'tomochain-NATIVE-VIC'
26
27
  };
27
28
  const allTxs = [];
28
29
  await Promise.all(Object.entries(changeSlugsMap).map(async ([oldSlug, newSlug], i) => {
@@ -42,6 +43,9 @@ export default class MigrateTransactionHistoryBySymbol extends BaseMigrationJob
42
43
  if (transaction.amount && transaction.amount.symbol === oldSymbolSlug) {
43
44
  transaction.amount.symbol = newSymbolSlug;
44
45
  }
46
+ if (transaction.fee && transaction.fee.symbol === oldSymbolSlug) {
47
+ transaction.fee.symbol = newSymbolSlug;
48
+ }
45
49
  }
46
50
  }
47
51
  allTxs.push(...filterTransactions);
@@ -0,0 +1,4 @@
1
+ import BaseMigrationJob from '@subwallet/extension-base/services/migration-service/Base';
2
+ export default class AutoEnableSomeTokens extends BaseMigrationJob {
3
+ run(): Promise<void>;
4
+ }
@@ -0,0 +1,22 @@
1
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import BaseMigrationJob from '@subwallet/extension-base/services/migration-service/Base';
5
+ export default class AutoEnableSomeTokens extends BaseMigrationJob {
6
+ async run() {
7
+ try {
8
+ const slugs = ['statemint-NATIVE-DOT', 'statemint-LOCAL-DED', 'statemint-LOCAL-PINK', 'moonbeam-LOCAL-xcDOT', 'moonbeam-LOCAL-xcPINK'];
9
+ const migratedAssetSetting = {};
10
+ for (const slug of slugs) {
11
+ migratedAssetSetting[slug] = {
12
+ visible: true
13
+ };
14
+ await this.state.chainService.updateAssetSetting(slug, {
15
+ visible: true
16
+ }, true);
17
+ }
18
+ } catch (e) {
19
+ console.error(e);
20
+ }
21
+ }
22
+ }
@@ -21,7 +21,8 @@ export default class MigrateAssetSetting extends BaseMigrationJob {
21
21
  'pangolin-LOCAL-CKTON': 'pangolin-LOCAL-PKTON',
22
22
  'zeta_test-NATIVE-aZETA': 'zeta_test-NATIVE-ZETA',
23
23
  'origintrail-NATIVE-OTP': 'origintrail-NATIVE-NEURO',
24
- 'moonbeam-LOCAL-xciBTC': 'moonbeam-LOCAL-xcIBTC'
24
+ 'moonbeam-LOCAL-xciBTC': 'moonbeam-LOCAL-xcIBTC',
25
+ 'tomochain-NATIVE-TOMO': 'tomochain-NATIVE-VIC'
25
26
  };
26
27
  const assetSetting = await this.state.chainService.getAssetSettings();
27
28
  const migratedAssetSetting = {};
@@ -1,6 +1,7 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import AutoEnableSomeTokens from '@subwallet/extension-base/services/migration-service/scripts/databases/AutoEnableSomeTokens';
4
5
  import DeleteEarningData from '@subwallet/extension-base/services/migration-service/scripts/DeleteEarningData';
5
6
  import MigrateTransactionHistoryBySymbol from '@subwallet/extension-base/services/migration-service/scripts/MigrateTransactionHistoryBySymbol';
6
7
  import MigrateAssetSetting from "./databases/MigrateAssetSetting.js";
@@ -47,7 +48,8 @@ export default {
47
48
  '1.1.28-01': MigrateEarningVersion,
48
49
  '1.1.41-01': DeleteChainStaking,
49
50
  '1.1.44-01': MigrateAssetSetting,
50
- '1.1.44-02': MigrateTransactionHistoryBySymbol
51
+ '1.1.45-01': MigrateTransactionHistoryBySymbol,
52
+ '1.1.46-01': AutoEnableSomeTokens
51
53
  // [`${EVERYTIME}-1.1.42-02`]: MigrateTransactionHistoryBySymbol
52
54
  // [`${EVERYTIME}-1`]: AutoEnableChainsTokens
53
55
  };
@@ -29,6 +29,7 @@ export default class AuthRequestHandler {
29
29
  url?: string;
30
30
  }): _ChainInfo | undefined;
31
31
  private authCompleteV2;
32
+ private authorizePromiseMap;
32
33
  authorizeUrlV2(url: string, request: RequestAuthorizeTab): Promise<boolean>;
33
34
  getAuthRequestV2(id: string): AuthRequestV2;
34
35
  get subscribeEvmChainChange(): BehaviorSubject<AuthUrls>;
@@ -4,10 +4,9 @@
4
4
  import { _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils';
5
5
  import { PREDEFINED_CHAIN_DAPP_CHAIN_MAP, WEB_APP_URL } from '@subwallet/extension-base/services/request-service/constants';
6
6
  import AuthorizeStore from '@subwallet/extension-base/stores/Authorize';
7
- import { getDomainFromUrl, stripUrl } from '@subwallet/extension-base/utils';
7
+ import { createPromiseHandler, getDomainFromUrl, stripUrl } from '@subwallet/extension-base/utils';
8
8
  import { getId } from '@subwallet/extension-base/utils/getId';
9
9
  import { BehaviorSubject } from 'rxjs';
10
- import { assert } from '@polkadot/util';
11
10
  import { isEthereumAddress } from '@polkadot/util-crypto';
12
11
  const AUTH_URLS_KEY = 'authUrls';
13
12
  export default class AuthRequestHandler {
@@ -200,17 +199,54 @@ export default class AuthRequestHandler {
200
199
  }
201
200
  };
202
201
  };
202
+ authorizePromiseMap = {};
203
203
  async authorizeUrlV2(url, request) {
204
204
  let authList = await this.getAuthList();
205
- const accountAuthType = request.accountAuthType || 'substrate';
205
+ let accountAuthType = request.accountAuthType || 'substrate';
206
206
  request.accountAuthType = accountAuthType;
207
207
  if (!authList) {
208
208
  authList = {};
209
209
  }
210
+ const id = getId();
211
+ const promiseHandler = createPromiseHandler();
212
+ const {
213
+ promise,
214
+ reject,
215
+ resolve
216
+ } = promiseHandler;
210
217
  const idStr = stripUrl(url);
218
+ const isExistedAuthBothBefore = Object.entries(this.authorizeUrlSubject.value).find(([key, data]) => key === idStr && data.accountAuthType === 'both');
219
+ if (isExistedAuthBothBefore) {
220
+ return true;
221
+ }
222
+
223
+ // Add promise to the map
224
+ this.authorizePromiseMap[id] = promiseHandler;
225
+ // Remove promise from the map after finish
226
+ promise.finally(() => {
227
+ delete this.authorizePromiseMap[id];
228
+ });
229
+
211
230
  // Do not enqueue duplicate authorization requests.
212
- const isDuplicate = Object.values(this.#authRequestsV2).some(_request => _request.idStr === idStr && _request.accountAuthType === request.accountAuthType);
213
- assert(!isDuplicate, 'The source {{url}} has a pending authorization request'.replace('{{url}}', url));
231
+ const mergeKeys = [];
232
+ Object.entries(this.#authRequestsV2).forEach(([key, _request]) => {
233
+ if (_request.idStr === idStr) {
234
+ if (_request.accountAuthType !== request.accountAuthType) {
235
+ request.accountAuthType = 'both';
236
+ accountAuthType = 'both';
237
+ }
238
+ mergeKeys.push(key);
239
+ }
240
+ });
241
+
242
+ // Resolve with current promise
243
+ if (mergeKeys.length > 0) {
244
+ mergeKeys.forEach(key => {
245
+ delete this.#authRequestsV2[key];
246
+ const backupHandler = this.authorizePromiseMap[key];
247
+ promise.then(backupHandler.resolve).catch(backupHandler.reject);
248
+ });
249
+ }
214
250
  const existedAuth = authList[idStr];
215
251
  const existedAccountAuthType = existedAuth === null || existedAuth === void 0 ? void 0 : existedAuth.accountAuthType;
216
252
  const confirmAnotherType = existedAccountAuthType !== 'both' && existedAccountAuthType !== request.accountAuthType;
@@ -255,21 +291,19 @@ export default class AuthRequestHandler {
255
291
  return true;
256
292
  }
257
293
  }
258
- return new Promise((resolve, reject) => {
259
- const id = getId();
260
- this.#authRequestsV2[id] = {
261
- ...this.authCompleteV2(id, url, resolve, reject),
262
- id,
263
- idStr,
264
- request,
265
- url,
266
- accountAuthType: accountAuthType
267
- };
268
- this.updateIconAuthV2();
269
- if (Object.keys(this.#authRequestsV2).length < 2) {
270
- this.#requestService.popupOpen();
271
- }
272
- });
294
+ this.#authRequestsV2[id] = {
295
+ ...this.authCompleteV2(id, url, resolve, reject),
296
+ id,
297
+ idStr,
298
+ request,
299
+ url,
300
+ accountAuthType: accountAuthType
301
+ };
302
+ this.updateIconAuthV2();
303
+ if (Object.keys(this.#authRequestsV2).length < 2 && !(mergeKeys.length > 0 && mergeKeys[mergeKeys.length - 1] !== id)) {
304
+ this.#requestService.popupOpen();
305
+ }
306
+ return promise;
273
307
  }
274
308
  getAuthRequestV2(id) {
275
309
  return this.#authRequestsV2[id];
@@ -22,6 +22,9 @@ function getBlockExplorerAccountRoute(explorerLink) {
22
22
  if (explorerLink.includes('3dpscan.io')) {
23
23
  return 'account';
24
24
  }
25
+ if (explorerLink.includes('explorer.polimec.org')) {
26
+ return 'account';
27
+ }
25
28
  return 'address';
26
29
  }
27
30
  function getBlockExplorerTxRoute(chainInfo) {