@subwallet/extension-base 1.1.25-0 → 1.1.26-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 (71) hide show
  1. package/background/KoniTypes.d.ts +2 -2
  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/relayChain.js +48 -25
  8. package/cjs/koni/api/xcm/xTokens.js +1 -1
  9. package/cjs/koni/background/handlers/Extension.js +11 -8
  10. package/cjs/koni/background/handlers/Mobile.js +81 -5
  11. package/cjs/koni/background/handlers/State.js +45 -117
  12. package/cjs/koni/background/subscription.js +2 -2
  13. package/cjs/packageInfo.js +1 -1
  14. package/cjs/services/balance-service/BalanceMapImpl.js +114 -0
  15. package/cjs/services/campaign-service/index.js +2 -0
  16. package/cjs/services/chain-service/constants.js +24 -3
  17. package/cjs/services/event-service/index.js +7 -7
  18. package/cjs/services/event-service/types.js +1 -1
  19. package/cjs/services/history-service/index.js +1 -0
  20. package/cjs/services/keyring-service/index.js +10 -6
  21. package/cjs/services/migration-service/scripts/index.js +3 -1
  22. package/cjs/services/migration-service/scripts/tokens/MigratePolygonUSDCProvider.js +16 -0
  23. package/cjs/services/migration-service/scripts/tokens/MigrateToken.js +33 -0
  24. package/cjs/services/setting-service/SettingService.js +2 -1
  25. package/cjs/services/setting-service/i18n/i18n.js +2 -1
  26. package/cjs/services/storage-service/DatabaseService.js +8 -19
  27. package/cjs/services/storage-service/db-stores/Balance.js +4 -13
  28. package/cjs/services/wallet-connect-service/index.js +6 -3
  29. package/cjs/storage/index.js +59 -0
  30. package/cjs/utils/array.js +27 -1
  31. package/constants/staking.d.ts +1 -0
  32. package/constants/staking.js +2 -1
  33. package/koni/api/dotsama/transfer.js +2 -2
  34. package/koni/api/nft/config.js +2 -1
  35. package/koni/api/staking/bonding/relayChain.js +40 -17
  36. package/koni/api/xcm/xTokens.js +1 -1
  37. package/koni/background/handlers/Extension.js +11 -8
  38. package/koni/background/handlers/Mobile.d.ts +6 -0
  39. package/koni/background/handlers/Mobile.js +75 -3
  40. package/koni/background/handlers/State.d.ts +7 -8
  41. package/koni/background/handlers/State.js +34 -104
  42. package/koni/background/subscription.js +2 -2
  43. package/package.json +40 -20
  44. package/packageInfo.js +1 -1
  45. package/services/balance-service/BalanceMapImpl.d.ts +17 -0
  46. package/services/balance-service/BalanceMapImpl.js +104 -0
  47. package/services/campaign-service/index.d.ts +1 -0
  48. package/services/campaign-service/index.js +2 -0
  49. package/services/chain-service/constants.d.ts +1 -0
  50. package/services/chain-service/constants.js +22 -2
  51. package/services/event-service/index.d.ts +1 -4
  52. package/services/event-service/index.js +8 -7
  53. package/services/event-service/types.js +1 -1
  54. package/services/history-service/index.js +1 -0
  55. package/services/keyring-service/index.js +10 -6
  56. package/services/migration-service/scripts/index.js +3 -1
  57. package/services/migration-service/scripts/tokens/MigratePolygonUSDCProvider.d.ts +5 -0
  58. package/services/migration-service/scripts/tokens/MigratePolygonUSDCProvider.js +8 -0
  59. package/services/migration-service/scripts/tokens/MigrateToken.d.ts +9 -0
  60. package/services/migration-service/scripts/tokens/MigrateToken.js +26 -0
  61. package/services/setting-service/SettingService.js +2 -1
  62. package/services/setting-service/i18n/i18n.js +2 -1
  63. package/services/storage-service/DatabaseService.d.ts +3 -1
  64. package/services/storage-service/DatabaseService.js +7 -19
  65. package/services/storage-service/db-stores/Balance.d.ts +3 -2
  66. package/services/storage-service/db-stores/Balance.js +4 -13
  67. package/services/wallet-connect-service/index.js +5 -3
  68. package/storage/index.d.ts +14 -0
  69. package/storage/index.js +52 -0
  70. package/utils/array.d.ts +1 -0
  71. package/utils/array.js +26 -1
@@ -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;
@@ -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 = {};
@@ -19,6 +19,6 @@ function getCurrencyId(tokenInfo) {
19
19
  }
20
20
  export function getExtrinsicByXtokensPallet(tokenInfo, originChainInfo, destinationChainInfo, recipientAddress, value, api) {
21
21
  const weightParam = ['pioneer'].includes(originChainInfo.slug) ? FOUR_INSTRUCTIONS_WEIGHT : getDestWeight();
22
- const destVersion = ['moonbeam', 'moonriver', 'bifrost_dot', 'interlay', 'hydradx_main', 'acala', 'parallel', 'astar', 'shiden'].includes(originChainInfo.slug) ? 'V3' : undefined;
22
+ const destVersion = ['moonbeam', 'moonriver', 'bifrost_dot', 'interlay', 'hydradx_main', 'acala', 'parallel', 'astar', 'shiden', 'centrifuge'].includes(originChainInfo.slug) ? 'V3' : undefined;
23
23
  return api.tx.xTokens.transfer(getCurrencyId(tokenInfo), value, getDestMultilocation(destinationChainInfo, recipientAddress, destVersion), weightParam);
24
24
  }
@@ -1000,21 +1000,24 @@ export default class KoniExtension {
1000
1000
  });
1001
1001
  return this.getPrice();
1002
1002
  }
1003
- getBalance(reset) {
1003
+ async getBalance(reset) {
1004
1004
  return this.#koniState.getBalance(reset);
1005
1005
  }
1006
- subscribeBalance(id, port) {
1006
+ async subscribeBalance(id, port) {
1007
1007
  const cb = createSubscription(id, port);
1008
1008
  const balanceSubscription = this.#koniState.subscribeBalance().subscribe({
1009
1009
  next: rs => {
1010
- cb(rs);
1010
+ const data = {
1011
+ details: rs
1012
+ };
1013
+ cb(data);
1011
1014
  }
1012
1015
  });
1013
1016
  this.createUnsubscriptionHandle(id, balanceSubscription.unsubscribe);
1014
1017
  port.onDisconnect.addListener(() => {
1015
1018
  this.cancelSubscription(id);
1016
1019
  });
1017
- return this.getBalance(true);
1020
+ return await this.getBalance(true);
1018
1021
  }
1019
1022
  getCrowdloan(reset) {
1020
1023
  return this.#koniState.getCrowdloan(reset);
@@ -3730,9 +3733,9 @@ export default class KoniExtension {
3730
3733
  case 'pri(price.getSubscription)':
3731
3734
  return await this.subscribePrice(id, port);
3732
3735
  case 'pri(balance.getBalance)':
3733
- return this.getBalance();
3736
+ return await this.getBalance();
3734
3737
  case 'pri(balance.getSubscription)':
3735
- return this.subscribeBalance(id, port);
3738
+ return await this.subscribeBalance(id, port);
3736
3739
  case 'pri(crowdloan.getCrowdloan)':
3737
3740
  return this.getCrowdloan();
3738
3741
  case 'pri(crowdloan.getSubscription)':
@@ -4068,8 +4071,8 @@ export default class KoniExtension {
4068
4071
  return this.#koniState.dbService.exportDB();
4069
4072
  case 'pri(database.import)':
4070
4073
  return this.#koniState.dbService.importDB(request);
4071
- case 'pri(database.checkMetadata)':
4072
- return this.#koniState.dbService.checkImportMetadata(request);
4074
+ case 'pri(database.exportJson)':
4075
+ return this.#koniState.dbService.getExportJson();
4073
4076
  /* Database */
4074
4077
  // Default
4075
4078
  default:
@@ -2,9 +2,13 @@
2
2
  import { ActiveCronAndSubscriptionMap, CronServiceType, MobileData, RequestCronAndSubscriptionAction, RequestInitCronAndSubscription, SubscriptionServiceType } from '@subwallet/extension-base/background/KoniTypes';
3
3
  import { MessageTypes, RequestTypes, ResponseType } from '@subwallet/extension-base/background/types';
4
4
  import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
5
+ export declare function isLocalStorageReset(): boolean;
6
+ export declare function isIndexedDBReset(): Promise<boolean>;
7
+ export declare function isWebRunnerDataReset(): Promise<boolean>;
5
8
  export default class Mobile {
6
9
  private state;
7
10
  private restoreHandler;
11
+ private lastRestoreData;
8
12
  constructor(state: KoniState);
9
13
  ping(): string;
10
14
  initCronAndSubscription({ cron: { activeServices, intervalMap }, subscription: { activeServices } }: RequestInitCronAndSubscription): ActiveCronAndSubscriptionMap;
@@ -18,6 +22,8 @@ export default class Mobile {
18
22
  startSubscriptionServices(services: SubscriptionServiceType[]): void;
19
23
  stopSubscriptionServices(services: SubscriptionServiceType[]): void;
20
24
  restartSubscriptionServices(services: SubscriptionServiceType[]): void;
25
+ private _getLocalStorageExportData;
26
+ private _getDexieExportData;
21
27
  mobileBackup(): Promise<MobileData>;
22
28
  mobileRestore({ indexedDB, storage }: Partial<MobileData>): Promise<void>;
23
29
  waitRestore(): Promise<void>;