@subwallet/extension-base 1.1.25-1 → 1.1.27-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 (76) hide show
  1. package/background/KoniTypes.d.ts +3 -3
  2. package/background/handlers/State.js +3 -2
  3. package/cjs/background/handlers/State.js +3 -2
  4. package/cjs/constants/staking.js +4 -2
  5. package/cjs/koni/api/dotsama/transfer.js +2 -2
  6. package/cjs/koni/api/nft/config.js +2 -1
  7. package/cjs/koni/api/staking/bonding/astar.js +15 -24
  8. package/cjs/koni/api/staking/bonding/relayChain.js +48 -25
  9. package/cjs/koni/api/xcm/xTokens.js +1 -1
  10. package/cjs/koni/background/handlers/Extension.js +15 -8
  11. package/cjs/koni/background/handlers/Mobile.js +81 -5
  12. package/cjs/koni/background/handlers/State.js +54 -118
  13. package/cjs/koni/background/handlers/index.js +1 -1
  14. package/cjs/koni/background/subscription.js +34 -11
  15. package/cjs/packageInfo.js +1 -1
  16. package/cjs/services/balance-service/BalanceMapImpl.js +111 -0
  17. package/cjs/services/campaign-service/index.js +2 -0
  18. package/cjs/services/chain-service/constants.js +20 -3
  19. package/cjs/services/event-service/index.js +7 -7
  20. package/cjs/services/event-service/types.js +1 -1
  21. package/cjs/services/history-service/index.js +1 -0
  22. package/cjs/services/keyring-service/index.js +10 -6
  23. package/cjs/services/migration-service/scripts/index.js +3 -1
  24. package/cjs/services/migration-service/scripts/tokens/MigratePolygonUSDCProvider.js +16 -0
  25. package/cjs/services/migration-service/scripts/tokens/MigrateToken.js +33 -0
  26. package/cjs/services/setting-service/SettingService.js +2 -1
  27. package/cjs/services/setting-service/i18n/i18n.js +2 -1
  28. package/cjs/services/storage-service/DatabaseService.js +8 -19
  29. package/cjs/services/storage-service/db-stores/Balance.js +4 -13
  30. package/cjs/services/wallet-connect-service/index.js +6 -3
  31. package/cjs/storage/index.js +59 -0
  32. package/cjs/utils/array.js +27 -1
  33. package/constants/staking.d.ts +1 -0
  34. package/constants/staking.js +2 -1
  35. package/koni/api/dotsama/transfer.js +2 -2
  36. package/koni/api/nft/config.js +2 -1
  37. package/koni/api/staking/bonding/astar.js +15 -24
  38. package/koni/api/staking/bonding/relayChain.js +40 -17
  39. package/koni/api/xcm/xTokens.js +1 -1
  40. package/koni/background/handlers/Extension.js +15 -8
  41. package/koni/background/handlers/Mobile.d.ts +6 -0
  42. package/koni/background/handlers/Mobile.js +75 -3
  43. package/koni/background/handlers/State.d.ts +10 -9
  44. package/koni/background/handlers/State.js +43 -105
  45. package/koni/background/handlers/index.js +1 -1
  46. package/koni/background/subscription.d.ts +4 -1
  47. package/koni/background/subscription.js +34 -11
  48. package/package.json +40 -20
  49. package/packageInfo.js +1 -1
  50. package/services/balance-service/BalanceMapImpl.d.ts +17 -0
  51. package/services/balance-service/BalanceMapImpl.js +101 -0
  52. package/services/campaign-service/index.d.ts +1 -0
  53. package/services/campaign-service/index.js +2 -0
  54. package/services/chain-service/constants.d.ts +1 -0
  55. package/services/chain-service/constants.js +18 -2
  56. package/services/event-service/index.d.ts +1 -4
  57. package/services/event-service/index.js +8 -7
  58. package/services/event-service/types.js +1 -1
  59. package/services/history-service/index.js +1 -0
  60. package/services/keyring-service/index.js +10 -6
  61. package/services/migration-service/scripts/index.js +3 -1
  62. package/services/migration-service/scripts/tokens/MigratePolygonUSDCProvider.d.ts +5 -0
  63. package/services/migration-service/scripts/tokens/MigratePolygonUSDCProvider.js +8 -0
  64. package/services/migration-service/scripts/tokens/MigrateToken.d.ts +9 -0
  65. package/services/migration-service/scripts/tokens/MigrateToken.js +26 -0
  66. package/services/setting-service/SettingService.js +2 -1
  67. package/services/setting-service/i18n/i18n.js +2 -1
  68. package/services/storage-service/DatabaseService.d.ts +3 -1
  69. package/services/storage-service/DatabaseService.js +7 -19
  70. package/services/storage-service/db-stores/Balance.d.ts +3 -2
  71. package/services/storage-service/db-stores/Balance.js +4 -13
  72. package/services/wallet-connect-service/index.js +5 -3
  73. package/storage/index.d.ts +14 -0
  74. package/storage/index.js +52 -0
  75. package/utils/array.d.ts +1 -0
  76. package/utils/array.js +26 -1
@@ -28,10 +28,12 @@ class KeyringService {
28
28
  });
29
29
  constructor(eventService) {
30
30
  this.eventService = eventService;
31
- this.currentAccountStore.get('CurrentAccountInfo', rs => {
32
- rs && this.currentAccountSubject.next(rs);
33
- });
34
- this.subscribeAccounts().catch(console.error);
31
+ this.eventService.waitCryptoReady.then(() => {
32
+ this.currentAccountStore.get('CurrentAccountInfo', rs => {
33
+ rs && this.currentAccountSubject.next(rs);
34
+ });
35
+ this.subscribeAccounts().catch(console.error);
36
+ }).catch(console.error);
35
37
  }
36
38
  async subscribeAccounts() {
37
39
  // Wait until account ready
@@ -72,8 +74,10 @@ class KeyringService {
72
74
  var _keyring$keyring, _keyring$keyring2;
73
75
  let isReady = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
74
76
  if (!this.keyringState.isReady && isReady) {
75
- this.eventService.emit('keyring.ready', true);
76
- this.eventService.emit('account.ready', true);
77
+ this.eventService.waitCryptoReady.then(() => {
78
+ this.eventService.emit('keyring.ready', true);
79
+ this.eventService.emit('account.ready', true);
80
+ }).catch(console.error);
77
81
  }
78
82
  this.keyringStateSubject.next({
79
83
  hasMasterPassword: !!((_keyring$keyring = _uiKeyring.keyring.keyring) !== null && _keyring$keyring !== void 0 && _keyring$keyring.hasMasterPassword),
@@ -8,6 +8,7 @@ exports.default = exports.EVERYTIME = void 0;
8
8
  var _MigrateEthProvider = _interopRequireDefault(require("./providers/MigrateEthProvider"));
9
9
  var _MigratePioneerProvider = _interopRequireDefault(require("./providers/MigratePioneerProvider"));
10
10
  var _MigrateProvidersV1M1P = _interopRequireDefault(require("./providers/MigrateProvidersV1M1P24"));
11
+ var _MigratePolygonUSDCProvider = _interopRequireDefault(require("./tokens/MigratePolygonUSDCProvider"));
11
12
  var _AutoEnableChainsTokens = _interopRequireDefault(require("./AutoEnableChainsTokens"));
12
13
  var _DeleteChain = _interopRequireDefault(require("./DeleteChain"));
13
14
  var _EnableVaraChain = _interopRequireDefault(require("./EnableVaraChain"));
@@ -42,7 +43,8 @@ var _default = {
42
43
  '1.1.13-01': _MigrateTokenDecimals.default,
43
44
  '1.1.17-01': _MigratePioneerProvider.default,
44
45
  '1.1.17-03': _EnableVaraChain.default,
45
- '1.1.24-01': _MigrateProvidersV1M1P.default
46
+ '1.1.24-01': _MigrateProvidersV1M1P.default,
47
+ '1.1.26-01': _MigratePolygonUSDCProvider.default
46
48
  // [`${EVERYTIME}-1`]: AutoEnableChainsTokens
47
49
  };
48
50
  exports.default = _default;
@@ -0,0 +1,16 @@
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 _MigrateToken = _interopRequireDefault(require("./MigrateToken"));
9
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ class MigratePolygonUSDCProvider extends _MigrateToken.default {
13
+ oldToken = 'polygon-ERC20-USDC-0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174';
14
+ newTokens = ['polygon-ERC20-USDC.e-0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174', 'polygon-ERC20-USDC-0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359'];
15
+ }
16
+ exports.default = MigratePolygonUSDCProvider;
@@ -0,0 +1,33 @@
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
+ /**
13
+ * @description Enable `newTokens` if `oldToken` active
14
+ * */
15
+ class MigrateToken extends _Base.default {
16
+ async run() {
17
+ const state = this.state;
18
+ const assetSettings = await state.chainService.getAssetSettings();
19
+ const oldAssetSetting = assetSettings[this.oldToken];
20
+ if (oldAssetSetting) {
21
+ if (oldAssetSetting.visible) {
22
+ for (const newToken of this.newTokens) {
23
+ assetSettings[newToken] = {
24
+ visible: true
25
+ };
26
+ }
27
+ }
28
+ delete assetSettings[this.oldToken];
29
+ state.chainService.setAssetSettings(assetSettings);
30
+ }
31
+ }
32
+ }
33
+ exports.default = MigrateToken;
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _constants = require("@subwallet/extension-base/constants");
9
+ var _storage = require("@subwallet/extension-base/storage");
9
10
  var _PassPhishingStore = _interopRequireDefault(require("@subwallet/extension-base/stores/PassPhishingStore"));
10
11
  var _Settings = _interopRequireDefault(require("@subwallet/extension-base/stores/Settings"));
11
12
  var _i18n = _interopRequireDefault(require("./i18n/i18n"));
@@ -17,7 +18,7 @@ class SettingService {
17
18
  settingsStore = new _Settings.default();
18
19
  passPhishingStore = new _PassPhishingStore.default();
19
20
  constructor() {
20
- let old = localStorage.getItem(_constants.LANGUAGE) || 'en';
21
+ let old = _storage.SWStorage.instance.getItem(_constants.LANGUAGE) || 'en';
21
22
  const updateLanguage = _ref => {
22
23
  let {
23
24
  language
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _constants = require("@subwallet/extension-base/constants");
9
+ var _storage = require("@subwallet/extension-base/storage");
9
10
  var _i18next = _interopRequireDefault(require("i18next"));
10
11
  var _Backend = _interopRequireDefault(require("./Backend"));
11
12
  // Copyright 2019-2022 @polkadot/extension-ui authors & contributors
@@ -19,7 +20,7 @@ _i18next.default.use(_Backend.default).init({
19
20
  escapeValue: false
20
21
  },
21
22
  keySeparator: false,
22
- lng: localStorage.getItem(_constants.LANGUAGE) || 'en',
23
+ lng: _storage.SWStorage.instance.getItem(_constants.LANGUAGE) || 'en',
23
24
  load: 'languageOnly',
24
25
  nsSeparator: false,
25
26
  returnEmptyString: false,
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.default = void 0;
7
+ exports.default = exports.DEXIE_BACKUP_TABLES = void 0;
8
8
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
9
9
  var _databases = _interopRequireDefault(require("@subwallet/extension-base/services/storage-service/databases"));
10
10
  var _dbStores = require("@subwallet/extension-base/services/storage-service/db-stores");
@@ -18,7 +18,8 @@ var _util = require("@polkadot/util");
18
18
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
19
19
  // SPDX-License-Identifier: Apache-2.0
20
20
 
21
- const EXPORT_EXCLUDE_TABLES = ['metadata'];
21
+ const DEXIE_BACKUP_TABLES = ['chain', 'asset', 'migrations', 'transactions', 'campaign'];
22
+ exports.DEXIE_BACKUP_TABLES = DEXIE_BACKUP_TABLES;
22
23
  class DatabaseService {
23
24
  // TODO: might remove this
24
25
 
@@ -297,10 +298,7 @@ class DatabaseService {
297
298
  async exportDB() {
298
299
  const blob = await (0, _dexieExportImport.exportDB)(this._db, {
299
300
  filter: (table, value, key) => {
300
- if (EXPORT_EXCLUDE_TABLES.indexOf(table) >= 0) {
301
- return false;
302
- }
303
- return true;
301
+ return DEXIE_BACKUP_TABLES.indexOf(table) >= 0;
304
302
  }
305
303
  });
306
304
  return await blob.text();
@@ -311,9 +309,8 @@ class DatabaseService {
311
309
  type: 'application/json'
312
310
  });
313
311
  await this._db.import(blob, {
314
- overwriteValues: true,
315
- acceptMissingTables: true,
316
- acceptVersionDiff: true
312
+ clearTablesBeforeImport: true,
313
+ acceptMissingTables: true
317
314
  });
318
315
  return true;
319
316
  } catch (e) {
@@ -321,16 +318,8 @@ class DatabaseService {
321
318
  return false;
322
319
  }
323
320
  }
324
- async checkImportMetadata(data) {
325
- try {
326
- const blob = new Blob([data], {
327
- type: 'application/json'
328
- });
329
- return await (0, _dexieExportImport.peakImportFile)(blob);
330
- } catch (e) {
331
- this.logger.error(e);
332
- return null;
333
- }
321
+ async getExportJson() {
322
+ return JSON.parse(await this.exportDB());
334
323
  }
335
324
  }
336
325
  exports.default = DatabaseService;
@@ -11,22 +11,13 @@ var _BaseStoreWithAddress = _interopRequireDefault(require("../db-stores/BaseSto
11
11
 
12
12
  class BalanceStore extends _BaseStoreWithAddress.default {
13
13
  async getBalanceMapByAddresses(addresses) {
14
- const data = await this.table.where('address').anyOf(addresses).toArray();
15
- const balanceMap = {};
16
- data.forEach(storedBalance => {
17
- const address = storedBalance.address;
18
- const slug = storedBalance.tokenSlug;
19
- if (!balanceMap[address]) {
20
- balanceMap[address] = {};
21
- }
22
- balanceMap[address][slug] = {
23
- ...storedBalance
24
- };
25
- });
26
- return balanceMap;
14
+ return this.table.where('address').anyOf(addresses).toArray();
27
15
  }
28
16
  async removeBySlugs(tokenSlugs) {
29
17
  return this.table.where('tokenSlug').anyOfIgnoreCase(tokenSlugs).delete();
30
18
  }
19
+ async removeByAddresses(addresses) {
20
+ return this.table.where('address').anyOfIgnoreCase(addresses).delete();
21
+ }
31
22
  }
32
23
  exports.default = BalanceStore;
@@ -9,6 +9,7 @@ var _classPrivateFieldLooseBase2 = _interopRequireDefault(require("@babel/runtim
9
9
  var _classPrivateFieldLooseKey2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseKey"));
10
10
  var _utils = require("@json-rpc-tools/utils");
11
11
  var _Eip155RequestHandler = _interopRequireDefault(require("@subwallet/extension-base/services/wallet-connect-service/handler/Eip155RequestHandler"));
12
+ var _storage = require("@subwallet/extension-base/storage");
12
13
  var _signClient = _interopRequireDefault(require("@walletconnect/sign-client"));
13
14
  var _utils2 = require("@walletconnect/utils");
14
15
  var _rxjs = require("rxjs");
@@ -18,6 +19,8 @@ var _helpers = require("./helpers");
18
19
  var _types = require("./types");
19
20
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
20
21
  // SPDX-License-Identifier: Apache-2.0
22
+
23
+ const storage = _storage.SWStorage.instance;
21
24
  var _requestService = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("requestService");
22
25
  var _polkadotRequestHandler = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("polkadotRequestHandler");
23
26
  var _eip155RequestHandler = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("eip155RequestHandler");
@@ -193,9 +196,9 @@ class WalletConnectService {
193
196
  }
194
197
  exports.default = WalletConnectService;
195
198
  function _get_haveData() {
196
- const sessionStorage = localStorage.getItem('wc@2:client:0.3//session');
197
- const pairingStorage = localStorage.getItem('wc@2:core:0.3//pairing');
198
- const subscriptionStorage = localStorage.getItem('wc@2:core:0.3//subscription');
199
+ const sessionStorage = storage.getItem('wc@2:client:0.3//session');
200
+ const pairingStorage = storage.getItem('wc@2:core:0.3//pairing');
201
+ const subscriptionStorage = storage.getItem('wc@2:core:0.3//subscription');
199
202
  const sessions = sessionStorage ? JSON.parse(sessionStorage) : [];
200
203
  const pairings = pairingStorage ? JSON.parse(pairingStorage) : [];
201
204
  const subscriptions = subscriptionStorage ? JSON.parse(subscriptionStorage) : [];
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SWStorage = void 0;
7
+ // Copyright 2019-2022 @polkadot/extension-base authors & contributors
8
+ // SPDX-License-Identifier: Apache-2.0
9
+
10
+ class SWStorage {
11
+ _storage = {};
12
+ constructor() {
13
+ this.sync();
14
+ }
15
+ setItem(key, value) {
16
+ this._storage[key] = value;
17
+ localStorage.setItem(key, value);
18
+ }
19
+ getItem(key) {
20
+ return this._storage[key] || localStorage.getItem(key) || null;
21
+ }
22
+ removeItem(key) {
23
+ this._storage[key] && delete this._storage[key];
24
+ localStorage.removeItem(key);
25
+ }
26
+ clear() {
27
+ this._storage = {};
28
+ localStorage.clear();
29
+ }
30
+ key(index) {
31
+ return Object.keys(this._storage)[index] || null;
32
+ }
33
+ length(index) {
34
+ return Object.keys(this._storage)[index] || null;
35
+ }
36
+
37
+ // Additional methods
38
+ keys() {
39
+ return Object.keys(this._storage) || [];
40
+ }
41
+ copy() {
42
+ return JSON.parse(JSON.stringify(this._storage));
43
+ }
44
+ sync() {
45
+ this._storage = JSON.parse(JSON.stringify(localStorage));
46
+ }
47
+ static get instance() {
48
+ // @ts-ignore
49
+ if (!window.SWStorage) {
50
+ console.log('SWStorage init');
51
+ // @ts-ignore
52
+ window.SWStorage = new SWStorage();
53
+ }
54
+
55
+ // @ts-ignore
56
+ return window.SWStorage;
57
+ }
58
+ }
59
+ exports.SWStorage = SWStorage;
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.listMerge = listMerge;
6
7
  exports.uniqueStringArray = void 0;
7
8
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
8
9
  // SPDX-License-Identifier: Apache-2.0
@@ -14,4 +15,29 @@ const uniqueStringArray = array => {
14
15
  });
15
16
  return Object.keys(map);
16
17
  };
17
- exports.uniqueStringArray = uniqueStringArray;
18
+ exports.uniqueStringArray = uniqueStringArray;
19
+ function listMerge(keys, existed, newItems) {
20
+ const getKey = (ks, item) => {
21
+ if (typeof ks === 'string') {
22
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return
23
+ return item[ks].toString();
24
+ }
25
+
26
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return
27
+ return ks.map(k => item[k].toString()).join('_');
28
+ };
29
+
30
+ // Build existed map with keys
31
+ const existedMap = Object.fromEntries(existed.map(v => {
32
+ return [getKey(keys, v), v];
33
+ }));
34
+ newItems.forEach(item => {
35
+ const key = getKey(keys, item);
36
+ if (existedMap[key]) {
37
+ Object.assign(existedMap[key], item);
38
+ } else {
39
+ existed.push(item);
40
+ }
41
+ });
42
+ return existed;
43
+ }
@@ -1 +1,2 @@
1
1
  export declare const PREDEFINED_STAKING_POOL: Record<string, number>;
2
+ export declare const MAX_NOMINATIONS = "16";
@@ -5,4 +5,5 @@ export const PREDEFINED_STAKING_POOL = {
5
5
  kusama: 80,
6
6
  polkadot: 39,
7
7
  vara_network: 29
8
- };
8
+ };
9
+ export const MAX_NOMINATIONS = '16';
@@ -155,9 +155,9 @@ export const createTransferExtrinsic = async ({
155
155
  }
156
156
  } else if (_TRANSFER_CHAIN_GROUP.pendulum.includes(networkKey) && isTxTokensSupported && !_isNativeToken(tokenInfo)) {
157
157
  if (transferAll) {
158
- transfer = api.tx.tokens.transferAll(to, _getTokenOnChainInfo(tokenInfo), false);
158
+ transfer = api.tx.tokens.transferAll(to, _getTokenOnChainInfo(tokenInfo) || _getTokenOnChainAssetId(tokenInfo), false);
159
159
  } else if (value) {
160
- transfer = api.tx.tokens.transfer(to, _getTokenOnChainInfo(tokenInfo), new BN(value));
160
+ transfer = api.tx.tokens.transfer(to, _getTokenOnChainInfo(tokenInfo) || _getTokenOnChainAssetId(tokenInfo), new BN(value));
161
161
  }
162
162
  } else if (_TRANSFER_CHAIN_GROUP.genshiro.includes(networkKey)
163
163
  // && isTxEqBalancesSupported
@@ -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 { SWStorage } from '@subwallet/extension-base/storage';
4
5
  import { RuntimeInfo } from '@subwallet/extension-base/utils';
5
6
  import Bowser from 'bowser';
6
7
  export const SINGULAR_V1_ENDPOINT = 'https://singular.rmrk-api.xyz/api/account-rmrk1/';
@@ -36,7 +37,7 @@ export const IPFS_ETH_ARAGON = 'https://ipfs.eth.aragon.network/ipfs/'; // 400
36
37
  export const SUBWALLET_IPFS = 'https://ipfs.subwallet.app/ipfs/'; // ???
37
38
 
38
39
  const detectFirefox = () => {
39
- return (localStorage.getItem('browserInfo') || Bowser.getParser(window.navigator.userAgent).getBrowserName()).toLowerCase() === 'firefox';
40
+ return (SWStorage.instance.getItem('browserInfo') || Bowser.getParser(window.navigator.userAgent).getBrowserName()).toLowerCase() === 'firefox';
40
41
  };
41
42
  const isFirefox = detectFirefox();
42
43
  export let SUPPORTED_NFT_NETWORKS;
@@ -8,6 +8,18 @@ import { isUrl, parseRawNumber } from '@subwallet/extension-base/utils';
8
8
  import fetch from 'cross-fetch';
9
9
  import { BN, BN_ZERO } from '@polkadot/util';
10
10
  import { isEthereumAddress } from '@polkadot/util-crypto';
11
+ const convertAddress = address => {
12
+ return isEthereumAddress(address) ? address.toLowerCase() : address;
13
+ };
14
+ const fetchDApps = async network => {
15
+ return new Promise(function (resolve) {
16
+ fetch(`https://api.astar.network/api/v1/${network}/dapps-staking/dappssimple`, {
17
+ method: 'GET'
18
+ }).then(resp => {
19
+ resolve(resp.json());
20
+ }).catch(console.error);
21
+ });
22
+ };
11
23
  export function subscribeAstarStakingMetadata(chain, substrateApi, callback) {
12
24
  return substrateApi.api.query.dappsStaking.currentEra(_currentEra => {
13
25
  const era = _currentEra.toString();
@@ -63,19 +75,10 @@ export async function getAstarStakingMetadata(chain, substrateApi) {
63
75
  unstakingPeriod
64
76
  };
65
77
  }
66
- const convertAddress = address => {
67
- return isEthereumAddress(address) ? address.toLowerCase() : address;
68
- };
69
78
  export async function subscribeAstarNominatorMetadata(chainInfo, address, substrateApi, ledger) {
70
79
  const nominationList = [];
71
80
  const unstakingList = [];
72
- const allDappsReq = new Promise(function (resolve) {
73
- fetch(`https://api.astar.network/api/v1/${chainInfo.slug}/dapps-staking/dapps`, {
74
- method: 'GET'
75
- }).then(resp => {
76
- resolve(resp.json());
77
- }).catch(console.error);
78
- });
81
+ const allDappsReq = fetchDApps(chainInfo.slug);
79
82
  const [_allDapps, _era, _stakerInfo] = await Promise.all([allDappsReq, substrateApi.api.query.dappsStaking.currentEra(), substrateApi.api.query.dappsStaking.generalStakerInfo.entries(address)]);
80
83
  const currentEra = _era.toString();
81
84
  const minDelegatorStake = substrateApi.api.consts.dappsStaking.minimumStakingAmount.toString();
@@ -160,13 +163,7 @@ export async function getAstarNominatorMetadata(chainInfo, address, substrateApi
160
163
  const chainApi = await substrateApi.isReady;
161
164
  const nominationList = [];
162
165
  const unstakingList = [];
163
- const allDappsReq = new Promise(function (resolve) {
164
- fetch(`https://api.astar.network/api/v1/${chain}/dapps-staking/dapps`, {
165
- method: 'GET'
166
- }).then(resp => {
167
- resolve(resp.json());
168
- }).catch(console.error);
169
- });
166
+ const allDappsReq = fetchDApps(chain);
170
167
  const [_ledger, _era, _stakerInfo] = await Promise.all([chainApi.api.query.dappsStaking.ledger(address), chainApi.api.query.dappsStaking.currentEra(), chainApi.api.query.dappsStaking.generalStakerInfo.entries(address)]);
171
168
  const ledger = _ledger.toPrimitive();
172
169
  const currentEra = _era.toString();
@@ -245,13 +242,7 @@ export async function getAstarDappsInfo(networkKey, substrateApi) {
245
242
  const rawMaxStakerPerContract = chainApi.api.consts.dappsStaking.maxNumberOfStakersPerContract.toHuman();
246
243
  const allDappsInfo = [];
247
244
  const maxStakerPerContract = parseRawNumber(rawMaxStakerPerContract);
248
- const allDappsReq = new Promise(function (resolve) {
249
- fetch(`https://api.astar.network/api/v1/${networkKey}/dapps-staking/dapps`, {
250
- method: 'GET'
251
- }).then(resp => {
252
- resolve(resp.json());
253
- }).catch(console.error);
254
- });
245
+ const allDappsReq = fetchDApps(networkKey);
255
246
  const [_era, _allDapps] = await Promise.all([chainApi.api.query.dappsStaking.currentEra(), allDappsReq]);
256
247
  const era = parseRawNumber(_era.toHuman());
257
248
  const allDapps = _allDapps;
@@ -3,8 +3,9 @@
3
3
 
4
4
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
5
  import { StakingStatus, StakingTxErrorType, StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
6
+ import { MAX_NOMINATIONS } from '@subwallet/extension-base/constants';
6
7
  import { calculateAlephZeroValidatorReturn, calculateChainStakedReturn, calculateInflation, calculateTernoaValidatorReturn, calculateValidatorStakedReturn, getCommission, getExistUnstakeErrorMessage, getMaxValidatorErrorMessage, getMinStakeErrorMessage, parseIdentity, parsePoolStashAddress } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
7
- import { _STAKING_CHAIN_GROUP, _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
8
+ import { _EXPECTED_BLOCK_TIME, _STAKING_CHAIN_GROUP, _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
8
9
  import { _getChainSubstrateAddressPrefix } from '@subwallet/extension-base/services/chain-service/utils';
9
10
  import { reformatAddress } from '@subwallet/extension-base/utils';
10
11
  import BigN from 'bignumber.js';
@@ -80,7 +81,7 @@ export function subscribeRelayChainStakingMetadata(chainInfo, substrateApi, call
80
81
  return substrateApi.api.query.staking.currentEra(async _currentEra => {
81
82
  var _substrateApi$api$con, _substrateApi$api$con2, _substrateApi$api$que, _substrateApi$api$que2, _substrateApi$api$que3, _substrateApi$api$que4, _substrateApi$api$que5, _substrateApi$api$que6, _substrateApi$api$que7;
82
83
  const currentEra = _currentEra.toString();
83
- const maxNominations = ((_substrateApi$api$con = substrateApi.api.consts.staking) === null || _substrateApi$api$con === void 0 ? void 0 : (_substrateApi$api$con2 = _substrateApi$api$con.maxNominations) === null || _substrateApi$api$con2 === void 0 ? void 0 : _substrateApi$api$con2.toString()) || '16'; // TODO
84
+ const maxNominations = ((_substrateApi$api$con = substrateApi.api.consts.staking) === null || _substrateApi$api$con === void 0 ? void 0 : (_substrateApi$api$con2 = _substrateApi$api$con.maxNominations) === null || _substrateApi$api$con2 === void 0 ? void 0 : _substrateApi$api$con2.toString()) || MAX_NOMINATIONS; // TODO
84
85
  const maxUnlockingChunks = substrateApi.api.consts.staking.maxUnlockingChunks.toString();
85
86
  const unlockingEras = substrateApi.api.consts.staking.bondingDuration.toString();
86
87
  const [_totalEraStake, _totalIssuance, _auctionCounter, _minNominatorBond, _minPoolJoin, _minimumActiveStake] = await Promise.all([substrateApi.api.query.staking.erasTotalStake(parseInt(currentEra)), substrateApi.api.query.balances.totalIssuance(), (_substrateApi$api$que = substrateApi.api.query.auctions) === null || _substrateApi$api$que === void 0 ? void 0 : _substrateApi$api$que.auctionCounter(), substrateApi.api.query.staking.minNominatorBond(), (_substrateApi$api$que2 = substrateApi.api.query) === null || _substrateApi$api$que2 === void 0 ? void 0 : (_substrateApi$api$que3 = _substrateApi$api$que2.nominationPools) === null || _substrateApi$api$que3 === void 0 ? void 0 : _substrateApi$api$que3.minJoinBond(), ((_substrateApi$api$que4 = substrateApi.api.query) === null || _substrateApi$api$que4 === void 0 ? void 0 : (_substrateApi$api$que5 = _substrateApi$api$que4.staking) === null || _substrateApi$api$que5 === void 0 ? void 0 : _substrateApi$api$que5.minimumActiveStake) && ((_substrateApi$api$que6 = substrateApi.api.query) === null || _substrateApi$api$que6 === void 0 ? void 0 : (_substrateApi$api$que7 = _substrateApi$api$que6.staking) === null || _substrateApi$api$que7 === void 0 ? void 0 : _substrateApi$api$que7.minimumActiveStake())]);
@@ -171,16 +172,17 @@ export async function getRelayChainStakingMetadata(chainInfo, substrateApi) {
171
172
  };
172
173
  }
173
174
  export async function subscribeRelayChainNominatorMetadata(chainInfo, address, substrateApi, ledger) {
174
- var _chainApi$api$query4, _chainApi$api$query4$, _chainApi$api$query5, _chainApi$api$query5$, _chainApi$api$query6, _chainApi$api$query6$, _chainApi$api$query7, _chainApi$api$query7$, _chainApi$api$query8, _chainApi$api$query8$, _chainApi$api$query9, _chainApi$api$query9$;
175
+ var _chainApi$api$query4, _chainApi$api$query4$, _chainApi$api$query5, _chainApi$api$query5$, _chainApi$api$query6, _chainApi$api$query6$, _chainApi$api$query7, _chainApi$api$query7$, _chainApi$api$query8, _chainApi$api$query8$, _chainApi$api$query9, _chainApi$api$query9$, _chainApi$api$derive, _chainApi$api$derive$;
175
176
  const chain = chainInfo.slug;
176
177
  const chainApi = await substrateApi.isReady;
177
- const [_nominations, _currentEra, _bonded, _minimumActiveStake, _minNominatorBond] = await Promise.all([(_chainApi$api$query4 = chainApi.api.query) === null || _chainApi$api$query4 === void 0 ? void 0 : (_chainApi$api$query4$ = _chainApi$api$query4.staking) === null || _chainApi$api$query4$ === void 0 ? void 0 : _chainApi$api$query4$.nominators(address), (_chainApi$api$query5 = chainApi.api.query) === null || _chainApi$api$query5 === void 0 ? void 0 : (_chainApi$api$query5$ = _chainApi$api$query5.staking) === null || _chainApi$api$query5$ === void 0 ? void 0 : _chainApi$api$query5$.currentEra(), (_chainApi$api$query6 = chainApi.api.query) === null || _chainApi$api$query6 === void 0 ? void 0 : (_chainApi$api$query6$ = _chainApi$api$query6.staking) === null || _chainApi$api$query6$ === void 0 ? void 0 : _chainApi$api$query6$.bonded(address), ((_chainApi$api$query7 = chainApi.api.query) === null || _chainApi$api$query7 === void 0 ? void 0 : (_chainApi$api$query7$ = _chainApi$api$query7.staking) === null || _chainApi$api$query7$ === void 0 ? void 0 : _chainApi$api$query7$.minimumActiveStake) && ((_chainApi$api$query8 = chainApi.api.query) === null || _chainApi$api$query8 === void 0 ? void 0 : (_chainApi$api$query8$ = _chainApi$api$query8.staking) === null || _chainApi$api$query8$ === void 0 ? void 0 : _chainApi$api$query8$.minimumActiveStake()), (_chainApi$api$query9 = chainApi.api.query) === null || _chainApi$api$query9 === void 0 ? void 0 : (_chainApi$api$query9$ = _chainApi$api$query9.staking) === null || _chainApi$api$query9$ === void 0 ? void 0 : _chainApi$api$query9$.minNominatorBond()]);
178
+ const [_nominations, _currentEra, _bonded, _minimumActiveStake, _minNominatorBond, _deriveSessionProgress] = await Promise.all([(_chainApi$api$query4 = chainApi.api.query) === null || _chainApi$api$query4 === void 0 ? void 0 : (_chainApi$api$query4$ = _chainApi$api$query4.staking) === null || _chainApi$api$query4$ === void 0 ? void 0 : _chainApi$api$query4$.nominators(address), (_chainApi$api$query5 = chainApi.api.query) === null || _chainApi$api$query5 === void 0 ? void 0 : (_chainApi$api$query5$ = _chainApi$api$query5.staking) === null || _chainApi$api$query5$ === void 0 ? void 0 : _chainApi$api$query5$.currentEra(), (_chainApi$api$query6 = chainApi.api.query) === null || _chainApi$api$query6 === void 0 ? void 0 : (_chainApi$api$query6$ = _chainApi$api$query6.staking) === null || _chainApi$api$query6$ === void 0 ? void 0 : _chainApi$api$query6$.bonded(address), ((_chainApi$api$query7 = chainApi.api.query) === null || _chainApi$api$query7 === void 0 ? void 0 : (_chainApi$api$query7$ = _chainApi$api$query7.staking) === null || _chainApi$api$query7$ === void 0 ? void 0 : _chainApi$api$query7$.minimumActiveStake) && ((_chainApi$api$query8 = chainApi.api.query) === null || _chainApi$api$query8 === void 0 ? void 0 : (_chainApi$api$query8$ = _chainApi$api$query8.staking) === null || _chainApi$api$query8$ === void 0 ? void 0 : _chainApi$api$query8$.minimumActiveStake()), (_chainApi$api$query9 = chainApi.api.query) === null || _chainApi$api$query9 === void 0 ? void 0 : (_chainApi$api$query9$ = _chainApi$api$query9.staking) === null || _chainApi$api$query9$ === void 0 ? void 0 : _chainApi$api$query9$.minNominatorBond(), (_chainApi$api$derive = chainApi.api.derive) === null || _chainApi$api$derive === void 0 ? void 0 : (_chainApi$api$derive$ = _chainApi$api$derive.session) === null || _chainApi$api$derive$ === void 0 ? void 0 : _chainApi$api$derive$.progress()]);
178
179
  const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
179
180
  const minNominatorBond = _minNominatorBond.toString();
180
181
  const bnMinActiveStake = new BN(minActiveStake);
181
182
  const bnMinNominatorBond = new BN(minNominatorBond);
182
183
  const minStake = bnMinActiveStake.gt(bnMinNominatorBond) ? bnMinActiveStake : bnMinNominatorBond;
183
- const _maxNominatorRewardedPerValidator = chainApi.api.consts.staking.maxNominatorRewardedPerValidator.toString();
184
+ const unlimitedNominatorRewarded = chainApi.api.consts.staking.maxExposurePageSize !== undefined;
185
+ const _maxNominatorRewardedPerValidator = (chainApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
184
186
  const maxNominatorRewardedPerValidator = parseInt(_maxNominatorRewardedPerValidator);
185
187
  const nominations = _nominations.toPrimitive();
186
188
  const currentEra = _currentEra.toString();
@@ -203,7 +205,7 @@ export async function subscribeRelayChainNominatorMetadata(chainInfo, address, s
203
205
  if (!topNominators.includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
204
206
  // if nominator has target but not in nominator list
205
207
  nominationStatus = StakingStatus.WAITING;
206
- } else if (topNominators.slice(0, maxNominatorRewardedPerValidator).includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
208
+ } else if (topNominators.slice(0, unlimitedNominatorRewarded ? undefined : maxNominatorRewardedPerValidator).includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
207
209
  // if address in top nominators
208
210
  nominationStatus = StakingStatus.EARNING_REWARD;
209
211
  }
@@ -234,9 +236,17 @@ export async function subscribeRelayChainNominatorMetadata(chainInfo, address, s
234
236
  }
235
237
  }
236
238
  ledger.unlocking.forEach(unlockingChunk => {
239
+ // Calculate the remaining era
237
240
  const isClaimable = unlockingChunk.era - parseInt(currentEra) < 0;
238
241
  const remainingEra = unlockingChunk.era - parseInt(currentEra);
239
- const waitingTime = remainingEra * _STAKING_ERA_LENGTH_MAP[chain];
242
+
243
+ // Calculate the remaining time for current era ending
244
+ const expectedBlockTime = _EXPECTED_BLOCK_TIME[chain];
245
+ const eraLength = _deriveSessionProgress.eraLength.toNumber();
246
+ const eraProgress = _deriveSessionProgress.eraProgress.toNumber();
247
+ const remainingSlots = eraLength - eraProgress;
248
+ const remainingHours = expectedBlockTime * remainingSlots / 60 / 60;
249
+ const waitingTime = remainingEra * _STAKING_ERA_LENGTH_MAP[chain] + remainingHours;
240
250
  unstakingList.push({
241
251
  chain,
242
252
  status: isClaimable ? UnstakingStatus.CLAIMABLE : UnstakingStatus.UNLOCKING,
@@ -272,7 +282,8 @@ export async function getRelayChainNominatorMetadata(chainInfo, address, substra
272
282
  const bnMinActiveStake = new BN(minActiveStake);
273
283
  const bnMinNominatorBond = new BN(minNominatorBond);
274
284
  const minStake = bnMinActiveStake.gt(bnMinNominatorBond) ? bnMinActiveStake : bnMinNominatorBond;
275
- const _maxNominatorRewardedPerValidator = chainApi.api.consts.staking.maxNominatorRewardedPerValidator.toString();
285
+ const unlimitedNominatorRewarded = chainApi.api.consts.staking.maxExposurePageSize !== undefined;
286
+ const _maxNominatorRewardedPerValidator = (chainApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
276
287
  const maxNominatorRewardedPerValidator = parseInt(_maxNominatorRewardedPerValidator);
277
288
  const ledger = _ledger.toPrimitive();
278
289
  const nominations = _nominations.toPrimitive();
@@ -307,7 +318,7 @@ export async function getRelayChainNominatorMetadata(chainInfo, address, substra
307
318
  if (!topNominators.includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
308
319
  // if nominator has target but not in nominator list
309
320
  nominationStatus = StakingStatus.WAITING;
310
- } else if (topNominators.slice(0, maxNominatorRewardedPerValidator).includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
321
+ } else if (topNominators.slice(0, unlimitedNominatorRewarded ? undefined : maxNominatorRewardedPerValidator).includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
311
322
  // if address in top nominators
312
323
  nominationStatus = StakingStatus.EARNING_REWARD;
313
324
  }
@@ -360,11 +371,13 @@ export async function getRelayChainNominatorMetadata(chainInfo, address, substra
360
371
  };
361
372
  }
362
373
  export async function subscribeRelayChainPoolMemberMetadata(chainInfo, address, substrateApi, poolMemberInfo) {
363
- const _maxNominatorRewardedPerValidator = substrateApi.api.consts.staking.maxNominatorRewardedPerValidator.toString();
374
+ var _substrateApi$api$der, _substrateApi$api$der2;
375
+ const unlimitedNominatorRewarded = substrateApi.api.consts.staking.maxExposurePageSize !== undefined;
376
+ const _maxNominatorRewardedPerValidator = (substrateApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
364
377
  const maxNominatorRewardedPerValidator = parseInt(_maxNominatorRewardedPerValidator);
365
378
  const poolsPalletId = substrateApi.api.consts.nominationPools.palletId.toString();
366
379
  const poolStashAccount = parsePoolStashAddress(substrateApi.api, 0, poolMemberInfo.poolId, poolsPalletId);
367
- const [_nominations, _poolMetadata, _currentEra] = await Promise.all([substrateApi.api.query.staking.nominators(poolStashAccount), substrateApi.api.query.nominationPools.metadata(poolMemberInfo.poolId), substrateApi.api.query.staking.currentEra()]);
380
+ const [_nominations, _poolMetadata, _currentEra, _deriveSessionProgress] = await Promise.all([substrateApi.api.query.staking.nominators(poolStashAccount), substrateApi.api.query.nominationPools.metadata(poolMemberInfo.poolId), substrateApi.api.query.staking.currentEra(), (_substrateApi$api$der = substrateApi.api.derive) === null || _substrateApi$api$der === void 0 ? void 0 : (_substrateApi$api$der2 = _substrateApi$api$der.session) === null || _substrateApi$api$der2 === void 0 ? void 0 : _substrateApi$api$der2.progress()]);
368
381
  const poolMetadata = _poolMetadata.toPrimitive();
369
382
  const currentEra = _currentEra.toString();
370
383
  const nominations = _nominations.toJSON();
@@ -388,7 +401,7 @@ export async function subscribeRelayChainPoolMemberMetadata(chainInfo, address,
388
401
  });
389
402
  const topNominators = sortedNominators.map(nominator => {
390
403
  return nominator.who;
391
- }).slice(0, maxNominatorRewardedPerValidator);
404
+ }).slice(0, unlimitedNominatorRewarded ? undefined : maxNominatorRewardedPerValidator);
392
405
  if (topNominators.includes(reformatAddress(poolStashAccount, _getChainSubstrateAddressPrefix(chainInfo)))) {
393
406
  // if address in top nominators
394
407
  stakingStatus = StakingStatus.EARNING_REWARD;
@@ -408,7 +421,15 @@ export async function subscribeRelayChainPoolMemberMetadata(chainInfo, address,
408
421
  Object.entries(poolMemberInfo.unbondingEras).forEach(([unlockingEra, amount]) => {
409
422
  const isClaimable = parseInt(unlockingEra) - parseInt(currentEra) < 0;
410
423
  const remainingEra = parseInt(unlockingEra) - parseInt(currentEra);
411
- const waitingTime = remainingEra * _STAKING_ERA_LENGTH_MAP[chainInfo.slug];
424
+ // const waitingTime = remainingEra * _STAKING_ERA_LENGTH_MAP[chainInfo.slug];
425
+
426
+ // Calculate the remaining time for current era ending
427
+ const expectedBlockTime = _EXPECTED_BLOCK_TIME[chainInfo.slug];
428
+ const eraLength = _deriveSessionProgress.eraLength.toNumber();
429
+ const eraProgress = _deriveSessionProgress.eraProgress.toNumber();
430
+ const remainingSlots = eraLength - eraProgress;
431
+ const remainingHours = expectedBlockTime * remainingSlots / 60 / 60;
432
+ const waitingTime = remainingEra * _STAKING_ERA_LENGTH_MAP[chainInfo.slug] + remainingHours;
412
433
  unstakings.push({
413
434
  chain: chainInfo.slug,
414
435
  status: isClaimable ? UnstakingStatus.CLAIMABLE : UnstakingStatus.UNLOCKING,
@@ -438,7 +459,8 @@ export async function subscribeRelayChainPoolMemberMetadata(chainInfo, address,
438
459
  export async function getRelayChainPoolMemberMetadata(chainInfo, address, substrateApi) {
439
460
  const chainApi = await substrateApi.isReady;
440
461
  const [_poolMemberInfo, _currentEra] = await Promise.all([chainApi.api.query.nominationPools.poolMembers(address), chainApi.api.query.staking.currentEra()]);
441
- const _maxNominatorRewardedPerValidator = chainApi.api.consts.staking.maxNominatorRewardedPerValidator.toString();
462
+ const unlimitedNominatorRewarded = chainApi.api.consts.staking.maxExposurePageSize !== undefined;
463
+ const _maxNominatorRewardedPerValidator = (chainApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
442
464
  const maxNominatorRewardedPerValidator = parseInt(_maxNominatorRewardedPerValidator);
443
465
  const poolsPalletId = chainApi.api.consts.nominationPools.palletId.toString();
444
466
  const poolMemberInfo = _poolMemberInfo.toPrimitive();
@@ -480,7 +502,7 @@ export async function getRelayChainPoolMemberMetadata(chainInfo, address, substr
480
502
  });
481
503
  const topNominators = sortedNominators.map(nominator => {
482
504
  return nominator.who;
483
- }).slice(0, maxNominatorRewardedPerValidator);
505
+ }).slice(0, unlimitedNominatorRewarded ? undefined : maxNominatorRewardedPerValidator);
484
506
  if (topNominators.includes(reformatAddress(poolStashAccount, _getChainSubstrateAddressPrefix(chainInfo)))) {
485
507
  // if address in top nominators
486
508
  stakingStatus = StakingStatus.EARNING_REWARD;
@@ -532,7 +554,8 @@ export async function getRelayValidatorsInfo(chain, substrateApi, decimals, chai
532
554
  const validatorInfoList = [];
533
555
  const [_totalEraStake, _eraStakers, _minBond, _stakingRewards] = await Promise.all([chainApi.api.query.staking.erasTotalStake(parseInt(currentEra)), chainApi.api.query.staking.erasStakers.entries(parseInt(currentEra)), chainApi.api.query.staking.minNominatorBond(), ((_chainApi$api$query$s2 = chainApi.api.query.stakingRewards) === null || _chainApi$api$query$s2 === void 0 ? void 0 : _chainApi$api$query$s2.data) && chainApi.api.query.stakingRewards.data()]);
534
556
  const stakingRewards = _stakingRewards === null || _stakingRewards === void 0 ? void 0 : _stakingRewards.toPrimitive();
535
- const maxNominatorRewarded = chainApi.api.consts.staking.maxNominatorRewardedPerValidator.toString();
557
+ const unlimitedNominatorRewarded = chainApi.api.consts.staking.maxExposurePageSize !== undefined;
558
+ const maxNominatorRewarded = (chainApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
536
559
  const bnTotalEraStake = new BN(_totalEraStake.toString());
537
560
  const eraStakers = _eraStakers;
538
561
  const rawMinBond = _minBond.toHuman();
@@ -569,7 +592,7 @@ export async function getRelayValidatorsInfo(chain, substrateApi, decimals, chai
569
592
  blocked: false,
570
593
  isVerified: false,
571
594
  minBond,
572
- isCrowded: nominatorCount > parseInt(maxNominatorRewarded)
595
+ isCrowded: unlimitedNominatorRewarded ? false : nominatorCount > parseInt(maxNominatorRewarded)
573
596
  });
574
597
  }
575
598
  const extraInfoMap = {};