@subwallet/extension-base 1.1.33-beta.0 → 1.1.33-beta.2

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 (47) hide show
  1. package/background/KoniTypes.d.ts +9 -0
  2. package/background/KoniTypes.js +3 -0
  3. package/cjs/background/KoniTypes.js +3 -0
  4. package/cjs/constants/staking.js +1 -1
  5. package/cjs/koni/api/yield/helper/utils.js +6 -3
  6. package/cjs/services/chain-service/constants.js +4 -2
  7. package/cjs/services/chain-service/handler/SubstrateApi.js +10 -5
  8. package/cjs/services/chain-service/index.js +144 -37
  9. package/cjs/services/chain-service/utils.js +68 -0
  10. package/cjs/services/earning-service/handlers/liquid-staking/base.js +2 -1
  11. package/cjs/services/earning-service/handlers/liquid-staking/bifrost-manta.js +140 -0
  12. package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +2 -1
  13. package/cjs/services/earning-service/handlers/liquid-staking/index.js +7 -0
  14. package/cjs/services/earning-service/handlers/special.js +7 -3
  15. package/cjs/services/earning-service/service.js +1 -0
  16. package/cjs/services/storage-service/DatabaseService.js +34 -0
  17. package/cjs/services/storage-service/db-stores/AssetRef.js +24 -0
  18. package/cjs/services/transaction-service/index.js +3 -0
  19. package/cjs/types/yield/actions/join/step.js +1 -0
  20. package/constants/staking.js +1 -1
  21. package/koni/api/yield/helper/utils.d.ts +1 -1
  22. package/koni/api/yield/helper/utils.js +5 -3
  23. package/package.json +12 -2
  24. package/services/chain-service/constants.d.ts +1 -0
  25. package/services/chain-service/constants.js +1 -0
  26. package/services/chain-service/handler/SubstrateApi.js +10 -5
  27. package/services/chain-service/index.d.ts +12 -1
  28. package/services/chain-service/index.js +140 -34
  29. package/services/chain-service/utils.d.ts +10 -1
  30. package/services/chain-service/utils.js +66 -1
  31. package/services/earning-service/handlers/liquid-staking/base.d.ts +1 -1
  32. package/services/earning-service/handlers/liquid-staking/base.js +2 -1
  33. package/services/earning-service/handlers/liquid-staking/bifrost-manta.d.ts +37 -0
  34. package/services/earning-service/handlers/liquid-staking/bifrost-manta.js +132 -0
  35. package/services/earning-service/handlers/liquid-staking/bifrost.d.ts +3 -3
  36. package/services/earning-service/handlers/liquid-staking/bifrost.js +2 -1
  37. package/services/earning-service/handlers/liquid-staking/index.d.ts +1 -0
  38. package/services/earning-service/handlers/liquid-staking/index.js +1 -0
  39. package/services/earning-service/handlers/special.js +7 -3
  40. package/services/earning-service/service.js +2 -1
  41. package/services/storage-service/DatabaseService.js +34 -0
  42. package/services/storage-service/databases/index.d.ts +4 -1
  43. package/services/storage-service/db-stores/AssetRef.d.ts +7 -0
  44. package/services/storage-service/db-stores/AssetRef.js +16 -0
  45. package/services/transaction-service/index.js +3 -0
  46. package/types/yield/actions/join/step.d.ts +1 -0
  47. package/types/yield/actions/join/step.js +1 -0
@@ -371,16 +371,19 @@ export declare enum ExtrinsicType {
371
371
  MINT_SDOT = "earn.mint_sdot",
372
372
  MINT_QDOT = "earn.mint_qdot",
373
373
  MINT_STDOT = "earn.mint_stdot",
374
+ MINT_VMANTA = "earn.mint_vmanta",
374
375
  REDEEM_QDOT = "earn.redeem_qdot",
375
376
  REDEEM_VDOT = "earn.redeem_vdot",
376
377
  REDEEM_LDOT = "earn.redeem_ldot",
377
378
  REDEEM_SDOT = "earn.redeem_sdot",
378
379
  REDEEM_STDOT = "earn.redeem_stdot",
380
+ REDEEM_VMANTA = "earn.redeem_vmanta",
379
381
  UNSTAKE_QDOT = "earn.unstake_qdot",
380
382
  UNSTAKE_VDOT = "earn.unstake_vdot",
381
383
  UNSTAKE_LDOT = "earn.unstake_ldot",
382
384
  UNSTAKE_SDOT = "earn.unstake_sdot",
383
385
  UNSTAKE_STDOT = "earn.unstake_stdot",
386
+ UNSTAKE_VMANTA = "earn.unstake_vmanta",
384
387
  TOKEN_APPROVE = "evm.token_approve",
385
388
  EVM_EXECUTE = "evm.execute",
386
389
  UNKNOWN = "unknown"
@@ -407,16 +410,19 @@ export interface ExtrinsicDataTypeMap {
407
410
  [ExtrinsicType.MINT_QDOT]: SubmitYieldStepData;
408
411
  [ExtrinsicType.MINT_STDOT]: SubmitYieldStepData;
409
412
  [ExtrinsicType.MINT_STDOT]: SubmitYieldStepData;
413
+ [ExtrinsicType.MINT_VMANTA]: SubmitYieldStepData;
410
414
  [ExtrinsicType.UNSTAKE_VDOT]: RequestYieldLeave;
411
415
  [ExtrinsicType.UNSTAKE_QDOT]: RequestYieldLeave;
412
416
  [ExtrinsicType.UNSTAKE_LDOT]: RequestYieldLeave;
413
417
  [ExtrinsicType.UNSTAKE_SDOT]: RequestYieldLeave;
414
418
  [ExtrinsicType.UNSTAKE_STDOT]: RequestYieldLeave;
419
+ [ExtrinsicType.UNSTAKE_VMANTA]: RequestYieldLeave;
415
420
  [ExtrinsicType.REDEEM_VDOT]: RequestYieldLeave;
416
421
  [ExtrinsicType.REDEEM_QDOT]: RequestYieldLeave;
417
422
  [ExtrinsicType.REDEEM_LDOT]: RequestYieldLeave;
418
423
  [ExtrinsicType.REDEEM_SDOT]: RequestYieldLeave;
419
424
  [ExtrinsicType.REDEEM_STDOT]: RequestYieldLeave;
425
+ [ExtrinsicType.REDEEM_VMANTA]: RequestYieldLeave;
420
426
  [ExtrinsicType.TOKEN_APPROVE]: TokenApproveData;
421
427
  [ExtrinsicType.EVM_EXECUTE]: TransactionConfig;
422
428
  [ExtrinsicType.CROWDLOAN]: any;
@@ -470,16 +476,19 @@ export declare type TransactionAdditionalInfo = {
470
476
  [ExtrinsicType.TRANSFER_XCM]: XCMTransactionAdditionalInfo;
471
477
  [ExtrinsicType.SEND_NFT]: NFTTransactionAdditionalInfo;
472
478
  [ExtrinsicType.MINT_VDOT]: Pick<SubmitYieldStepData, 'derivativeTokenSlug' | 'exchangeRate' | 'slug'>;
479
+ [ExtrinsicType.MINT_VMANTA]: Pick<SubmitYieldStepData, 'derivativeTokenSlug' | 'exchangeRate' | 'slug'>;
473
480
  [ExtrinsicType.MINT_QDOT]: Pick<SubmitYieldStepData, 'derivativeTokenSlug' | 'exchangeRate' | 'slug'>;
474
481
  [ExtrinsicType.MINT_SDOT]: Pick<SubmitYieldStepData, 'derivativeTokenSlug' | 'exchangeRate' | 'slug'>;
475
482
  [ExtrinsicType.MINT_LDOT]: Pick<SubmitYieldStepData, 'derivativeTokenSlug' | 'exchangeRate' | 'slug'>;
476
483
  [ExtrinsicType.MINT_STDOT]: Pick<SubmitYieldStepData, 'derivativeTokenSlug' | 'exchangeRate' | 'slug'>;
477
484
  [ExtrinsicType.REDEEM_VDOT]: LeavePoolAdditionalData;
485
+ [ExtrinsicType.REDEEM_VMANTA]: LeavePoolAdditionalData;
478
486
  [ExtrinsicType.REDEEM_QDOT]: LeavePoolAdditionalData;
479
487
  [ExtrinsicType.REDEEM_SDOT]: LeavePoolAdditionalData;
480
488
  [ExtrinsicType.REDEEM_LDOT]: LeavePoolAdditionalData;
481
489
  [ExtrinsicType.REDEEM_STDOT]: LeavePoolAdditionalData;
482
490
  [ExtrinsicType.UNSTAKE_VDOT]: LeavePoolAdditionalData;
491
+ [ExtrinsicType.UNSTAKE_VMANTA]: LeavePoolAdditionalData;
483
492
  [ExtrinsicType.UNSTAKE_QDOT]: LeavePoolAdditionalData;
484
493
  [ExtrinsicType.UNSTAKE_SDOT]: LeavePoolAdditionalData;
485
494
  [ExtrinsicType.UNSTAKE_LDOT]: LeavePoolAdditionalData;
@@ -81,16 +81,19 @@ export let ExtrinsicType;
81
81
  ExtrinsicType["MINT_SDOT"] = "earn.mint_sdot";
82
82
  ExtrinsicType["MINT_QDOT"] = "earn.mint_qdot";
83
83
  ExtrinsicType["MINT_STDOT"] = "earn.mint_stdot";
84
+ ExtrinsicType["MINT_VMANTA"] = "earn.mint_vmanta";
84
85
  ExtrinsicType["REDEEM_QDOT"] = "earn.redeem_qdot";
85
86
  ExtrinsicType["REDEEM_VDOT"] = "earn.redeem_vdot";
86
87
  ExtrinsicType["REDEEM_LDOT"] = "earn.redeem_ldot";
87
88
  ExtrinsicType["REDEEM_SDOT"] = "earn.redeem_sdot";
88
89
  ExtrinsicType["REDEEM_STDOT"] = "earn.redeem_stdot";
90
+ ExtrinsicType["REDEEM_VMANTA"] = "earn.redeem_vmanta";
89
91
  ExtrinsicType["UNSTAKE_QDOT"] = "earn.unstake_qdot";
90
92
  ExtrinsicType["UNSTAKE_VDOT"] = "earn.unstake_vdot";
91
93
  ExtrinsicType["UNSTAKE_LDOT"] = "earn.unstake_ldot";
92
94
  ExtrinsicType["UNSTAKE_SDOT"] = "earn.unstake_sdot";
93
95
  ExtrinsicType["UNSTAKE_STDOT"] = "earn.unstake_stdot";
96
+ ExtrinsicType["UNSTAKE_VMANTA"] = "earn.unstake_vmanta";
94
97
  ExtrinsicType["TOKEN_APPROVE"] = "evm.token_approve";
95
98
  ExtrinsicType["EVM_EXECUTE"] = "evm.execute";
96
99
  ExtrinsicType["UNKNOWN"] = "unknown";
@@ -95,16 +95,19 @@ exports.ExtrinsicType = ExtrinsicType;
95
95
  ExtrinsicType["MINT_SDOT"] = "earn.mint_sdot";
96
96
  ExtrinsicType["MINT_QDOT"] = "earn.mint_qdot";
97
97
  ExtrinsicType["MINT_STDOT"] = "earn.mint_stdot";
98
+ ExtrinsicType["MINT_VMANTA"] = "earn.mint_vmanta";
98
99
  ExtrinsicType["REDEEM_QDOT"] = "earn.redeem_qdot";
99
100
  ExtrinsicType["REDEEM_VDOT"] = "earn.redeem_vdot";
100
101
  ExtrinsicType["REDEEM_LDOT"] = "earn.redeem_ldot";
101
102
  ExtrinsicType["REDEEM_SDOT"] = "earn.redeem_sdot";
102
103
  ExtrinsicType["REDEEM_STDOT"] = "earn.redeem_stdot";
104
+ ExtrinsicType["REDEEM_VMANTA"] = "earn.redeem_vmanta";
103
105
  ExtrinsicType["UNSTAKE_QDOT"] = "earn.unstake_qdot";
104
106
  ExtrinsicType["UNSTAKE_VDOT"] = "earn.unstake_vdot";
105
107
  ExtrinsicType["UNSTAKE_LDOT"] = "earn.unstake_ldot";
106
108
  ExtrinsicType["UNSTAKE_SDOT"] = "earn.unstake_sdot";
107
109
  ExtrinsicType["UNSTAKE_STDOT"] = "earn.unstake_stdot";
110
+ ExtrinsicType["UNSTAKE_VMANTA"] = "earn.unstake_vmanta";
108
111
  ExtrinsicType["TOKEN_APPROVE"] = "evm.token_approve";
109
112
  ExtrinsicType["EVM_EXECUTE"] = "evm.execute";
110
113
  ExtrinsicType["UNKNOWN"] = "unknown";
@@ -11,7 +11,7 @@ const PREDEFINED_STAKING_POOL = {
11
11
  kusama: 80,
12
12
  polkadot: 39,
13
13
  vara_network: 29,
14
- aleph: 55
14
+ aleph: 82
15
15
  };
16
16
  exports.PREDEFINED_STAKING_POOL = PREDEFINED_STAKING_POOL;
17
17
  const MAX_NOMINATIONS = '16';
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
@@ -10,6 +11,8 @@ exports.syntheticSelectedValidators = void 0;
10
11
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
11
12
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
12
13
  var _types = require("@subwallet/extension-base/types");
14
+ var _utils2 = require("@subwallet/extension-base/utils");
15
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
13
16
  // Copyright 2019-2022 @subwallet/extension-base
14
17
  // SPDX-License-Identifier: Apache-2.0
15
18
 
@@ -40,7 +43,7 @@ function convertDerivativeToOriginToken(amount, poolInfo, derivativeTokenInfo, o
40
43
  const derivativeDecimals = (0, _utils._getAssetDecimals)(derivativeTokenInfo);
41
44
  const originDecimals = (0, _utils._getAssetDecimals)(originTokenInfo);
42
45
  const exchangeRate = ((_poolInfo$statistic = poolInfo.statistic) === null || _poolInfo$statistic === void 0 ? void 0 : (_poolInfo$statistic$a = _poolInfo$statistic.assetEarning) === null || _poolInfo$statistic$a === void 0 ? void 0 : _poolInfo$statistic$a[0].exchangeRate) || 1;
43
- const formattedAmount = parseInt(amount) / 10 ** derivativeDecimals; // TODO: decimals
44
- const minAmount = formattedAmount * exchangeRate;
45
- return Math.floor(minAmount * 10 ** originDecimals);
46
+ const formattedAmount = new _bignumber.default(amount).dividedBy(_utils2.BN_TEN.pow(derivativeDecimals)); // TODO: decimals
47
+ const minAmount = formattedAmount.multipliedBy(exchangeRate);
48
+ return minAmount.multipliedBy(_utils2.BN_TEN.pow(originDecimals)).toFixed(0);
46
49
  }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_MAX_RETRY = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
6
+ exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_MAX_RETRY = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
7
7
  var _chainList = require("@subwallet/chain-list");
8
8
  var _types = require("@subwallet/chain-list/types");
9
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
@@ -262,9 +262,11 @@ exports.EVM_PASS_CONNECT_STATUS = EVM_PASS_CONNECT_STATUS;
262
262
  const EVM_REFORMAT_DECIMALS = {
263
263
  acala: ['acala_evm', 'karura_evm']
264
264
  };
265
+ exports.EVM_REFORMAT_DECIMALS = EVM_REFORMAT_DECIMALS;
266
+ const LATEST_CHAIN_DATA_FETCHING_INTERVAL = 120000;
265
267
 
266
268
  // TODO: review
267
- exports.EVM_REFORMAT_DECIMALS = EVM_REFORMAT_DECIMALS;
269
+ exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = LATEST_CHAIN_DATA_FETCHING_INTERVAL;
268
270
  const TARGET_BRANCH = process.env.NODE_ENV !== 'production' ? 'koni-dev' : 'master';
269
271
  const _CHAIN_INFO_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/ChainInfo.json`;
270
272
  exports._CHAIN_INFO_SRC = _CHAIN_INFO_SRC;
@@ -64,7 +64,8 @@ class SubstrateApi {
64
64
  const apiOption = {
65
65
  provider,
66
66
  typesBundle: _api3.typesBundle,
67
- registry: this.registry
67
+ registry: this.registry,
68
+ noInitWarn: true
68
69
  };
69
70
  if (this.metadata) {
70
71
  const metadata = this.metadata;
@@ -78,27 +79,31 @@ class SubstrateApi {
78
79
  api = externalApiPromise;
79
80
  } else if (_constants._API_OPTIONS_CHAIN_GROUP.acala.includes(this.chainSlug)) {
80
81
  api = new _api2.ApiPromise((0, _api.options)({
81
- provider
82
+ provider,
83
+ noInitWarn: true
82
84
  }));
83
85
  } else if (_constants._API_OPTIONS_CHAIN_GROUP.turing.includes(this.chainSlug)) {
84
86
  api = new _api2.ApiPromise({
85
87
  provider,
86
88
  rpc: _types.rpc,
87
- types: _types.types
89
+ types: _types.types,
90
+ noInitWarn: true
88
91
  });
89
92
  } else if (_constants._API_OPTIONS_CHAIN_GROUP.avail.includes(this.chainSlug)) {
90
93
  api = new _api2.ApiPromise({
91
94
  provider,
92
95
  rpc: _availJsSdk.spec.rpc,
93
96
  types: _availJsSdk.spec.types,
94
- signedExtensions: _availJsSdk.spec.signedExtensions
97
+ signedExtensions: _availJsSdk.spec.signedExtensions,
98
+ noInitWarn: true
95
99
  });
96
100
  } else if (_constants._API_OPTIONS_CHAIN_GROUP.goldberg.includes(this.chainSlug)) {
97
101
  api = new _api2.ApiPromise({
98
102
  provider,
99
103
  rpc: _goldberg.default.rpc,
100
104
  types: _goldberg.default.types,
101
- signedExtensions: _goldberg.default.signedExtensions
105
+ signedExtensions: _goldberg.default.signedExtensions,
106
+ noInitWarn: true
102
107
  });
103
108
  } else {
104
109
  api = new _api2.ApiPromise(apiOption);
@@ -410,9 +410,11 @@ class ChainService {
410
410
  await this.eventService.waitDatabaseReady;
411
411
 
412
412
  // TODO: reconsider the flow of initiation
413
- const [latestAssetRefMap, latestMultiChainAssetMap] = await Promise.all([this.fetchLatestData(_constants._ASSET_REF_SRC, _chainList.AssetRefMap), this.fetchLatestData(_constants._MULTI_CHAIN_ASSET_SRC, _chainList.MultiChainAssetMap)]);
414
- this.multiChainAssetMapSubject.next(latestMultiChainAssetMap);
415
- this.dataMap.assetRefMap = latestAssetRefMap;
413
+ this.multiChainAssetMapSubject.next(_chainList.MultiChainAssetMap);
414
+ // const storedAssetRefMap = await this.dbService.getAssetRefMap();
415
+ //
416
+ // this.dataMap.assetRefMap = storedAssetRefMap && Object.values(storedAssetRefMap).length > 0 ? storedAssetRefMap : AssetRefMap;
417
+
416
418
  await this.initChains();
417
419
  this.chainInfoMapSubject.next(this.getChainInfoMap());
418
420
  this.updateChainStateMapSubscription();
@@ -420,16 +422,103 @@ class ChainService {
420
422
  this.xcmRefMapSubject.next(this.dataMap.assetRefMap);
421
423
  await this.initApis();
422
424
  await this.initAssetSettings();
425
+ await this.initAssetRefMap();
426
+ this.checkLatestData();
427
+ }
428
+ async initAssetRefMap() {
429
+ try {
430
+ const fetchPromise = this.fetchLatestBlockedAssetRef();
431
+ const timeout = new Promise(resolve => {
432
+ const id = setTimeout(() => {
433
+ clearTimeout(id);
434
+ resolve(null);
435
+ }, 1000);
436
+ });
437
+ const disabledAssetRefs = (await Promise.race([timeout, fetchPromise])) || null;
438
+ if (disabledAssetRefs) {
439
+ this.handleLatestBlockedAssetRef(disabledAssetRefs);
440
+ } else {
441
+ this.dataMap.assetRefMap = _chainList.AssetRefMap;
442
+ }
443
+ } catch (e) {
444
+ this.dataMap.assetRefMap = _chainList.AssetRefMap;
445
+ }
446
+ }
447
+ checkLatestData() {
448
+ clearInterval(this.refreshLatestChainDataTimeOut);
449
+ this.handleLatestData();
450
+ this.handleLatestData();
451
+ this.handleLatestData();
452
+ this.refreshLatestChainDataTimeOut = setInterval(this.handleLatestData.bind(this), _constants.LATEST_CHAIN_DATA_FETCHING_INTERVAL);
453
+ }
454
+ stopCheckLatestChainData() {
455
+ clearInterval(this.refreshLatestChainDataTimeOut);
423
456
  }
457
+ handleLatestProviderData(latestChainInfo) {
458
+ try {
459
+ if (latestChainInfo && latestChainInfo.length > 0) {
460
+ const {
461
+ needUpdateChainApiList,
462
+ storedChainInfoList
463
+ } = (0, _utils.updateLatestChainInfo)(this.dataMap, latestChainInfo);
464
+ this.dbService.bulkUpdateChainStore(storedChainInfoList).catch(console.error);
465
+ this.updateChainSubscription();
466
+ needUpdateChainApiList.forEach(chainInfo => {
467
+ console.log('Updating chain API for', chainInfo.slug);
468
+ this.initApiForChain(chainInfo).catch(console.error);
469
+ });
470
+ this.logger.log('Finished updating latest RPC providers');
471
+ }
472
+ } catch (e) {
473
+ console.error('Error fetching latest chain data');
474
+ }
475
+ }
476
+ handleLatestBlockedAssetRef(latestBlockedAssetRefList) {
477
+ const updatedAssetRefMap = {
478
+ ..._chainList.AssetRefMap
479
+ };
480
+ latestBlockedAssetRefList.forEach(blockedAssetRef => {
481
+ delete updatedAssetRefMap[blockedAssetRef];
482
+ });
483
+ this.dataMap.assetRefMap = updatedAssetRefMap;
484
+
485
+ // this.dbService.setAssetRef(this.dataMap.assetRefMap).catch(console.error);
486
+ this.xcmRefMapSubject.next(this.dataMap.assetRefMap);
487
+ this.logger.log('Finished updating latest asset ref');
488
+ }
489
+ handleLatestPriceId(latestPriceIds) {
490
+ Object.entries(latestPriceIds).forEach(_ref3 => {
491
+ let [slug, priceId] = _ref3;
492
+ if (this.dataMap.assetRegistry[slug]) {
493
+ this.dataMap.assetRegistry[slug].priceId = priceId;
494
+ }
495
+ });
496
+ this.assetRegistrySubject.next(this.dataMap.assetRegistry);
497
+ this.eventService.emit('asset.updateState', '');
498
+ this.logger.log('Finished updating latest price IDs');
499
+ }
500
+ handleLatestData() {
501
+ this.fetchLatestChainData().then(latestChainInfo => {
502
+ this.handleLatestProviderData(latestChainInfo);
503
+ }).catch(console.error);
504
+ this.fetchLatestBlockedAssetRef().then(latestAssetRef => {
505
+ this.handleLatestBlockedAssetRef(latestAssetRef);
506
+ }).catch(console.error);
507
+
508
+ // this.fetchLatestPriceIdsData().then((latestPriceIds) => {
509
+ // this.handleLatestPriceId(latestPriceIds);
510
+ // }).catch(console.error);
511
+ }
512
+
424
513
  async initApis() {
425
514
  const chainInfoMap = this.getChainInfoMap();
426
515
  const chainStateMap = this.getChainStateMap();
427
- await Promise.all(Object.entries(chainInfoMap).filter(_ref3 => {
516
+ await Promise.all(Object.entries(chainInfoMap).filter(_ref4 => {
428
517
  var _chainStateMap$slug;
429
- let [slug] = _ref3;
518
+ let [slug] = _ref4;
430
519
  return (_chainStateMap$slug = chainStateMap[slug]) === null || _chainStateMap$slug === void 0 ? void 0 : _chainStateMap$slug.active;
431
- }).map(_ref4 => {
432
- let [, chainInfo] = _ref4;
520
+ }).map(_ref5 => {
521
+ let [, chainInfo] = _ref5;
433
522
  try {
434
523
  return this.initApiForChain(chainInfo);
435
524
  } catch (e) {
@@ -578,8 +667,8 @@ class ChainService {
578
667
  }
579
668
  return duplicatedSlug;
580
669
  }
581
- async fetchLatestData(src, defaultValue) {
582
- return Promise.resolve(defaultValue);
670
+ async fetchLatestChainData() {
671
+ return await (0, _utils2.fetchStaticData)('chains');
583
672
  // try {
584
673
  // const timeout = new Promise((resolve) => {
585
674
  // const id = setTimeout(() => {
@@ -616,9 +705,16 @@ class ChainService {
616
705
  // }
617
706
  }
618
707
 
708
+ // @ts-ignore
709
+ async fetchLatestPriceIdsData() {
710
+ return await (0, _utils2.fetchStaticData)('chain-assets/price-map');
711
+ }
712
+ async fetchLatestBlockedAssetRef() {
713
+ return await (0, _utils2.fetchStaticData)('chain-assets/disabled-xcm-channels');
714
+ }
619
715
  async initChains() {
620
716
  const storedChainSettings = await this.dbService.getAllChainStore();
621
- const latestChainInfoMap = await this.fetchLatestData(_constants._CHAIN_INFO_SRC, _chainList.ChainInfoMap);
717
+ const defaultChainInfoMap = _chainList.ChainInfoMap;
622
718
  const storedChainSettingMap = {};
623
719
  storedChainSettings.forEach(chainStoredSetting => {
624
720
  storedChainSettingMap[chainStoredSetting.slug] = chainStoredSetting;
@@ -627,10 +723,13 @@ class ChainService {
627
723
  const deprecatedChains = [];
628
724
  const deprecatedChainMap = {};
629
725
  if (storedChainSettings.length === 0) {
630
- this.dataMap.chainInfoMap = latestChainInfoMap;
631
- Object.values(latestChainInfoMap).forEach(chainInfo => {
726
+ this.dataMap.chainInfoMap = defaultChainInfoMap;
727
+ Object.values(defaultChainInfoMap).forEach(chainInfo => {
728
+ const {
729
+ providerKey
730
+ } = (0, _utils.randomizeProvider)(chainInfo.providers);
632
731
  this.dataMap.chainStateMap[chainInfo.slug] = {
633
- currentProvider: Object.keys(chainInfo.providers)[0],
732
+ currentProvider: providerKey,
634
733
  slug: chainInfo.slug,
635
734
  connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
636
735
  active: _constants._DEFAULT_ACTIVE_CHAINS.includes(chainInfo.slug)
@@ -640,15 +739,15 @@ class ChainService {
640
739
  newStorageData.push({
641
740
  ...chainInfo,
642
741
  active: _constants._DEFAULT_ACTIVE_CHAINS.includes(chainInfo.slug),
643
- currentProvider: Object.keys(chainInfo.providers)[0]
742
+ currentProvider: providerKey
644
743
  });
645
744
  });
646
745
  } else {
647
- const mergedChainInfoMap = latestChainInfoMap;
746
+ const mergedChainInfoMap = defaultChainInfoMap;
648
747
  for (const [storedSlug, storedChainInfo] of Object.entries(storedChainSettingMap)) {
649
- const chainInfo = latestChainInfoMap[storedSlug];
748
+ const chainInfo = defaultChainInfoMap[storedSlug];
650
749
 
651
- // Network is existed on change list
750
+ // Network existed on change list
652
751
  // check predefined chains first, keep setting for providers and currentProvider
653
752
  if (chainInfo) {
654
753
  // Keep customer provider only
@@ -663,23 +762,27 @@ class ChainService {
663
762
  }
664
763
  }
665
764
  mergedChainInfoMap[storedSlug].providers = providers;
666
-
667
- // Merge current provider
668
- let currentProvider = storedChainInfo.currentProvider;
669
- const providerValue = storedChainInfo.providers[currentProvider] || '';
670
- if (!providers[currentProvider]) {
671
- currentProvider = Object.keys(providers)[0];
672
- for (const [key, value] of Object.entries(providers)) {
673
- if (providerValue === value) {
674
- currentProvider = key;
675
- break;
676
- }
765
+ const {
766
+ providerKey
767
+ } = (0, _utils.randomizeProvider)(providers);
768
+ let selectedProvider = providerKey;
769
+ const storedProviderKey = storedChainInfo.currentProvider;
770
+ const storedProviderValue = storedChainInfo.providers[storedProviderKey] || '';
771
+ if (storedProviderValue !== null && storedProviderValue !== void 0 && storedProviderValue.startsWith('light') || storedProviderKey !== null && storedProviderKey !== void 0 && storedProviderKey.startsWith(_types3._CUSTOM_PREFIX)) {
772
+ const savedProviderKey = Object.keys(providers).find(key => providers[key] === storedProviderValue);
773
+ if (savedProviderKey) {
774
+ selectedProvider = savedProviderKey;
677
775
  }
678
776
  }
777
+
778
+ // Merge current provider
779
+ // let currentProvider = storedChainInfo.currentProvider;
780
+ // const providerValue = storedChainInfo.providers[selectedProvider] || '';
781
+
679
782
  const hasProvider = Object.values(providers).length > 0;
680
783
  const canActive = hasProvider && chainInfo.chainStatus === _types._ChainStatus.ACTIVE;
681
784
  this.dataMap.chainStateMap[storedSlug] = {
682
- currentProvider: currentProvider,
785
+ currentProvider: selectedProvider,
683
786
  slug: storedSlug,
684
787
  connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
685
788
  active: canActive && storedChainInfo.active
@@ -687,13 +790,13 @@ class ChainService {
687
790
  newStorageData.push({
688
791
  ...mergedChainInfoMap[storedSlug],
689
792
  active: canActive && storedChainInfo.active,
690
- currentProvider: currentProvider
793
+ currentProvider: selectedProvider
691
794
  });
692
795
  } else if ((0, _utils._isCustomChain)(storedSlug)) {
693
796
  var _storedChainInfo$subs, _storedChainInfo$evmI;
694
797
  // only custom chains are left
695
798
  // check custom chain duplicated with predefined chain => merge into predefined chain
696
- const duplicatedDefaultSlug = this.checkExistedPredefinedChain(latestChainInfoMap, (_storedChainInfo$subs = storedChainInfo.substrateInfo) === null || _storedChainInfo$subs === void 0 ? void 0 : _storedChainInfo$subs.genesisHash, (_storedChainInfo$evmI = storedChainInfo.evmInfo) === null || _storedChainInfo$evmI === void 0 ? void 0 : _storedChainInfo$evmI.evmChainId);
799
+ const duplicatedDefaultSlug = this.checkExistedPredefinedChain(defaultChainInfoMap, (_storedChainInfo$subs = storedChainInfo.substrateInfo) === null || _storedChainInfo$subs === void 0 ? void 0 : _storedChainInfo$subs.genesisHash, (_storedChainInfo$evmI = storedChainInfo.evmInfo) === null || _storedChainInfo$evmI === void 0 ? void 0 : _storedChainInfo$evmI.evmChainId);
697
800
  if (duplicatedDefaultSlug.length > 0) {
698
801
  // merge custom chain with existed chain
699
802
  mergedChainInfoMap[duplicatedDefaultSlug].providers = {
@@ -718,6 +821,7 @@ class ChainService {
718
821
  slug: storedSlug,
719
822
  name: storedChainInfo.name,
720
823
  providers: storedChainInfo.providers,
824
+ // TODO: review
721
825
  evmInfo: storedChainInfo.evmInfo,
722
826
  substrateInfo: storedChainInfo.substrateInfo,
723
827
  isTestnet: storedChainInfo.isTestnet,
@@ -727,6 +831,7 @@ class ChainService {
727
831
  };
728
832
  this.dataMap.chainStateMap[storedSlug] = {
729
833
  currentProvider: storedChainInfo.currentProvider,
834
+ // TODO: review
730
835
  slug: storedSlug,
731
836
  connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
732
837
  active: storedChainInfo.active
@@ -734,7 +839,7 @@ class ChainService {
734
839
  newStorageData.push({
735
840
  ...mergedChainInfoMap[storedSlug],
736
841
  active: storedChainInfo.active,
737
- currentProvider: storedChainInfo.currentProvider
842
+ currentProvider: storedChainInfo.currentProvider // TODO: review
738
843
  });
739
844
  }
740
845
  } else {
@@ -743,8 +848,8 @@ class ChainService {
743
848
  }
744
849
 
745
850
  // Fill in the missing chainState and storageData (new chains never before seen)
746
- Object.entries(mergedChainInfoMap).forEach(_ref5 => {
747
- let [slug, chainInfo] = _ref5;
851
+ Object.entries(mergedChainInfoMap).forEach(_ref6 => {
852
+ let [slug, chainInfo] = _ref6;
748
853
  if (!(slug in this.dataMap.chainStateMap)) {
749
854
  this.dataMap.chainStateMap[slug] = {
750
855
  currentProvider: Object.keys(chainInfo.providers)[0],
@@ -767,7 +872,7 @@ class ChainService {
767
872
  }
768
873
  async initAssetRegistry(deprecatedCustomChainMap) {
769
874
  const storedAssetRegistry = await this.dbService.getAllAssetStore();
770
- const latestAssetRegistry = await this.fetchLatestData(_constants._CHAIN_ASSET_SRC, _chainList.ChainAssetMap);
875
+ const latestAssetRegistry = _chainList.ChainAssetMap;
771
876
  const availableChains = Object.values(this.dataMap.chainInfoMap).filter(info => info.chainStatus === _types._ChainStatus.ACTIVE).map(chainInfo => chainInfo.slug);
772
877
 
773
878
  // Fill out zk assets from latestAssetRegistry if not supported
@@ -1217,9 +1322,11 @@ class ChainService {
1217
1322
  }
1218
1323
  async stopAllChainApis() {
1219
1324
  await Promise.all([this.substrateChainHandler.sleep(), this.evmChainHandler.sleep()]);
1325
+ this.stopCheckLatestChainData();
1220
1326
  }
1221
1327
  async resumeAllChainApis() {
1222
1328
  await Promise.all([this.substrateChainHandler.wakeUp(), this.evmChainHandler.wakeUp()]);
1329
+ this.checkLatestData();
1223
1330
  }
1224
1331
  checkAndUpdateStatusMapForChain(chainSlug) {
1225
1332
  const substrateApiMap = this.getSubstrateApiMap();
@@ -1355,10 +1462,10 @@ class ChainService {
1355
1462
  return this.assetSettingSubject;
1356
1463
  }
1357
1464
  async getChainLogoMap() {
1358
- return await this.fetchLatestData(_constants._CHAIN_LOGO_MAP_SRC, _chainList.ChainLogoMap);
1465
+ return Promise.resolve(_chainList.ChainLogoMap);
1359
1466
  }
1360
1467
  async getAssetLogoMap() {
1361
- return await this.fetchLatestData(_constants._ASSET_LOGO_MAP_SRC, _chainList.AssetLogoMap);
1468
+ return Promise.resolve(_chainList.AssetLogoMap);
1362
1469
  }
1363
1470
  resetWallet(resetAll) {
1364
1471
  if (resetAll) {
@@ -68,6 +68,8 @@ exports._isXcmPathSupported = _isXcmPathSupported;
68
68
  exports._parseAssetRefKey = _parseAssetRefKey;
69
69
  exports._parseMetadataForSmartContractAsset = _parseMetadataForSmartContractAsset;
70
70
  exports.findChainInfoByHalfGenesisHash = exports.findChainInfoByChainId = void 0;
71
+ exports.randomizeProvider = randomizeProvider;
72
+ exports.updateLatestChainInfo = updateLatestChainInfo;
71
73
  var _types = require("@subwallet/chain-list/types");
72
74
  var _constants = require("@subwallet/extension-base/services/chain-service/constants");
73
75
  var _types2 = require("@subwallet/extension-base/services/chain-service/types");
@@ -435,4 +437,70 @@ const findChainInfoByChainId = (chainMap, chainId) => {
435
437
  exports.findChainInfoByChainId = findChainInfoByChainId;
436
438
  function _isMantaZkAsset(chainAsset) {
437
439
  return _constants._MANTA_ZK_CHAIN_GROUP.includes(chainAsset.originChain) && chainAsset.symbol.startsWith(_constants._ZK_ASSET_PREFIX);
440
+ }
441
+ function randomizeProvider(providers, excludedKeys) {
442
+ if (Object.keys(providers).length === 0) {
443
+ return {
444
+ providerKey: '',
445
+ providerValue: ''
446
+ };
447
+ }
448
+ let isValid = false;
449
+ let selectedProviderKey = '';
450
+ let selectedProviderValue = '';
451
+ while (!isValid) {
452
+ var _selectedProviderValu, _selectedProviderKey;
453
+ const randomProvider = Math.floor(Math.random() * Object.keys(providers).length);
454
+ selectedProviderKey = Object.keys(providers)[randomProvider];
455
+ selectedProviderValue = providers[selectedProviderKey];
456
+ if (!((_selectedProviderValu = selectedProviderValue) !== null && _selectedProviderValu !== void 0 && _selectedProviderValu.startsWith('light')) && !((_selectedProviderKey = selectedProviderKey) !== null && _selectedProviderKey !== void 0 && _selectedProviderKey.startsWith(_types2._CUSTOM_PREFIX)) && !(excludedKeys !== null && excludedKeys !== void 0 && excludedKeys.includes(selectedProviderKey))) {
457
+ // if it's light client, then re-randomize
458
+ isValid = true;
459
+ }
460
+ }
461
+ return {
462
+ providerKey: selectedProviderKey,
463
+ providerValue: selectedProviderValue
464
+ };
465
+ }
466
+ function updateLatestChainInfo(currentDataMap, latestChainInfoList) {
467
+ const currentChainInfoMap = currentDataMap.chainInfoMap;
468
+ const currentChainStateMap = currentDataMap.chainStateMap;
469
+ const storedChainInfoList = [];
470
+ const needUpdateChainApiList = [];
471
+ latestChainInfoList.forEach(latestChainInfo => {
472
+ const currentChainInfo = currentChainInfoMap[latestChainInfo.slug];
473
+ const currentChainState = currentChainStateMap[latestChainInfo.slug];
474
+ const currentChainProviderValue = currentChainInfo === null || currentChainInfo === void 0 ? void 0 : currentChainInfo.providers[currentChainState === null || currentChainState === void 0 ? void 0 : currentChainState.currentProvider];
475
+ if (currentChainInfo && currentChainState) {
476
+ const preservedProvider = {};
477
+ Object.entries(currentChainInfo.providers).forEach(_ref => {
478
+ let [providerKey, providerValue] = _ref;
479
+ if (providerValue !== null && providerValue !== void 0 && providerValue.startsWith('light') || providerKey !== null && providerKey !== void 0 && providerKey.startsWith(_types2._CUSTOM_PREFIX)) {
480
+ preservedProvider[providerKey] = providerValue;
481
+ }
482
+ });
483
+ currentChainInfo.providers = {
484
+ ...latestChainInfo.providers,
485
+ ...preservedProvider
486
+ };
487
+ const currentProviderNotFound = !Object.keys(currentChainInfo.providers).includes(currentChainState.currentProvider);
488
+ const currentProviderUpdated = Object.keys(currentChainInfo.providers).includes(currentChainState.currentProvider) && !Object.values(currentChainInfo.providers).includes(currentChainProviderValue);
489
+ if (currentChainInfo.chainStatus === _types._ChainStatus.ACTIVE && (currentProviderNotFound || currentProviderUpdated)) {
490
+ const {
491
+ providerKey
492
+ } = randomizeProvider(currentChainInfo.providers);
493
+ currentChainState.currentProvider = providerKey;
494
+ needUpdateChainApiList.push(currentChainInfo);
495
+ }
496
+ storedChainInfoList.push({
497
+ ...currentChainInfo,
498
+ ...currentChainState
499
+ });
500
+ }
501
+ });
502
+ return {
503
+ storedChainInfoList,
504
+ needUpdateChainApiList
505
+ };
438
506
  }
@@ -10,6 +10,7 @@ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
10
  var _utils = require("@subwallet/extension-base/koni/api/yield/helper/utils");
11
11
  var _types = require("@subwallet/extension-base/types");
12
12
  var _utils2 = require("@subwallet/extension-base/utils");
13
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
13
14
  var _i18next = require("i18next");
14
15
  var _util = require("@polkadot/util");
15
16
  var _special = _interopRequireDefault(require("../special"));
@@ -38,7 +39,7 @@ class BaseLiquidStakingPoolHandler extends _special.default {
38
39
  return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INVALID_PARAMS));
39
40
  }
40
41
  const formattedMinAmount = (0, _utils.convertDerivativeToOriginToken)(amount, poolInfo, derivativeTokenInfo, originTokenInfo);
41
- return Math.floor(this.minAmountPercent * formattedMinAmount);
42
+ return new _bignumber.default(formattedMinAmount).multipliedBy(this.minAmountPercent).toFixed(0);
42
43
  }
43
44
  async validateYieldLeave(amount, address, fastLeave, selectedTarget) {
44
45
  const poolInfo = await this.getPoolInfo();