@subwallet/extension-base 1.1.38-1 → 1.1.39-beta.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 (67) hide show
  1. package/background/KoniTypes.d.ts +2 -0
  2. package/background/types.d.ts +1 -0
  3. package/cjs/koni/api/dotsama/balance.js +464 -0
  4. package/cjs/koni/api/nft/unique_network_nft/index.js +4 -0
  5. package/cjs/koni/background/handlers/Extension.js +64 -13
  6. package/cjs/koni/background/handlers/State.js +6 -5
  7. package/cjs/packageInfo.js +1 -1
  8. package/cjs/services/balance-service/helpers/subscribe/balance.js +1 -1
  9. package/cjs/services/chain-service/health-check/constants/index.js +36 -0
  10. package/cjs/services/chain-service/health-check/utils/asset-info.js +282 -0
  11. package/cjs/services/chain-service/health-check/utils/chain-info.js +36 -0
  12. package/cjs/services/chain-service/health-check/utils/index.js +38 -0
  13. package/cjs/services/chain-service/health-check/utils/provider.js +186 -0
  14. package/cjs/services/chain-service/index.js +61 -51
  15. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +42 -26
  16. package/cjs/services/earning-service/service.js +9 -2
  17. package/cjs/services/migration-service/scripts/MigrateEthProvider.js +17 -0
  18. package/cjs/services/migration-service/scripts/MigratePioneerProvider.js +17 -0
  19. package/cjs/services/migration-service/scripts/MigrateProvider.js +29 -0
  20. package/cjs/services/storage-service/index.js +241 -0
  21. package/cjs/services/transaction-service/index.js +6 -4
  22. package/cjs/types.js +1 -0
  23. package/cjs/utils/address.js +34 -0
  24. package/cjs/utils/eth/mergeTransactionAndSignature.js +8 -3
  25. package/cjs/utils/index.js +6 -5
  26. package/cjs/utils/keyring.js +57 -0
  27. package/cjs/utils/staticData/index.js +5 -5
  28. package/koni/api/nft/unique_network_nft/index.d.ts +1 -0
  29. package/koni/api/nft/unique_network_nft/index.js +5 -1
  30. package/koni/api/staking/bonding/utils.d.ts +0 -1
  31. package/koni/background/handlers/Extension.d.ts +1 -0
  32. package/koni/background/handlers/Extension.js +64 -13
  33. package/koni/background/handlers/State.js +2 -1
  34. package/package.json +42 -17
  35. package/packageInfo.js +1 -1
  36. package/services/balance-service/helpers/subscribe/balance.js +1 -1
  37. package/services/chain-service/health-check/constants/index.d.ts +4 -0
  38. package/services/chain-service/health-check/constants/index.js +26 -0
  39. package/services/chain-service/health-check/utils/asset-info.d.ts +14 -0
  40. package/services/chain-service/health-check/utils/asset-info.js +269 -0
  41. package/services/chain-service/health-check/utils/chain-info.d.ts +8 -0
  42. package/services/chain-service/health-check/utils/chain-info.js +28 -0
  43. package/services/chain-service/health-check/utils/index.d.ts +3 -0
  44. package/services/chain-service/health-check/utils/index.js +6 -0
  45. package/services/chain-service/health-check/utils/provider.d.ts +25 -0
  46. package/services/chain-service/health-check/utils/provider.js +172 -0
  47. package/services/chain-service/index.d.ts +7 -3
  48. package/services/chain-service/index.js +52 -43
  49. package/services/chain-service/types.d.ts +4 -0
  50. package/services/earning-service/handlers/native-staking/relay-chain.d.ts +0 -1
  51. package/services/earning-service/handlers/native-staking/relay-chain.js +42 -26
  52. package/services/earning-service/handlers/special.d.ts +0 -1
  53. package/services/earning-service/service.js +10 -3
  54. package/services/transaction-service/index.js +6 -4
  55. package/types/balance.d.ts +0 -1
  56. package/types/yield/info/pallet.d.ts +4 -1
  57. package/utils/eth/mergeTransactionAndSignature.js +8 -3
  58. package/utils/index.d.ts +1 -2
  59. package/utils/index.js +6 -5
  60. package/utils/staticData/buyServiceInfos.json +0 -1
  61. package/utils/staticData/buyTokenConfigs.json +0 -15
  62. package/utils/staticData/chains.json +192 -89
  63. package/utils/staticData/crowdloanFunds.json +433 -58
  64. package/utils/staticData/index.d.ts +1 -2
  65. package/utils/staticData/index.js +4 -3
  66. package/utils/staticData/marketingCampaigns.json +1 -298
  67. package/utils/staticData/termAndCondition.json +1 -1
@@ -38,6 +38,7 @@ class ChainService {
38
38
  // TODO: consider BehaviorSubject
39
39
  chainInfoMapSubject = new _rxjs.Subject();
40
40
  chainStateMapSubject = new _rxjs.Subject();
41
+ chainStatusMapSubject = new _rxjs.BehaviorSubject({});
41
42
  assetRegistrySubject = new _rxjs.Subject();
42
43
  multiChainAssetMapSubject = new _rxjs.Subject();
43
44
  xcmRefMapSubject = new _rxjs.Subject();
@@ -111,6 +112,9 @@ class ChainService {
111
112
  subscribeChainStateMap() {
112
113
  return this.chainStateMapSubject;
113
114
  }
115
+ subscribeChainStatusMap() {
116
+ return this.chainStatusMapSubject;
117
+ }
114
118
  getAssetRegistry() {
115
119
  return this.dataMap.assetRegistry;
116
120
  }
@@ -188,6 +192,12 @@ class ChainService {
188
192
  getChainStateByKey(key) {
189
193
  return this.dataMap.chainStateMap[key];
190
194
  }
195
+ getChainStatusMap() {
196
+ return this.chainStatusMapSubject.getValue();
197
+ }
198
+ getChainStatusByKey(key) {
199
+ return this.getChainStatusMap()[key];
200
+ }
191
201
  getActiveChains() {
192
202
  return Object.entries(this.dataMap.chainStateMap).filter(_ref => {
193
203
  let [, chainState] = _ref;
@@ -353,9 +363,32 @@ class ChainService {
353
363
  this.lockChainInfoMap = false;
354
364
  return true;
355
365
  }
356
- setChainConnectionStatus(slug, connectionStatus) {
357
- const chainStateMap = this.getChainStateMap();
358
- chainStateMap[slug].connectionStatus = connectionStatus;
366
+ connectionStatusQueueMap = {};
367
+ updateChainConnectionStatus(slug, connectionStatus) {
368
+ this.connectionStatusQueueMap[slug] = connectionStatus;
369
+ (0, _utils2.addLazy)('updateChainConnectionStatus', () => {
370
+ const chainStatusMap = this.getChainStatusMap();
371
+ let update = false;
372
+ Object.entries(this.connectionStatusQueueMap).forEach(_ref3 => {
373
+ let [slug, status] = _ref3;
374
+ if (chainStatusMap[slug]) {
375
+ if (chainStatusMap[slug].connectionStatus !== status) {
376
+ chainStatusMap[slug].connectionStatus = status;
377
+ chainStatusMap[slug].lastUpdated = Date.now();
378
+ update = true;
379
+ }
380
+ } else {
381
+ chainStatusMap[slug] = {
382
+ slug,
383
+ connectionStatus: status,
384
+ lastUpdated: Date.now()
385
+ };
386
+ update = true;
387
+ }
388
+ });
389
+ this.connectionStatusQueueMap = {};
390
+ update && this.chainStatusMapSubject.next(chainStatusMap);
391
+ });
359
392
  }
360
393
  upsertCustomToken(token) {
361
394
  if (token.slug.length === 0) {
@@ -484,8 +517,8 @@ class ChainService {
484
517
  this.logger.log('Finished updating latest asset ref');
485
518
  }
486
519
  handleLatestPriceId(latestPriceIds) {
487
- Object.entries(latestPriceIds).forEach(_ref3 => {
488
- let [slug, priceId] = _ref3;
520
+ Object.entries(latestPriceIds).forEach(_ref4 => {
521
+ let [slug, priceId] = _ref4;
489
522
  if (this.dataMap.assetRegistry[slug]) {
490
523
  this.dataMap.assetRegistry[slug].priceId = priceId;
491
524
  }
@@ -510,12 +543,12 @@ class ChainService {
510
543
  async initApis() {
511
544
  const chainInfoMap = this.getChainInfoMap();
512
545
  const chainStateMap = this.getChainStateMap();
513
- await Promise.all(Object.entries(chainInfoMap).filter(_ref4 => {
546
+ await Promise.all(Object.entries(chainInfoMap).filter(_ref5 => {
514
547
  var _chainStateMap$slug;
515
- let [slug] = _ref4;
548
+ let [slug] = _ref5;
516
549
  return (_chainStateMap$slug = chainStateMap[slug]) === null || _chainStateMap$slug === void 0 ? void 0 : _chainStateMap$slug.active;
517
- }).map(_ref5 => {
518
- let [, chainInfo] = _ref5;
550
+ }).map(_ref6 => {
551
+ let [, chainInfo] = _ref6;
519
552
  try {
520
553
  return this.initApiForChain(chainInfo);
521
554
  } catch (e) {
@@ -530,13 +563,8 @@ class ChainService {
530
563
  providerName
531
564
  } = this.getChainCurrentProviderByKey(chainInfo.slug);
532
565
  const onUpdateStatus = status => {
533
- const currentStatus = this.getChainStateByKey(chainInfo.slug).connectionStatus;
534
-
535
- // Avoid unnecessary update in case disable chain
536
- if (currentStatus !== status) {
537
- this.setChainConnectionStatus(chainInfo.slug, status);
538
- this.updateChainStateMapSubscription();
539
- }
566
+ const slug = chainInfo.slug;
567
+ this.updateChainConnectionStatus(slug, status);
540
568
  };
541
569
  if (chainInfo.substrateInfo !== null && chainInfo.substrateInfo !== undefined) {
542
570
  if (_constants._MANTA_ZK_CHAIN_GROUP.includes(chainInfo.slug) && _utils2.MODULE_SUPPORT.MANTA_ZK && this.mantaChainHandler) {
@@ -635,7 +663,7 @@ class ChainService {
635
663
  this.lockChainInfoMap = true;
636
664
  chainStateMap[chainSlug].active = false;
637
665
  // Set disconnect state for inactive chain
638
- chainStateMap[chainSlug].connectionStatus = _types3._ChainConnectionStatus.DISCONNECTED;
666
+ this.updateChainConnectionStatus(chainSlug, _types3._ChainConnectionStatus.DISCONNECTED);
639
667
  this.destroyApiForChain(chainInfo);
640
668
  this.dbService.updateChainStore({
641
669
  ...chainInfo,
@@ -728,9 +756,9 @@ class ChainService {
728
756
  this.dataMap.chainStateMap[chainInfo.slug] = {
729
757
  currentProvider: providerKey,
730
758
  slug: chainInfo.slug,
731
- connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
732
759
  active: _constants._DEFAULT_ACTIVE_CHAINS.includes(chainInfo.slug)
733
760
  };
761
+ this.updateChainConnectionStatus(chainInfo.slug, _types3._ChainConnectionStatus.DISCONNECTED);
734
762
 
735
763
  // create data for storage
736
764
  newStorageData.push({
@@ -781,9 +809,9 @@ class ChainService {
781
809
  this.dataMap.chainStateMap[storedSlug] = {
782
810
  currentProvider: selectedProvider,
783
811
  slug: storedSlug,
784
- connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
785
812
  active: canActive && storedChainInfo.active
786
813
  };
814
+ this.updateChainConnectionStatus(storedSlug, _types3._ChainConnectionStatus.DISCONNECTED);
787
815
  newStorageData.push({
788
816
  ...mergedChainInfoMap[storedSlug],
789
817
  active: canActive && storedChainInfo.active,
@@ -803,9 +831,9 @@ class ChainService {
803
831
  this.dataMap.chainStateMap[duplicatedDefaultSlug] = {
804
832
  currentProvider: storedChainInfo.currentProvider,
805
833
  slug: duplicatedDefaultSlug,
806
- connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
807
834
  active: storedChainInfo.active
808
835
  };
836
+ this.updateChainConnectionStatus(duplicatedDefaultSlug, _types3._ChainConnectionStatus.DISCONNECTED);
809
837
  newStorageData.push({
810
838
  ...mergedChainInfoMap[duplicatedDefaultSlug],
811
839
  active: storedChainInfo.active,
@@ -830,9 +858,9 @@ class ChainService {
830
858
  currentProvider: storedChainInfo.currentProvider,
831
859
  // TODO: review
832
860
  slug: storedSlug,
833
- connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
834
861
  active: storedChainInfo.active
835
862
  };
863
+ this.updateChainConnectionStatus(storedSlug, _types3._ChainConnectionStatus.DISCONNECTED);
836
864
  newStorageData.push({
837
865
  ...mergedChainInfoMap[storedSlug],
838
866
  active: storedChainInfo.active,
@@ -845,15 +873,15 @@ class ChainService {
845
873
  }
846
874
 
847
875
  // Fill in the missing chainState and storageData (new chains never before seen)
848
- Object.entries(mergedChainInfoMap).forEach(_ref6 => {
849
- let [slug, chainInfo] = _ref6;
876
+ Object.entries(mergedChainInfoMap).forEach(_ref7 => {
877
+ let [slug, chainInfo] = _ref7;
850
878
  if (!(slug in this.dataMap.chainStateMap)) {
851
879
  this.dataMap.chainStateMap[slug] = {
852
880
  currentProvider: Object.keys(chainInfo.providers)[0],
853
881
  slug,
854
- connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
855
882
  active: _constants._DEFAULT_ACTIVE_CHAINS.includes(slug)
856
883
  };
884
+ this.updateChainConnectionStatus(slug, _types3._ChainConnectionStatus.DISCONNECTED);
857
885
  newStorageData.push({
858
886
  ...mergedChainInfoMap[slug],
859
887
  active: _constants._DEFAULT_ACTIVE_CHAINS.includes(slug),
@@ -928,9 +956,7 @@ class ChainService {
928
956
  }
929
957
  }
930
958
  updateChainStateMapSubscription() {
931
- (0, _utils2.addLazy)('updateChainStateMapSubscription', () => {
932
- this.chainStateMapSubject.next(this.getChainStateMap());
933
- }, 300, 900);
959
+ this.chainStateMapSubject.next(this.getChainStateMap());
934
960
  }
935
961
  updateChainInfoMapSubscription() {
936
962
  this.chainInfoMapSubject.next(this.getChainInfoMap());
@@ -1039,10 +1065,17 @@ class ChainService {
1039
1065
  const chainStateMap = this.getChainStateMap();
1040
1066
  chainStateMap[newChainSlug] = {
1041
1067
  active: true,
1042
- connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
1043
1068
  currentProvider: params.chainEditInfo.currentProvider,
1044
1069
  slug: newChainSlug
1045
1070
  };
1071
+
1072
+ // const chainStatusMap = this.getChainStatusMap();
1073
+ // const chainStatusMap[newChainSlug] = {
1074
+ // slug: newChainSlug,
1075
+ // connectionStatus: _ChainConnectionStatus.DISCONNECTED,
1076
+ // lastUpdated: Date.now()
1077
+ // };
1078
+
1046
1079
  await this.initApiForChain(chainInfo);
1047
1080
 
1048
1081
  // create a record in assetRegistry for native token and update store/subscription
@@ -1327,29 +1360,6 @@ class ChainService {
1327
1360
  await Promise.all([this.substrateChainHandler.wakeUp(), this.evmChainHandler.wakeUp()]);
1328
1361
  this.checkLatestData();
1329
1362
  }
1330
- checkAndUpdateStatusMapForChain(chainSlug) {
1331
- const substrateApiMap = this.getSubstrateApiMap();
1332
- const evmApiMap = this.getEvmApiMap();
1333
- const chainState = this.getChainStateByKey(chainSlug);
1334
- let update = false;
1335
- function updateState(current, status) {
1336
- if (current.connectionStatus !== status) {
1337
- current.connectionStatus = status;
1338
- update = true;
1339
- }
1340
- }
1341
- if (chainState.active) {
1342
- const api = substrateApiMap[chainSlug] || evmApiMap[chainSlug];
1343
- if (api) {
1344
- updateState(chainState, api.isApiConnected ? _types3._ChainConnectionStatus.CONNECTED : _types3._ChainConnectionStatus.DISCONNECTED);
1345
- }
1346
- } else {
1347
- updateState(chainState, _types3._ChainConnectionStatus.DISCONNECTED);
1348
- }
1349
- if (update) {
1350
- this.dataMap.chainStateMap[chainSlug] = chainState;
1351
- }
1352
- }
1353
1363
  async initAssetSettings() {
1354
1364
  const assetSettings = await this.getAssetSettings();
1355
1365
  const activeChainSlugs = this.getActiveChainSlugs();
@@ -287,7 +287,21 @@ class RelayNativeStakingPoolHandler extends _base.default {
287
287
  const currentEra = _era.toString();
288
288
  const allValidators = [];
289
289
  const validatorInfoList = [];
290
- 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$s = chainApi.api.query.stakingRewards) === null || _chainApi$api$query$s === void 0 ? void 0 : _chainApi$api$query$s.data) && chainApi.api.query.stakingRewards.data()]);
290
+ const [_totalEraStake, _eraStakers, _minBond, _stakingRewards, _validators] = 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$s = chainApi.api.query.stakingRewards) === null || _chainApi$api$query$s === void 0 ? void 0 : _chainApi$api$query$s.data) && chainApi.api.query.stakingRewards.data(), chainApi.api.query.staking.validators.entries()]);
291
+
292
+ // filter blocked validators
293
+ const validators = _validators;
294
+ const blockValidatorList = [];
295
+ for (const validator of validators) {
296
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
297
+ const validatorAddress = validator[0].toHuman()[0];
298
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
299
+ const validatorPrefs = validator[1].toHuman();
300
+ const isBlocked = validatorPrefs.blocked;
301
+ if (isBlocked) {
302
+ blockValidatorList.push(validatorAddress);
303
+ }
304
+ }
291
305
  const stakingRewards = _stakingRewards === null || _stakingRewards === void 0 ? void 0 : _stakingRewards.toPrimitive();
292
306
  const unlimitedNominatorRewarded = chainApi.api.consts.staking.maxExposurePageSize !== undefined;
293
307
  const maxNominatorRewarded = (chainApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
@@ -303,32 +317,34 @@ class RelayNativeStakingPoolHandler extends _base.default {
303
317
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
304
318
  const rawValidatorStat = item[1].toHuman();
305
319
  const validatorAddress = rawValidatorInfo[1];
306
- const rawTotalStake = rawValidatorStat.total;
307
- const rawOwnStake = rawValidatorStat.own;
308
- const bnTotalStake = new _util.BN(rawTotalStake.replaceAll(',', ''));
309
- const bnOwnStake = new _util.BN(rawOwnStake.replaceAll(',', ''));
310
- const otherStake = bnTotalStake.sub(bnOwnStake);
311
- totalStakeMap[validatorAddress] = bnTotalStake;
312
- let nominatorCount = 0;
313
- if ('others' in rawValidatorStat) {
314
- const others = rawValidatorStat.others;
315
- nominatorCount = others.length;
320
+ if (!blockValidatorList.includes(validatorAddress)) {
321
+ const rawTotalStake = rawValidatorStat.total;
322
+ const rawOwnStake = rawValidatorStat.own;
323
+ const bnTotalStake = new _util.BN(rawTotalStake.replaceAll(',', ''));
324
+ const bnOwnStake = new _util.BN(rawOwnStake.replaceAll(',', ''));
325
+ const otherStake = bnTotalStake.sub(bnOwnStake);
326
+ totalStakeMap[validatorAddress] = bnTotalStake;
327
+ let nominatorCount = 0;
328
+ if ('others' in rawValidatorStat) {
329
+ const others = rawValidatorStat.others;
330
+ nominatorCount = others.length;
331
+ }
332
+ allValidators.push(validatorAddress);
333
+ validatorInfoList.push({
334
+ address: validatorAddress,
335
+ totalStake: bnTotalStake.toString(),
336
+ ownStake: bnOwnStake.toString(),
337
+ otherStake: otherStake.toString(),
338
+ nominatorCount,
339
+ // to be added later
340
+ commission: 0,
341
+ expectedReturn: 0,
342
+ blocked: false,
343
+ isVerified: false,
344
+ minBond,
345
+ isCrowded: unlimitedNominatorRewarded ? false : nominatorCount > parseInt(maxNominatorRewarded)
346
+ });
316
347
  }
317
- allValidators.push(validatorAddress);
318
- validatorInfoList.push({
319
- address: validatorAddress,
320
- totalStake: bnTotalStake.toString(),
321
- ownStake: bnOwnStake.toString(),
322
- otherStake: otherStake.toString(),
323
- nominatorCount,
324
- // to be added later
325
- commission: 0,
326
- expectedReturn: 0,
327
- blocked: false,
328
- isVerified: false,
329
- minBond,
330
- isCrowded: unlimitedNominatorRewarded ? false : nominatorCount > parseInt(maxNominatorRewarded)
331
- });
332
348
  }
333
349
  const extraInfoMap = {};
334
350
  await Promise.all(allValidators.map(async address => {
@@ -134,13 +134,20 @@ class EarningService {
134
134
  this.eventService.onLazy((events, eventTypes) => {
135
135
  (async () => {
136
136
  const removedAddresses = [];
137
+ const removeChains = [];
137
138
  events.forEach(event => {
138
139
  if (event.type === 'account.remove') {
139
140
  removedAddresses.push(event.data[0]);
140
141
  }
142
+ if (event.type === 'chain.updateState') {
143
+ const chainState = this.state.getChainStateByKey(event.data[0]);
144
+ if (chainState && !(0, _utils._isChainEnabled)(chainState)) {
145
+ removeChains.push(event.data[0]);
146
+ }
147
+ }
141
148
  });
142
- if (removedAddresses.length > 0) {
143
- await this.removeYieldPositions(undefined, removedAddresses);
149
+ if (removeChains.length || removedAddresses.length) {
150
+ await this.removeYieldPositions(removeChains, removedAddresses);
144
151
  }
145
152
 
146
153
  // Account changed or chain changed (active or inactive)
@@ -0,0 +1,17 @@
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 _MigrateProvider = _interopRequireDefault(require("./MigrateProvider"));
9
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ class MigrateEthProvider extends _MigrateProvider.default {
13
+ newProvider = 'ethereum';
14
+ oldProvider = 'Cloudflare';
15
+ slug = 'Llamarpc';
16
+ }
17
+ exports.default = MigrateEthProvider;
@@ -0,0 +1,17 @@
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 _MigrateProvider = _interopRequireDefault(require("./MigrateProvider"));
9
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ class MigratePioneerProvider extends _MigrateProvider.default {
13
+ slug = 'pioneer';
14
+ oldProvider = 'OnFinality';
15
+ newProvider = 'Pioneer';
16
+ }
17
+ exports.default = MigratePioneerProvider;
@@ -0,0 +1,29 @@
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 MigrateProvider extends _Base.default {
13
+ async run() {
14
+ const state = this.state;
15
+ const chainState = state.getChainStateByKey(this.slug);
16
+ const chainInfo = state.getChainInfo(this.slug);
17
+ if (chainState && chainState.active && chainState.currentProvider === this.oldProvider) {
18
+ await state.upsertChainInfo({
19
+ mode: 'update',
20
+ chainEditInfo: {
21
+ currentProvider: this.newProvider,
22
+ slug: this.slug,
23
+ providers: chainInfo.providers
24
+ }
25
+ });
26
+ }
27
+ }
28
+ }
29
+ exports.default = MigrateProvider;
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.DatabaseService = void 0;
8
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
9
+ var _databases = _interopRequireDefault(require("@subwallet/extension-base/services/storage-service/databases"));
10
+ var _dbStores = require("@subwallet/extension-base/services/storage-service/db-stores");
11
+ var _ChainStakingMetadata = _interopRequireDefault(require("@subwallet/extension-base/services/storage-service/db-stores/ChainStakingMetadata"));
12
+ var _NominatorMetadata = _interopRequireDefault(require("@subwallet/extension-base/services/storage-service/db-stores/NominatorMetadata"));
13
+ var _utils = require("@subwallet/extension-base/utils");
14
+ var _util = require("@polkadot/util");
15
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
16
+ // SPDX-License-Identifier: Apache-2.0
17
+
18
+ class DatabaseService {
19
+ // TODO: might remove this
20
+
21
+ constructor(eventService) {
22
+ this.eventService = eventService;
23
+ this.logger = (0, _util.logger)('DB-Service');
24
+ this._db = new _databases.default();
25
+ this._db.on('ready', () => {
26
+ this.eventService.emit('database.ready', true);
27
+ });
28
+ this.stores = {
29
+ price: new _dbStores.PriceStore(this._db.price),
30
+ balance: new _dbStores.BalanceStore(this._db.balances),
31
+ nft: new _dbStores.NftStore(this._db.nfts),
32
+ nftCollection: new _dbStores.NftCollectionStore(this._db.nftCollections),
33
+ crowdloan: new _dbStores.CrowdloanStore(this._db.crowdloans),
34
+ staking: new _dbStores.StakingStore(this._db.stakings),
35
+ transaction: new _dbStores.TransactionStore(this._db.transactions),
36
+ migration: new _dbStores.MigrationStore(this._db.migrations),
37
+ metadata: new _dbStores.MetadataStore(this._db.metadata),
38
+ chain: new _dbStores.ChainStore(this._db.chain),
39
+ asset: new _dbStores.AssetStore(this._db.asset),
40
+ // staking
41
+ chainStakingMetadata: new _ChainStakingMetadata.default(this._db.chainStakingMetadata),
42
+ nominatorMetadata: new _NominatorMetadata.default(this._db.nominatorMetadata)
43
+ };
44
+ }
45
+ async updatePriceStore(priceData) {
46
+ await this.stores.price.table.put(priceData);
47
+ }
48
+ async getPriceStore() {
49
+ try {
50
+ const rs = await this.stores.price.table.get('usd');
51
+ return rs;
52
+ } catch (e) {
53
+ this.logger.error(e);
54
+ return undefined;
55
+ }
56
+ }
57
+
58
+ // Balance
59
+ async getStoredBalance() {
60
+ return this.stores.balance.table.toArray();
61
+ }
62
+ async updateBalanceStore(address, item) {
63
+ if (item.state === _KoniTypes.APIItemState.READY) {
64
+ return this.stores.balance.upsert({
65
+ address,
66
+ ...item
67
+ });
68
+ }
69
+ }
70
+ async removeFromBalanceStore(assets) {
71
+ return this.stores.balance.removeBySlugs(assets);
72
+ }
73
+
74
+ // Crowdloan
75
+ async updateCrowdloanStore(chain, address, item) {
76
+ if (item.state === _KoniTypes.APIItemState.READY && item.contribute !== '0') {
77
+ return this.stores.crowdloan.upsert({
78
+ chain,
79
+ address,
80
+ ...item
81
+ });
82
+ } else {
83
+ return this.stores.crowdloan.deleteByChainAndAddress(chain, address);
84
+ }
85
+ }
86
+
87
+ // Staking
88
+ async updateStaking(chain, address, item) {
89
+ if (item.state === _KoniTypes.APIItemState.READY) {
90
+ return this.stores.staking.upsert(item);
91
+ }
92
+ }
93
+ async getStakings(addresses, chains) {
94
+ return this.stores.staking.getStakings(addresses, chains);
95
+ }
96
+ async getStakingsByChains(chains) {
97
+ return this.stores.staking.getStakingsByChains(chains);
98
+ }
99
+ async getPooledStakings(addresses, chainHashes) {
100
+ return this.stores.staking.getPooledStakings(addresses, chainHashes);
101
+ }
102
+ subscribeStaking(addresses, chainList, callback) {
103
+ this.stakingSubscription && this.stakingSubscription.unsubscribe();
104
+ this.stakingSubscription = this.stores.staking.subscribeStaking(addresses, chainList).subscribe({
105
+ next: stakings => callback && callback(stakings)
106
+ });
107
+ return this.stakingSubscription;
108
+ }
109
+ subscribeChainStakingMetadata(chains, callback) {
110
+ this.stores.chainStakingMetadata.subscribeByChain(chains).subscribe({
111
+ next: data => callback && callback(data)
112
+ });
113
+ }
114
+ subscribeNominatorMetadata(addresses, callback) {
115
+ return this.stores.nominatorMetadata.subscribeByAddresses(addresses).subscribe({
116
+ next: data => callback && callback(data)
117
+ });
118
+ }
119
+
120
+ // Transaction histories
121
+ async getHistories(query) {
122
+ return this.stores.transaction.queryHistory(query);
123
+ }
124
+ async upsertHistory(histories) {
125
+ const cleanedHistory = histories.filter(x => x && x.address && x.chain && x.extrinsicHash);
126
+ return this.stores.transaction.bulkUpsert(cleanedHistory);
127
+ }
128
+ async updateHistoryByExtrinsicHash(extrinsicHash, updateData) {
129
+ const canUpdate = updateData && extrinsicHash;
130
+ if (!canUpdate) {
131
+ return;
132
+ }
133
+ return this.stores.transaction.updateWithQuery({
134
+ extrinsicHash
135
+ }, updateData);
136
+ }
137
+
138
+ // NFT Collection
139
+ async addNftCollection(collection) {
140
+ return this.stores.nftCollection.upsert(collection);
141
+ }
142
+ async deleteNftCollection(chain, collectionId) {
143
+ await this.stores.nftCollection.removeCollection(chain, collectionId);
144
+ await this.stores.nft.deleteNftsByCollection(chain, collectionId);
145
+ }
146
+ getAllNftCollection(chainHashes) {
147
+ return this.stores.nftCollection.getNftCollection(chainHashes);
148
+ }
149
+
150
+ // NFT
151
+ subscribeNft(addresses, chainHashes, callback) {
152
+ this.nftSubscription && this.nftSubscription.unsubscribe();
153
+ this.nftSubscription = this.stores.nft.subscribeNft(addresses, chainHashes).subscribe({
154
+ next: nfts => callback && callback(nfts)
155
+ });
156
+ return this.nftSubscription;
157
+ }
158
+ async cleanUpNft(chain, owner, collectionIds, nftIds, ownNothing) {
159
+ if (ownNothing) {
160
+ return this.stores.nft.deleteNftsByChainAndOwner(chain, (0, _utils.reformatAddress)(owner, 42), collectionIds);
161
+ }
162
+ return this.stores.nft.cleanUpNfts(chain, (0, _utils.reformatAddress)(owner, 42), collectionIds, nftIds);
163
+ }
164
+ async getNft(addresses, chainHashes) {
165
+ return this.stores.nft.getNft(addresses, chainHashes);
166
+ }
167
+ async addNft(address, nft) {
168
+ return this.stores.nft.upsert({
169
+ ...nft,
170
+ address
171
+ });
172
+ }
173
+ handleNftTransfer(chain, addresses, nftItem) {
174
+ return this.stores.nft.deleteNftItem(chain, addresses, nftItem);
175
+ }
176
+ removeNfts(chain, address, collectionId, nftIds) {
177
+ return this.stores.nft.removeNfts(chain, address, collectionId, nftIds);
178
+ }
179
+
180
+ // Chain
181
+ async updateChainStore(item) {
182
+ return this.stores.chain.upsert(item);
183
+ }
184
+ async bulkUpdateChainStore(data) {
185
+ return this.stores.chain.bulkUpsert(data);
186
+ }
187
+ async removeFromChainStore(chains) {
188
+ return this.stores.chain.removeChains(chains);
189
+ }
190
+ async getAllChainStore() {
191
+ return this.stores.chain.getAll();
192
+ }
193
+
194
+ // Asset
195
+ async updateAssetStore(item) {
196
+ return this.stores.asset.upsert(item);
197
+ }
198
+ async getAllAssetStore() {
199
+ return this.stores.asset.getAll();
200
+ }
201
+ async removeFromAssetStore(items) {
202
+ return this.stores.asset.removeAssets(items);
203
+ }
204
+
205
+ // Staking
206
+ async updateChainStakingMetadata(item, changes) {
207
+ const existingRecord = await this.stores.chainStakingMetadata.getByChainAndType(item.chain, item.type);
208
+ if (existingRecord && changes) {
209
+ return this.stores.chainStakingMetadata.updateByChainAndType(item.chain, item.type, changes);
210
+ }
211
+ return this.stores.chainStakingMetadata.upsert(item);
212
+ }
213
+ async getChainStakingMetadata() {
214
+ return this.stores.chainStakingMetadata.getAll();
215
+ }
216
+ async getStakingMetadataByChain(chain) {
217
+ let type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _KoniTypes.StakingType.NOMINATED;
218
+ return this.stores.chainStakingMetadata.getByChainAndType(chain, type);
219
+ }
220
+ async updateNominatorMetadata(item) {
221
+ return this.stores.nominatorMetadata.upsert(item);
222
+ }
223
+ async getNominatorMetadata() {
224
+ return this.stores.nominatorMetadata.getAll();
225
+ }
226
+ async resetWallet(resetAll) {
227
+ return new Promise((resolve, reject) => {
228
+ const stores = [this.stores.balance, this.stores.nft, this.stores.nftCollection, this.stores.crowdloan, this.stores.staking, this.stores.transaction, this.stores.nominatorMetadata];
229
+ if (resetAll) {
230
+ stores.push(this.stores.chain, this.stores.asset);
231
+ }
232
+ const promises = stores.map(store => store.clear());
233
+ Promise.all(promises).then(() => {
234
+ resolve();
235
+ }).catch(e => {
236
+ reject(e);
237
+ });
238
+ });
239
+ }
240
+ }
241
+ exports.DatabaseService = DatabaseService;